2012-03-27 2 views
6

여러 페이지 양식, 일명 마법사 패턴입니다. 여기서 Page 1은 마법사 양식의 1 단계에 해당하고 페이지 2는 2 단계에 해당합니다. 마지막 페이지가 아닌 다른 페이지에는 다음 버튼이 있습니다 양식의 다음 페이지로 이동합니다. 마지막 페이지에는 마법사의 모든 페이지에 대한 모든 데이터를 제출하는 제출 버튼이 있습니다.JSF 2.0에서 마법사 패턴에 사용할 범위는 무엇입니까?

각 양식에 입력 된 데이터의 상태를 유지하려면 어떤 범위를 사용해야합니까? 예 : 모든 페이지에 입력 된 모든 데이터를 보유하는 View Scoped Bean을 사용해야합니까? 다른 페이지로 이동하게 될 것이므로 (다른보기 인 것으로 간주되는 것으로 생각되며 다른보기 인 경우 다음 페이지로 이동하면 View Scoped 데이터가 손실 될 것입니다. 마법사)

+0

내가 ViewScope는 아약스와 올바르게 작동하는지 생각합니다. 하지만이 옵션을 권하고 싶습니다. – Gaim

답변

12

당신이 마법사의 다음 페이지로 이동하면보기 범위가 지정된 데이터가 손실 될 것으로 예상) 맞습니다

. 뷰 범위는 동일한 뷰와 상호 작용하고 새로운 뷰가 생성 될 때마다 휴지통에있는 한 계속 유지됩니다. 당신은 "대화 범위"를 찾고 있습니다. 이것은 JSF 관리 빈 범위에서 사용할 수 없습니다. 그러나 이것은 CDI @ConversationScoped에 의해 이용 가능합니다. 환경은 CDI를 지원하기 위해 일한다면, 당신은 그것의 사용을 만들 수 :

import javax.enterprise.context.Conversation; 
import javax.enterprise.context.ConversationScoped; 
import javax.inject.Inject; 
import javax.inject.Named; 

@Named 
@ConversationScoped 
public class Wizard implements Serializable { 

    @Inject 
    private Conversation conversation; 

    @PostConstruct 
    public void init() { 
     conversation.begin(); 
    } 

    public void submitFirstStep() { 
     // ... 
    } 

    // ... 

    public String submitLastStep() { 
     // ... 

     conversation.end(); 
     return "someOtherPage?faces-redirect=true"; 
    } 

    // ... 
} 

대화가 자동으로 삽입 cid 요청 매개 변수에 의해 관리됩니다. 당신이 제 3 자를 사용할 수,

<h:panelGroup rendered="#{wizard.step == 1}"> 
    <ui:include src="/WEB-INF/wizard/step1.xhtml" /> 
</h:panelGroup> 
<h:panelGroup rendered="#{wizard.step == 2}"> 
    <ui:include src="/WEB-INF/wizard/step2.xhtml" /> 
</h:panelGroup> 
<h:panelGroup rendered="#{wizard.step == 3}"> 
    <ui:include src="/WEB-INF/wizard/step3.xhtml" /> 
</h:panelGroup> 

을 또는 :

는 JSF 뷰 범위에 충실하고 싶은 경우는, 당신의 가장 좋은 방법은 당신이 조건부로 여러 단계를 렌더링에있어서 하나의 페이지를 만드는 것입니다 이 목적을 위해 <p:wizard> 구성 요소를 가진 PrimeFaces과 같은 구성 요소 라이브러리가 필요합니다.

+0

불행히도 CDI 컨테이너에 액세스 할 수 없습니다. 나는 아마도 p : wizard 나 조건부 렌더링으로 갈 것입니다. JSF 2.0의 "Custom Scope"기능을 사용하면 또 다른 대안이 될까요? – BestPractices

+0

예, 맞춤 JSF2 범위에서 가능해야합니다. 그것은 내가 머리 꼭대기에서 타이핑 할 수있는 사소한 코드가되지 않을 것입니다. – BalusC

0

내 pov에서 좋은 선택은 세션 범위 콩입니다. 필요한 경우 사용자는 마법사를 중단하고 다른 페이지, 문서, 설명서 등을 방문하여 동일한 마법사 단계로 돌아갈 수 있습니다. 물론 뷰 범위 Bean을 통해 수행 할 수 있습니다 (BalusC 응답 참조). 개인적으로 아약스가 심하게 관여 할 때는 뷰 범위의 콩을 선호합니다. 이 경우이 두 범위를 결합하는 것이 좋습니다.

+0

세션 범위를 권장하지 않습니다. 이렇게하면 여러 브라우저 창/탭에서 마법사 페이지를 열면 비정상적인 결과가 발생합니다. – BalusC

+0

...뿐만 아니라 backbuttons. – BestPractices

+0

@BestPractices, 물론 이죠. ALT-F4가 문제가되어 모든 곳에서 이길 수없는 경우가 있습니다)) – Osw

관련 문제