Publica tu how-to

Dinos como hacer lo que sabes hacer, mándanos un email a wdonet@gmail.com y lo publicamos (dos días máximo) o si te interesa unirte al equipo de redactores, también háznoslo saber por correo.

Ciclo de vida en JSF

JSF (Java Server Faces) es un framework de desarrollo basado en el patrón MVC (Modelo Vista Control), su intención es estandarizar el desarrollo de aplicaciones web similar al estilo de Swing o Delphi, donde la interfaz se realiza mediante componentes y basada en eventos, esto permite que sea bastante flexible y sencillo, especialmente para quienes ya están acostumbrados a los componentes y eventos.  No obstante aún no tiene la experiencia de otros frameworks y es importante entender como trabaja.

Algunos conceptos que debemos tener en mente son:
Managed Bean (o Backing Bean) . Es un pojo que se asocia con los componentes de la interfaz de usuario (UIComponent), dentro de sus funciones está
  • Almacenar referencias a los componentes de la vista y ponerlos a la disposición del controller (durante el ciclo de vida JSF).
  • Proveer de las propiedades necesarias para la vista, como el comportamiento de la pantalla, la información que se presenta e inclusive hasta algunos elementos del diseño gráfico.
  • Exponer los métodos que pueden ser usados por los componentes para comunicar al servidor de la iteracción con el usuario.
Binding, es el acceso programático a los componentes de la vista, mismos que heredan del árbol jerárquico de componentes con la raíz UIviewroot.
Convertidores, son parte de la vista y es un proceso que transforma una cadena del lado de la vista a un tipo de dato Java en el lado del servidor y así mismo de regreso.
Validaciones, son usadas para validar los datos de los componentes de acuerdo al uso de la vista o las reglas de negocio.
Method expressions, son usados para comunicar eventos de la vista al modelo de presentación como ActionEvent, ValueChangeEvent, PhaseEvente.  Soportan invocaciones arbitrarias a métodos públicos del managed bean.

Ahora describiremos las 6 fases del ciclo de vida en JSF.

1. Restaurar vista :: Restore View
En esta etapa se crea la vista con la información desde cero o la ya existente en los componentes si fue redireccionada desde otro control de jsf.
Si no encuentra datos enviados por método POST, se salta directamente a la etapa de producir respuesta.

2. Aplicar valores a petición :: Apply Request Values
Se invocan los convertidores definidos, si falla alguno, se marca el componente UIComponent como erróneo con setValid(true) y se agrega un mensaje al contexto de faces con addMessage(), luego se va directamente a producir respuesta.
La funcionalidad del convertidor es transformar el dato String de la forma a uno de tipo Java y viceversa, también mantiene el dato String para seguirlo presentando en pantalla en la etapa de producir respuesta.

Finalmente se guardan los valores enviados por la forma como cadenas dentro del componente (setters del UIComponent). Cadena es lo único que pueden devolver la forma java: HttpServletRequest.getParameter().

Se puede usar el atributo immediate para saltar el proceso de conversión y validación de datos.  Generalmente es usado para botones como Cancelar.

3. Procesar validaciones :: Process Validation
Se llama a los validadores de cada componente: validate(), con la regla de profundidad primero, se usan los valores enviados por la fase de aplicación de valores, si alguna validación falla, se marca el componente como erróneo con setValid(true) y se agrega un mensaje con addMessage() , después salta directamente a la fase producir respuesta.
Aunque se pueden ejecutar validaciones de todo tipo, se recomienda que en esta fase se manejen solo aquellas que dicten el uso de la vista.

4. Actualizar modelo :: Update Model
Actualiza los beans (mediante los setters del ManagedBean) del modelo asociados al componente.  Esta asociación es generalmente usada con el atributo value del componente jsf.

5. Invocar la aplicación :: Invoke Application
Se ejecutan los eventos encolados y pendientes (actionEvent).
En esta fase se ejecuta la lógica de negocio y es recomendable implementar aquí las validaciones del modelo de domino o procesos de negocio necesarios.
Como resultado de estas validaciones y/o procesos de negocio, se manipula la navegación entre las pantallas.

6. Producir respuesta (final) :: Render Response
Se genera la respuesta HTML, cada componente pregunta al modelo de presentación para recuperar los datos que necesita mostrar (getters del UIComponent).
Utiliza un kit de rendereo (o renderkit) que puede ser modificado para presentar la respuesta en xml, por ejemplo para un browser tipo wap.

Este ciclo de fases se repite continuamente en cada petición que se hace al servidor.  Si se realizan peticiones parciales como en ICEfaces, también se produce el mismo ciclo con leves modificaciones para evitar ejecutar las conversiones y validaciones en campos que aún no han sido llenados por ejemplo. 

En resumen podríamos decir que por cada petición al servidor, las fases producen los siguientes pasos sobre los datos de las formas enviadas: convertir valores de la forma, validarlos, se generan eventos de cambio de valor (valueChangeListener), ejecuta setters en modelo de dominio (ManagedBean) y setters en modelo de presentación (UIComponent).

Notas finales:
  • Cuando se usa el atributo immediate y la directiva renderResponse con programación pero se quiere guardar cualquier dato alterado en la forma, entonces se necesita usar ValueChangeEvent para actualizar manualmente el modelo de dominio.
  • ResponseComplete es una directiva similar al renderResponse, la diferencia radica en que el primero obliga a terminar el ciclo de vida del JSF y puede ser usado en procesos de lado del cliente para eventos AJAX, pero no se desea actualizar completamente la vista o intentar obtener datos binarios desde la vista.

Referencias:
Especificaciones JSR127 | JSR252 | JSR276

4 comentarios:

  1. A mi se me plantea una visión más de como insertar JSF en el proceso habitual de la construcción de páginas WEB. En definitiva, como se trabaja con un equipo de diseño gráfico y JSF.

    Gracias,

    ResponderEliminar
  2. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  3. Tengo un pequeño problema, quiero validar para aplicar un dependiendo de si recibo por parametro en mi taglib el metodo.

    la cosa es que queda algo asi
    c:set test="#{cc.attrs.metodo != null}">
    f:ajax />
    /c:set>

    pero al parecer las etiquetas c, que vienen de http://java.sun.com/jsp/jstl/core siempre se ejecutan primero que todo, por lo tanto el resultado me esta dando falso, no se si exista otra etiqueta que me ayude a validar esto. O que exista una manera de settear estos valores antes de ejecutar mi test.

    Gracias

    ResponderEliminar
  4. Me gusta la forma en que está redactado este artículo. Mis felicitaciones a pesar de ser este comentario bastante posterior a su publicación, a mi me sirvió bastante el contenido

    ResponderEliminar

Que opinas sobre esta publicación?