2011-06-14 2 views
3

페이지로드시 백킹 빈을 초기화하려고합니다. 이미 많은 솔루션을 찾았지만 대부분은 링크, 버튼 또는 매개 변수를 사용하지 않고 있습니다.JSF 2.0에서 페이지로드시 매개 변수가있는 백킹 빈 초기화

시나리오 : 고객이 사이트에 로그인 한 후 다음 페이지에서 그의 모든 데이터를 볼 수 있습니다.

백업 콩 :

  1. loginDetailsController - 로그인 프로세스를 지원합니다. 사용자의 비밀번호와 사용자 이름에 액세스 할 수 있습니다. Login.xhtml에 백킹 빈 .

  2. customerController - 나머지 사용자 세부 정보는 에 액세스합니다. 또한 customer_id 필드가 있습니다. Home.xhtml의 Backing bean 입니다. customerController는 customer_id에서 완전히 초기화 할 수 있습니다. Home.xhtml에

는이 방법 CUSTOMER_ID 얻을 수 있습니다 : 페이지로드에 위의 값으로 customerController을 초기화 할 수있는 방법이

#{loginDetailsController.customer_id} 

있습니까?

감사합니다,

다니엘

답변

1

를이 내가 그것을 해결하는 방법입니다 다음과 같이, 당신은 그것을 주입 할 수

LoginDetailsController은 세션 범위이기 때문에 - CUSTOMER_ID 항상 초기화 .

그래서 - CUSTOMER_ID에 대한 getter 및 setter - 나는

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

플러스를 추가했다.

Nikhil이 말한 것처럼 LoginDetailsController에서 약간의 변화가있었습니다. 그런 다음 #{customerController.customer_id}을 사용하고 나머지는 customerController의 home.xhtml에서 customerController의 초기화 된 요소를 사용할 수 있습니다.

감사합니다.

10

JSF 2.0 미리 렌더링 지원이, 당신의 문제를 해결해야한다고.

JSF 2에는 뷰 매개 변수 처리가 끝나고 뷰가 렌더링되기 전에 시작되는 PreRenderViewEvent가 포함되어 있습니다. 사전 렌더링 뷰 리스너는 태그를 사용하여 등록 할 수 있습니다. 예 :

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

감사합니다. 한 백킹 빈에서 다른 백킹 빈에 매개 변수를 전달하는 방법을 여전히 이해하지 못합니다. 어쩌면 내가 뭔가를 놓친 것 같아. – Daniel

4

빈의 범위는 무엇입니까? 어쨌든 @PostConstruct 어노테이션으로 표시된 메소드는 빈이 작성되는 동안 한 번 호출됩니다. 당신이 당신의 페이지가 항상 관계없이 콩이 이미 생성되어 있는지의 여부,이 방법을 실행 Tarun 바르게 제안 PreRenderViewEvent을 사용하려면

@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; 
    } 
} 

. 그러나이 이벤트는 페이지가 렌더링 될 때마다 발생한다는 점에 유의하십시오. 사용자가 페이지를 새로 고칠 때도

당신이 customerControllerLoginDetailsController에서이 값을 사용하려면

@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(); 
    } 
+0

둘 다 세션 범위가 지정됩니다. 관리되는 bean에 대한 loginDetailsController가 존재하지 않습니다 .'라는 메시지가 나타납니다. JSF가 어떻게 보이는지 기록해 주시겠습니까? – Daniel

+0

같은 코드이지만'@ViewScoped' 대신'@ SessionScoped'를 사용합니다. – BalusC

+0

오하이오 당신은 백킹 빈이 CustomerController 인 페이지에서 # {loginDetailsController.customer_id}를 사용하려고합니다. loginDetailsController에 getter와 setter를 정의하지 않았을 수도 있습니다 (위의 코드에도 해당 항목이 포함되어 있지 않습니다). 따라서 오류. # {loginDetailsController.customer_id} 대신 # {customerController.customer_id} 속성을 참조해야합니다. – Nikhil