如何在JSF 2.0中使用表单重新呈现页面的一部分?

时间:2012-04-05 15:06:16

标签: ajax forms jsf-2 richfaces

目前我们正在尝试从JSF 1.2迁移到JSF 2.0,我们面临的一个问题是,不可能重新呈现包含表单的页面的一部分。像这样(重新呈现outerDiv或形成自己):

<h:panelGroup id="outerDiv">
    <h:form id="form1">...</h:form>
    <h:form id="form2">...</h:form>
</h:panelGroup>

我的意思是如果我更新outerDiv所有内容都会更新,但表单(或表单)本身会被破坏并且行为异常,至少ajax调用要么在第一次触发时不起作用,要么不是调用某些bean的方法他们创建该bean的新实例并且什么都不做(要么在每次调用时销毁先前的,要么在第一次调用时创建新的然后什么都不做)。只需重新呈现表单中的组件即可解决此问题,例如(更新innerDiv1innerDiv2):

<h:panelGroup id="outerDiv">
   <h:form id="form1">
       <h:panelGroup id="innerDiv1">...</h:panelGroup>
   </h:form>
   <h:form id="form2">
       <h:panelGroup id="innerDiv2">...</h:panelGroup>
   </h:form>
</h:panelGroup>

但是我们在很多地方都包含了一些ui:include的页面,查看该页面并更新某些组件并不是很方便。此外,我们必须修改所有这些页面,因为它们中的许多页面内部没有共同的包装div,并且单独更新每个组件将非常麻烦且容易出错。
那么,是否有可能使JSF 2.0正确地更新页面的一部分,就像在JSF 1.2中一样?


编辑:表单渲染的问题看起来像richfaces 4.2问题,因为我使用a4j:ajax(与richfaces 3.3.3一起使用的a4j:support的后继者)和基于{{1的自定义按钮}}。当我用原生jsf替换它们时,rich:commandButton形式似乎正确刷新。但外部div的问题仍然是实际的

1 个答案:

答案 0 :(得分:5)

这与部分状态保存有关。如果你ajax更新一个组件,而该组件又包含一个表单作为其子项之一,那么它的视图状态将会丢失。该表单中的每个第一个ajax请求都将失败,因为没有视图状态。但是,如果该ajax请求重新呈现表单本身,那么它将起作用。

要解决此问题,您需要明确render旁边的ajax update / outerDiv属性中包含其他表单的ID它是从另一个形式调用的。

E.g。

<h:form>
    <h:commandButton value="Update other forms">
        <f:ajax render="outerDiv form1 form2" />
    </h:commandButton>
</h:form>
<h:panelGroup id="outerDiv">
    <h:form id="form1">...</h:form>
    <h:form id="form2">...</h:form>
</h:panelGroup>

不,这不会导致重复组件的ajax响应。它只会触发JSF准备并保存其他表单的状态。

另见: