2012-03-27 6 views
6

Ich habe ein mehrseitiges Formular, auch bekannt als Wizard-Muster, wobei Seite 1 Schritt 1 des Assistenten-Formulars entspricht, Seite 2 Schritt 2 usw. entspricht. Jede andere Seite als die letzte Seite hat eine Schaltfläche Weiter Sie auf die nächste Seite im Formular. Die letzte Seite hat eine Übergabeschaltfläche, die alle Daten für alle Seiten im Assistenten übermittelt.Welcher Bereich in JSF 2.0 für das Wizard-Muster?

Welchen Umfang sollte ich verwenden, um den Status der Daten auf jedem Formular zu erhalten? z.B. Soll ich eine View-Scoped-Bean verwenden, die alle auf allen Seiten eingegebenen Daten enthält? Funktioniert das, weil ich zu verschiedenen Seiten navigiere (die meiner Meinung nach unterschiedliche "Ansichten" sind, und wenn sie unterschiedliche Ansichten sind, glaube ich, dass die Daten des Ansichtsbereichs beim Navigieren zur nächsten Seite verloren gehen der Assistent)

+0

Ich denke, dass ViewScope mit Ajax nur richtig funktioniert. Aber ich würde diese Option empfehlen. – Gaim

Antwort

12

ich glaube, wird die Ansicht Scoped Daten verloren, wenn Sie auf der nächsten Seite des Assistenten) Ebene

das ist richtig. Der Ansichtsbereich bleibt so lange bestehen, wie Sie mit der gleichen Ansicht interagieren und bei der Erstellung einer neuen Ansicht verworfen werden. Sie suchen nach dem "Gesprächsumfang". Dies ist in keinem der von JSF verwalteten Bean-Bereiche verfügbar. Dies ist jedoch von CDI @ConversationScoped verfügbar. Also, wenn Ihre Umgebung CDI unterstützen passieren, könnte man davon Gebrauch machen:

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

    // ... 
} 

Das Gespräch durch die automatisch eingefügt cid Anforderungsparameter verwaltet wird.

Wenn Sie auf die JSF Viewbereich bleiben möchten, dann Ihre beste Wette ist eine einzelne Seite zu erstellen, wobei Sie die mehrere Schritte bedingt machen:

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

Oder Sie eine 3rd-Party verwenden könnte Komponentenbibliothek wie PrimeFaces, die eine <p:wizard> Komponente für genau diesen Zweck hat.

+0

Ich habe leider keinen Zugriff auf einen CDI-Container. Ich denke, ich werde wahrscheinlich dann mit p: wizard oder dem bedingten Rendering gehen. Würde die Nutzung von JSF 2.0's "Custom Scope" Einrichtungen eine andere Alternative bieten? – BestPractices

+0

Ja, sollte es sicherlich mit einem benutzerdefinierten JSF2-Bereich möglich sein. Es wird nur kein trivialer Code sein, den ich oben tippen könnte (nur weil ich das nie versucht habe :)). – BalusC

0

Von meinem POV, ist eine gute Wahl hier Session-Bohnen. Bei Bedarf kann der Benutzer den Assistenten unterbrechen, andere Seiten, Dokumente, Handbücher usw. aufrufen und zum selben Assistenten-Schritt zurückkehren. Natürlich kann dies über View-Scoped-Beans geschehen (siehe BalusC-Antwort). Persönlich bevorzuge ich View-Scoped-Bohnen, wenn Ajax stark beteiligt ist. In diesem Fall würde ich empfehlen, diese beiden Bereiche zu kombinieren.

+0

Ich würde den Sitzungsumfang dafür nicht empfehlen. Dies führt zu Unregelmäßigkeiten, wenn die Assistentenseite in mehreren Browserfenstern/Tabs geöffnet wird. – BalusC

+0

... sowie Backbuttons. – BestPractices

+0

@BestPractices, sicher, es kommt darauf an. Es gibt Fälle, in denen ALT-F4 auch ein Problem ist, man kann nicht überall gewinnen)) – Osw

Verwandte Themen