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

在页面加载时调用JSF托管bean操作,jsf,action,onload,managed-bean,Jsf,Action,Onload,Managed Bean,在加载页面时,是否有一种执行JSF托管bean操作的方法 如果相关的话,我目前正在使用JSF1.2。JSF1.0/1.1 只需将所需的逻辑放入与JSF页面关联的请求范围bean的构造函数中 public Bean() { // Do your stuff here. } JSF1.2/2.x 对请求或视图范围的bean使用@PostConstruct带注释的方法。它将在所有托管属性和注入依赖项的构造和初始化/设置之后执行 @PostConstruct public void init(

在加载页面时,是否有一种执行JSF托管bean操作的方法

如果相关的话,我目前正在使用JSF1.2。

JSF1.0/1.1 只需将所需的逻辑放入与JSF页面关联的请求范围bean的构造函数中

public Bean() {
    // Do your stuff here.
}
JSF1.2/2.x 对请求或视图范围的bean使用
@PostConstruct
带注释的方法。它将在所有托管属性和注入依赖项的构造和初始化/设置之后执行

@PostConstruct
public void init() {
    // Do your stuff here.
}
如果您使用的是使用代理(如CDI)的bean管理框架,则强烈建议不要使用构造函数,因为构造函数可能不会在您期望的时间被调用

JSF2.0/2.1 或者,如果您也打算基于
进行初始化,或者当bean被放在比视图范围更广的范围内时(这反过来表明存在设计问题,但不考虑这一点),请使用
。否则,
@PostConstruct
也很好

<f:metadata>
    <f:viewParam name="foo" value="#{bean.foo}" />
    <f:event type="preRenderView" listener="#{bean.onload}" />
</f:metadata>
<f:metadata>
    <f:viewParam name="foo" value="#{bean.foo}" />
    <f:viewAction action="#{bean.onload}" />
</f:metadata>
JSF2.2+ 或者,如果您也打算基于
进行初始化,或者当bean被放在比视图范围更广的范围内时(这反过来表明存在设计问题,但不考虑这一点),请使用
。否则,
@PostConstruct
也很好

<f:metadata>
    <f:viewParam name="foo" value="#{bean.foo}" />
    <f:event type="preRenderView" listener="#{bean.onload}" />
</f:metadata>
<f:metadata>
    <f:viewParam name="foo" value="#{bean.foo}" />
    <f:viewAction action="#{bean.onload}" />
</f:metadata>
请注意,如有必要,这可能会返回一个
字符串
导航案例。它将被解释为重定向(因此这里不需要
?faces redirect=true

另见:
  • -如果您实际上对在HTMLDOM
    load
    事件期间执行bean操作方法感兴趣,而不是在页面加载期间

@PostConstruct在创建Bean时首先运行一次。 解决方案是创建一个未使用的属性,并在该属性的Getter方法中执行操作 并将此属性添加到.xhtml文件中,如下所示:

<h:inputHidden  value="#{loginBean.loginStatus}"/>

另一种简单的方法是在渲染视图之前使用激发方法。这比postConstruct好,因为对于sessionScope,postConstruct在每个会话中只触发一次。这将在每次加载页面时触发。这当然只适用于JSF2.0,而不适用于JSF1.2

这就是如何做到的-

<html xmlns:f="http://java.sun.com/jsf/core">
      <f:metadata>
          <f:event type="preRenderView" listener="#{myController.onPageLoad}"/>
      </f:metadata>
</html>
编辑-虽然这不是本页问题的解决方案,但我只为使用更高版本JSF的用户添加了这个选项

JSF2.2有一个新特性,它使用
viewAction
执行此任务

<f:metadata>
    <f:viewAction action="#{myController.onPageLoad}" />
</f:metadata>

从调用bean操作是个好主意,保持属性autoRun=“true” 下面的例子

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


duplicate虽然不确定,但问题中存在歧义。只要他没有明确地声明“页面加载时下载文件”或“页面加载时发出新请求”等等,那么所提到的主题就不一定是重复的。这里给出了正确的答案,那么,您是在单独使用会话范围的bean吗?那是一个坏习惯。另外,你的例子很差。在bean的生命中,getter可以被多次调用,不应该被滥用来执行业务。只需使用一个请求范围的bean,在构造函数或
@PostConstruct
中完成这项工作。您的答案非常好,适合我的需要。。。但有一个问题。。。在我的D.constructor中,我添加了这样一个在视图端可见的内容(在同一个jsp上)。在这种情况下,我的jsp不会第一次查看这些信息。但如果我重新加载一个页面,该内容是可见的。我们能以任何方式处理这件事吗?如果我有一个会话范围,这个答案只会起作用一次。对于会话范围bean,有没有更好的实现方法?@huahsin68,提供的答案将如预期的那样起作用。正如BalusC所说,使用最后两个例子来说明范围比视图范围更广的bean。对于那些想在
ui:composition
页面中放置
f:metadata
信息的人:就在
ui:composition
之后和可能的
ui:define
或类似标记之前。你应该使用“f:event”而不是“f:viewAction”,如果您使用的是JSF2.0+,那么当上述解决方案不需要额外的往返时,为什么这是一个“好主意”。
 public void onPageLoad(){
    // Do something
 }
<f:metadata>
    <f:viewAction action="#{myController.onPageLoad}" />
</f:metadata>
<p:remoteCommand autoRun="true" name="myRemoteCommand" action="#{bean.action}" partialSubmit="true" update=":form" />