2012-03-27 23 views
6

Tengo un formulario de varias páginas, también conocido como un patrón de Asistente, donde la Página 1 corresponde al Paso 1 del asistente, la Página 2 corresponde al Paso 2, etc. Cada página que no sea la última tiene un botón Siguiente que toma usted a la página siguiente en el formulario. La página final tiene un botón de enviar que envía todos los datos para todas las páginas en el asistente.¿Qué ámbito usar en JSF 2.0 para el patrón Wizard?

¿Qué alcance debo usar para mantener el estado de los datos ingresados ​​en cada formulario? p.ej. ¿Debería usar un bean View Scoped que contenga todos los datos ingresados ​​en todas las páginas? ¿Funcionará eso ya que estaré navegando a diferentes páginas (que creo que se consideran "vistas" diferentes, y si son vistas diferentes, creo que los datos de Ver alcance se perderán cuando navegue a la página siguiente en el asistente)

+0

Creo que ViewScope sólo funciona correctamente con el Ajax. Pero recomendaría esta opción. – Gaim

Respuesta

12

creo que los datos Ver Scoped se perderán cuando se desplaza a la siguiente página del asistente)

Eso es correcto. El alcance de la vista vive siempre que interactúe con la misma vista y se destruya cada vez que se crea una nueva vista. Está buscando el "alcance de la conversación". Esto no está disponible en ninguno de los ámbitos de beans gestionados de JSF. Sin embargo, esto está disponible en CDI @ConversationScoped. Así que si su entorno de pasar a apoyar CDI, se puede hacer uso de ella:

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 conversación es administrado por el parámetro inserta automáticamente cid petición.

Si desea adherirse al alcance vista JSF, entonces su mejor apuesta es la creación de una sola página en la que renderizar los múltiples pasos condicionalmente:

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

O bien, se puede utilizar una tercera parte biblioteca de componentes como PrimeFaces que tiene un componente <p:wizard> para este propósito.

+0

Desafortunadamente no tengo acceso a un contenedor CDI. Supongo que probablemente vaya con p: asistente o la representación condicional. ¿El uso de las instalaciones de "alcance personalizado" de JSF 2.0 proporcionaría otra alternativa? – BestPractices

+0

Sí, seguramente debería ser posible con un alcance personalizado JSF2. No va a ser solo un código trivial que podría escribir de la mejor manera (solo porque nunca lo intenté :)). – BalusC

0

Desde mi punto de vista, una buena opción aquí es frijol de sesión. Cuando sea necesario, el usuario podrá interrumpir el asistente, visitar otras páginas, documentos, manuales, lo que sea, y volver al mismo paso del asistente. Por supuesto, se puede hacer a través de frijoles con vista (ver respuesta BalusC). Personalmente prefiero los beans con vista cuando Ajax está muy involucrado. En ese caso, recomendaría combinar estos dos ámbitos.

+0

No recomendaría el alcance de la sesión para esto. Esto dará lugar a irregularidades al abrir la página del asistente en varias ventanas/pestañas del navegador. – BalusC

+0

... así como también los botones de retroceso. – BestPractices

+0

@BestPractices, seguro, depende. Hay casos en que ALT-F4 también es un problema, no se puede ganar en todas partes)) – Osw

Cuestiones relacionadas