与使用@PostConstruct
注释相比,什么时候应该使用f:viewAction
或preRenderView
事件初始化页面的数据?使用其中一个或另一个的理由是基于backingbean的作用域类型吗?例如,如果backingbean是@RequestScoped
,那么在渲染视图之前使用f:viewAction
或preRenderView
而不是@PostConstruct
来初始化backingbean是否无关紧要,因为两者会产生相同的效果?
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()
{
}
}
什么时候应该使用f:viewAction或preRenderView事件来初始化使用@PostConstruct注释的页面诗句的数据
如果要在呈现HTML之前执行方法,请使用<f:viewAction>
。如果您希望在更新模型值阶段根据<f:viewParam>
设置的模型值执行操作,这一点尤其有用。也就是说,它们在@PostConstruct
运行时不可用。在JSF 2.0/2.1中,这个标签并不存在,您必须使用preRenderView
解决方法。
如果backingbean是@RequestScoped,它们是否有效地做了完全相同的事情?(所以这取决于开发人员的选择?(@PostConstruct看起来"更干净")
不,他们肯定不会有效地做同样的事情。@PostConstruct
旨在在bean构造和设置所有注入的依赖项和托管属性(如@EJB
、@Inject
、@ManagedProperty
等)后直接执行操作。也就是说,注入的依赖性在bean的构造函数内不可用。因此,当bean在视图、会话或应用程序范围内时,每个视图、会话和应用程序只运行一次。默认情况下,<f:viewAction>
仅在初始GET请求时调用,但也可以通过onPostback="true"
属性配置为在回发请求时调用。preRenderView
事件在每个HTTP请求上都会被调用(是的,这也包括ajax请求!)。
总之,如果您想对注入的依赖项和托管属性执行操作,请使用@PostConstruct
,这些依赖项和属性由@EJB
、@Inject
、@ManagedProperty
等在bean的构建过程中设置。如果还希望对<f:viewParam>
设置的属性执行操作,请使用<f:viewAction>
。如果您仍然使用JSF 2.0/2.1,请使用preRenderView
而不是<f:viewAction>
。如有必要,您可以在FacesContext#isPostback()
上添加一个检查,以仅对初始请求执行preRenderView
操作。
另请参阅:
- 什么可以<f: 元数据>lt;f: viewParam>并且<f: viewAction>用于
- ViewParam与@ManagedProperty(值="#{param.id}")
- 是否可以禁用f:event-type=";preRenderView";回发时的侦听器
是否需要初始化托管bean的属性?-->然后,使用@PostConstruct否则,是否需要使用从其他视图传递的params?-->然后,使用"preRenderView"