使用JSF2.0在页面加载上使用参数初始化支持Bean

使用JSF2.0在页面加载上使用参数初始化支持Bean,jsf,jsf-2,Jsf,Jsf 2,我试图在页面加载时初始化一个支持bean。已经寻找了许多解决方案,但大多数都使用链接、按钮或根本没有参数 场景: 客户登录到一个站点,然后应在下一页上查看其所有数据 支持bean: loginDetailsController-支持 登录过程。可以访问用户的 密码和用户名。背豆 用于Login.xhtml customerController-访问 其余的用户详细信息。它还有一个customer\u id字段。这是后盾 对于Home.xhtml。可以完全从客户id初始化customerContr

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

场景: 客户登录到一个站点,然后应在下一页上查看其所有数据

支持bean:

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

  • customerController-访问 其余的用户详细信息。它还有一个customer\u id字段。这是后盾 对于Home.xhtml。可以完全从客户id初始化customerController

  • 在Home.xhtml上,可以通过以下方式获取客户id:

     #{loginDetailsController.customer_id}
    
    是否有方法在页面加载时使用上述值初始化customerController

    问候,


    Daniel

    JSF2.0提供了preRender支持,可以解决您的问题

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

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

    您的bean的范围是什么?在任何情况下,标记为 创建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的建议使用。但请注意,每次呈现页面时都会触发此事件;即使用户刷新页面

    如果要使用
    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是会话作用域-客户id始终初始化

    所以我补充道

    @ManagedProperty(value="#{loginDetailsController.customer_id}") 
    private String customer_id;
    
    Plus-客户id的获取者和设置者

    在LoginDeailsController上,正如Nikhil所说,有一点变化。 然后,可以在Home.xhtml上使用
    {customerController.customer_id}
    和customerController的其余初始化元素


    谢谢大家!

    谢谢。仍然不知道如何将参数从一个支持bean传递到另一个。也许我错过了什么。两个都是会话范围。我获取的托管bean customerController的
    loginDetailsController不存在。
    。你能写下JSF应该是什么样子吗?它是相同的代码,但是
    @SessionScoped
    而不是
    @ViewScoped
    。哦,我想你是想在你的页面上使用#{logindetailscocontroller.customer\u id},它的支持bean是CustomerController。您可能还没有为loginDetailsController定义getter和setter(即使上面的代码也不包含)。因此出现了错误。您应该引用#{customerController.customer_id}属性,而不是#{logindetailscocontroller.customer_id}