Jsf 2 使用a4j:ajax使用多种表单的Richfaces
我有这一页:Jsf 2 使用a4j:ajax使用多种表单的Richfaces,jsf-2,richfaces,Jsf 2,Richfaces,我有这一页: <h:head></h:head> <h:body> <h:form id="someForm"> Form is here </h:form> <h:form> <a4j:commandButton id="editButton" value="editSomeString"
<h:head></h:head>
<h:body>
<h:form id="someForm">
Form is here
</h:form>
<h:form>
<a4j:commandButton id="editButton" value="editSomeString"
execute="@this"
action="#{testBean.edit('afterEdit')}"
oncomplete="#{rich:component('editPanel')}.show()"
render="editPanel"/>
<rich:popupPanel modal="true" id="editPanel" autosized="true"
domElementAttachment="form">
<f:facet name="controls">
<a4j:ajax event="show" oncomplete="alert('#{testBean.someString}')" />
</f:facet>
Changed value is
#{testBean.someString}
</rich:popupPanel>
</h:form>
</h:body>
}
现在,如果我单击弹出窗口中的按钮,我将有正确的值(afterEdit),在警报框中有旧的值(initValue)。
若我删除了第一个表单(id=someForm)或者将bean范围更改为session,它就可以正常工作(警报框中显示的afterEdit值)。
知道发生了什么事吗
我将此依赖项用于jsf:
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>2.1.1-b04</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-impl</artifactId>
<version>2.1.1-b04</version>
<scope>compile</scope>
</dependency>
com.sun.faces
JSFAPI
2.1.1-b04
编译
com.sun.faces
jsf impl
2.1.1-b04
编译
以及richfaces 4.0.0.Final和GlassFish服务器开源版本3.1.2(构建23)
同一页面的另一个变体(添加了onhide和onshow方法)
表格在这里
更改的值为
#{testBean.someString}
如果您尝试打开和关闭弹出窗口,则会出现以下警报:
任何有关如何处理视图状态以及视图状态代表什么的参考资料链接都非常有用(即使视图状态在这里不是这样)您可以尝试使用相同的表单和
a4j:region
来分隔不同的表单,因为jsf不喜欢更新其他表单,因为它们的状态没有发送到服务器
当您使用
sessionScope
时,状态会保存在服务器中,这是可能的,但这不是真正web应用程序的最佳解决方案您可以尝试使用相同的表单和a4j:region
来分隔不同的表单,因为jsf不喜欢更新其他表单,因为它们的状态不会发送到服务器
当您使用
sessionScope
时,状态会保存在服务器中,这是可能的,但这不是真正web应用程序的最佳解决方案谢谢您的回答。我知道在区域中使用一个表单会很好,并且已经解决了这个问题。但我想知道到底是什么导致了这个问题。既然这两个表单彼此不交互(我尝试在a4j:ajax上添加render以确保不会重新提交第一个表单),为什么会发生这种情况?问题很简单,当表单提交到服务器时,它与他的组件id一起,使服务器获得表单的视图,即发送请求的表单,因此,如果您试图更新表单之外的值,它们将被忽略,一种解决方案是在命令按钮或链接的execute参数中包含另一个表单,但这些值将被发送到,另一种解决方案是使用JavaScription调用另一个表单中的点击按钮,我知道,这非常令人难过,我不止一次被迫使用javascript解决方案,但看起来没有其他方法,因为JSF2就是这样工作的,它计划使用一个表单。。。还有很多你会发现的美丽的东西你说“如果你试图更新表单之外的值…”。但我没有。在我的页面中,第一个表单什么也不做,第二个表单只更新自身的字段。或者我这里遗漏了什么?更改javax.faces.STATE\u SAVING\u方法以解决服务器问题。正如@rekiem87所写,这是一个国家储蓄问题。还在想办法。谢谢你的回答。我知道在区域中使用一个表单会很好,并且已经解决了这个问题。但我想知道到底是什么导致了这个问题。既然这两个表单彼此不交互(我尝试在a4j:ajax上添加render以确保不会重新提交第一个表单),为什么会发生这种情况?问题很简单,当表单提交到服务器时,它与他的组件id一起,使服务器获得表单的视图,即发送请求的表单,因此,如果您试图更新表单之外的值,它们将被忽略,一种解决方案是在命令按钮或链接的execute参数中包含另一个表单,但这些值将被发送到,另一种解决方案是使用JavaScription调用另一个表单中的点击按钮,我知道,这非常令人难过,我不止一次被迫使用javascript解决方案,但看起来没有其他方法,因为JSF2就是这样工作的,它计划使用一个表单。。。还有很多你会发现的美丽的东西你说“如果你试图更新表单之外的值…”。但我没有。在我的页面中,第一个表单什么也不做,第二个表单只更新自身的字段。或者我这里遗漏了什么?更改javax.faces.STATE\u SAVING\u方法以解决服务器问题。正如@rekiem87所写,这是一个国家储蓄问题。我还在想办法。
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>2.1.1-b04</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-impl</artifactId>
<version>2.1.1-b04</version>
<scope>compile</scope>
</dependency>
<h:head></h:head>
<h:body>
<h:form id="someForm">
Form is here
</h:form>
<h:form>
<a4j:commandButton id="editButton" value="go"
execute="@this"
action="#{testBean.edit('afterEdit')}"
oncomplete="#{rich:component('editPanel')}.show()"
render="editPanel,y"/>
<rich:popupPanel modal="true" id="editPanel" autosized="true"
styleClass="taskEditPanel" domElementAttachment="form" onhide="alert('from on hide #{testBean.someString}')" onshow="alert('from on show #{testBean.someString}')">
<f:facet name="controls">
<a4j:ajax event="show" oncomplete="alert('show complete #{testBean.someString}')" />
<a4j:ajax event="hide" oncomplete="alert('hide complete #{testBean.someString}')"/>
</f:facet>
Changed value is
#{testBean.someString}
<a4j:commandButton id="exitButton" value="exit"
execute="@this"
oncomplete="#{rich:component('editPanel')}.hide()"
/>
</rich:popupPanel>
</h:form>
</h:body>