何时使用f:viewAction / preRenderView与PostConstruct?


95

什么时候应该使用f:viewActionpreRenderView事件来初始化页面数据而不是使用@PostConstruct注释?是根据后备bean的范围类型使用一个或另一个的理由,例如,如果后备bean是@RequestScoped,那么在呈现视图之前使用f:viewActionor preRenderViewover @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()
    {

    }
}

Answers:


117

什么时候应该使用@PostConstruct批注使用f:viewAction或preRenderView事件初始化页面经文的数据?

使用<f:viewAction>时,你要的是被呈现的HTML之前执行的方法。如果要基于<f:viewParam>在更新模型值阶段设置的模型值执行操作,这将特别有用。即,它们在@PostConstruct运行时不可用。在JSF 2.0 / 2.1中,此标记不存在,因此您必须使用preRenderView替代方法。

如果支持bean是@RequestScoped,它们是否有效地执行了完全相同的操作?(因此,这取决于开发人员的选择?(@ PostConstruct看起来“更干净”))。

不,他们肯定不会有效地做同样的事情。该@PostConstruct被intented执行动作直接 bean的建设和所有依赖注入的设置和管理特性,如后@EJB@Inject@ManagedProperty等即,注入的依赖是不具备的bean的构造函数中。因此,当bean在视图,会话或应用程序范围内时,每个视图,会话或应用程序仅运行一次。在<f:viewAction>默认情况下才会调用初始GET请求,但可以通过onPostback="true"属性被配置在回发请求以及被调用。该preRenderView事件在每个HTTP请求上调用(是的,这还包括ajax请求!)。

总结,使用@PostConstruct如果要对其执行注射依赖和由设置管理性质的行动@EJB@Inject@ManagedProperty,等豆腐的建设过程中。使用<f:viewAction>,如果你想执行由设置属性的行为<f:viewParam>。如果您仍在使用JSF 2.0 / 2.1,请使用preRenderView代替<f:viewAction>。您可以根据需要添加检查FacesContext#isPostback()以执行preRenderView仅对初始请求操作。

也可以看看:


谢谢。抱歉,当您编写回复时,我编辑了原始问题……
BestPractices 2012年

我提到了bean作用域,因为@PostConstruct仅在bean为SessionScoped时才被调用一次(在第一次创建bean时),但是每次访问页面时都会调用preRenderView。还是我弄错了?
BestPractices 2012年

对,那是正确的。预渲染视图事件在调用操作阶段被调用。post构造在bean构造之后被调用。并非在每个HTTP请求上都构造一个会话范围的bean。
BalusC 2012年

我想知道我的方法在ajax请求期间被调用。isPostBack()调用节省了一天!
jacosta 2013年

1

您是否需要初始化托管bean的属性?->然后,使用@ PostConstruct 否则,是否需要使用从其他视图传递的参数?->然后,使用“ preRenderView

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.