64

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

如果这是相关的,我目前正在使用 JSF 1.2。

4

4 回答 4

99

JSF 1.0 / 1.1

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

public Bean() {
    // Do your stuff here.
}

JSF 1.2 / 2.x

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

@PostConstruct
public void init() {
    // Do your stuff here.
}

如果您正在使用使用代理的 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>
public void onload() { 
    // Do your stuff here.
}

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>
public void onload() { 
    // Do your stuff here.
}

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

public String onload() { 
    // Do your stuff here.
    // ...
    return "some.xhtml";
}

也可以看看:

于 2010-03-15T23:59:28.960 回答
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>

而在myController.java

 public void onPageLoad(){
    // Do something
 }

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

JSF 2.2 有一个新特性,它使用viewAction.

<f:metadata>
    <f:viewAction action="#{myController.onPageLoad}" />
</f:metadata>
于 2014-12-03T11:59:17.963 回答
11

@PostConstruct 在创建 Bean 时首先运行一次。解决方案是创建一个未使用的属性并在此属性的 Getter 方法中执行您的操作,然后将此属性添加到您的 .xhtml 文件中,如下所示:

<h:inputHidden  value="#{loginBean.loginStatus}"/>

并在您的 bean 代码中:

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

public String getLoginStatus()  {
    // Do your stuff here.
    return loginStatus;
}
于 2010-11-23T12:14:42.653 回答
2

从 a 调用 bean 动作<p:remoteCommand>将是一个好主意,保持属性autoRun="true" 下面的示例

<p:remoteCommand autoRun="true" name="myRemoteCommand" action="#{bean.action}" partialSubmit="true" update=":form" />
于 2018-05-08T05:22:22.977 回答