在页面加载时调用JSF托管bean操作

DD.*_*DD. 57 jsf action onload managed-bean

有没有办法在加载页面时执行JSF托管bean操作?

如果那是相关的,我现在正在使用JSF 1.2.

Bal*_*usC 84

JSF 1.0/1.1

只需将所需的逻辑放在与JSF页面关联的请求范围bean的构造函数中.

public Bean() {
    // Do your stuff here.
}
Run Code Online (Sandbox Code Playgroud)

JSF 1.2/2.x.

@PostConstruct对请求使用带注释的方法或查看范围内的bean.它将在构造初始化/设置所有托管属性和注入依赖项后执行.

@PostConstruct
public void init() {
    // Do your stuff here.
}
Run Code Online (Sandbox Code Playgroud)

如果您使用的是使用代理的bean管理框架(例如CDI),强烈建议使用构造函数,因为构造函数可能不会在您期望的时候调用.

JSF 2.0/2.1

或者,<f:event type="preRenderView">如果您打算基于此进行初始化<f:viewParam>,或者将bean放在比视图范围更广的范围内(这反过来表明设计问题,但除此之外),请使用.否则,a @PostConstruct也完全没问题.

<f:metadata>
    <f:viewParam name="foo" value="#{bean.foo}" />
    <f:event type="preRenderView" listener="#{bean.onload}" />
</f:metadata>
Run Code Online (Sandbox Code Playgroud)
public void onload() { 
    // Do your stuff here.
}
Run Code Online (Sandbox Code Playgroud)

JSF 2.2+

或者,<f:viewAction>如果您打算基于此进行初始化<f:viewParam>,或者将bean放在比视图范围更广的范围内(这反过来表明设计问题,但除此之外),请使用.否则,a @PostConstruct也完全没问题.

<f:metadata>
    <f:viewParam name="foo" value="#{bean.foo}" />
    <f:viewAction action="#{bean.onload}" />
</f:metadata>
Run Code Online (Sandbox Code Playgroud)
public void onload() { 
    // Do your stuff here.
}
Run Code Online (Sandbox Code Playgroud)

请注意,String如果需要,这可以返回导航案例.它将被解释为重定向(因此您不需要?faces-redirect=true这里).

public String onload() { 
    // Do your stuff here.
    // ...
    return "some.xhtml";
}
Run Code Online (Sandbox Code Playgroud)

也可以看看:


sto*_*ves 14

另一种简单的方法是在渲染视图之前使用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>
Run Code Online (Sandbox Code Playgroud)

并在myController.java中

 public void onPageLoad(){
    // Do something
 }
Run Code Online (Sandbox Code Playgroud)

编辑 - 虽然这不是本页问题的解决方案,但我只是为使用更高版本的JSF的人添加了这个.

JSF 2.2有一个新功能,可以使用它执行此任务viewAction.

<f:metadata>
    <f:viewAction action="#{myController.onPageLoad}" />
</f:metadata>
Run Code Online (Sandbox Code Playgroud)


小智 11

@PostConstruct在Bean Created时首先运行ONCE.解决方案是创建一个Unused属性并在此属性的Getter方法中执行Action,并将此属性添加到.xhtml文件中,如下所示:

<h:inputHidden  value="#{loginBean.loginStatus}"/>
Run Code Online (Sandbox Code Playgroud)

并在您的bean代码中:

public void setLoginStatus(String loginStatus) {
    this.loginStatus = loginStatus;
}

public String getLoginStatus()  {
    // Do your stuff here.
    return loginStatus;
}
Run Code Online (Sandbox Code Playgroud)

  • 那么,你是单独使用会话范围的bean?这是一个糟糕的做法.另外,你的榜样很差.在bean的生活中可以不止一次调用getter,不应该滥用getter来执行业务.只需使用请求范围的bean并在构造函数或`@ PostConstruct`中完成工作. (5认同)