Java 渲染<;h:panelGroup>;jsf中的ajax
我有一段代码,它和我想的不完全一样。我尝试通过Ajax设置属性,然后重新渲染一个组件。我的.xhtml看起来像这样Java 渲染<;h:panelGroup>;jsf中的ajax,java,jsf-2,Java,Jsf 2,我有一段代码,它和我想的不完全一样。我尝试通过Ajax设置属性,然后重新渲染一个组件。我的.xhtml看起来像这样 <h:form> <h:commandButton value="Render!" > <f:ajax render=":result" listener="#{eFindUser.findUser}" /> </h:commandButton> </h:
<h:form>
<h:commandButton value="Render!" >
<f:ajax render=":result" listener="#{eFindUser.findUser}" />
</h:commandButton>
</h:form>
<h:panelGroup id="result" layout="block" rendered="#{eFindUser.responseRendered}" >
This is some text that is supposed to be rendered later
</h:panelGroup>
@Named(value = "eFindUser")
@ViewScoped
public class EFindUserManagedBean implements Serializable{
private boolean responseRendered = false;
/**
* Creates a new instance of EFindUserManagedBean
*/
public EFindUserManagedBean() {
}
public void findUser(AjaxBehaviorEvent abe) {
responseRendered = !responseRendered;
System.out.println("finding..... ("+ responseRendered+")" + this);
}
public boolean isResponseRendered() {
return responseRendered;
}
public void setResponseRendered(boolean responseRendered) {
this.responseRendered = responseRendered;
}
}
当我重新单击按钮时,属性没有更改。serverlog中有一条消息,上面说
INFO: finding..... (true)backingbeans.EFindUserManagedBean@5736b751
INFO: finding..... (true)backingbeans.EFindUserManagedBean@23959d6f
显然,托管bean存在一些问题,因为它是在每次有请求时创建的,即使它应该是视图范围的
我应该更改什么,以便panelgroup(id:“result”)可以更改其可见性?不允许使用richfaces或任何其他技术
非常感谢您的回答这对我很有用:
<ui:composition>
<h:form id="mainForm">
<h:commandButton value="Render!" action="#{eFindUser.findUser}">
<f:ajax event="action" render=":result" />
</h:commandButton>
</h:form>
<h:panelGroup id="result" layout="block" rendered="#{eFindUser.responseRendered}" >
This is some text that is supposed to be rendered later
</h:panelGroup>
</ui:composition>
看看你不能动态地呈现一个不是一直呈现的JSF组件。对象必须存在于DOM客户端中。使用rendered=“false”时,不会在服务器端生成输出 按如下方式更改代码:
<h:form>
<h:commandButton value="Render!" >
<f:ajax render=":result" listener="#{eFindUser.findUser}" />
</h:commandButton>
</h:form>
<h:panelGroup id="result">
<h:panelGroup layout="block" rendered="#{eFindUser.responseRendered}" >
This is some text that is supposed to be rendered later
</h:panelGroup>
</h:panelGroup>
这是一些应该稍后呈现的文本
这样,DOM将始终包含id=“result”的内容。可能是,但这并不能解决视图范围的托管bean的重新创建问题。这样一来,
{efinduster.responserdered}“
总是被解析为false。非常感谢您的解决方案!正如您所说,只需指出第一个面板组将始终生成一个
(如果第二个面板组的呈现属性为false,则无效)但对我来说不起作用。可能是因为我在使用CDI。是的!就是这样。CDI没有查看范围。结合Alexandre Lavoie的回答,我让它起作用了,谢谢。
<h:form>
<h:commandButton value="Render!" >
<f:ajax render=":result" listener="#{eFindUser.findUser}" />
</h:commandButton>
</h:form>
<h:panelGroup id="result">
<h:panelGroup layout="block" rendered="#{eFindUser.responseRendered}" >
This is some text that is supposed to be rendered later
</h:panelGroup>
</h:panelGroup>