2012-03-27 2 views
6

Ho un modulo a più pagine, ovvero un modello di procedura guidata, in cui la pagina 1 corrisponde al passaggio 1 del modulo della procedura guidata, la pagina 2 corrisponde al passaggio 2, ecc. Ogni pagina diversa dall'ultima ha un pulsante Avanti che richiede alla pagina successiva nel modulo. La pagina finale ha un pulsante di invio che invia tutti i dati per tutte le pagine nella procedura guidata.Quale ambito da utilizzare in JSF 2.0 per il modello Wizard?

Quale ambito dovrei utilizzare per mantenere lo stato dei dati immessi in ogni modulo? per esempio. dovrei usare un bean View Scoped che contiene tutti i dati inseriti su tutte le pagine? Funzionerà da quando navigerò su pagine diverse (che credo siano considerate "viste" diverse, e se sono viste diverse, credo che i dati di View Scoped andranno persi quando navigherai alla pagina successiva in la procedura guidata)

+0

Penso che Viewscope funziona correttamente solo con l'Ajax. Ma raccomanderei questa opzione. – Gaim

risposta

12

credo che i dati di vista con ambito andranno persi quando si passa alla pagina successiva della procedura guidata)

Questo è corretto. L'ambito di visualizzazione dura finché si interagisce con la stessa vista e vengono eliminati ogni volta che viene creata una nuova vista. Stai cercando "l'ambito della conversazione". Questo non è disponibile da nessuno degli ambiti di bean gestiti JSF. Questo è comunque disponibile da CDI @ConversationScoped. Quindi, se l'ambiente capita di sostenere CDI, si potrebbe fare uso di esso:

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

    // ... 
} 

La conversazione è gestita dal parametro inserito automaticamente cid richiesta.

Se vuoi a bastone per la portata vista JSF, allora la cosa migliore è quello di creare una singola pagina in cui si esegue il rendering i molteplici passaggi condizionale:

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

Oppure, si potrebbe utilizzare un 3rd party libreria di componenti come PrimeFaces che ha un componente <p:wizard> esattamente per questo scopo.

+0

Purtroppo non ho accesso a un contenitore CDI. Credo che probabilmente andrò con p: wizard o il rendering condizionale. Usare le strutture "Ambito personalizzato" di JSF 2.0 fornirebbe un'altra alternativa? – BestPractices

+0

Sì, dovrebbe essere sicuramente possibile con un ambito JSF2 personalizzato. Non sarà solo un codice banale che potrei cancellare dalla testa (solo perché non ho mai provato così :)). – BalusC

0

Dal mio punto di vista, buona scelta qui sono i bean con scope di sessione. Quando necessario, l'utente sarà in grado di interrompere la procedura guidata, visitare altre pagine, documenti, manuali, qualsiasi altra cosa e tornare allo stesso passo della procedura guidata. Ovviamente può essere fatto tramite bean con scope view (vedi risposta BalusC). Personalmente preferisco i bean con scope view quando ajax è pesantemente coinvolto. In tal caso, consiglierei di combinare questi due ambiti.

+0

Non consiglierei l'ambito della sessione per questo. Ciò comporterà delle irregolarità quando si apre la pagina della procedura guidata in più finestre/schede del browser. – BalusC

+0

... così come i backbuttons. – BestPractices

+0

@BestPractices, certo, dipende. Ci sono casi in cui anche ALT-F4 è un problema, non puoi vincere ovunque)) – Osw