2011-05-14 124 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

相關問題