2010-11-22 11 views
10

Actualmente estoy aprendiendo sobre JSF 2.0 y estoy muy contento por la existencia de esta característica de alcance de conversación, que es muy útil para abrir una nueva pestaña o una nueva ventana en el misma página y tener recursos separados, sin anularse entre sí.JSF CDI: Conversation scope bean [s] best practice

Pero tengo curiosidad sobre cómo implementar esto de una buena manera, sobre cuándo iniciar la conversación y cuándo cerrarla.

En mi caso, tengo cada frijol CDI para cada página JSF. Y digamos que tengo un menú, y cuando se hace clic, esto llevará a la página A, y de A, podría conducir a B, B podría conducir a C, C podría llevar a D, todas estas 4 páginas están conectadas en una cadena.

Es posible acceder a las propiedades del grano A desde granos B o C o D, también es posible acceder a las propiedades de B a partir de granos C o D, etc.

Ahora estoy bastante confundido acerca de:

  • si todas estas A B C D debe ser en ámbito de conversación o no, o tal vez sólo un ? Porque creo que a veces desde otra página que es fuera de la cadena ABCD, como una página F, podría navegar a la página B, aunque todavía no sé cómo suministrar los datos al bean B.
  • si todas estas ABCD deben combinan en un grano de
  • dónde y cuándo comenzar el conversación, im pensando en el constructor, pero yo no creo que es una buena idea , porque prefiero partir la conversación cuando se accede por primera vez la página, no el grano
  • dónde y cuándo parar la conversación , por lo que que no habrá recursos no utilizados que cuelgan alrededor

Por favor, comparta sus ideas al respecto.

+3

CDI no es parte de JSF estándar.CDI significa Contexts and Dependency Injection (JSR-299) que cubre las anotaciones del paquete 'javax.enterprise'. Conversation Scope tampoco es parte de JSF estándar. Fue una invención de JBoss Seam durante las edades de JSF 1.2 y ha sido adoptada por la especificación JSF 2.0 como View Scope, que se puede seleccionar mediante la anotación '@ ViewScoped'. Ahora, ¿de qué estás hablando en realidad? – BalusC

+0

Hola BalusC, gracias por la aclaración. Usé el término CDI solo para aclarar lo que estoy usando, pero tal vez esa información no está relacionada con mi pregunta, mi disculpa :) Hasta donde sé, el @ViewScoped es para que una sola página se vuelva a mostrar y las propiedades serán persistió Pero lo que quería lograr desde el alcance de la conversación es que puedo abrir la misma página en varias pestañas, con cada pestaña como si tuviera su propio alcance de sesión. Por lo tanto, enviar el valor 'albert' en un myBean.name en una pestaña no anulará myBean.name en otras pestañas. Pero estoy confundido sobre dónde comenzar y finalizar la conversación. – bertie

+0

Y esto me confunde más si hay 4 páginas, por ejemplo, la página A es una página de exploración, donde el usuario puede buscar, la página B es la página de detalles, donde el usuario puede modificar detalles, la página C es donde el usuario puede modificar sub detalle, y así sucesivamente. Si quisiera poder abrir la página A en varias pestañas sin que una afecte a otra, tengo que usar el alcance de conversación en el bean de A. Pero supongo que también será tema de conversación para B C y D? También sobre dónde y cuándo debería comenzar/finalizar la conversación. Quiero decir, el usuario puede abrir pestañas nuevas y cerrar las pestañas. ¿Cómo puedo detectar esto y cerrar la conversación? – bertie

Respuesta

11

JSF 2 proporciona ámbitos de solicitud, vista, sesión y aplicación. CDI presenta el alcance de la conversación, pero lo más importante es que introduce un estándar mediante el cual se pueden agregar nuevos ámbitos a la plataforma.

El Alcance que está describiendo probablemente se ajusta mejor a un ámbito personalizado como un ámbito de ventana. Dos proyectos de desarrollo de este ámbito son:

  1. Apache MyFaces CODI
  2. IceFaces tiene una JSF (no CDI) Window scope implementation.

Sin embargo, le recomiendo que reconsidere su estructura de frijoles. Me he encariñado bastante con el alcance de View, junto con los parámetros de vista de JSF 2 para propagar información de una página a otra (y de una instancia de View View a otra).

El alcance "Ver acceso" de MyFaces parece ser otro enfoque ordenado, en el que un bean permanece en el alcance siempre y cuando las páginas que navega mantengan una referencia a ese ámbito.

+0

¡Gracias! También he estado pensando en View scope, y también podría usarse en entornos multitab o multiventana. Lo que quiso decir al pasar los parámetros de visualización de un viewcope a otro viewcope, es aquel logrado desde h: button y f: param anidado, y con los metadatos f: con f anidado: viewParam, ¿estoy en lo correcto? Si no me equivoco, el botón h: dará como resultado la solicitud GET, y esto me plantea un problema, ya que a veces, al presionar borrar desde la página B (POST), se devuelve la navegación a la página A. ¿Hay alguna manera de ¿enviar vista parámetro de B a A en este caso? – bertie

+0

Puede agregar la cadena "? IncludeViewParams = true" a una regla de navegación, y los parámetros de vista definidos en la "página de aterrizaje" se incluirán automáticamente. –

+0

Bien, gracias. Lee sobre esto una vez, pero nunca pensaste en usarlo antes. Creo que me acostumbré al alcance de la sesión donde todo está donde está. Tengo que probar esto :) – bertie