首页 文章

使用JSF 2.0初始化带有页面加载参数的Backing Bean [重复]

提问于
浏览
3

这个问题在这里已有答案:

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

scenario: 客户登录网站,然后应在下一页上看到他的所有数据 .

backing beans:

  • loginDetailsController - 支持登录过程 . 可以访问用户的密码和用户名 . Login.xhtml的支持bean .

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

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

#{loginDetailsController.customer_id}

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

问候,

丹尼尔

3 回答

  • 1

    这就是我解决它的方式:

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

    所以 - 我补充道

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

    加 - customer_id的getter和setter .

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

    谢谢你们!

  • 4

    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>
    
  • 10

    你 beans 子的范围是什么?在任何情况下,在创建bean时,将调用标记为@PostConstruct注释的方法一次 .

    @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,请使用PreRenderViewEvent作为Tarun正确建议 . 但请注意,每次呈现页面时都会触发此事件;即使用户刷新页面 .

    如果要在 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();
        }
    

相关问题