7

目前我们正在尝试从 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(其后继者a4j:support与richfaces 3.3.3一起使用)和基于rich:commandButton. 当我用本机 jsf 的表单替换它们时,f:ajax似乎正确刷新了它们。但是外部 div 的问题仍然存在

4

1 回答 1

6

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

要解决此问题,您需要在 ajax /属性旁边显式包含其他表单的 ID,无论何时从另一个表单调用它。renderupdateouterDiv

例如

<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 准备和保存其他表单的状态。

也可以看看:

于 2012-04-05T17:29:25.707 回答