我有这个页面:
<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>
使用这个bean:
@ViewScoped
@ManagedBean(name = "testBean")
public class TestBean implements Serializable {
public TestBean() {
someString = "initValue";
}
private String someString;
public String getSomeString() {
return someString;
}
public void setSomeString(String someString) {
this.someString = someString;
}
public void edit(String value) {
someString = value;
}
}
现在,如果我单击弹出窗口中的按钮,我将获得正确的值(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>
以及richfaces 4.0.0.Final和GlassFish Server Open Source Edition 3.1.2(build 23)
同一页面的另一种变体(添加了onhide和onshow方法)
<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>
如果您尝试打开和关闭弹出窗口,则会显示这些警报:
所以它看起来像a4j:ajax从弹出窗口上的方法获取其他地方的值? 它是ViewState问题吗?有两个隐藏的javax.faces.ViewState字段具有相同的id和不同的值。它们是代表整个视图的状态还是仅包含它们的形式?如果整个视图这两个字段应该具有相同的值,并且可能是a4j:ajax从第一个表单查看未更新的视图状态是可能的? 关于如何处理视图状态以及它代表什么的资源的任何链接都很棒(即使视图状态不是这里的情况)
答案 0 :(得分:1)
您可以尝试使用相同的表单和a4j:region
来分隔不同的表单,因为jsf不喜欢更新其他表单,因为它们的状态未被发送到服务器
当您使用sessionScope
时,状态会保存在服务器中,但这不是真正的网络应用程序的最佳解决方案