2012-03-27 10 views
6

Sayfa 1'in sihirbaz formunun 1. Adımına karşılık geldiği, Sayfa 2'nin Adım 2'ye karşılık geldiği, çok sayfalı bir formum var. Sihirbazın sonundaki her sayfanın üzerinde bir İleri düğmesi var. formdaki bir sonraki sayfaya. Son sayfada, sihirbazdaki tüm sayfalar için tüm verileri gönderen bir gönderme düğmesi vardır.Sihirbaz deseni için JSF 2.0'da hangi kapsamı kullanılır?

Her formda girilen verilerin durumunu korumak için hangi kapsamı kullanmalıyım? Örneğin. Tüm sayfalarda girilen tüm verileri tutan View Scoped bean kullanmalı mıyım? Farklı sayfalara (Ben farklı "görünümler" olarak kabul edildiğine inanıyorum) farklı sayfalar arasında gezineceğime göre çalışacağım ve farklı görünümler varsa, bir sonraki sayfaya gittiğinizde View Scoped verilerinin kaybolacağına inanıyorum sihirbaz)

+0

Ben ViewScope sadece Ajax ile düzgün çalıştığını düşünüyorum. Ancak bu seçeneği öneriyorum. – Gaim

cevap

12

sana sihirbazın sonraki sayfaya gittiklerinde Görünüm Dürbünlü veriler kaybolur inanıyoruz) doğru olduğundan

. Görünüm kapsamı, aynı görünümle etkileşim kurduğunuz ve yeni bir görünüm oluşturulduğunda çöp kutusuna atıldığı sürece yaşar. "Konuşma alanı" nı arıyorsun. Bu, herhangi bir JSF yönetilen fasulye kapsamı tarafından mevcut değildir. Ancak bu, CDI @ConversationScoped tarafından kullanılabilir. ortamınızın CDI desteklemek için ne ise Yani, bunu kullanan yapabiliriz:

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

    // ... 
} 

konuşma otomatik olarak eklenir cid istek parametresi tarafından yönetilmektedir. Eğer bir 3. parti kullanabilirsiniz,

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

Veya:

Eğer JSF görünümü kapsamına sadık isterseniz, o zaman en iyi bahis koşullu birden çok adım işlemek burada tek bir sayfa oluşturmaktır Tam olarak bu amaçla bir <p:wizard> bileşeni olan PrimeFaces gibi bileşen kitaplığı.

+0

Maalesef bir CDI kabına erişemiyorum. Sanırım muhtemelen p: sihirbaz veya koşullu oluşturma ile gideceğim. JSF 2.0'ın "Özel Kapsam" tesislerini kullanmak başka bir alternatif sağlıyor mu? – BestPractices

+0

Evet, özel bir JSF2 kapsamı ile kesinlikle mümkün olmalıdır. Sadece başın üstünden yazabildiğim bazı önemsiz kodlar olmayacak (sadece böyle denemediğim için :)). – BalusC

0

Benim pov'umdan, burada iyi bir seçim oturum kapsamı fasulye. Gerektiğinde, kullanıcı sihirbazı kesintiye uğratabilir, diğer sayfaları, dokümanları, kılavuzları ziyaret edebilir ve aynı sihirbaz adımına geri dönebilir. Tabii ki, bakışlı fasulye ile yapılabilir (bkz. BalusC cevabı). Şahsen ajax ağır bir şekilde dahil olduğunda bakla fasulye tercih ederim. Bu durumda bu iki kapsamı birleştirmenizi tavsiye ederim.

+0

Bunun için oturum kapsamını önermem. Bu, sihirbaz sayfasının birden çok tarayıcı penceresinde/sekmesinde açıldığında düzensizliklere neden olur. – BalusC

+0

... yanı sıra backbuttons. – BestPractices

+0

@ BestPractices, elbette, bağlıdır. ALT-F4'ün de bir sorun olduğu durumlar var, her yerde kazanamazsınız)) – Osw