有没有办法在加载页面时执行JSF托管bean操作?
如果那是相关的,我现在正在使用JSF 1.2。
答案 0 :(得分:80)
将所需的逻辑放在与JSF页面关联的请求范围bean的构造函数中。
public Bean() {
// Do your stuff here.
}
对请求使用@PostConstruct
带注释的方法或查看范围内的bean。它将在构造和初始化/设置所有托管属性和注入依赖项后执行。
@PostConstruct
public void init() {
// Do your stuff here.
}
如果您使用的是使用代理的bean管理框架(例如CDI),强烈建议使用构造函数,因为构造函数可能不会在您期望的时候调用。
或者,如果您打算基于<f:event type="preRenderView">
进行初始化,或者将bean放在比视图范围更广的范围内(这反过来表明设计问题,但是),请使用<f:viewParam>
除此之外)。否则,@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>
进行初始化,或者将bean放在比视图范围更广的范围内(这反过来表明设计问题,但是),请使用<f:viewParam>
除此之外)。否则,@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";
}
答案 1 :(得分:13)
另一种简单的方法是在渲染视图之前使用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>
答案 2 :(得分:10)
@PostConstruct在Bean Created时首先运行ONCE。 解决方案是创建一个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;
}
答案 3 :(得分:0)
从a调用bean动作将是一个好主意,保持属性 autoRun =“true” 以下示例
<p:remoteCommand autoRun="true" name="myRemoteCommand" action="#{bean.action}" partialSubmit="true" update=":form" />