Richfaces使用a4j:ajax的多个表单

时间:2012-09-18 09:02:49

标签: 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"
                            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>

如果您尝试打开和关闭弹出窗口,则会显示这些警报:

  1. &#34;来自节目后#Edit&#34;
  2. &#34;显示完整的initValue&#34;
  3. &#34;来自onEdit&#34;
  4. &#34;隐藏完整的initValue&#34;
  5. 所以它看起来像a4j:ajax从弹出窗口上的方法获取其他地方的值? 它是ViewState问题吗?有两个隐藏的javax.faces.ViewState字段具有相同的id和不同的值。它们是代表整个视图的状态还是仅包含它们的形式?如果整个视图这两个字段应该具有相同的值,并且可能是a4j:ajax从第一个表单查看未更新的视图状态是可能的? 关于如何处理视图状态以及它代表什么的资源的任何链接都很棒(即使视图状态不是这里的情况)

1 个答案:

答案 0 :(得分:1)

您可以尝试使用相同的表单和a4j:region来分隔不同的表单,因为jsf不喜欢更新其他表单,因为它们的状态未被发送到服务器 当您使用sessionScope时,状态会保存在服务器中,但这不是真正的网络应用程序的最佳解决方案