在页面加载时调用 JSF 托管 Bean 操作
-
20-09-2019 - |
题
有没有办法在页面加载时执行 JSF 托管 bean 操作?
如果相关的话,我目前正在使用 JSF 1.2。
解决方案
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 被放置在比视图范围更宽的范围中时(这反过来表明存在设计问题,但除此之外)。否则,一个 @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 被放置在比视图范围更宽的范围中时(这反过来表明存在设计问题,但除此之外)。否则,一个 @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";
}
也可以看看:
- 如何在页面加载时处理支持 bean 中的 GET 查询字符串 URL 参数?
- <f:metadata>、<f:viewParam> 和 <f:viewAction> 可以用来做什么?
- 如何使用本机 JavaScript 在 HTML DOM 事件上调用 JSF 托管 Bean? - 如果您确实有兴趣在 HTML DOM 期间执行 bean 操作方法
load
事件,而不是在页面加载期间。
其他提示
另一个简单的方法是视图被呈现之前,使用火的方法。这比postConstruct更好,因为sessionScope,postConstruct将触发仅一次会议。这将触发每次页面加载时间。这是ofcourse仅对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的人
。 2.2 JSF有一个新的特征,它利用viewAction
此任务。
<f:metadata>
<f:viewAction action="#{myController.onPageLoad}" />
</f:metadata>
@PostConstruct在第一运行一次时豆创建。 该解决方案是创建一个未使用的特性,做你的行动在这个属性的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;
}
从呼叫豆的行动将是一个好主意,不断属性的 AUTORUN =“真” 的 下面的例子
<p:remoteCommand autoRun="true" name="myRemoteCommand" action="#{bean.action}" partialSubmit="true" update=":form" />