繁体   English   中英

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

[英]Invoke JSF managed bean action on page load

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

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

JSF 1.0 / 1.1

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

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

JSF 1.2 / 2.x

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

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

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

JSF 2.0 / 2.1

或者,使用<f:event type="preRenderView">如果您也打算基于<f:viewParam>进行初始化,或者当 bean 被置于比视图范围更广的范围内(这反过来表明设计问题,但除此之外)。 否则,@ @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 置于比视图范围更广的范围内(这反过来表明设计问题,但除此之外),也可以使用<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导航案例。 它将被解释为重定向(因此您不需要?faces-redirect=true此处)。

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

也可以看看:

另一种简单的方法是在渲染视图之前使用 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>

@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;
}

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

<p:remoteCommand autoRun="true" name="myRemoteCommand" action="#{bean.action}" partialSubmit="true" update=":form" />

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM