了解PrimeFaces进程/更新和JSF:ajax执行/呈现属性

了解PrimeFaces进程/更新和JSF:ajax执行/呈现属性,jsf,primefaces,process,updates,Jsf,Primefaces,Process,Updates,在PrimeFacesp:commandXxx组件和execute和render标签中,什么是process和update 哪些在验证时有效?update属性做什么,而不是从后端将值更新到组件?是否处理属性将值绑定到模型?在这两个属性中,@this、@parent、@all和@form究竟是什么 下面的示例运行良好,但我对基本概念有点困惑 <p:commandButton process="@parent" update="@form"

在PrimeFaces
p:commandXxx
组件和
execute
render
标签中,什么是
process
update

哪些在验证时有效?
update
属性做什么,而不是从后端将值更新到组件?
是否处理
属性将值绑定到模型?在这两个属性中,
@this
@parent
@all
@form
究竟是什么

下面的示例运行良好,但我对基本概念有点困惑

<p:commandButton process="@parent"
                 update="@form"
                 action="#{bean.submit}" 
                 value="Submit" />

通过进程(在JSF规范中称为execute),您告诉JSF将处理限制在指定的组件上,其他任何事情都被忽略

更新指示服务器响应您的请求时将更新的元素

@all:处理/渲染每个组件

@此:处理/呈现具有execute属性的请求组件

@form:处理/呈现包含请求组件的表单

@parent:处理/呈现包含请求组件的父级

有了Primefaces,您甚至可以使用JQuery选择器,查看这个博客:

通过进程(在JSF规范中称为执行),您告诉JSF将处理限制在指定的组件上,其他任何事情都被忽略

更新指示服务器响应您的请求时将更新的元素

@all:处理/渲染每个组件

@此:处理/呈现具有execute属性的请求组件

@form:处理/呈现包含请求组件的表单

@parent:处理/呈现包含请求组件的父级

使用Primefaces,您甚至可以使用JQuery选择器,请查看以下博客:

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

JSF随后将应用请求值(根据组件自己的客户端ID查找HTTP请求参数,然后在
EditableValueHolder
组件的情况下将其设置为提交值,或者在
ActionSource
组件的情况下将新参数排队),执行转换、验证和更新模型值(
EditableValueHolder
仅组件)并最终调用排队的
ActionEvent
ActionSource
仅组件).JSF将跳过
进程
属性未涵盖的所有其他组件的处理。此外,在应用请求值阶段,如果
呈现
属性的计算结果为
,则作为防止篡改请求的一部分,也将跳过这些组件

请注意,对于
ActionSource
组件(如
)而言,将组件本身包含在
过程
属性中非常重要,特别是如果您打算调用与组件关联的操作。下面的示例只打算处理某些输入组件当调用某个命令组件时,该组件将无法工作:

<p:inputText id="foo" value="#{bean.foo}" />
<p:commandButton process="foo" action="#{bean.action}" />
或者,正如您明显发现的,如果它们恰好是唯一具有公共父级的组件,则使用
@parent

<p:panel><!-- Type doesn't matter, as long as it's a common parent. -->
    <p:inputText id="foo" value="#{bean.foo}" />
    <p:commandButton process="@parent" action="#{bean.action}" />
</p:panel>
如果表单包含更多您希望在处理过程中跳过的输入组件,这有时是不可取的,在您希望更新另一个输入组件的情况下更是如此或者基于ajax侦听器方法中当前输入组件的某个UI部分。您不希望其他输入组件上的验证错误阻止ajax侦听器方法的执行

然后是
@all
。这在
过程
属性中没有特殊效果,但只在
更新
属性中有特殊效果。
过程=“@all”
的行为与
过程=“@form”
完全相同。HTML无论如何都不支持同时提交多个表单

顺便说一下,还有一个
@none
,如果您完全不需要处理任何内容,而只想通过
update
更新某些特定部分,尤其是那些内容不依赖于提交的值或操作侦听器的部分,它可能会很有用

需要注意的是,
process
属性对HTTP请求负载(请求参数的数量)没有影响。这意味着发送“一切”的默认HTML行为包含在
的HTML表示中的内容不会受到影响。如果您有一个大型表单,并且希望将HTTP请求负载减少到处理过程中绝对必需的内容,即只有
进程
属性所涵盖的内容,那么您可以在PrimeFaces Ajax中设置
partialSubmit
属性组件,如
中所示。您还可以通过编辑
web.xml
并添加

<context-param>
    <param-name>primefaces.SUBMIT</param-name>
    <param-value>partial</param-value>
</context-param>
(请注意,
process
属性被省略,因为该属性已默认为
@form

虽然这可能很好,但在这个特定示例中,输入和命令组件的更新是不必要的。除非您在
操作
方法中更改模型值
foo
bar
(这反过来在UX透视图中是不直观的),否则更新它们是没有意义的
<h:form>
    <p:inputText id="foo" value="#{bean.foo}" />
    <p:commandButton process="@form" action="#{bean.action}" />
</h:form>
<context-param>
    <param-name>primefaces.SUBMIT</param-name>
    <param-value>partial</param-value>
</context-param>
<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>
<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>
<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>
<p:commandButton action="#{bean.action}" update="@this" 
    oncomplete="doSomething('#{bean.value}')" />
process="@(.myClass :input)"