【问题标题】:JSF ViewState not updated when submitting 2 forms提交 2 个表单时 JSF ViewState 未更新
【发布时间】:2013-01-17 08:02:38
【问题描述】:

我在使用 JSF 2 时遇到了一个问题。我将 Mojarra 2.1.14 与 Primefaces 3.1.4 一起使用

我有一个包含 2 个表单的页面:formAformB。这两个表单在隐藏的输入字段中分别包含 ViewState。

<h:form id="formA" binding="#{sessionBean.formA}">
    <h:commandButton value="formA" action="#{sessionBean.actionA}">
        <f:ajax/>
    </h:commandButton>
</h:form>

<h:form id="formB" binding="#{sessionBean.formB}">
    <h:commandButton value="formB" action="#{sessionBean.actionB}">
        <f:ajax/>
    </h:commandButton>
</h:form>

用户使用 Ajax 操作提交 formA。在 Java 操作中,我显式更新了 formAformB(已绑定)。

public void actionA(){
    FacesContext.getCurrentInstance().getPartialViewContext().getRenderIds().add(formA.getClientId());
    FacesContext.getCurrentInstance().getPartialViewContext().getRenderIds().add(formB.getClientId());
    System.out.println("action A!!");
}

public void actionB(){
    System.out.println("action B!!");
}

在 Ajax 响应中有 formAformB(元素)和 ViewState 的 HTML 代码。

JSF更新formAformB的HTML,并设置调用表单的ViewState:formAformB 不包含任何 ViewState。

用户使用 Ajax 操作提交 formB。因为未定义 ViewState,所以 postBack 为 false,并且在 RESTORE 阶段将 renderResponse 设置为 true,跳过了 INVOKE APPLICATION 阶段:未调用该操作。响应 VIEW_STATE 更新后,如果用户提交 formB,则调用该操作。

这是 JSF 2 的错误还是限制?还是我做错了什么?

你可以在 GitHub 上找到一个 maven 项目: https://github.com/nithril/jsf-multiple-form

提前感谢您的帮助!

【问题讨论】:

  • 你能贴出这两个表单的代码,并用 AJAX 更新属性吗?
  • 我即将完成一个小型 maven 项目
  • 尝试在f:ajax标签内显式添加render=":formB"
  • 它有效,但我还不明白为什么它与 getRenderIds().add(formB.getClientId()); 不同事实上,这两种形式都在 2 个 xhtml 文件片段中,彼此看不到。只有父组件可以看到 2 个表单。

标签: jsf-2 primefaces mojarra


【解决方案1】:

您面临的问题与 JSF JavaScript 库的已知问题有关。解决方法是在f:ajax 标签的rendered 属性中显式设置另一个表单的客户端ID:

<h:form id="formA" binding="#{sessionBean.formA}">
  <h:commandButton value="formA" action="#{sessionBean.actionA}">
    <f:ajax render=":formB @form"/>
  </h:commandButton>
</h:form>

<h:form id="formB" binding="#{sessionBean.formB}">
  <h:commandButton value="formB" action="#{sessionBean.actionB}">
    <f:ajax render=":formA @form"/>
  </h:commandButton>
</h:form>

更多信息:

【讨论】:

  • 感谢您的回答。这 2 个 xhtml 表单是松散耦合的。可悲的是,要纠正这个问题,我必须将两者紧密结合。
  • 在第一个链接上有一个 JavaScript 代码可以解决这个问题,也许你应该先尝试一下。您正在使用 primefaces,所以它应该可以工作。了解可能可行的 BalusC 方法。
  • 我已经测试了 BalusC 脚本并且它可以工作。我使用 primefaces,但它不能纠正使用 Java 刷新组件的情况
【解决方案2】:

如果您使用 MyFaces 2.0.x / 2.1.x,还有一个替代技巧可以正确更新表单,添加以下脚本:

window.myfaces = window.myfaces || {};
myfaces.config = myfaces.config || {};
//set the config part
myfaces.config.no_portlet_env = true; 

JSF Ajax and Multiple Forms

此选项要好得多,因为您无需担心修复 web 应用程序中使用多个表单的每个地方,只需将其添加到主模板即可。

【讨论】:

  • 感谢您的信息。我应该试试 myfaces
猜你喜欢
  • 1970-01-01
  • 2012-02-17
  • 2011-03-24
  • 1970-01-01
  • 1970-01-01
  • 2017-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多