0

我无法使用 PrimeFaces 从后面的 bean 更新视图RequestContext。在下面的示例中,我有一个按钮和 2 个面板。按下按钮时,我想更新一个面板,而不是另一个面板。但它不起作用,我找不到错误!requestContext.update("panela");被解雇,但没有完成它的工作!非常感谢帮助!

XHTML 文件:

<!DOCTYPE html>
<html xmlns="http://www.w3c.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.org/ui"
      xmlns:f="http://xmlns.jcp.org/jsf/core">
    <h:head/>
    <h:body>
        <h:form>
            <p:panelGrid columns="1">
                <p:commandButton value="Save" actionListener="#{runtimeUpdatesBean.save}" />
                <p:panel id="panela">
                    <h:outputText value="#{runtimeUpdatesBean.texta}"/>
                </p:panel>
                <p:panel id="panelb">
                    <h:outputText value="#{runtimeUpdatesBean.textb}"/>
                </p:panel>
            </p:panelGrid>
        </h:form>
    </h:body>
</html>

豆子:

package com.glasses.primework;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import org.primefaces.context.RequestContext;

@ManagedBean
@SessionScoped
public class RuntimeUpdatesBean {
    private String texta;
    private String textb;
    private boolean outcome;

    public String getTexta() {
        texta += "a";
        System.out.println("RuntimeUpdatesBean.getTexta() = " + texta);
        return texta;
    }

    public String getTextb() {
        textb += "b";
        System.out.println("RuntimeUpdatesBean.getTextb() = " + textb);
        return textb;
    }

    public void save() {
        RequestContext requestContext = RequestContext.getCurrentInstance();

        if(outcome) {
            System.out.println("RuntimeUpdatesBean.save() = update panela");
            requestContext.update("panela");
            outcome = false;
        } else {
            System.out.println("RuntimeUpdatesBean.save() = update panelb");
            requestContext.update("panelb");
            outcome = true;
        }
    }
}
4

2 回答 2

4

那么问题是您所指的组件的ID。
在 JSF 中,当您在其中放置一个组件h:form(或一些 Primefaces 组件,如 TabView)时,该组件的 Id 也将基于该h:formid 生成。
这是示例:

<h:form id="panelaForm">
   <p:panel id="panela">
       ....
   </p:panel>
</h:form>

在上述情况下,您p:panel的 id 将生成为panelaForm:panela.
在您的情况下,由于您没有为h:form动态 ID 提供任何 ID,因此将附加例如j_xyz:panela(您可以使用浏览器的 Inspect 元素查看它)。

因此,如果您想在同一内部p:panel使用 Id访问,则无需附加表单 Id。 但是如果你想访问外部,那么你需要附加id 来访问它。panelah:form
p:panelh:formh:form

解决您的问题是:使用自定义 ID 到您的h:form(顺便说一句,这是一个最佳实践..)并p:panel通过附加该表单 ID 来访问。

<h:form id="panelaForm">
   <p:panel id="panela">
       ....
   </p:panel>
</h:form>

在托管 bean 中使用:

RequestContext.getCurrentInstance().update("panelaForm:panela");
于 2014-12-01T04:37:21.340 回答
0

我是这里的新人(Java EE),但是下面的解决方案对我有用:

<!DOCTYPE html>
<html   xmlns="http://www.w3c.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:p="http://primefaces.org/ui"
    xmlns:f="http://xmlns.jcp.org/jsf/core">
<h:head/>
<h:body>
    <h:form id="form">
        <p:panelGrid columns="1">
            <p:commandButton value="Save" actionListener="#{runtimeUpdatesBean.save}" update=":form" />
            <p:panel id="panela">
                <h:outputText value="#{runtimeUpdatesBean.texta}"/>
            </p:panel>
            <p:panel id="panelb">
                <h:outputText value="#{runtimeUpdatesBean.textb}"/>
            </p:panel>
        </p:panelGrid>
    </h:form>
</h:body>

于 2014-11-30T14:23:50.327 回答