加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 22:55:56 所属栏目:百科 来源:网络整理
导读:目前我们正试图从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 我的意思是,
目前我们正试图从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并没有做任何事情(无论是在每次通话中销毁先前还是在第一次通话时创建新的,然后什么都不做).只需重新渲染表单内的组件就可以解决这个问题,比如这样(更新innerDiv1和innerDiv2):

<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的后继:与richfaces 3.3.3一起使用的支持)和基于rich:commandButton的自定义按钮.当我用原生jsf的f替换它们时:ajax表单似乎正确刷新.但外部div的问题仍然存在

解决方法

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

要解决此问题,只要从另一个表单调用,就需要在outerDiv旁边的ajax render / update属性中显式包含其他表单的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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读