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

Posted

技术标签:

【中文标题】如何在 JSF 2.0 中使用表单重新呈现页面的一部分?【英文标题】:How to rerender part of page with form in JSF 2.0? 【发布时间】:2012-04-19 08:15:19 【问题描述】:

目前我们正在尝试从 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 中一样使用 1-st 方法正确更新页面的一部分?


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

【问题讨论】:

【参考方案1】:

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

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

例如

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

另见:

Communication in JSF 2.0 - Ajax rendering of content which contains another form

【讨论】:

但在这种情况下,我想如果它不包含表单之外的任何信息,我根本不需要重新渲染outerDiv。问题就像我说这些表格在很多情况下都在其他文件中,所以我总是需要检查哪个 ui:include 包含哪个表格。这不是很方便:在 JSF 1.2 中,我只能重新渲染位于同一页面上的外部 div。是 JSF 2 的错误还是功能? :) 我的意思是它会被修复还是我只需要接受它? 它将在 JSF 2.2 中修复。另见第 790 期。

以上是关于如何在 JSF 2.0 中使用表单重新呈现页面的一部分?的主要内容,如果未能解决你的问题,请参考以下文章

JSF 2.0在bean(或页面?)之间传递数据

JSF 2.0;我的脸;仅使用 POST 提交表单

JSF 2.0将动态表单保存到数据库[重复]

JSF 2.0 无法从 primefaces 呈现对话框

如何在页面呈现期间测试是不是存在 JSF 导航案例

如何(以及何时?)在 JSF 2.0 中删除 Session 范围的 bean