在页面加载时调用JSF托pipebean操作
有没有办法在加载页面时执行JSF托pipebean操作?
如果这是相关的,我目前正在使用JSF 1.2。
JSF 1.0 / 1.1
只需将所需的逻辑放在与JSF页面关联的请求范围bean的构造函数中即可。
public Bean() { // Do your stuff here. }
JSF 1.2 / 2.x
在请求或视图范围的bean上使用@PostConstruct
注释的方法。 它将在所有托pipe属性和注入依赖项的构build和初始化/设置之后执行。
@PostConstruct public void init() { // Do your stuff here. }
如果你正在使用一个使用代理的beanpipe理框架(比如CDI),那么强烈推荐这样做,因为构造函数可能不会在你期望的时候被调用。
JSF 2.0 / 2.1
或者,如果您打算基于<f:viewParam>
进行初始化,或者将bean放在比视图范围更广的范围内(这反过来表示devise问题),也可以使用<f:event type="preRenderView">
,但是这一边)。 否则,@ @PostConstruct
也不错。
<f:metadata> <f:viewParam name="foo" value="#{bean.foo}" /> <f:event type="preRenderView" listener="#{bean.onload}" /> </f:metadata>
public void onload() { // Do your stuff here. }
JSF 2.2+
或者,如果您打算基于<f:viewParam>
进行初始化,或者将bean放在比视图范围更广的范围内(这反过来表示devise问题,除此之外),也可以使用<f:viewAction>
。 否则,@ @PostConstruct
也不错。
<f:metadata> <f:viewParam name="foo" value="#{bean.foo}" /> <f:viewAction action="#{bean.onload}" /> </f:metadata>
public void onload() { // Do your stuff here. }
请注意,如果需要,这可以返回一个String
导航的情况 它将被解释为一个redirect(所以你不需要在这里?faces-redirect=true
)。
public String onload() { // Do your stuff here. // ... return "some.xhtml"; }
也可以看看:
- 如何在页面加载时在后台bean中处理GET查询stringURL参数?
- 什么可以使用<f:元数据>,<f:viewParam>和<f:viewAction>?
- 如何使用本机JavaScript在HTML DOM事件上调用JSF托pipebean? – 如果你真的有兴趣在HTML DOM
load
事件期间执行bean操作方法,而不是在页面加载期间。
创buildBean时,@PostConstruct首先运行一次。 解决方法是创build一个Unused属性,并在Getter方法中执行此属性的Action,并将此属性添加到.xhtml文件中,如下所示:
<h:inputHidden value="#{loginBean.loginStatus}"/>
并在你的bean代码中:
public void setLoginStatus(String loginStatus) { this.loginStatus = loginStatus; } public String getLoginStatus() { // Do your stuff here. return loginStatus; }
另一个简单的方法是在渲染视图之前使用fire方法。 这比postConstruct更好,因为对于sessionScope,postConstruct每次会话只会触发一次。 每次页面加载时都会触发。 这当然只适用于JSF 2.0,而不适用于JSF 1.2。
这是如何做到这一点 –
<html xmlns:f="http://java.sun.com/jsf/core"> <f:metadata> <f:event type="preRenderView" listener="#{myController.onPageLoad}"/> </f:metadata> </html>
并在myController.java中
public void onPageLoad(){ // Do something }
编辑 – 虽然这不是在这个页面上的问题的解决scheme,我只是为使用更高版本的JSF的人添加。
JSF 2.2有一个使用viewAction
执行这个任务的新特性。
<f:metadata> <f:viewAction action="#{myController.onPageLoad}" /> </f:metadata>