【问题标题】:Initializng a Backing Bean With Parameters on Page Load with JSF 2.0 [duplicate]使用 JSF 2.0 在页面加载时使用参数初始化支持 Bean [重复]
【发布时间】:2011-09-14 13:11:04
【问题描述】:

我正在尝试在页面加载时初始化一个支持 bean。已经找了很多解决方案,但大多数都是使用链接、按钮或根本没有参数。

场景: 客户登录网站,然后应该会在下一页上看到他的所有数据。

支持 bean:

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

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

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

 #{loginDetailsController.customer_id}

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

问候,

丹尼尔

【问题讨论】:

    标签: jsf jsf-2


    【解决方案1】:

    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>
    

    【讨论】:

    • 谢谢。仍然不明白如何将参数从一个支持 bean 传递到另一个支持 bean。也许我错过了什么。
    【解决方案2】:

    您的 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。但请注意,每次呈现页面时都会触发此事件;即使用户刷新页面。

    如果你想在customerController中使用来自LoginDetailsController的这个值,你可以按如下方式注入它

    @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();
        }
    

    【讨论】:

    • 两者都是会话范围的。我得到loginDetailsController for managed bean customerController does not exist.。你能写出 JSF 应该是什么样子吗?
    • 是相同的代码,但是是@SessionScoped而不是@ViewScoped
    • 哦,我猜您正在尝试在支持 bean 为 CustomerController 的页面上使用 #{loginDetailsController.customer_id}。好吧,您可能没有为 loginDetailsController 定义 getter 和 setter。(即使上面的代码也不包含它)。因此错误。您应该指的是#{customerController.customer_id} 属性而不是#{loginDetailsController.customer_id}
    【解决方案3】:

    我就是这样解决的:

    因为 LoginDetailsController 是会话范围的 - customer_id 总是被初始化。

    所以-我添加了

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

    Plus - customer_id 的 getter 和 setter。

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

    谢谢大家!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-22
      • 2012-08-03
      • 2019-10-03
      • 2013-09-04
      • 2012-09-03
      • 1970-01-01
      • 2011-02-10
      • 2015-08-23
      相关资源
      最近更新 更多