![](/img/trans.png)
[英]How to invoke a managed bean action method in on* attribute of a JSF component
[英]Invoke JSF managed bean action on page load
有没有办法在页面加载时执行 JSF 托管 bean 操作?
如果这是相关的,我目前正在使用 JSF 1.2。
只需将所需的逻辑放在与 JSF 页面关联的请求范围 bean 的构造函数中。
public Bean() {
// Do your stuff here.
}
在请求或视图范围的 bean 上使用@PostConstruct
注释方法。 它将在所有托管属性和注入的依赖项的构建和初始化/设置之后执行。
@PostConstruct
public void init() {
// Do your stuff here.
}
如果您使用使用代理的 bean 管理框架(例如 CDI),强烈建议使用构造函数,因为可能不会在您期望的时间调用构造函数。
或者,使用<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.
}
或者,如果您也打算基于<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";
}
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;
}
从<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.