jsf 响应客户端的ajax,了解PrimeFaces进程/更新和JSF f:ajax执行/呈现属性

BalusC..

284

该process属性是服务器端,只能影响UIComponent实现EditableValueHolder(输入字段)或ActionSource(命令字段).该process属性告诉JSF,使用以空格分隔的客户端ID列表,在(部分)表单提交时,必须通过整个JSF生命周期处理哪些组件.

然后,JSF将应用请求值(根据组件自己的客户端ID查找HTTP请求参数,然后在EditableValueHolder组件情况下将其设置为提交值,或者ActionEvent在ActionSource组件情况下将新值排队),执行转换,验证和更新模型值(EditableValueHolder仅限组件)并最终调用排队ActionEvent(ActionSource仅限组件).JSF将跳过处理process属性未涵盖的所有其他组件.此外,作为防止篡改请求的一部分,还将跳过在应用请求值阶段期间rendered属性求false值的组件.

请注意,在ActionSource组件(例如)非常重要的情况下,您还要在组件中包含组件本身process,特别是如果您打算调用与组件关联的操作.所以下面的例子打算在调用某个命令组件时只处理某些输入组件是不行的:

它只会处理#{bean.foo}而不是处理#{bean.action}.您还需要包含命令组件本身:

或者,正如您明显发现的那样,使用@parent它们恰好是具有共同父级的唯一组件:

或者,如果它们碰巧是父UIForm组件的唯一组件,那么您还可以使用@form:

如果表单包含您希望在处理过程中跳过的更多输入组件,有时会出现这种情况,这通常比您希望根据当前输入组件更新其他输入组件或某些UI部分更常见.一个ajax监听器方法.您不希望其他输入组件上的验证错误阻止执行ajax侦听器方法.

那就是了@all.这在process属性中没有特殊效果,但仅在update属性中有效.A process="@all"表现完全相同process="@form".HTML不支持同时提交多个表单.

这里顺便也一个很@none可能是在情况下,你完全不需要处理任何有用的东西,但只是想更新通过一些特定的部位update,特别是那些部分,其内容不依赖于提交的值或动作监听器.

注意应该是该process属性对HTTP请求有效负载(请求参数的数量)没有影响.这意味着,发送HTML表示中包含的"所有内容"的默认HTML行为

将不会受到影响.如果您有一个大型表单,并且希望将HTTP请求有效负载减少到只有处理中绝对必要的那些,即只有process属性覆盖的那些,那么您可以partialSubmit在或中设置PrimeFaces Ajax组件中的属性.或者,您也可以使用默认为此行为的OmniFaces 3.0+.

JSF的同等标准的PrimeFaces具体process是execute从.它的行为完全相同,只是它不支持逗号分隔的字符串而PrimeFaces字符串(虽然我个人建议只是坚持空格分隔的约定),也不支持@parent关键字.此外,知道默认为@formwhile 和默认值可能很有用@this.最后,了解process支持所谓的"PrimeFaces选择器" 也很有用,另请参阅更新="@(.myClass)"中的PrimeFaces选择器如何工作?

该update属性是客户端,可以影响所有UIComponents 的HTML表示.该update属性告诉JavaScript(负责处理ajax请求/响应的人),使用空格分隔的客户端ID列表,HTML DOM树中的哪些部分需要更新为对表单提交的响应.

然后,JSF将为此准备正确的ajax响应,仅包含要更新的请求部分.JSF将跳过updateajax响应中属性未涵盖的所有其他组件,从而保持响应有效负载较小.此外,将跳过在呈现响应阶段期间rendered属性求值的组件false.请注意,即使它会返回true,但如果最初是JavaScript,则无法在HTML DOM树中更新它false.您需要将其换行或更新其父级.另请参见Ajax update/render不适用于具有呈现属性的组件.

通常,您只想在(部分)表单提交时更新客户端中真正需要"刷新" 的组件.以下示例通过以下方式更新整个父表单@form:

(注意,process省略属性,因为默认属性@form)

虽然这可能工作正常,但输入和命令组件的更新在此特定示例中是不必要的.除非您更改模型值foo和bar内部action方法(在UX透视图中反过来又不直观),否则无法更新它们.消息组件是唯一真正需要更新的组件:

然而,当你有很多这样的时候,这会变得乏味.这就是PrimeFaces选择器存在的原因之一.这些消息组件在生成的HTML输出中有一个共同的样式类ui-message,因此以下内容也应如下:

(请注意,您应该在消息组件上保留ID,否则@(...)将无法工作!再次,请参阅如何更新PrimeFaces选择器="@(.myClass)"工作?了解详细信息)

该@parent更新只父组件,因此其覆盖电流分量和所有的兄弟姐妹和他们的孩子.如果您将表单中的表单与每个自己的职责分开,这将更有用.该@this更新,显然,只有电流分量.通常,仅当您需要在操作方法中更改组件自己的HTML属性之一时,才需要这样做.例如

oncomplete="doSomething('#{bean.value}')" />

想象一下,如果组件没有更新,那么oncomplete需要使用value更改的组件action,那么这个构造就不会有效,原因oncomplete很简单,因为它是生成的HTML输出的一部分(因此评估了所有EL表达式)在渲染响应期间).

该@all更新整个文档,应小心使用.通常,您希望使用真正的GET请求,而不是通过普通链接(或

JSF的同等标准的PrimeFaces具体update是render从.它的行为完全相同,只是它不支持逗号分隔的字符串而PrimeFaces字符串(虽然我个人建议只是坚持空格分隔的约定),也不支持@parent关键字.双方update并render默认为@none(这是"无").

也可以看看:

@Rapster:因为`process`没有设置,所以它使用`@ form`的默认值.这也在上面的答案中解释. (2认同)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值