Jsf 何时使用f:viewAction/preRenderView与PostConstruct?
与使用Jsf 何时使用f:viewAction/preRenderView与PostConstruct?,jsf,jsf-2,postconstruct,prerenderview,viewaction,Jsf,Jsf 2,Postconstruct,Prerenderview,Viewaction,与使用@PostConstruct注释相比,何时应该使用f:viewAction或preRenderView事件初始化页面数据?是否基于支持bean的作用域类型(例如,如果支持bean是@RequestScoped),使用一个或另一个的理由,那么,在呈现视图之前使用f:viewAction或preRenderView而不是@PostConstruct来初始化支持bean的选择是否不相关,因为这两种方法会产生相同的效果 f:viewAction或preRenderView <f:metada
@PostConstruct
注释相比,何时应该使用f:viewAction
或preRenderView
事件初始化页面数据?是否基于支持bean的作用域类型(例如,如果支持bean是@RequestScoped
),使用一个或另一个的理由,那么,在呈现视图之前使用f:viewAction
或preRenderView
而不是@PostConstruct
来初始化支持bean的选择是否不相关,因为这两种方法会产生相同的效果
f:viewAction或preRenderView
<f:metadata>
<f:viewAction action="#{myBean.initialize}" />
</f:metadata>
何时应该使用f:viewAction或preRenderView事件来初始化使用@PostConstruct注释的页面的数据
如果要在呈现HTML之前执行方法,请使用
。如果要在更新模型值阶段根据
设置的模型值执行操作,这一点特别有用。也就是说,它们在@PostConstruct
运行时不可用。在JSF2.0/2.1中,这个标签不存在,您必须使用preRenderView
解决方法
如果支持bean是@RequestScope的,那么它们是否有效地执行了完全相同的操作?(因此,这取决于开发人员的选择?(@PostConstruct似乎“更干净”)
不,它们肯定不会有效地做同样的事情。@PostConstruct
旨在在bean构造和设置所有注入依赖项和托管属性(如@EJB
,@Inject
,@ManagedProperty
)之后直接执行操作。也就是说,注入的依赖项不是在bean的构造函数中可用。因此,当bean在视图、会话或应用程序范围内时,每个视图、会话或应用程序只运行一次。默认情况下,
仅在初始GET请求时调用,但可以通过onPostback=“true”调用
属性也可以配置为在回发请求时调用。preRenderView
事件会在每个HTTP请求上调用(是的,这也包括ajax请求!)
总之,如果您想在bean的构造过程中对由@EJB
、@Inject
、@ManagedProperty
等设置的注入依赖项和托管属性执行操作,请使用@PostConstruct
。如果您还想对由
设置的属性执行操作,请使用
在JSF 2.0/2.1上,使用preRenderView
而不是
。如果需要,您可以在FacesContext\isPostback()
上添加一个复选框,以便仅在初始请求时执行preRenderView
操作
另见:
否则,您需要使用从其他视图传递的参数吗?-->然后,使用“preRenderView”谢谢。很抱歉,在您编写响应时,我编辑了我的原始问题……我提到了bean范围,因为如果bean是会话范围的(在第一次创建bean时),则只会调用@PostConstruct一次但是每次访问页面时都会调用preRenderView。或者我弄错了吗?是的,这是正确的。preRenderView事件在调用操作阶段调用。post构造在bean构造之后调用。会话范围的bean不是在每个HTTP请求上构造的。我想知道我的my方法是在aja期间被调用的x请求。isPostBack()调用节省了时间!!为了完整起见,我们应该提到:“对于HTTP请求参数,它基本上类似于
,但主要的区别是,注入的参数在@PostConstruct
期间直接可用,从而允许更简单的处理方式,而不需要视图中的
或
。”
<f:metadata>
<f:event type="preRenderView" listener="#{myBean.initialize}"/>
</f:metadata>
public class MyBean
{
@PostConstruct
public void initialize()
{
}
}