何时使用 preRenderView 与 viewAction?
Posted
技术标签:
【中文标题】何时使用 preRenderView 与 viewAction?【英文标题】:When to use preRenderView versus viewAction? 【发布时间】:2014-08-20 19:49:43 【问题描述】:什么时候应该使用 preRenderView 事件来初始化页面的数据而不是使用 viewAction?它们在使用上是否相同,是否具有相同的效果?
preRenderView 事件
<f:metadata>
<f:event type="preRenderView" listener="#myBean.initialize"/>
</f:metadata>
或
viewAction
<f:metadata>
<f:viewAction action="#myBean.initialize"/>
</f:metadata>
【问题讨论】:
【参考方案1】:在实践中,它们可以用来实现相同的效果,但viewAction
(JSF2.2 的新功能)具有以下增强功能:
onPostback
:viewAction
带有此属性,允许您指定是否希望在回发到同一视图时执行操作(即在页面刷新或按钮提交时)等等)。它默认为false
,因此如果不需要,您甚至不必指定它。要达到与preRenderView
相同的效果,您需要
<f:metadata>
<f:event type="preRenderView" rendered="#facesContext.postBack" listener="#myBean.initialize"/>
</f:metadata>
phase
:此属性允许您指定在特定 JSF 阶段执行的操作。默认为 INVOKE_APPLICATION
,但所有其他 JSF Phase Id 在这里都有效。
if
:此属性允许您提供一个计算结果为布尔结果的值表达式。视图动作只会在这个表达式的结果上执行。
immediate
:此属性现在授予在APPLY_REQUEST_VALUES
阶段执行viewAction
的能力(相对于默认的INVOKE_APPLICATION
阶段),允许它表现得像普通的UIComponent
总的来说,viewAction
是一种更简洁的设计方法来执行视图命令。
【讨论】:
带有<f:event>
标签的rendered="..."
的技巧对我不起作用(在Wildfly 9.0 和Mojarra 2.2.11 上)。根据JSF 2.2 VDL documentation,<f:event>
没有rendered
-属性。
@MartinHöller 没有记录,但我在 GF4 上有(在我写这个答案时有)JSF2.2,并且标签确实带有 rendered
属性。可能是开发人员的疏忽
也许行为改变了一些次要版本,但我尝试了rendered="false"
,并且每次请求视图时都会调用通过listener
-attribute 指定的方法。以上是关于何时使用 preRenderView 与 viewAction?的主要内容,如果未能解决你的问题,请参考以下文章
JSF 2.0。无法在 preRenderView 事件处理程序中获取 POST 参数和 cookie
查看 Scoped Bean preRenderView 方法被多次调用
JSF f:event preRenderView 是由 f:ajax 调用和部分渲染触发的,还有别的吗?
Objective C:何时在 App Delegate 中使用方法以及何时在 View Controller 中使用方法