2012-04-11 3 views
0

기본적으로 내가 다른 브라우저 탭으로 리디렉션되는 페이지에 ViewScoped 콩 유지하려면 어떻게 hereJSF 2.0 @ViewScoped 리디렉션 (탐색) = "_ 빈"대상으로

과 같은 질문 :

firstPage.xhtml :

<h:commandLink action="#{controller.redirect}" value="#{bean.value} target="_blank"/> 

리디렉션/탐색은 다른 빈을 초기화와 함께 완료,이 과정에서이 # {콩}을 파괴합니다. 리디렉션 된 코드에서 # {bean}을 사용하지 않았습니다. 이전에 사용하던 작업

<a4j:keepAlive> 

다음은 현재 설정입니다. 빈 클래스 :

@ViewScoped 
public class Bean{ 
    @PreDestroy 
    public void onDestroy(){ // being destroyed when I don't want to } 
} 

얼굴-설정 :

Luiggi 제안 및 저장 데이터를 일시적으로 세션 또는 데이터를 다시 가져 오기에 충분한 데이터 (또는 키를 통과 할 때 당신이해야 할
<navigation-rule> 
    <from-view-id>/firstPage.xhtml</from-view-id> 
    <navigation-case> 
     <from-outcome>redirect</from-outcome> 
     <to-view-id>/secondPage.xhtml</to-view-id> 
    </navigation-case> 
</navigation-rule> 
+0

Bean은 작동하려면 @Session 범위를 가져야합니다. 마지막 리소스로서 세션에서 데이터를 저장하고 다른 bean의 생성자에서 복구 할 수 있습니다. –

답변

2

)를 쿼리 매개 변수를 통해 대상 뷰로 보냅니다. 새 창/탭을 리디렉션하거나 타겟팅하지 않은 경우에도 마찬가지입니다.

보기 범위가 이상합니다. 사용자가 동일한보기에 머물러있을 때만 존재합니다. JSF는 뷰를 탐색 한 것으로 판단하면 해당 뷰로 범위가 지정된 모든 빈을 자동으로 삭제합니다.

다른보기로 이동할 수있는 두 가지 방법이 있습니다. 첫 번째는 얼굴이 아닌 요청입니다 (예 : h:link 또는 h:button). 이 경우, 이전 뷰는 복원되지 않으므로 JSF는 뷰 범위의 빈을 파기해야한다는 것을 알지 못합니다. 두 번째는 void 또는 null이 아닌 또는 h:commandButton과 같은 얼굴 요청입니다. 이 경우 뷰를 다시 게시 할 수 있으며이 뷰는 작업을 처리하기 위해 복원됩니다. 해당 조치의 결과가 해당보기에서 이동하거나 리다이렉션되는 경우, 해당보기에 범위가 지정된 모든 bean은 파기됩니다.

보기 범위는 기본적으로 "이전"데이터 정리를위한 내장 된 의미 체계가있는 세션 범위입니다. 사용자가 두 개 이상의 창/탭에서 애플리케이션을 열지 않고 애플리케이션 내에서 제공되는 탐색 만 사용해야하는 경우 (예 : 브라우저의 뒤로/앞으로 버튼 제외)이 효과적입니다. 그러나, 우리는 웹 브라우저 타겟팅에 대해 이야기하고 있기 때문에 뷰 범위는 꽤 쓸모가 없습니다 (유일한 예외는 대상 브라우저를 제어하고 뒤로/앞으로/다시로드/위치를 완전히 비활성화 할 수있는 경우이지만, 당신이 그런 환경에있는 것처럼 소리가 나지 않습니다.)

+0

나는 마지 못해 대답을 받아 들인다 ... 단지 내가 듣기를 바라고 있었던 것이 아니기 때문에) :) 그래서 나는 약간의 재 설계를 할 필요가있다. 내 자신 만의 세션 정리를 관리하거나 동일한 후드 팩 요청에서 리디렉션하지는 않지만 비 페이스 방식으로 수행하면 콩을 만지지 않을 것입니다. 브라이언 감사합니다. – Elijah