2011-05-14 3 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=""; 
... 

성공한 후 주문 목록 페이지로 이동하므로 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 속성이 필요하면이 콩을 주입 할 수 있다고 생각합니다. 그렇다면이 접근법에 대한 제안 사항이 있습니까? 수 <f:attribute> 사용할 수 있습니까?

답변

43

@ManagedProperty은 JSF가 속성을 설정해야하는 위치가 아니라 JSF가 속성을 "내 보내야"하는 위치를 선언합니다. LoginBeanOrderBean의 속성으로 삽입해야합니다. 당신이 당신의 OrderBean 요청 또는보기를 만들 경우, 또는 단지

loginBean.getIdentityNr(); 

하여 OrderBean에 액세스 할 수 있습니다

public class OrderBean { 

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

    // ... 
} 

이 방법은 당신은 또한 단지 identityNr 속성을 설정할 수 있습니다, 범위. 구체적인 문제에

public class OrderBean { 

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

    // ... 
} 

관련없는 : 빈 문자열로 String 속성을 초기화 가난한 방법입니다.

+0

안녕하세요 BalusC하지만 이번에는 OrderBean에서 loginbean의 불필요한 속성을 갖게 될 것입니다. 프로그램을위한 힙 낭비가 아닌가? 신원 확인이 필요해. 보안 문자 값 또는 이름이 아닙니다. – asyard

+1

어, 그냥 참고서 일뿐입니다. 전체 콩을 메모리에 복사하지 않습니다. ** 세션에서 이미 가지고있는 bean과 똑같은 ** bean을 가리 킵니다. Java는 절차 지향적 인 것이 아니라 객체 지향적입니다. 심지어 자바 빈즈 대신에 문자열을 이중 참조하는 것은 잠재적으로 더 비쌉니다. – BalusC

+0

답변 해 주셔서 감사합니다. 나는 충분한 평판을 얻 자마자 모든 답을 투표 할 것이다. :) 그러나 호기심이 많은가, facescontext.getblabla() .. 또는 jsf 페이지에 주입하지 않고 다른 방법이 있는가? – asyard

관련 문제