2012-03-27 14 views
6

私は複数のページ形式、別名ウィザードパターンを持っています。ここで、ページ1はウィザードフォームのステップ1に対応し、ページ2はステップ2に対応します。最後以外の各ページには、フォームの次のページに移動します。最後のページには、ウィザードのすべてのページのすべてのデータを送信する送信ボタンがあります。JSF 2.0でどのような範囲でウィザードパターンを使用できますか?

各フォームに入力されたデータの状態を維持するにはどのような有効範囲を使用しますか?例えばすべてのページに入力されたすべてのデータを保持するView Scoped Beanを使用する必要がありますか?私は別のページに移動しているので、これはうまくいくだろう(私は異なるビュー "とみなされていると信じている;そしてそれらが異なるビューであるならば、次のページに移動するとビュースコープのデータは失われるだろう正しいだウィザード)

+0

私はViewScopeだけアヤックスで正しく動作することを考えます。しかし、私はこのオプションをお勧めします。 – Gaim

答えて

12

私は、ウィザードの次のページに移動したときに表示スコープのデータが失われると信じて

。ビューの有効範囲は、同じビューとやりとりしている限り、新しいビューが作成されるたびに破棄されます。あなたは "会話範囲"を探しています。これは、JSFマネージドBeanスコープでは使用できません。しかし、これは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リクエストパラメータによって管理されています。

あなたはJSFビューのスコープに固執したい場合は、あなたの最善の策は、あなたが条件付きで複数のステップをレンダリングする前記単一のページを作成することです:

<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> 

または、サードパーティ製を使用することができます正確にこの目的のために<p:wizard>成分を有するPrimeFacesのようなコンポーネントライブラリである。

+0

残念ながら、CDIコンテナにアクセスすることはできません。私はおそらく、p:wizardか条件付きレンダリングで行くと思います。 JSF 2.0の「カスタムスコープ」機能を使用すると、別の方法が提供されますか? – BestPractices

+0

はい、カスタムJSF2スコープでは可能です。それは私が頭の上から打ち抜くことができる(私がそういったことを試みたことがないので)ただの簡単なコードではないでしょう:))。 – BalusC

0

私のポストからは、ここではセッションスコープのビーンズが適しています。必要に応じて、ユーザーはウィザードを中断し、他のページ、ドキュメント、マニュアルなどを訪問して、同じウィザードステップに戻ることができます。もちろん、ビュースコープのBeanを介して行うこともできます(BalusCの回答を参照)。個人的には、Ajaxが深く関わっているときは、ビュースコープのBeanを好む。その場合は、これらの2つのスコープを組み合わせることをお勧めします。

+0

私はこのためにセッションスコープをお勧めしません。これにより、複数のブラウザウィンドウ/タブでウィザードページを開いたときに不規則になります。 – BalusC

+0

...とバックボタンがあります。 – BestPractices

+0

@BestPractices、確かに、それは依存しています。 ALT-F4も問題で、どこでも勝てない場合があります) – Osw

関連する問題