Java Server Faces
Java Server Faces - JSF
La tecnología JavaServer Faces es un marco de trabajo de interfaces de usuario del lado de
servidor para aplicaciones Web basadas en tecnología Java .
Java Server Faces utiliza el patrón de arquitectura MVC de tipo 2 (con controlador monolítico).
El framework JSF instala en nuestra aplicación web un controlador que se encarga de la gestión
de los formularios y de la navegación entre páginas.
Los principales componentes de la tecnología JavaServer Faces son:
1. Un API y una implementación de referencia para: representar componentes UI y manejar su
estado; manejo de eventos, validación del lado del servidor y conversión de datos; definir la
navegación entre páginas; soportar internacionalización y accesibilidad; y proporcionar
extensibilidad para todas estas características.
2. Una librería de etiquetas JavaServer Pages (JSP) personalizadas para dibujar componentes UI
dentro de una página JSP.
Java Server Faces - JSF
Este modelo de programación bien definido y la librería de etiquetas para
componentes UI facilitan de forma significativa la tarea de la construcción y
mantenimiento de aplicaciones Web con UIs del lado del servidor.
Con un mínimo esfuerzo, podemos:
1.Conectar eventos generados en el cliente a código de la aplicación en el
lado del servidor.
2.Mapear componentes UI a una página de datos del lado del servidor.
3.Construir un UI con componentes reutilizables y extensibles.
4.Grabar y restaurar el estado del UI más allá de la vida de las peticiones
de servidor.
Java Server Pages - JSP
Como se puede apreciar en la siguiente figura, el interface de usuario que creamos con la
tecnología Java Server Faces (representado por myUI en el gráfico) se ejecuta en el servidor y
se “renderiza” en el cliente.
Java Server Pages - JSP
La página JSP, myform.jsp, dibuja los componentes del interface de usuario con etiquetas
personalizadas definidas por la tecnología Java Server Faces.
El UI de la aplicación Web (representado por myUI en la imagen) maneja los objetos
referenciados por la página JSP:
1. Los objetos componentes que mapean las etiquetas sobre la página JSP.
2. Los oyentes de eventos, validadores, y los convertidores que están registrados en los
componentes.
3. Los objetos del modelo que encapsulan los datos y las funcionalidades de los componentes
específicos de la aplicación.
Beneficios de la tecnología
JSF
Una de las grandes ventajas de la tecnología Java Server Faces es que ofrece una clara
separación entre el comportamiento y la presentación.
Las aplicaciones Web construidas con tecnología JSP conseguían parcialmente esta separación.
Sin embargo, una aplicación JSP no puede mapear peticiones HTTP al manejo de eventos
específicos del componentes o manejar elementos UI como objetos con estado en el servidor.
La tecnología Java Server Faces nos permite construir aplicaciones Web que implementan una
separación entre el comportamiento y la presentación tradicionalmente ofrecidas por
arquitectura UI del lado del cliente.
La separación de la lógica de la presentación también le permite a cada miembro del equipo de
desarrollo de una aplicación Web enfocarse en su parte del proceso de desarrollo, y proporciona
un sencillo modelo de programación para enlazar todas las piezas.
Beneficios de la tecnología
JSF
Otro objetivo importante de la tecnología Java Server Faces es mejorar los conceptos familiares
de componente-UI y capa-Web sin limitarnos a una tecnología de script particular o un lenguaje
de marcas.
Aunque la tecnología Java Server Faces incluye una librería de etiquetas JSP personalizadas
para representar componentes en una página JSP, los APIs de la tecnología Java Server Faces se
han creado directamente sobre el API JavaServlet.
Esto nos permite hacer algunas cosas:
◦ usar otra tecnología de presentación junto a JSP,
◦ crear nuestros propios componentes personalizados directamente desde las clases de
componentes,
◦ generar salida para diferentes dispositivos cliente.
Pero lo más importante, la tecnología Java Server Faces proporciona una rica arquitectura para
manejar el estado de los componentes, procesar los datos, validar la entrada del usuario, y
manejar eventos.
¿Qué es una aplicación JSF?
Las aplicaciones Java Server Faces son como cualquier otra aplicación Web Java.
Se ejecutan en un contenedor Servlet Java, y típicamente contienen:
◦ Componentes JavaBeans (llamados objetos del modelo en tecnología
JavaServer Faces) conteniendo datos y funcionalidades específicas de la
aplicación.
◦ Oyentes de Eventos.
◦ Páginas, cómo páginas JSP.
◦ Clases de utilidad del lado del servidor, como beans para acceder a las bases de
datos.
¿Qué es una aplicación JSF?
Además de estos ítems, una aplicación Java Server Faces también tiene:
◦ Una librería de etiquetas personalizadas para dibujar componentes UI en una página.
◦ Una librería de etiquetas personalizadas para representar manejadores de eventos,
validadores, y otras acciones.
◦ Componentes UI representados como objetos con estado en el servidor.
◦ Validadores, manejadores de eventos y manejadores de navegación.
Toda aplicación Java Server Faces debe incluir una librería de etiquetas personalizadas que
define las etiquetas que representan componentes UI (html) y una librería de etiquetas para
representar otras acciones importantes, como validadores y manejadores de eventos (core).
La implementación de JavaServer Faces proporciona estas dos librerías.
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
¿Qué es una aplicación JSF?
La librería de etiquetas de componentes “html” elimina la necesidad de codificar componentes
UI en HTML u otro lenguaje de marcas, resultando en componentes completamente
reutilizables.
La librería "core" hace fácil registrar eventos, validadores y otras acciones de los componentes.
Otra ventaja importante de las aplicaciones JSF es que los componentes UI de la página están
representados en el servidor como objetos con estado.
Esto permite a la aplicación manipular el estado del componente y conectar los eventos
generados por el cliente a código en el lado del servidor.
Finalmente, la tecnología Java Server Faces nos permite convertir y validar datos sobre
componentes individuales y reportar cualquier error antes de que se actualicen los datos en el
lado del servidor.
Proceso de Desarrollo de una
aplicación
Desarrollar una sencilla aplicación Java Server Faces requiere la realización de estos pasos:
◦ Desarrollar los objetos del modelo, los que contendrán los datos.
◦ Añadir las declaraciones del bean controlado al fichero de configuración de la aplicación.
◦ Crear las páginas utilizando las etiquetas de componentes UI y las etiquetas "core".
◦ Definir la navegación entre las páginas.
Estas tareas se pueden realizar simultáneamente o en cualquier orden.
Proceso de Desarrollo de una
aplicación
Este ejemplo nos pedirá que adivinemos un número del 0 al 100, ambos inclusive.
La segunda página nos dirá si hemos acertado.
El ejemplo también chequea la validez de nuestra entrada.
1. Desarrollar los Objetos del Modelo
Serán los objetos que se encargan de comunicar la página con la lógica de la aplicación y deben
coincidir los nombres de los componentes con los de los atributos.
2. Desarrollar los Objetos del Modelo
Dependiendo del tipo de componente que referencia una propiedad del objeto del modelo, esta
propiedad puede ser de cualquiera de los tipos básicos primitivos y los tipos referencia
(envoltura).
La tecnología JavaServer Faces convertirá automáticamente el dato al tipo especificado por la
propiedades del objeto del modelo.
Se recomienda el uso de tipos básicos primitivos.
Proceso de Desarrollo de una
aplicación
Proceso de Desarrollo de una
aplicación
3. Añadir las Declaraciones del Bean Controlado
Después de desarrollar los beans utilizados en la aplicación, necesitamos añadir declaraciones
para ellos en el archivo de configuración de la aplicación.
Esto se realiza en el archivo faces-config.xml
Proceso de Desarrollo de una
aplicación
2. Añadir las Declaraciones del Bean Controlado
Después de desarrollar los beans utilizados en la aplicación, se declaran en el archivo de
configuración de la aplicación (faces-config.xml)
JavaServer Faces procesa este archivo al arrancar la aplicación, inicializa el UserNumberBean
(AdivineNumero) y lo almacena en el ámbito de sesión, estando disponible para todas las
páginas de la aplicación.
Es equivalente a la utilización de la etiqueta jsp:useBean
3. Crear las Páginas
Distribuir los componentes UI en las páginas.
Mapear los componentes a los datos de los objetos del modelo.
Añadir etiquetas importantes (etiquetas del validador) a las etiquetas componentes.
Proceso de Desarrollo de una
aplicación
welcome.jsp
Proceso de Desarrollo de una
aplicación
success.jsp
Proceso de Desarrollo de una
aplicación
4. Definir las Navegación por las Páginas
Se indica a que página va la aplicación después de que el usuario pulse un botón para enviar un
formulario.
La navegación por la aplicación se define en el archivo de configuración.
Proceso de Desarrollo de una
aplicación
4. Definir las Navegación por las Páginas
Cada regla de navegación define cómo ir de una página a otras páginas de la aplicación.
El elemento navigation-rule puede contener cualquier número de elementos navigation-case,
cada uno de los cuales define la página que se abrirá luego (definida por to-tree-id) basándose
en una salida lógica (definida mediante from-outcome).
La salida se puede definir mediante el atributo action del componente UICommand que envía el
formulario.
Ciclo de vida de una Página
JSF
El ciclo de vida de una página Java Server Faces es similar al de una página JSP:
El cliente hace una petición HTTP de la página y el servidor responde con la página traducida
a HTML.
Sin embargo, debido a las características extras que ofrece la tecnología Java Server Faces, el
ciclo de vida proporciona algunos servicios adicionales mediante la ejecución de algunos pasos
extras:
◦ Reconstituir el Árbol de Componentes
◦ Aplicar Valores de la Petición
◦ Procesar Validaciones
◦ Actualizar los Valores del Modelo
◦ Invocar Aplicación
◦ Renderizar la Respuesta
Ciclo de vida de una Página
JSF
Los pasos del ciclo de vida se ejecutan dependen de si la petición se originó o no desde una
aplicación JavaServer Faces y si la respuesta es o no generada con la fase de “renderizado” del
ciclo de vida de JavaServer Faces.
La “renderización” (interpretación) es el proceso de generar una imagen a partir de un modelo,
usando una aplicación de computadora.
Esta sección explica los diferentes escenarios del ciclo de vida.
Escenarios de Procesamiento del
Ciclo de vida de una petición
Una aplicación JavaServer Faces soporta dos tipos diferentes de respuestas y dos tipos
diferentes de peticiones:
◦ Respuesta Faces: Una respuesta servlet que se generó mediante la ejecución de la fase
“Renderizar la Respuesta” del ciclo de vida de procesamiento de la respuesta.
◦ Respuesta No-Faces: Una respuesta servlet que no se generó mediante la ejecución de la
fase “Renderizar la Respuesta”. Un ejemplo es una página JSP que no incorpora
componentes Java Server Faces.
◦ Petición Faces: Una petición servlet que fue enviada desde una Respuesta Faces
previamente generada. Ejemplo: un formulario enviado desde un componente de interface
de usuario JavaServer Faces, donde la URI de la petición identifica el árbol de componentes
JavaServer Faces para usar el procesamiento de petición.
Escenarios de Procesamiento del
Ciclo de vida de una petición
◦ Petición No-Faces: Una petición Servlet que fue enviada a un componente de aplicación
como un servlet o una página JSP, en vez de directamente a un componente JavaServer
Faces.
La combinación de estas peticiones y respuestas resulta en tres posibles escenarios del ciclo de
vida que pueden existir en una aplicación JavaServer Faces:
◦ Escenario 1: Una Petición No-Faces genera una Respuesta Faces:
Un ejemplo es cuando se pulsa un enlace de una página HTML que abre una página que
contiene componentes Java Server Faces. Para dibujar una Respuesta Faces desde una
petición No-Faces, una aplicación debe proporcionar un mapeo FacesServlet en la URL de la
página que contiene componentes Java Server Faces. FacesServlet acepta peticiones
entrantes y pasa a la implementación del ciclo de vida para su procesamiento.
Escenarios de Procesamiento del
Ciclo de vida de una petición
◦ Escenario 2: Una Petición Faces genera una Respuesta No-Faces:
Algunas veces una aplicación JavaServer Faces podría necesitar redirigir la salida a un
recurso diferente de la aplicación Web diferente o generar una respuesta que no contiene
componentes JavaServer Faces. En estas situaciones, el desarrollador debe saltarse la fase
“Renderizar la Respuesta” llamando a FacesContext.responseComplete. FacesContext
Contiene toda la información asociada con una Petición Faces particular. Este método se
puede invocar durante las fases “”Actualizar los Valores del Modelo”.
◦ Escenario 3: Una Petición Faces genera una Respuesta Faces:
Es el escenario más común en el ciclo de vida de una aplicación Java Server Faces.
Este escenario implica componentes Java Server Faces enviando una petición a una
aplicación JavaServer Faces utilizando el FacesServlet.
Como la petición ha sido manejada por la implementación Java Server Faces, la aplicación
no necesita pasos adicionales para generar la respuesta. Todos los oyentes, validadores y
convertidores serán invocados automáticamente durante la fase apropiada del ciclo de vida
estándar.
Ciclo de Vida Estándar de
Procesamiento de Peticiones
La mayoría de los usuarios de la tecnología Java Server Faces no necesitarán conocer a fondo el
ciclo de vida de procesamiento de una petición. Sin embargo, conociendo lo que la tecnología
Java Server Faces realiza para procesar una página, un desarrollador de aplicaciones Java
Server Faces no necesitará preocuparse de los problemas de “renderizado” asociados con otras
tecnologías UI. La siguiente figura ilustra los pasos del ciclo de vida petición-respuesta Java
Server Faces
Ciclo de Vida Estándar de
Procesamiento de Peticiones
Reconstituir el Árbol de Componentes
Cuando se hace una petición para una página Java Server Faces, como cuando se pulsa
sobre un enlace o un botón, la implementación Java Server Faces comienza el estado
Reconstituir el Árbol de Componentes.
Durante esta fase, la implementación Java Server Faces construye el árbol de
componentes de la página JavaS erver Faces, conecta los manejadores de eventos y los
validadores y graba el estado en el FacesContext.
Aplicar Valores de la Petición
Una vez construido el árbol de componentes, cada componente del árbol extrae su
nuevo valor desde los parámetros de la petición con su método decode. almacenando el
valor localmente en el componente.
Si falla la conversión del valor, se genera un mensaje de error asociado con el
componente y se pone en la cola de FacesContext y se mostrará durante la fase
“Renderizar la Respuesta”, junto con cualquier error de validación resultante de la
fase “Procesar Validaciones”.
Ciclo de Vida Estándar de
Procesamiento de Peticiones
Aplicar Valores de la Petición
Si durante esta fase se produce algún evento, la implementación Java Server Faces emite los
eventos a los oyentes interesados.
En este punto, si la aplicación necesita redirigirse a un recurso de aplicación Web diferente o
generar una respuesta que no contenga componentes Java Server Faces, puede llamar a
FacesContext.responseComplete.
Procesar Validaciones
Durante esta fase, la implementación Java Server Faces procesa todas las validaciones
registradas con los componentes del árbol. Examina los atributos del componente que
especifican las reglas de validación y compara esas reglas con el valor local almacenado en el
componente.
Si el valor local no es válido, la implementación JavaServer Faces añade un mensaje de error al
FacesContext y el ciclo de vida avanza directamente hasta la fase “Renderizar la Respuesta”
para que la página sea dibujada de nuevo incluyendo los mensajes de error.
Ciclo de Vida Estándar de
Procesamiento de Peticiones
Procesar Validaciones
Si había errores de conversión de la fase “Aplicar los Valores a la Petición”, también se
mostrarán. En este momento, si la aplicación necesita redirigirse a un recurso de aplicación Web
diferente o generar una respuesta que no contenga componentes Java Server Faces, puede
llamar a FacesContext.responseComplete.
Si se han disparado eventos durante esta fase, la implementación Java Server Faces los emite a
los oyentes interesados.
Actualizar los Valores del Modelo
Una vez que la implementación Java Server Faces determina que el dato es válido, puede pasar
por el árbol de componentes y configurar los valores del objeto de modelo correspondiente con
los valores locales de los componentes. Sólo se actualizarán los componentes que tenga
expresiones valueRef.
Si el dato local no se puede convertir a los tipos especificados por las propiedades del objeto del
modelo, el ciclo de vida avanza directamente a la fase “Renderizar la Respuesta”, durante la
que se dibujará de nuevo la página mostrándo los errores, similar a lo que sucede con los
errores de validación.
Ciclo de Vida Estándar de
Procesamiento de Peticiones
Actualizar los Valores del Modelo
En este punto, si la aplicación necesita redirigirse a un recurso de aplicación Web diferente o
generar una respuesta que no contenga componentes Java Server Faces, puede llamar a
FacesContext.responseComplete.
Si se han disparado eventos durante esta fase, la implementación Java Server Faces los emite a
los oyentes interesados.
Ciclo de Vida Estándar de
Procesamiento de Peticiones
Invocar Aplicación
Durante esta fase, la implementación Java Server Faces maneja cualquier evento a nivel de
aplicación, como enviar un formulario o enlazar a otra página.
En este momento, si la aplicación necesita redirigirse a un recurso de aplicación Web diferente o
generar una respuesta que no contenga componentes Java Server Faces, puede llamar a
FacesContext.responseComplete.
Luego la implementación Java Server Faces configura el árbol de componentes de la respuesta a
esa nueva página.
Finalmente, la implementación Java Server Faces transfiere el control a la fase Renderizar la
Respuesta.
Ciclo de Vida Estándar de
Procesamiento de Peticiones
Renderizar la Respuesta
Durante esta fase, la implementación Java Server Faces invoca las propiedades de codificación
de los componentes y dibuja los componentes del árbol de componentes grabado en el
FacesContext.
Si se encontraron errores durante las fases Aplicar los Valores a la Petición, Procesar
Validaciones o Actualizar los Valores del Modelo, se dibujará la página original. Si las
páginas contienen etiquetas “output_errors”, cualquier mensaje de error que haya en la cola
se mostrará en la página.