什么时候应该使用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的新增功能)具有以下增强功能:


onPostbackviewAction带有此属性,可让您指定是否要在回发到同一视图时(即在页面刷新或按钮提交等时)执行操作。它默认为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是执行视图命令的更简洁的设计方法。

10-06 13:35