在页面加载时调用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>