Saltar al contenido

¿Cómo elegir el alcance de frijol correcto?

Esta pregunta se puede abordar de diversas formas, pero en este caso te enseñamos la que en nuestra opinión es la resolución más completa.

Solución:

Introducción

Representa el alcance (la vida útil) del bean. Esto es más fácil de entender si está familiarizado con el funcionamiento “oculto” de una aplicación web de servlet básica: ¿Cómo funcionan los servlets? Instanciación, sesiones, variables compartidas y multiproceso.


@Request/View/Flow/Session/ApplicationScoped

A @RequestScoped bean vive mientras un solo ciclo de solicitud-respuesta HTTP (tenga en cuenta que una solicitud Ajax también cuenta como una sola solicitud HTTP). A @ViewScoped bean vive siempre que esté interactuando con la misma vista JSF mediante devoluciones de datos que llaman a los métodos de acción que regresan null/void sin ningún tipo de navegación / redireccionamiento. A @FlowScoped bean vive siempre que navegue a través de la colección especificada de vistas registradas en el archivo de configuración de flujo. A @SessionScoped bean vive mientras la sesión HTTP establecida. Un @ApplicationScoped bean vive mientras se ejecuta la aplicación web. Tenga en cuenta que el CDI @Model es básicamente un estereotipo para @Named @RequestScoped, por lo que se aplican las mismas reglas.

El alcance que se elija depende únicamente de los datos (el estado) que contiene y representa el bean. Usar @RequestScoped para presentaciones / formularios simples y no ajax. Usar @ViewScoped para vistas dinámicas ricas habilitadas para ajax (validación basada en ajax, renderizado, diálogos, etc.). Usar @FlowScoped para el patrón de “asistente” (“cuestionario”) de recopilación de datos de entrada repartidos en varias páginas. Usar @SessionScoped para datos específicos del cliente, como el usuario que inició sesión y las preferencias del usuario (idioma, etc.). Usar @ApplicationScoped para datos / constantes de toda la aplicación, como listas desplegables que son iguales para todos, o beans administrados sin variables de instancia y que solo tienen métodos.

Abusar de un @ApplicationScoped bean para datos de alcance de sesión / vista / solicitud haría que se compartiera entre todos los usuarios, por lo que cualquier otra persona puede ver los datos de los demás, lo cual es simplemente incorrecto. Abusar de un @SessionScoped bean para ver / solicitar datos de alcance haría que se compartiera entre todas las pestañas / ventanas en una sola sesión del navegador, por lo que el usuario final puede experimentar inconsistencias al interactuar con cada vista después de cambiar entre pestañas, lo cual es malo para la experiencia del usuario. Abusar de un @RequestScoped bean para datos de alcance de vista haría que los datos de alcance de vista se reinicializaran a los valores predeterminados en cada devolución de datos (ajax), lo que podría provocar que los formularios no funcionen (consulte también los puntos 4 y 5 aquí). Abusar de un @ViewScoped bean para datos de solicitud, sesión o aplicación, y abusar de un @SessionScoped bean para datos de ámbito de aplicación no afecta al cliente, pero ocupa innecesariamente la memoria del servidor y es simplemente ineficiente.

Tenga en cuenta que el alcance no debe elegirse en función de las implicaciones del rendimiento, a menos que De Verdad tienen una huella de memoria baja y quieren ser completamente apátridas; necesitarías usar exclusivamente @RequestScoped beans y manipula los parámetros de solicitud para mantener el estado del cliente. También tenga en cuenta que cuando tiene una sola página JSF con datos de alcance diferente, entonces es perfectamente válido colocarlos en beans de respaldo separados en un alcance que coincida con el alcance de los datos. Los frijoles pueden acceder entre sí a través de @ManagedProperty en el caso de beans gestionados por JSF o @Inject en el caso de beans gestionados por CDI.

Ver también:

  • Diferencia entre el alcance de la vista y la solicitud en beans administrados
  • Ventajas de usar JSF Faces Flow en lugar del sistema de navegación normal
  • Comunicación en JSF2 – Ámbitos de bean gestionados

@CustomScoped/NoneScoped/Dependent

No se menciona en su pregunta, pero JSF (heredado) también admite @CustomScoped y @NoneScoped, que rara vez se utilizan en el mundo real. los @CustomScoped debe referirse a una costumbre Map implementación en un alcance más amplio que ha anulado Map#put() y / o Map#get() para tener un control más detallado sobre la creación y / o destrucción de beans.

El JSF @NoneScoped y CDI @Dependent básicamente vive tanto como una única evaluación EL en el bean. Imagine un formulario de inicio de sesión con dos campos de entrada que hacen referencia a una propiedad de bean y un botón de comando que hace referencia a una acción de bean, por lo que con un total de tres expresiones EL, se crearán efectivamente tres instancias. Uno con el nombre de usuario establecido, uno con la contraseña establecida y otro en el que se invoca la acción. Normalmente, desea usar este alcance solo en beans que deberían vivir tanto como el bean donde se inyecta. Entonces si un @NoneScoped o @Dependent se inyecta en un @SessionScoped, entonces vivirá mientras el @SessionScoped frijol.

Ver también:

  • Caducar la instancia de bean administrada específica después del intervalo de tiempo
  • ¿Qué es un bean sin alcance y cuándo usarlo?
  • ¿Cuál es el ámbito de bean administrado predeterminado en una aplicación JSF 2?

