我一直在努力解决这个问题,我希望有人可以帮助我。
我有这个代码使用JSF-2(取自BalusC在this question中给出的解决方案):
<h:panelGroup id="content" layout="block">
<h:form id="contentform">
<h:panelGroup rendered="#{bean.page == 'include1'}">
<ui:include src="include1.xhtml" />
</h:panelGroup>
<h:panelGroup rendered="#{bean.page == 'include2'}">
<ui:include src="include2.xhtml" />
</h:panelGroup>
<h:panelGroup rendered="#{bean.page == 'include3'}">
<ui:include src="include3.xhtml" />
</h:panelGroup>
</h:form>
</h:panelGroup>
然后,在包含的每个页面中,我有类似的东西(也在工作):
<h:outputText value="Name: "/>
<h:inputText value="#{itemsBean.item.name}" id="name" required="#{not empty param[save.clientId]}"/>
<h:outputText value="Desc: "/>
<h:inputText value="#{itemsBean.item.description}" id="desc" required="#{not empty param[save.clientId]}"/>
<h:commandButton binding="#{save}" label="Save" actionListener="#{itemsBean.save}">
<f:ajax render=":contentForm" execute="name desc"
</h:commandButton>
<h:dataTable value="#{itemsBean.itemsList}" var="item">
<h:column>
<h:outputText value="#{item.name}" />
</h:column>
<h:column>
<h:outputText value="#{item.description}" />
</h:column>
</h:dataTable>
现在问题。
它开始于我尝试将PrimeFaces用于包含页面时,特别是当我将<h:commandButton...
替换为:
<p:commandButton binding="#{save}" value="Save" actionListener="#{itemsBean.save}">
<p:ajax update=":contentForm" process="name desc" />
</p:commandButton>
结果是表单被多次提交,甚至来自其他包含(未呈现)页面的输入字段也被处理(完全混乱)。
我正在使用:
JSF 2.1.1 Mojarra实施。
PrimeFaces 3.0-RC2。
Tomcat 7.
(Tomcat和JSF是NetBeans 7.0.1附带的那些)
提前谢谢。
答案 0 :(得分:1)
在p:commandButton
上为什么您同时使用binding
和actionListener
属性?顺便说一下,#{save}
是什么?你的意思是#{itemsBeans.save}
?
无论您是在托管bean的save方法中设置actionListener,也不应该绑定它。删除绑定属性,看看是否可以防止多次回发。
答案 1 :(得分:0)
我必须在每个相应的页面中替换binding="#{save}"
,例如binding="#{savePage1}"
,binding="#{savePage2}"
和binding="#{savePage2}"
。
我遇到的另一个错误是<p:ajax...
,这导致了奇怪的行为。我有这个:
<p:ajax update=":contentForm" process="name desc" />
应该是这样的:
<p:ajax update=":contentForm" process="@this name desc" />
"@this"
<f:ajax execute="..
答案 2 :(得分:0)
默认情况下,primefaces启用了ajax。所以你不需要指定
<p:commandButton value="Save"
update="@form"
process="@this,name,desc"
actionListener="#{itemBean.save}" />
2)“@ this”是必须的。它必须处理commandButton单击。 3)使用prependId =“false”。这将使您能够将process属性中的控件名称指定为实际控件名称,即name,desc,否则您必须在控件的前面指定表单名称,如 contentFrom:姓名,contentForm:降序
Update = @form表示它将在执行后呈现完整的表单。
希望这能解决问题。