使用JSF 2.0在页面加载上使用参数初始化Backing Bean

时间:2011-06-14 09:16:56

标签: jsf jsf-2

我正在尝试在页面加载时初始化辅助bean。已经寻找了许多解决方案,但大多数都使用链接,按钮或根本没有参数。

情形: 客户登录到某个站点,然后应该在下一页上看到他的所有数据。

支持bean:

  1. loginDetailsController - 支持 登录过程。可以访问用户的 密码和用户名。支持豆 对于Login.xhtml。

  2. customerController - 访问 其余的用户详细信息。它还有一个customer_id字段。它是Backing bean 对于Home.xhtml。可以完全从customer_id初始化customerController。

  3. 在Home.xhtml上,可以通过这种方式获得customer_id:

     #{loginDetailsController.customer_id}
    

    有没有办法在页面加载时使用上面的值初始化customerController?

    此致

    丹尼尔

3 个答案:

答案 0 :(得分:10)

JSF 2.0具有preRender支持,可以解决您的问题。

JSF 2包含一个PreRenderViewEvent,它在视图参数处理完毕后但在渲染视图之前触发。可以使用标记注册预渲染视图侦听器,例如:

<f:metadata>
  <f:viewParam name="foo" value="#{bean.foo}"/>
  <f:event type="preRenderView" listener="#{bean.doSomething}"/>
</f:metadata>

答案 1 :(得分:4)

您的bean的范围是什么?无论如何,标有@PostConstruct的方法 在创建bean时,将调用一次注释。

@ManagedBean
@ViewScoped
public class LoginDetailsController() {
  private String customer_id;
// getters and setters for customer_id

  @PostConstruct
   public void init() {
      this.customer_id = fetch_the_value_from_somewhere;
    }
}

如果您希望页面始终执行此方法,无论是否已创建bean,请使用正确建议的Tarun PreRenderViewEvent。但请注意,每次呈现页面时都会触发此事件;即使用户刷新页面。

如果您想在LoginDetailsController中使用customerController中的此值,可以按如下方式将其注入

@ManagedBean
@ViewScoped
public class CustomerController() {
  @ManagedProperty(value="#{loginDetailsController}")
  private LoginDetailsController loginDetailsController;
  private String customer_id;
// getters and setters for customer_id

   @PostConstruct
   public void init() {
      this.customer_id = loginDetailsController.getCustomer_id();
    }

答案 2 :(得分:1)

这就是我解决它的方法:

因为LoginDetailsController是会话作用域,所以始终初始化customer_id。

所以 - 我添加了

@ManagedProperty(value="#{loginDetailsController.customer_id}") 
private String customer_id;

Plus - customer_id的getter和setter。

在LoginDetailsController上,正如Nikhil所说 - 稍微改变一下。 然后,可以在Home.xhtml上使用#{customerController.customer_id}和customerController的其余customerController初始化元素。

谢谢大家!