Alcance del flash

Como último, JSF también admite el alcance flash. Está respaldado por una cookie de corta duración que está asociada con una entrada de datos en el alcance de la sesión. Antes de la redirección, se establecerá una cookie en la respuesta HTTP con un valor que se asocia de forma exclusiva con la entrada de datos en el ámbito de la sesión. Después de la redirección, se verificará la presencia de la cookie de alcance flash y la entrada de datos asociada con la cookie se eliminará del alcance de la sesión y se colocará en el alcance de la solicitud redirigida. Finalmente, la cookie se eliminará de la respuesta HTTP. De esta manera, la solicitud redirigida tiene acceso para solicitar datos con ámbito que se prepararon en la solicitud inicial.

En realidad, esto no está disponible como un alcance de bean administrado, es decir, no existe tal cosa como @FlashScoped. El alcance del flash solo está disponible como mapa a través de ExternalContext#getFlash() en frijoles gestionados y #flash en EL.

Ver también:

  • Cómo mostrar el mensaje de caras en la página redirigida
  • Pasar un objeto entre beans @ViewScoped sin usar parámetros GET
  • CDI falta @ViewScoped y @FlashScoped

Desde JSF 2.3 todos los ámbitos de frijol definidos en el paquete javax.faces.bean han quedado obsoletos para alinear los ámbitos con CDI. Además, solo son aplicables si su bean está usando @ManagedBean anotación. Si está utilizando versiones de JSF inferiores a 2.3, consulte la respuesta heredada al final.


De JSF 2.3, aquí hay ámbitos que se pueden usar en JSF Backing Beans:

1. @javax.enterprise.context.ApplicationScoped: El alcance de la aplicación persiste durante toda la duración de la aplicación web. Ese alcance se comparte entre todas las solicitudes y todas las sesiones. Esto es útil cuando tiene datos para toda la aplicación.

2. @javax.enterprise.context.SessionScoped: El alcance de la sesión persiste desde el momento en que se establece una sesión hasta su finalización. El contexto de la sesión se comparte entre todas las solicitudes que ocurren en la misma sesión HTTP. Esto es útil cuando no desea guardar datos para un cliente específico para una sesión en particular.

3. @javax.enterprise.context.ConversationScoped: El alcance de la conversación persiste como logaritmo mientras vive el bean. El alcance proporciona 2 métodos: Conversation.begin() y Conversation.end(). Estos métodos deben llamarse explícitamente, ya sea para iniciar o finalizar la vida de un bean.

4. @javax.enterprise.context.RequestScoped: El alcance de la solicitud es de corta duración. Comienza cuando se envía una solicitud HTTP y finaliza después de que la respuesta se envía al cliente. Si coloca un bean administrado en el alcance de la solicitud, se crea una nueva instancia con cada solicitud. Vale la pena considerar el alcance de la solicitud si le preocupa el costo del almacenamiento del alcance de la sesión.

5. @javax.faces.flow.FlowScoped: El osciloscopio Flow persiste mientras el Flow esté activo. Un flujo puede definirse como un conjunto contenido de páginas (o vistas) que definen una unidad de trabajo. El estado del flujo con alcance está activo siempre que el usuario navegue dentro del flujo.

6. @javax.faces.view.ViewScoped: Un bean en el alcance de la vista persiste mientras se vuelve a mostrar la misma página JSF. Tan pronto como el usuario navega a una página diferente, el bean queda fuera de alcance.


La siguiente respuesta heredada aplica la versión JSF anterior a la 2.3

A partir de JSF 2.x hay 4 Bean Scopes:

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

Alcance de la sesión: El alcance de la sesión persiste desde el momento en que se establece una sesión hasta su finalización. Una sesión termina si la aplicación web invoca el método invalidate en el objeto HttpSession o si se agota el tiempo de espera.

Solicitud Alcance: El alcance de la solicitud es de corta duración. Comienza cuando se envía una solicitud HTTP y finaliza después de que la respuesta se envía al cliente. Si coloca un bean administrado en el alcance de la solicitud, se crea una nueva instancia con cada solicitud. Vale la pena considerar el alcance de la solicitud si le preocupa el costo del almacenamiento del alcance de la sesión.

Ámbito de aplicación: El alcance de la aplicación persiste durante toda la duración de la aplicación web. Ese alcance se comparte entre todas las solicitudes y todas las sesiones. Coloca beans administrados en el ámbito de la aplicación si se debe compartir un solo bean entre todas las instancias de una aplicación web. El bean se construye cuando cualquier usuario de la aplicación lo solicita por primera vez y permanece activo hasta que la aplicación web se elimina del servidor de aplicaciones.

ViewScope: El alcance de la vista se agregó en JSF 2.0. Un bean en el alcance de la vista persiste mientras se vuelve a mostrar la misma página JSF. (La especificación JSF usa el término vista para una página JSF). Tan pronto como el usuario navega a una página diferente, el bean sale del alcance.

Elija el alcance que desee según sus necesidades.

Fuente: Core Java Server Faces 3rd Edition por David Geary y Cay Horstmann [Page no. 51 – 54]
ingrese la descripción de la imagen aquí

Si sostienes alguna desconfianza o forma de innovar nuestro ensayo eres capaz de añadir un paráfrasis y con deseo lo leeremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *