关于primeface的process、updata属性总结

关于primeface的process、updata属性总结

process=“@all”->提交时对页面内所有组件进行验证
process=“@form” -> 对提交的整改表单进行验证。
process=“@this” ->提交时仅对当前控件验证
process=“@none”->不进行验证
process=“@parent”->提交时对其父组件下的所有组件进行验证

process属性作用于服务端,其属性值只会影响实现了EditableValueHolder(input这类标签)或ActionSource(command这类标签)接口的UIComponent。通过使用空格分隔的client ID列表,process属性告诉JSF,在表单提交时,具体是哪个组件必须在JSF的生命周期中被处理。

JSF将会应用请求值(通过组件自己的client ID查找HTTP请求的参数,如果组件是实现了EditableValueHolder接口的话,将会其设置其为提交的值,如果是实现了ActionSource接口的话,则会将一个新的ActionEvent加入事件队列),转换、验证和更新模型的值(只针对实现了EditableValueHolder接口的组件),最后触发队列中的ActionEvent(只针对实现了ActionSource接口的组件)。JSF会跳过处理所有其它没有被process属性包含的组件。并且,作为一种对付请求篡改的防护措施,rendered属性为false的组件在应用请求值阶段也会被跳过。

注意了,对于ActionSource组件(比如<p:commandButton>),将组件自身包含进process属性,这非常重要的,特别是当你想要触发和此组件相关的行为时。因此,下面的例子,想要在command组件触发时只处理input组件,这将不会成功。

<p:inputText id="foo" value="#{bean.foo}" />
<p:commandButton process="foo" action="#{bean.action}" />

只会执行#{bean.fool},而不会执行#{bean.action},你需要把command组件自己也包含进process中:

<p:inputText id="foo" value="#{bean.foo}" />
<p:commandButton process="@this foo" action="#{bean.action}" />

或者,正如你之前发现的,如果这两个组件拥有唯一的父组件,可以使用@parent:

<p:panel><!-- 是什么组件无关紧要,只要是个公共的父组件. -->
    <p:inputText id="foo" value="#{bean.foo}" />
    <p:commandButton process="@parent" action="#{bean.action}" />
</p:panel>

亦或者,如果公共父组件是一个UIForm 组件,那么你就可以使用@form:

<h:form>
    <p:inputText id="foo" value="#{bean.foo}" />
    <p:commandButton process="@form" action="#{bean.action}" />
</h:form>

在标准JSF中,与PrimeFaces中process等同的属性为<f:ajax excute>的excute属性。它们效果完全相同,但是execute不支持以逗号分隔的字符串,而PrimeFaces的process支持(仅管我个人推荐遵守空格分隔的惯例),execute也无法使用@parent关键字。并且,<p:commandXxx process> 缺省情况下为@form,<p:ajax process> 和<f:ajax execute> 缺省为@this。最后,process还支持所谓的PrimeFaces选择器,可参考:https://stackoverflow.com/questions/20080861/how-do-primefaces-selectors-as-in-update-myclass-work

update属性作用于客户端,其属性值会影响HTML显示的所有UIComponents。通过使用空格分隔的client ID列表,update属性告诉JavaScript(负责处理ajax的请求/响应)HTML DOM树的哪些部分需要被更新以响应表单的提交。

然后JSF将为其准备正确的ajax响应,其中仅仅包含被要求更新的部分。 JSF会跳过处理所有其它在ajax响应中没有被update属性包含的组件,通过这种方式,来将响应的负荷保持在一个较低的水平。在渲染响应阶段中rendered属性为false的组件在应用请求值阶段也会被跳过。 注意,就算rendered将来会为true,但如果最初是false的话,JavaScript也不会在HTML DOM树中更新此组件。 你需要将其包装一下或者更新其父组件。可参考:https://stackoverflow.com/questions/14790014

通常情况下,你只想在客户端表单提交时更新那些真正需要被“刷新”的组件。下面的例子通过使用@form更新了整个form父组件:

<h:form>
    <p:inputText id="foo" value="#{bean.foo}" required="true" />
    <p:message id="foo_m" for="foo" />
    <p:inputText id="bar" value="#{bean.bar}" required="true" />
    <p:message id="bar_m" for="bar" />
    <p:commandButton action="#{bean.action}" update="@form" />
</h:form>

(注意process属性忽略不写,因为这样缺省为@form)
尽管这可以良好的运行,但是input和command组件的更新在此例中却是没有必要的。除非你想要在action方法中改变模型的值foo和bar,否则更新毫无意义。只有message组件才是真正需要被更新的:

<h:form>
    <p:inputText id="foo" value="#{bean.foo}" required="true" />
    <p:message id="foo_m" for="foo" />
    <p:inputText id="bar" value="#{bean.bar}" required="true" />
    <p:message id="bar_m" for="bar" />
    <p:commandButton action="#{bean.action}" update="foo_m bar_m" />
</h:form>

但是,如果要更新的组件很多的话,这么写会变得很冗长。于是PrimeFaces选择器应运而生。这些message组件在生成的HTML中有一个公共的样式类ui-message。下面也应该这么做:

<h:form>
    <p:inputText id="foo" value="#{bean.foo}" required="true" />
    <p:message id="foo_m" for="foo" />
    <p:inputText id="bar" value="#{bean.bar}" required="true" />
    <p:message id="bar_m" for="bar" />
    <p:commandButton action="#{bean.action}" update="@(.ui-message)" />
</h:form>

@parent只更新其父组件,如此一来就包含了当前组件、同级组件和其下的子组件。按照@…的职责将其明确分类会更加合理。 @this,不必多说,只更新当前的组件。正常情况下,只有当你需要在action方法中改变一个组件自身的HTML属性时,@this才会发挥效用。 eg:

<p:commandButton action="#{bean.action}" update="@this" 
    oncomplete="doSomething('#{bean.value}')" />

想象一下,oncomplete属性需要配合value属性,而value又会在action中被改变,如果当前所在组件不被更新的话,oncomplete就不会执行,原因很简单,oncomplete属性是生成的HTML的一部分(如此一来,其中所有的EL表达式都是在渲染响应阶段求值的)

@all更新整个文件,使用需谨慎。一般工作中很少用到。

在标准JSF中,与PrimeFaces中update等同的属性为<f:ajax render>的render属性。它们效果完全相同,但是render不支持以逗号分隔的字符串,而PrimeFaces的update支持(仅管我个人推荐遵守空格分隔的惯例),render也无法使用@parent关键字。update和render属性都缺省为@none

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值