何时应该使用preRenderView事件来初始化页面的数据而不是使用viewAction?它们在使用上是否相同,是否具有相同的效果?
preRenderView活动
<f:metadata>
<f:event type="preRenderView" listener="#{myBean.initialize}"/>
</f:metadata>
或
的viewAction
<f:metadata>
<f:viewAction action="#{myBean.initialize}"/>
</f:metadata>
答案 0 :(得分:20)
在实践中,它们可用于实现相同的效果,但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阶段ID在此处都有效。
if
:此属性允许您提供计算结果为布尔值的值表达式。视图操作仅对此表达式的结果执行。
immediate
:此属性现在授予在viewAction
阶段执行APPLY_REQUEST_VALUES
的能力(与默认{{ 1}}阶段),使其表现得像常规INVOKE_APPLICATION
总的来说,UIComponent
是一种执行视图命令的更简洁的设计方法。