什么时候应该使用preRenderView事件来初始化页面数据而不是使用viewAction?它们的使用是否相等,并且效果相同吗?
preRenderView事件
<f:metadata>
<f:event type="preRenderView" listener="#{myBean.initialize}"/>
</f:metadata>
要么
viewAction
<f:metadata>
<f:viewAction action="#{myBean.initialize}"/>
</f:metadata>
最佳答案
实际上,可以使用它们来达到相同的效果,但是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
阶段)执行INVOKE_APPLICATION
的功能,使其表现得像常规的UIComponent
总体而言,
viewAction
是执行视图命令的更简洁的设计方法。