2011-05-14 119 views
17

我搜索了类似的问题,但我有点困惑。我有一个登录页面,所以LoginBean也是这样;如何从JSF中的另一个bean获取managedbean属性

@ManagedBean(name = "loginBean") 
@SessionScoped 
public class LoginBean implements Serializable {  
    private String password=""; 
    private String image=""; 
    @ManagedProperty(value = "#{loginBeanIdentityNr}") 
    private String identityNr=""; 
... 

成功后,导航到orderlist页面,所以我也有OrderBean。

@ManagedBean(name = "OrderBean") 
@SessionScoped 
     public class OrderBean { 
      List<Ordery> sdList; 

      public List<Order> getSdList() { 

       try { 

        String identityNr =""; 
        ELContext elContext = FacesContext.getCurrentInstance().getELContext(); 
        LoginBean lBean = (LoginBean) FacesContext.getCurrentInstance().getApplication().getELResolver().getValue(elContext, null, "loginBean"); 
        identityNr =lBean.getIdentityNr(); 
        sdList = DatabaseUtil.getOrderByIdentityNr(identityNr); 
    ... 
    } 

我不需要整个LoginBean,只需要ManagedProperty“loginBeanIdentityNr”。但下面的代码不起作用(当然);

identityNr = (String) FacesContext.getCurrentInstance() 
         .getApplication().getELResolver() 
         .getValue(elContext, null, "loginBeanIdentityNr"); 

这次它返回null给我。 我想如果我需要整个bean属性,我可以注入这些bean,对吧?那么,你对这种方法有什么建议吗?可以使用<f:attribute>吗?

回答

43

@ManagedProperty声明JSF应该设置属性的位置,而不是JSF应该“导出”属性的位置。您需要注入LoginBean作为OrderBean的财产。

public class OrderBean { 

    @ManagedProperty(value="#{loginBean}") 
    private LoginBean loginBean; // +setter 

    // ... 
} 

这样你就可以通过只

loginBean.getIdentityNr(); 

访问它在OrderBean另外,如果你让你OrderBean请求或查看作用域,那么你也可以只设定identityNr属性。

public class OrderBean { 

    @ManagedProperty(value="#{loginBean.identityNr}") 
    private String identityNr; // +setter 

    // ... 
} 

无关到具体的问题:初始化String性能与空字符串是一个贫穷的做法。

+0

嗨BalusC,但这次在OrderBean中,我会有不必要的loginbean属性。这不是浪费堆的程序吗?我只需要身份证号码。不是验证码值或名称。 – asyard 2011-05-14 19:35:39

+1

呃,它只是一个参考。它不会在内存或其他东西中创建整个bean的副本。它指向**完全相同的** bean,就像你已经在会话中一样。 Java是面向对象的,而不是程序性的或其他的东西。更重要的是,双引用String而不是javabean可能会更昂贵。 – BalusC 2011-05-14 19:37:37

+0

感谢您的回答。只要我有足够的声望,我会投你所有的回复:)但是,只是好奇,是否有另一种方式,像facescontext.getblabla()..或在jsf页面作为参数没有注入? – asyard 2011-05-14 19:41:26

相关问题