Cómo elegir el derecho de frijol alcance?

Me di cuenta de que hay diferentes bean ámbitos como:

@RequestScoped
@ViewScoped
@FlowScoped
@SessionScoped
@ApplicationScoped

¿Cuál es el propósito de cada uno de ellos? ¿Cómo elegir un buen ámbito para mi bean?

OriginalEl autor Valter Silva | 2011-08-11

2 Kommentare

  1. 457

    Introducción

    Representa el alcance (la duración) del grano. Esto es más fácil de entender si se está familiarizado con «bajo las sábanas» trabajo de base de servlets de la aplicación web: ¿Cómo servlets trabajo? La creación de instancias, las sesiones, las variables compartidas y multithreading.


    @Request/View/Flow/Session/ApplicationScoped

    Un @RequestScoped de frijol en la vida mientras una sola petición HTTP-ciclo de respuesta (tenga en cuenta que una petición Ajax se cuenta como una sola petición HTTP demasiado). Un @ViewScoped de frijol en la vida mientras que usted está interactuando con el mismo JSF vista por las devoluciones de datos que llamar a los métodos de acción de volver null/void sin ningún tipo de navegación/redirect. Un @FlowScoped de frijol en la vida mientras que usted está navegando a través de la colección especificada de vistas a la registrada en el flujo de archivo de configuración. Un @SessionScoped de frijol en la vida mientras el establecido sesión HTTP. Un @ApplicationScoped de frijol en la vida mientras se ejecuta la aplicación web. Tenga en cuenta que la CDI @Model es básicamente un estereotipo para @Named @RequestScoped, de modo mismas reglas aplican.

    Que alcance a elegir depende exclusivamente de los datos (el estado) el frijol contiene y representa. Uso @RequestScoped sencillo y no ajax formas y presentaciones. Uso @ViewScoped para ricos habilitado para ajax vistas dinámicas (ajaxbased de validación, el procesamiento, cuadros de diálogo, etc). Uso @FlowScoped para el «asistente» («cuestionario») el patrón de la recogida de datos de entrada, repartidas en varias páginas. Uso @SessionScoped para el cliente de datos específicos, tales como el usuario que ha iniciado sesión y preferencias del usuario (idioma, etc). Uso @ApplicationScoped para la aplicación amplia de datos/constantes, tales como listas desplegables, que son iguales para todos, o managed beans sin ningún variables de instancia y tener sólo métodos.

    Abusar de una @ApplicationScoped bean de sesión/vista/ámbito de petición de datos de llegar a ser compartido entre todos los usuarios, por lo que nadie puede ver los datos de los demás que es simplemente malo. Abusando de una @SessionScoped bean para ver/ámbito de petición de datos de llegar a ser compartida entre todas las pestañas/ventanas en una sola sesión del navegador, por lo que el usuario final puede experimentar inconsitenties a la hora de interactuar con cada vista después de cambiar entre pestañas de lo que es malo para la experiencia del usuario. Abusando de una @RequestScoped bean para ver el ámbito de los datos podría hacer la vista ámbito de los datos de la reinicialización de los valores predeterminados en cada (ajax) devolución, causando posiblemente no formas de trabajo (ver también los puntos 4 y 5 aquí). Abusando de una @ViewScoped de frijol de la solicitud, de sesión o ámbito de aplicación de datos, y abusando de un @SessionScoped bean para el ámbito de la aplicación de datos no afecta el cliente, pero innecesariamente ocupa la memoria del servidor y es simple ineficiente.

    Tenga en cuenta que el ámbito de aplicación debería no ser elegido en base a las implicaciones de la ejecución, a menos que usted realmente tienen una huella de memoria baja y quieres ir completamente apátridas; había necesidad de utilizar exclusivamente @RequestScoped frijoles y jugar con los parámetros de solicitud para mantener al cliente del estado. También tenga en cuenta que cuando se tiene una sola página JSF con diferente ámbito de los datos, entonces es perfectamente válido para ponerlos en separar la copia de frijoles en un ámbito de coincidencia de los datos del ámbito. Los granos sólo puede acceder a ellos a través de @ManagedProperty en caso de JSF managed beans o @Inject en el caso de la CDI managed beans.

    Véase también:


    @CustomScoped/NoneScoped/Dependent

    No menciona en su pregunta, pero (legado) JSF también admite @CustomScoped y @NoneScoped, que rara vez se utilizan en el mundo real. El @CustomScoped debe referir a una costumbre Map<K, Bean> aplicación en algunos ámbito de aplicación más amplio que ha anulado la Map#put() y/o Map#get() con el fin de tener más de un control más fino sobre bean creación y/o destruir.

    El JSF @NoneScoped y CDI @Dependiente básicamente en la vida mientras una sola de EL-evaluación en el bean. Imagina un formulario de inicio de sesión con dos campos de entrada de referencia de un bean de propiedad y un botón de comando en referencia a un bean de acción, por lo tanto con un total de tres expresiones EL, entonces efectivamente tres instancias será creado. Uno con el nombre de usuario, uno con la contraseña establecida y en el que la acción se invoca. Normalmente se desea utilizar este ámbito sólo en granos, que debe de vivir tan largo como el frijol, donde se inyecta. Así que si un @NoneScoped o @Dependent se inyecta en un @SessionScoped, a continuación, se va a vivir tanto como el @SessionScoped bean.

    Véase también:


    Flash ámbito

    Último, JSF también soporta el flash alcance. Está respaldada por un corto de vida de la cookie de que se asocia con una entrada de datos en el ámbito de la sesión. Antes de la redirección, se guardará una cookie en la respuesta HTTP con un valor que es el único asociado con la entrada de datos en el ámbito de la sesión. Después de la redirección, la presencia del flash el alcance de la cookie será revisado y la entrada de datos asociados con la cookie será eliminado desde el ámbito de la sesión y se coloca en el ámbito de petición de la solicitud redirigida. Finalmente, la cookie será eliminado de la respuesta HTTP. De esta manera la solicitud redirigida tiene acceso a un ámbito de petición de datos que se ha preparado en la solicitud inicial.

    Esto en realidad no es disponible como un bean gestionado alcance, es decir, no hay tal cosa como @FlashScoped. El flash ámbito de aplicación sólo está disponible como un mapa a través de ExternalContext#getFlash() en manejo de granos y #{flash} en EL.

    Véase también:

    Creo que una referencia a la su respuesta a la pregunta «¿Cómo y cuando es una vista ámbito de la haba destruido en JSF?» es relevante aquí.
    que un viejo CDI alcance y en JSF 2.2 sustituido con @FlowScoped (no hay necesidad de iniciar manualmente/stop).
    Y DeltaSpike además ha ViewAccesscoped y WindowScoped
    Creo que hay un problema, con ViewScoped bean en MyFaces 2.2. Actualmente estoy enfrentando un problema con ViewScoped bean y Ajax, que me han publicado en el here. En MyFaces JIRA, también hay un discusión sobre este tema.

    OriginalEl autor BalusC

  2. 118

    Como de JSF 2.x hay 4 Bean Ámbitos:

    • @SessionScoped
    • @RequestScoped
    • @ApplicationScoped
    • @ViewScoped

    El Ámbito de la sesión: el ámbito de La sesión persiste desde el momento en que se establece una sesión hasta la finalización de sesión. Un finaliza la sesión
    si la aplicación web, se invoca el método invalidate en el
    Objeto HttpSession, o si el tiempo de espera.

    RequestScope: El ámbito de petición es de corta duración. Se inicia cuando una petición HTTP que se envía, y termina después de la respuesta se envía de vuelta
    para el cliente. Si se coloca un bean gestionado en el ámbito de petición, una nueva
    se crea la instancia con cada solicitud. Vale la pena considerar la solicitud de
    alcance si le preocupa el costo de la sesión alcance de almacenamiento.

    ApplicationScope: el ámbito de La aplicación persiste durante toda la duración de la aplicación web. Ese ámbito es compartida entre todos
    las solicitudes y todas las sesiones. Colocar managed beans en el
    el ámbito de aplicación si una sola de frijol debe ser compartida entre todos
    las instancias de una aplicación web. El frijol se construye cuando se
    primera solicitado por cualquier usuario de la aplicación, y se mantiene viva
    hasta que la aplicación web es eliminado desde el servidor de la aplicación.

    ViewScope: Vista ámbito de aplicación se ha añadido en JSF 2.0. Un bean en vista de ámbito persiste mientras la misma página JSF se vuelve a mostrar. (El JSF
    la especificación se utiliza el término de la vista de una página JSF.) Tan pronto como el usuario
    navega a una página diferente, el grano sale del ámbito.

    Elegir el ámbito de usted, basado en su requisito.

    Fuente: Núcleo de Java Server Faces 3ª Edición por David Geary & Cay Horstmann [Página no. 51 – 54]
    Cómo elegir el derecho de frijol alcance?

    Podría usted por favor aclarar, ¿qué entiende usted por «el método invalidate en el objeto HttpSession»: invalidate() método o método no válido?
    Un poco viejo y tal vez tarde para responder, pero para aclarar: FacesContext.getCurrentInstance().getExternalContext().invalidateSession(); que se invoca en su «logout bean» es lo que él significa.

    OriginalEl autor Kishor Prakash

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea