应该何时使用f:viewAction
或preRenderView
事件初始化网页数据而不是使用@PostConstruct
注释?基于支持bean的范围类型使用一个或另一个的基本原理是如果支持bean是@RequestScoped
,那么在呈现视图之前选择使用f:viewAction
或preRenderView
而不是@PostConstruct
来初始化您的支持bean是不相关的,因为两者会产生同样的效果?
f:viewAction或preRenderView
<f:metadata>
<f:viewAction action="#{myBean.initialize}" />
</f:metadata>
<f:metadata>
<f:event type="preRenderView" listener="#{myBean.initialize}"/>
</f:metadata>
或
@PostConstruct
public class MyBean
{
@PostConstruct
public void initialize()
{
}
}
答案 0 :(得分:112)
何时应该使用f:viewAction或preRenderView事件使用@PostConstruct注释初始化页面的数据?
如果要在呈现HTML之前执行方法,请使用<f:viewAction>
。如果要在更新模型值阶段期间基于<f:viewParam>
设置的模型值执行操作,这将特别有用。也就是说,@PostConstruct
运行时它们不可用。在JSF 2.0 / 2.1中,此标记不存在,您必须使用preRenderView
解决方法。
如果支持bean是@RequestScoped,他们是否有效地完成了同样的事情? (那么这取决于开发人员的选择?(@ PostConstruct看起来更“干净”)。
不,他们肯定没有有效地做同样的事情。 @PostConstruct
旨在在bean构造和设置所有注入的依赖项和托管属性(例如@EJB
,@Inject
,@ManagedProperty
之后直接执行 操作等等。注入的依赖项在bean的构造函数中不可用。因此,当bean是视图,会话或应用程序作用域时,每个视图,会话或应用程序只运行一次。默认情况下,<f:viewAction>
仅在初始GET请求时调用,但也可以通过onPostback="true"
属性配置为在回发请求上调用。每个HTTP请求都会调用preRenderView
事件(是的,这也包括ajax请求!)。
总结一下,如果要在bean构造期间对@PostConstruct
,@EJB
,@Inject
等设置的注入依赖项和托管属性执行操作,请使用@ManagedProperty
。如果 想要对<f:viewAction>
设置的属性执行操作,请使用<f:viewParam>
。如果您仍在使用JSF 2.0 / 2.1,请使用preRenderView
而不是<f:viewAction>
。如有必要,您可以在FacesContext#isPostback()
上添加一项检查,以便仅对初始请求执行preRenderView
操作。
答案 1 :(得分:1)
您是否需要初始化托管bean的属性? - &GT;然后,使用@ PostConstruct 否则,你需要使用从其他视图传递的params吗? - &GT;然后,使用“ preRenderView ”