何时使用f:viewAction / preRenderView与PostConstruct?
何时应该使用f:viewAction
或preRenderView
事件初始化页面的数据,而不是使用@PostConstruct
注释? 是基于支持bean的范围types使用一个或另一个的基本原理,例如,如果支持bean是@RequestScoped
,那么select在呈现之前使用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() { } }
什么时候应该使用f:viewAction或preRenderView事件来初始化使用@PostConstruct注解的页面经文的数据?
如果要在呈现HTML之前执行方法,请使用<f:viewAction>
。 如果要在更新模型值阶段根据由<f:viewParam>
设置的模型值执行操作,这一点尤其有用。 也就是说,@ @PostConstruct
运行的时候不可用。 在JSF 2.0 / 2.1中,这个标签不存在,您必须使用preRenderView
解决方法。
如果支持bean是@RequestScoped,他们有效地做同样的事情吗? (那么这是由开发人员的select?(@PostConstruct似乎“更清洁”)。
不,他们绝对不会有效地做同样的事情。 @PostConstruct
用于在bean的构build和设置完所有注入的依赖项和托pipe属性(如@ @EJB
,@ @Inject
,@ @ManagedProperty
等)之后直接执行动作。即,注入的依赖关系在bean的构造函数中不可用。 因此,当bean被视图,会话或应用程序作用域时,这只会在每个视图,会话或应用程序中运行一次。 默认情况下,只在初始GET请求上调用<f:viewAction>
,但也可以通过onPostback="true"
属性configuration为在回发请求上调用。 每个HTTP请求都调用preRenderView
事件(是的,这也包括ajax请求!)。
总结一下,如果你想在bean的构造过程中对@EJB,@ @Inject
,@ @ManagedProperty
等设置的注入依赖和托pipe属性执行操作,可以使用@PostConstruct
。 如果您还想对由<f:viewParam>
设置的属性执行操作,请使用<f:viewParam>
。 如果您仍然使用JSF 2.0 / 2.1,请使用preRenderView
而不是<f:viewAction>
。 如有必要,可以在FacesContext#isPostback()
上添加一个检查来preRenderView
初始请求执行preRenderView
操作。
也可以看看:
- 什么可以使用<f:元数据>,<f:viewParam>和<f:viewAction>?
- ViewParam vs @ManagedProperty(value =“#{param.id}”)
- 是否有可能在回发中禁用f:event type =“preRenderView”侦听器?
你是否需要初始化托pipebean的属性? – >然后,使用@ PostConstruct否则,你需要使用其他视图传递的参数吗? – >然后,使用“ preRenderView ”
- 从JSF 1.2迁移到JSF 2.0
- JSF中的国际化,何时使用消息包和资源包?
- 在页面加载时调用JSF托pipebean操作
- JSF使用plain / raw XHTML / XML / EL源返回空白/未分析的页面,而不是呈现的HTML输出
- 什么是Mojarra?
- JSF 2.0从浏览器和编程设置整个会话的区域设置
- 从外部文件系统或数据库获取Facelets模板/文件
- com.sun.faces.context.FacesContextImpl.assertNotReleased上的java.lang.IllegalStateException
- 如何在页面加载时在后台bean中处理GET查询stringURL参数?