我无法使用PrimeFaces的RequestContext
从后面的bean更新视图。在下面的示例中,我有一个按钮和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;
}
}
}
答案 0 :(得分:4)
问题是你所指的组件的ID
在JSF中,当您将组件放在h:form
(或某些Primefaces组件,如TabView)中时,该组件的ID也将基于h:form
ID生成。
这是例子:
<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 Element查看它)。
因此,如果您想在同一p:panel
内访问ID为panela
的{{1}},则无需附加表单ID。
但是,如果您想访问h:form
以外的p:panel
,则需要附加h:form
ID才能访问它。
问题的解决方案是:对h:form
使用自定义ID(顺便说一句,这是最佳做法..)并通过附加表单ID访问h:form
。
p:panel
在Managed bean中使用:
<h:form id="panelaForm">
<p:panel id="panela">
....
</p:panel>
</h:form>
答案 1 :(得分: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>