下面的例子很好用,但是我在基本概念上有点混乱。
<p:commandButton process="@parent"
update="@form"
action="#{bean.submit}"
value="Submit" />
process
属性是服务器端的,只能影响UIComponent
实现EditableValueHolder
(输入字段)或ActionSource
(命令字段)。process
属性使用一个以空格分隔的客户机ID列表告诉JSF,在(部分)表单提交时,在整个JSF生命周期中必须准确地处理哪些组件。
然后,JSF将应用请求值(根据组件自己的客户端ID查找HTTP请求参数,然后在EditableValueHolder
组件的情况下将其设置为提交值,或者在ActionSource
组件的情况下将新的ActionEvent
排队),执行转换、验证和更新模型值(仅限EditableValueHolder
组件),最后调用排队的ActionEvent
(仅限ActionSource
组件)。JSF将跳过process
属性未覆盖的所有其他组件的处理。此外,在应用请求值阶段,其rendered
属性计算结果为false
的组件也将被跳过,作为防止被篡改请求的保护措施的一部分。
请注意,对于ActionSource
组件(如
)来说,在process
属性中包含组件本身非常重要,特别是如果您打算调用与组件关联的操作。因此,下面的示例在调用某个命令组件时只处理某个输入组件是行不通的:
<p:inputText id="foo" value="#{bean.foo}" />
<p:commandButton process="foo" action="#{bean.action}" />
它将只处理#{bean.foo}
而不处理#{bean.action}
。您还需要包含命令组件本身:
<p:inputText id="foo" value="#{bean.foo}" />
<p:commandButton process="@this 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>
或者,如果它们碰巧都是父UIForm
组件的唯一组件,那么您也可以使用@form
:
<h:form>
<p:inputText id="foo" value="#{bean.foo}" />
<p:commandButton process="@form" action="#{bean.action}" />
</h:form>
如果表单包含更多的输入组件,而您希望在处理过程中跳过这些组件,这有时是不希望的,而当您希望根据ajax侦听器方法中的当前输入组件更新另一个输入组件或某个UI部分时,这种情况就更多了。也就是说,您不希望其他输入组件上的验证错误阻止ajax侦听器方法的执行。
然后是@all
。这在process
属性中没有特殊效果,而只在update
属性中有特殊效果。process=“@all”
的行为与process=“@form”
完全相同。HTML不支持同时提交多个表单。
顺便说一下,还有一个@none
,在您完全不需要处理任何内容,而只想通过update
更新某些特定部分的情况下,它可能很有用,特别是那些内容不依赖于提交的值或操作侦听器的部分。
需要注意的是,process
属性对HTTP请求有效负载(请求参数的数量)没有影响。也就是说,发送
的HTML表示形式中包含的“所有内容”的默认HTML行为不会受到影响。如果您有一个很大的表单,并且希望将HTTP请求负载减少到仅有处理中绝对必需的这些,即仅有process
属性覆盖的这些,那么您可以在PrimeFaces Ajax组件中设置PartialSubmit
属性,如
或
。您还可以通过编辑web.xml
并添加“全局”配置
<context-param>
<param-name>primefaces.SUBMIT</param-name>
<param-value>partial</param-value>
</context-param>
或者,您也可以使用OmniFaces 3.0+的
,它默认为此行为。
与PrimeFaces特定的进程
等效的标准JSF是
中的execute
。它的行为完全相同,只是它不支持逗号分隔的字符串,而PrimeFaces则支持(尽管我个人建议坚持空格分隔的惯例),也不支持@parent
关键字。此外,了解
默认为@form
而
和
默认为@this
可能是有用的。最后,了解process
支持所谓的“PrimeFaces选择器”也很有用,请参见update=“@(.MyClass)”中的PrimeFaces选择器如何工作?
update
属性是客户端的,可以影响所有UIComponent
的HTML表示形式。update
属性告诉JavaScript(负责处理ajax请求/响应的人),使用一个用空格分隔的客户机ID列表,需要更新HTML DOM树中的哪些部分作为对表单submit的响应。
然后,JSF将为此准备正确的ajax响应,只包含需要更新的部分。JSF将跳过ajax响应中update
属性未覆盖的所有其他组件,从而使响应负载保持较小。此外,在呈现响应阶段,其rendered
属性计算结果为false
的组件将被跳过。请注意,即使它返回true
,但如果它最初是false
,JavaScript也不能在HTML DOM树中更新它。您需要换行它或更新它的父级。另请参见Ajax update/render不能在具有rendered属性的组件上工作。
通常情况下,您只希望在提交(部分)表单时更新客户端中真正需要“刷新”的组件。下面的示例通过@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
)
虽然这可能工作良好,但在这个特定示例中,输入和命令组件的更新是不必要的。除非更改action
方法中的模型值foo
和bar
(这在UX透视图中是不直观的),否则更新它们是没有意义的。消息组件是唯一真正需要更新的:
<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选择器存在的原因之一。这些消息组件在生成的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属性之一时,才需要这样做。例如。
<p:commandButton action="#{bean.action}" update="@this"
oncomplete="doSomething('#{bean.value}')" />
假设oncomplete
需要与action
中更改的value
一起工作,那么如果组件没有更新,这个构造就不会工作,原因很简单,因为oncomplete
是生成的HTML输出的一部分(因此在呈现响应期间会计算其中的所有EL表达式)。
@all
更新整个文档,使用时应小心。通常,您希望使用true GET请求,而不是通过普通链接(或
)或通过?faces-redirect=true
或externalcontext#redirection()
执行post后的重定向。在效果方面,process=“@form”update=“@all”
与非Ajax(非部分)提交的效果完全相同。在我的整个JSF生涯中,我遇到的@all
唯一明智的用例是在ajax请求期间发生异常时完整地显示错误页面。另请参见处理AJAXified组件的JSF2.0异常的正确方法是什么?
我是一个初学者React开发人员,我对这个特定的代码片段有一个问题。 问题: 虽然我直接复制了虚拟数据的值并将其作为单独的子项呈现,但并不是所有的虚拟数据都被呈现 我特意选择使用useRef而不是useState,因为在用户添加或编辑他们想要的任何链接之后,我想将keyRef发送到NoSQL数据库;然而,当我使用useState()时,它给了我陈旧的状态问题,其中包含所有链接的数组没有不断更新。
我试图学习libGDX游戏开发的一些简单原则,并在下面的代码中获得了吸吮。我已经将更新和渲染的任务分开,但不太确定如何将它们放在一起。我所要做的就是绘制一个在屏幕上移动的简单矩形。我的代码如下所示。除了渲染,一切都正常。 使用的呈现方法:
我有一个primefaces,点击按钮就会弹出。当我更改订单列表中项目的顺序,并单击弹出窗口上的“保存订单”按钮时,我没有看到带有更改顺序的列表。我的密码- 在豆子里: 请告诉我代码可能有什么问题。
我有一个表单,其中包含所需的数据,我使用了以下代码: 在同一页面上有一个datatable,它包含我通过表单添加的对象(付款)。添加对象后,我使用以下代码对datable进行更新以添加新对象: 我遇到的问题是,当数据没有输入,我单击按钮,更新完成,表显示为空!但是,验证消息正确地显示为强制数据。 datatable是 我在CDI中使用,因为托管bean如下所示://import //类 }
我正在编写一组定制的PrimeFaces组件,使用PrimeFaces5.0,并在JBoss EAP6.2中运行。 null 2.2在myFaceStest.taglib.xml中,我定义了输入标记: 2.3在input.java(我的自定义组件)中,我执行以下操作: 2.4此组件的呈现器包含以下内容: 给定这种设置,为什么自定义组件不会呈现?我的jboss日志中没有任何内容,即使日志级别设置为d
除了项目的配置之外,我所做的没有比展示柜上说的更多。以下是我的设置摘要: > 我在Windows x64上使用Apache Tomcat 8.0.39 Firefox 50.0.2和Chrome版本55.0.2883.75m(64位)显示相同的结果(只有当前选定的图像可见) 我使用的是Java8 ,这些是项目的依赖项 这是我的backing bean: