有没有办法在加载页面时执行 JSF 托管 bean 操作?
如果这是相关的,我目前正在使用 JSF 1.2。
只需将所需的逻辑放在与 JSF 页面关联的请求范围 bean 的构造函数中。
public Bean() {
// Do your stuff here.
}
@PostConstruct
在请求或视图范围的 bean 上使用带注释的方法。它将在所有托管属性和注入的依赖项的构造和初始化/设置之后执行。
@PostConstruct
public void init() {
// Do your stuff here.
}
如果您正在使用使用代理的 bean 管理框架(例如 CDI),强烈建议在构造函数上使用此方法,因为构造函数可能不会在您期望的时间被调用。
或者,<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.
}
或者,<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";
}
load
事件期间执行 bean 操作方法,而不是在页面加载期间。另一种简单的方法是在视图呈现之前使用 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;
}
从 a 调用 bean 动作<p:remoteCommand>
将是一个好主意,保持属性autoRun="true"
下面的示例
<p:remoteCommand autoRun="true" name="myRemoteCommand" action="#{bean.action}" partialSubmit="true" update=":form" />