JSF Aplicaciones Distribuidas Contenidos • Introducción • Internacionalización • Arquitectura • Conversores • Componentes UI • Navegación • Renders • Ciclo de Vida • Eventos • Fichero configuración • Validadores • Backing beans 2 Introducción • JavaServer Faces es una especificación que define un framework web para la creación de aplicaciones • Permite: • • • • • • gestión de componentes gráficos manejo de eventos en el servidor validación de entradas de usuario asociación entre el modelo de datos y el interfaz de usuario gestión del flujo entre páginas etc… 3 • Necesidad de adoptar el concepto RAD para desarrollar aplicaciones web. • En las herramientas RAD observamos cuatro capas: • • • • una arquitectura de componentes subyacente un conjunto de artilugios o widgets estándar una infraestructura de aplicación la herramienta en sí misma. 4 • JavaServer Faces define tres capas: • una arquitectura de componentes, • un conjunto estándar de widgets (literalmente artefactos, aunque son componentes) de interfaz de usuario (UI) • una infraestructura de aplicación. • La arquitectura de componentes de JSF define un modo común de construir componentes de interfaz de usuario. • Proporciona componentes de interfaz de usuario (botones, hiperenlaces, checkboxes, campos de texto, etc), pero también establece la base para componentes de terceros. 5 • Los componentes están orientados a eventos, así que JSF permite procesar eventos generados por el cliente (por ejemplo, cambiando el valor de un campo de texto o haciendo click sobre un botón). • Debido a que las aplicaciones basadas en web, a diferencia de las de escritorio, deben con frecuencia satisfacer a múltiples clientes (como navegadores de escritorio, teléfonos móviles, o PDAs), JSF tiene una arquitectura capaz de mostrar componentes de diferentes maneras. • También tiene facilidades extensibles para validar entradas (la longitud de un campo, por ejemplo) y convertir objetos a y desde cadenas de texto o strings. 6 • JSF se ejecuta en el servidor, en un contenedor de servlets y muestra código HTML u otro lenguaje de marcas al cliente. • Si se pulsa un botón en una aplicación Swing, se disparará un evento que se puede manejar directamente en el código que reside en el escritorio. • Pero, los navegadores web no saben nada sobre componentes JSF o eventos, sólo saben cómo mostrar HTML. 7 • Cuando se hace click en un botón de una aplicación JavaServer Faces, se genera una petición para ser enviada desde el navegador web al servidor • JSF es responsable de traducir la petición a un evento que puede ser procesado por la lógica de la aplicación en el servidor. • También es responsable de asegurarse de que todo componente de interfaz de usuario definido en el servidor, se muestre apropiadamente en el navegador. 8 • Principales elementos de la tecnología JavaServer Faces son: • Un API y una implementación de referencia para representar componentes de interfaz de usuario (UI) y manejar su estado, manejar eventos, validar en el lado del servidor y aplicar una conversión de datos, definir la navegación entre páginas, soportar internacionalización y accesibilidad y proporcionar extensibilidad para todas estas características. • Una librería de etiquetas JavaServer Pages (JSP) personalizadas para dibujar componentes UI dentro de una página JSP. 9 Desarrollo de Aplicaciones Distribuidas • Permite: • Conectar eventos generados en el cliente a código de la aplicación en el lado del servidor. • Mapear componentes de interface de usuario a una página de datos del lado del servidor. • Construir un interface de usuario con componentes reutilizables y extensibles. • Grabar y restaurar el estado del interface de usuario más allá de la vida de las peticiones de servidor. 10 Tecnologías subyacentes • Todas las aplicaciones JSF son aplicaciones web Java estándar. • Protocolo HTTP mediante el API Servlet y algún conjunto de tecnologías de visualización como JSP • La tecnología de visualización se usa para definir componentes de UI (componentes que interactúan con código Java). 11 • La arquitectura de componentes de JSF se vale de beans de respaldo o backing beans (JavaBeans) para propiedades y manejo de eventos • Los JavaBeans son componentes Java que se utilizan para crear los componentes de UI de JSF • JSF usa HTTP que es sin estado • JSF permite abstraer a los programadores de este protocolo (no maneja directamente peticiones y respuestas) 12 • Los componentes de JavaServer Faces están diseñados para trabajar con backing beans. • Un backing beans define las propiedades y la lógica de manejo asociadas con los componentes de interface de usuario utilizados en una página. • Cada propiedad del bean está unida a un componente o a su valor. • Un backing beans también define un conjunto de métodos que realizan funciones para el componente (p.e. validar los datos del componente, manejar los eventos que dispara el componente, y realizar el procesamiento asociado con la navegación entre páginas cuando el componente se activa) 13 • Uno de los principales objetivos de JSF es el de evitar estar ligado a una tecnología de visualización concreta. • Tanto JSP como JSF son tecnologías Java estándar. • La implementación de referencia JSF viene con una implementación de JSP y JSF trabaja sobre JSP. • En JSF 2.0 se sustituye JSP por Facelets 14 Patrón Modelo-VistaControlador • JavaServer Faces emplea una variación de MVC • Model-2 (específica para web): • El modelo puede constar de objetos Java “de toda la vida” (POJOs), EJBs, u otra cosa. • La vista pueden ser JSPs u otra tecnología de visualización. • El controlador se implementa siempre como un servlet. • El controlador JSF es un servlet FrontController llamado FacesServlet • Emplea ficheros de configuración y un conjunto de manejadores de acción (Action Handlers). 15 • El FacesServlet recibe peticiones de clientes web y ejecuta un conjunto lógico de pasos para preparar y servir una respuesta • Un action handler es simplemente un método de un JavaBean que no tiene parámetros y retorna un String. resultado • Retorna un (como por ejemplo “éxito” o “fallo”). • El fichero de configuración define el flujo de interfaces de usuario, entre otras cosas. 16 17 Arquitectura • Elementos de la arquitectura: • Componente UI: Un objeto con estado, mantenido en el servidor, que proporciona funcionalidad específica para interactuar con un usuario final. Son javabeans con propiedades, métodos y eventos. Organizados en una vista (árbol de componentes visualizado como una página). • Renderer: Responsable de mostrar un componente UI y traducir una entrada de usuario al valor del componente. Los renderers pueden ser diseñados para trabajar con uno o más componentes UI, y un componente UI se puede asociar con muchos renderers diferentes. • Validador: Responsable de asegurar que el valor introducido por un usuario es aceptable. Uno o más validadores pueden ser asociados con un sencillo componente UI. • Backing beans: Javabeans especializados que coleccionan valores de componentes UI e implementan métodos oyentes de eventos. También pueden mantener referencias a componentes UI. 18 • Conversores: Convierte el valor de un componente a/desde un String para visualizar. Un componente UI puede ser asociado con un convertidor sencillo. • Events y listeners (eventos y oyentes): JSF utiliza el modelo evento/oyente de javabeans (también utilizado por Swing). Los componentes UI (y otros objetos) generan eventos, y pueden registrarse oyentes para manejar esos eventos. • Mensajes e internacionalización: La información que se visualiza de vuelta al usuario. Cualquier parte de la aplicación (beans de respaldo, validadores, convertidores, etc) pueden generar información o mensajes de error que pueden ser mostrados al usuario. • Navegación: La habilidad de moverse de una página a la siguiente. JSF tiene un potente sistema de navegación que está integrado con oyentes de evento especializados. 19 20 • Los componentes de interface de usuario, que están contenidos en una vista, actualizan beans y generan eventos basados en entradas de usuario. • Los renderers muestran componentes, y también pueden generar eventos y mensajes. • Los convertidores traducen y formatean el valor de un componente para la visualización, y también generan mensajes de error. • Los validadores verifican el valor de un componente y generan mensajes de error. • Los beans contienen oyentes de evento y métodos de acción, que son oyentes de evento que están especializados en la navegación. • Los oyentes de evento consumen eventos y pueden manipular la vista o ejecutar objetos del modelo, que desempeñan la lógica de la aplicación 21 • Los métodos de acción pueden hacer todo lo que los oyentes de evento pueden hacer, pero también devuelven un resultado que es usado por el sistema de navegación. • El sistema de navegación usa este resultado para seleccionar la siguiente vista a mostrar al usuario. • La mayoría de los elementos generan un mensaje o un evento (así es como JSF se comunica). • Los eventos representan entradas de usuario u operaciones de la aplicación. • Los mensajes indican errores o notificaciones de la aplicación. 22 Componentes UI • Objetos con estado, mantenidos en el servidor, que proporcionan funcionalidad específica para la interacción con el usuario final • Se construyen sobre la base de javabeans • Se ejecutan en el lado del servidor, no en el cliente • Estrategia de desarrollo basado en componentes (RAD) • El aspecto de un componente es la manera en la que se renderiza (diferentes visualizaciones para un mismo componente) 23 • Los componentes UI tienen que recordar sus valores, o estado. Los componentes JSF gestionan esto automáticamente evitando esa tarea al desarrollador. • Los componentes JSF pueden recordar valores entre peticiones porque el framework mantiene un árbol de componentes de interface de usuario para una página en particular • El árbol de componentes, llamado vista, es la representación interna de la página JSF • Utilizar “Vista” en lugar de “Página” subraya el hecho de que la representación del usuario no tiene que ser una página web HTML siempre 24 25 • Cada componente en el árbol se identifica con un identificador de componente. • El identificador componente puede ser establecido por el desarrollador, y si no se establece ninguno, será generado automáticamente. 26 Desarrollo de Aplicaciones Distribuidas Renderers • Se encargan de la visualización gráfica de un componente • JSF proporciona un render kit estándar para HTML 4.01 • Otros render kit podrían generar un “look and feel” diferente: WML, SVG, etc.. • Se separa el concepto de componente del concepto de renderer • P.E.: un componente UICommand puede representarse como un hipervínculo HTML o como un botón HTML. • En JSP, el tipo de renderer se indica mediante la incrustación de una etiqueta específica de tipo de render • p.e.: <commandHyperlink/> y <commandButton/> 27 28 29 • JSF tiene un render kit por defecto, (se expone a través de la propiedad renderKitId): • public String getDefaultRenderKitId(); • public void setDefaultRenderKitId(String renderKitId); • Se configura en el fichero de configuración JSF, y el valor por defecto es “HTML_BASIC” • RenderKitFactory.HTML_BASIC_RENDER_KIT • El desarrollador puede personalizar los Renderers de un RenderKit existente o crear su propio RenderKit • El desarrollador puede definir un componente personalizado 30 Eventos • JSF utiliza el modelo de eventos y oyentes (event/ listener) de javabeans. • Los componentes de interface de usuario y otros componentes generan eventos y oyentes que pueden ser registrados para manejar esos eventos • JSF integra la lógica de aplicación asignando los oyentes apropiados a componentes que generan los eventos que los oyentes comprenden (no hay peticiones y respuestas) 31 • Hay cuatro eventos estándar: • eventos de cambio de valor (value-change events): se disparan cuando el usuario cambia el valor de un componente que es un control de entrada. • eventos de acción (action events): se generan cuando un usuario activa un componente de comando como un botón. • eventos de modelo de datos (data model events): se disparan cuando un componente de datos selecciona una fila para procesamiento. • eventos de fase (phase events): se ejecutan cuando JSF procesa una petición HTTP 32 • JSF Expression Language (EL) • Basado en el EL incluido en JSP 2.0 • EL proporciona un conjunto de objetos implícitos que permiten al desarrollador acceder a parámetros de la petición, cabeceras HTTP, etc. • Se puede utilizar EL para sentencias lógicas y matemáticas, y también es posible mezclar valores literales con expresiones 33 • Diferencias entre JSF EL y JSP 2.0 EL: • JSF utiliza el signo (#) para marcar el principio de una expresión, en vez del símbolo ($). • Las expresiones JSF pueden ser también de dos vías. En otras palabras pueden o recuperar el valor de una propiedad o actualizarla. • JSF EL también te permite referenciar métodos de objetos. • Algunas características específicas de JSP no están disponibles, como el ámbito de página. • Las funciones JSP EL no están soportadas oficialmente 34 • Se puede utilizar JSF EL para enlazar componentes a objetos que exponen propiedades javabean, colecciones, y tipos de datos sencillos. • EL puede también ser utilizado para referenciar métodos y crear sentencias lógicas o numéricas. También soporta sentencias anidadas 35 Eventos de cambio de valor • Se gestiona con oyentes valuechange. <h:inputText valueChangeListener="#{myForm.processValueChanged}"/> <h:panelGrid binding="#{myForm.changePanel}" rendered="false"> ... </h:panelGrid> public void processValueChanged(ValueChangeEvent event){ HtmlInputText sender = (HtmlInputText)event.getComponent(); sender.setReadonly(true); changePanel.setRendered(true); } • El método oyente del evento cambiará la propiedad readOnly del emisor (en este caso, el componente HtmlInputText) a true de modo que el usuario no pueda editar su contenido. • Entonces cambiará la propiedad rendered del componente HtmlPanelGrid (que está ligada a la propiedad changePanel) a true de modo que será visible cuando la página es redibujada. 36 Eventos de acción • Los componentes que generan eventos de acción, también llamados action sources, incluyen controles como botones o hiperenlaces. • Los eventos de acción se manejan por oyentes de acción (action listeners) • Dos tipos de oyentes de acción: los que afectan a la navegación, y los que no: • Los que afectan a la navegación generalmente llevan a cabo algún tipo de procesamiento y luego devuelven un resultado lógico que usa el sistema de navegación de JSF para seleccionar la siguiente página • Los que no afectan a la navegación generalmente manipulan componentes en la vista en curso, o llevan a cabo algún procesamiento que cambia objetos de modelo o propiedades del beans, pero no modifican la página en curso a la que el usuario está accediendo 37 • Los oyentes de acción delegan todo su trabajo a métodos de acción (action methods) en beans, así que el desarrollador puede tener métodos de acción diferentes manejando partes diferentes de su aplicación • Cuando un componente dispara un evento de acción, este oyente de acción por defecto determina su cadena de resultado, por ejemplo: “menuprincipal”, “exito”, “fallo”. 38 • Dos tipos básicos de salidas: estática y dinámica • Las salidas estáticas son cadenas constantes que se declaran con el componente <h:commandButton type="submit" value="Login" action="exito“ immediate="true"/> • Las salidas dinámicas son cadenas devueltas por métodos de acción <h:commandButton type="submit" value="Login" action="#{loginForm.login}"/> public class LoginForm { public String login() { if (...) {return "exito";} else { return "fallo";} } 39 • Cuando se necesita ejecutar lógica de aplicación que no está asociada con la navegación, puede asociar un método oyente de acción con un componente. • los oyentes de acción tienen acceso al componente que disparó el evento (mediante event) <h:commandButton id="redisplayCommand" type="submit" value="Redisplay“ actionListener="#{miForm.doIt}"/> public void doIt(ActionEvent event){ HtmlCommandButton button = (HtmlCommandButton)event.getComponent(); button.setValue("Hecho!"); } 40 Eventos de modelo de datos • Ejemplo: componentes que muestran una lista de elementos en una tabla, como por ejemplo un HtmlDataTable • Sus oyentes de evento deben implementar una interface Java • Los eventos son disparados por una instancia DataModel, que es un objeto de modelo usado internamente por componentes relacionados con datos • DataModel son envolturas para listas, arrays, result sets, y otras fuentes de datos. 41 • Debido a que el evento es técnicamente disparado por un objeto del modelo en lugar de por un componente, no se puede registrar un oyente sobre el componente mismo en JSP. • Hay que registrarlo en el código Java (clase interna anónima) FacesContext facesContext = FacesContext.getCurrentInstance(); dataTable = (HtmlDataTable) facesContext.getApplication().createComponent (HtmlDataTable.COMPONENT_TYPE) DataModel myDataModel = new ResultSetDataModel(myResultSet); myDataModel.addDataModelListener( new DataModelListener() { public void rowSelected(DataModelEvent e){ FacesContext.getCurrentInstance().getExternalContext().log("fila seleccionada:" + e.getRowIndex()); } }); dataTable.setValue(myDataModel); 42 Eventos de fase • Siempre que una aplicación JSF recibe una petición, pasa a través de un proceso de seis pasos denominado Ciclo de vida de Procesamiento de Petición • Durante este proceso, JSF restaura la visualización pedida, traduce los parámetros de petición a valores componentes, realiza la validación de entradas, actualiza beans de respaldo u objetos de modelo, invoca oyentes de acción, y devuelve una respuesta al usuario. • Los eventos de fase se generan antes y después de cada paso, o fase, de este ciclo de vida. 43 • Es necesario que se implemente una interface Java para registrar oyentes de evento lifecycle.addPhaseListener( new PhaseListener(){ public void beforePhase(PhaseEvent event) {priceQuote = QuoteService.getLatestQuote(currentQuoteId);} public void afterPhase(PhaseEvent event){} Public PhaseId getPhaseId(){ return PhaseId.RENDER_RESPONSE; } }) • Ejemplo de registrar un oyente de fase que se ejecuta antes de que una vista sea mostrada • Lifecycle representa al ciclo de vida del procesamiento de la petición. • La propiedad phaseId del oyente indica al ciclo de vida cuándo debería procesar eventos (la fase Renderizar Respuesta). 44 Validadores • Son los responsables de asegurar que los valores introducidos son aceptables. • Se puede asociar uno o más validadores al mismo componente de interface de usuario • 3 formas de validación: • A nivel de componentes de interface de usuario (validadores estándares predefinidos): se usa para validaciones simples (p.e. como asegurar que se ha introducido un valor en un campo obligatorio) • Mediante métodos validadores en los beans (útil cuando necesitamos validar uno o más campos de un formulario y no queremos compartir esa lógica con otros componentes) • Mediante clases validadoras (útiles para casos genéricos como la longitud de un campo o el rango de un número). 45 • Validadores estándar (predefinidos) en JSF: • campo con valor requerido • validadores de la longitud de una cadena • validadores de rango para enteros y decimales. • Se pueden crear validadores propios • Cuando un validador encuentra un error, añade un mensaje de error a la lista de mensajes actual, que es un componente que muestra mensajes relacionados con componentes o con la aplicación. 46 • Ejemplos: • validador estándar <h:inputText id="userNumber" value="#{NumberBean.userNumber}" required="true"/> • validador que recurre a un bean <h:inputText id="emailInput" validator="# {registrationBean.validateEmail}“ value="#{registrationBean.email}/> • Clases validadoras <h:inputText id="age" value="#{resumeBean.age}" required="true"> <f:validateLongRange minimum="16" maximum="64"/> </h:inputText> 47 Modelo (uso de beans) • JavaServer Faces implementa una variante del Modelo Vista Controlador (MVC) denominada Modelo 2. • Este modelo potencia la separación entre la vista y el modelo, y la interacción entre ambos que viene determinada por el controlador. • El modelo vendría a estar formado por clases de acceso a bases de datos (DAO o Hibernate), EJB, servicios web, etc… • Los beans de respaldo son los objetos que realizan función del controlador: controlar la interacción entre la interface de usuario y el modelo. 48 • Los beans generalmente contienen propiedades a recuperar y métodos de oyentes de eventos, que procesan esas propiedades. • También pueden manipular la interface de usuario o realizar algún tipo de procesamiento en la aplicación. • Algunas herramientas de desarrollo generan clases bean de respaldo automáticamente cuando se crea una nueva página. 49 • JSF permite asociar beans de respaldo con componentes de interfaz de usuario de forma declarativa (con marcas y no código) • Se asocia un componente con el bean de respaldo a través del lenguaje de expresiones (EL) de JSF <h:outputText id="helloBeanOutput" value="#{helloBean.numControls}"/> • Cuando cambia el valor del componente, cambiará el valor del bean de respaldo y viceversa, porque ambos están sincronizados. 50 • Se puede enlazar una propiedad de un componente con la de un bean de forma que se puede manipular la vista con código Java <h:panelGrid id=“aControlPanel" binding="#{helloBean.controlPanel}“ columns="20" border="1" cellspacing="0"/> • Dede el bean se puede manipular el componente, haciendo uso de la propiedad controlPanel. 51 • Los beans son declarados en el fichero de configuración (faces-config.xml): se puede especificar qué objetos estarán disponibles a lo largo del ciclo de vida de la aplicación. <managed-bean> <managed-bean-name>brokeUser</managed-bean-name> <managed-bean-class>org.jia.examples.UserBean</managed-bean-class> <managed-bean-scope>request</managed-bean-scope> <managed-property> <property-name>firstName</property-name> <value>Joe</value> </managed-property> <managed-property> <property-name>favoriteAnimal</property-name> <null-value/> </managed-property> </managed-bean> • O se puede declarar y crear la clase en codigo Java (.java) <managed-bean> <managed-bean-name>userBean</managed-bean-name> <managed-bean-class>org.jia.examples.UserBean</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> </managed-bean> 52 Internacionalización • JSF conocerá la localización del usuario mediante la aplicación cliente (el navegador web indicará en las cabeceras HTTP las lenguas que soporta y la que tiene por defecto) • Los códigos de los idiomas se ponen en minúscula, mediante cadenas de dos letras definidas por la Internacional Organization for Standardization (ISO). 53 • Tareas: • 1 - Indicar en JSF (faces-config.xml) las lenguas que soporta y la región en la que se aplican • 2 - Crear al menos un fichero de recursos con las cadenas de texto en los lenguajes deseados • 3 - Cargar el fichero de recursos y referenciar las cadenas de los ficheros de recursos en vez de escribirlas directamente en las páginas 54 • 1. Indicar JSF qué idiomas debería soportar. • faces-config.xml <application> <locale-config> <default-locale>es</default-locale> <supported-locale>en</supported-locale> <supported-locale>en_US</supported-locale> </locale-config> <message-bundle> MensajesPersonalizados </message-bundle> </application> • La lengua seleccionada en el cliente tiene preferencia y si no se esta en las indicadas con la etiqueta <locale-config> del cliente, se recurre a la lengua por defecto. 55 • 2. Crear ficheros de recursos • Ficheros con el texto en los distintos lenguajes soportados • resource bundles: Se componen de líneas formadas por los pares clave/valor. • Igual nombre excepto por un sufijo que debe ser acorde con el lenguaje al que traduce y que precede a la extensión. • Los mensajes contenidos en los ficheros se pueden parametrizar MensajesPersonalizados_es.properties halloween=Todos los días son como el Día de las Brujas. numberOfVisits=Nos ha visitado {0} veces, {1}. ¡que buena onda! toggleLocale=Traducir a Ingles helloImage=../images/hola.gif 56 • 3. Cargar recursos y usar las cadenas contenidas • Cargar el fichero de recursos (resource bundle) con el nombre que tienen en común los ficheros de recursos de los diferentes idiomas, pero excluyendo el sufijo que indica el lenguaje concreto y la extensión <f:loadBundle basename=" MensajesPersonalizados" var="bundle"/> • Referenciar las cadenas <h:outputFormat value="#{bundle.numberOfVisits}"> <f:param value="#{user.numberOfVisits}"/> <f:param value="#{user.firstName}"/> </h:outputFormat> 57 Conversores • Convierten el valor de un componente desde y a una cadena para mostrar por la pantalla. • Un componente de interface de usuario puede ser asociado con un único conversor. • Traducen un objeto a una cadena para visualizar, y desde una cadena de entrada en un objeto • JSF tiene conversores para tipos comunes como fechas y números • Pero también podemos crear nuestros propios conversores 58 • p.e.: Conversor de fecha: <h:outputText value="#{user.dateOfBirth}"> <f:convertDateTime type="both" dateStyle="full"/> </h:outputText> • JSF dispone de conversores por defecto si no se indica nada • Formas de definir un conversor: • Anidando (permite parametros): <h:outputText value="#{user.dateOfBirth}"> <f:convertDateTime type="date" dateStyle="medium"/> </h:outputText> • Atributo: <h:outputText value="#{user.creditCardNumber}" converter="creditcard"/> 59 Navegacion • La navegación es la habilidad de pasar de una página a la siguiente. • JSF tiene un sistema de navegación que se integra con oyentes de eventos especializados. • El manejador de navegación (navigation handler) es el responsable de decidir qué página se va a cargar en base a la salida de un método de acción. • Para cualquier página dada, una regla de navegación define qué salidas se pueden dar y qué páginas se deben cargar en base a esas salidas. • La correspondencia entre una salida y una página se llama caso de navegación (navigation case). 60 • Las reglas de navegación se expresan en el fichero de configuración (faces-config.xml) <navigation-rule> <from-view-id>/login.jsp</from-view-id> <navigation-case> <from-outcome>success</from-outcome> <to-view-id>/mainmenu.jsp</to-view-id> </navigation-case> <navigation-case> <from-outcome>failure</from-outcome> <to-view-id>/login.jsp</to-view-id> </navigation-case> </navigation-rule> 61 Ciclo de vida • Para entender cómo el framework enmascara la naturaleza del procesamiento de la petición subyacente del API Servlet, es de gran ayuda analizar cómo JSF procesa cada petición. • El ciclo de vida de una página JSF 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 • JSF proporciona algunos servicios adicionales mediante la ejecución de algunos pasos extras 62 • Este proceso comienza tan pronto como se recibe una petición por el servlet JSF • Hay seis fases primarias (mostradas en los cuadrados sombreados), y después de la mayoría de ellas se procesan eventos (mostrados en cuadros blancos). 63 • Restore View • JSF construye el árbol de componentes de la página JavaServer Faces, conecta los manejadores de eventos y los validadores y graba el estado en el FacesContext • Apply Request Values • 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. Su valor se almacena localmente en el componente. • Process Validations • JSF procesa todas las validaciones registradas con los componentes del árbol 64 • Update Model Values • Una vez que JSF 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 • Invoke Application • JSF maneja cualquier evento a nivel de aplicación, como enviar un formulario o enlazar a otra página • Render Response • JSF invoca las propiedades de codificación de los componentes y dibuja los componentes del árbol de componentes grabado en el FacesContext. 65 Ficheros de configuración • En web.xml <web-app> <display-name>Tienda</display-name> <description>Comprar un ordenador</description> <!-- Faces Servlet --> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet </servlet-class> </servlet> <!-- Faces Servlet Mapping --> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>/faces/*</url-pattern> </servlet-mapping> </web-app> • Tambien mapping a ‘*.jsf’ y ‘*.faces’ 66 • En faces-config.xml 67 68 • Destacar el uso frecuente de: <application> <message-bundle>tiendadecoches.bundles.Messages</message-bundle> <locale-config> <default-locale>es</default-locale> <supported-locale>en</supported-locale> </locale-config> </application> … <converter> <description>Registra la implementación Converter concreta, tiendadecoches.CreditCardConverter utilizando el identificador creditcard. </description> <converter-id>creditcard</converter-id> <converter-class>tiendadecoches.CreditCardConverter</converter-class> </converter> 69 <managed-bean> <description> Para inicializar en la sesión el bean del usuario que utiliza la aplicación </description> <managed-bean-name>usuario</managed-bean-name> <managed-bean-class> ejemplo.JDBCUsuarioDAO </managedbean-class> <managed-bean-scope>session</managed-bean-scope> … <navigation-rule> <from-view-id>/login.jsp</from-view-id> <navigation-case> <description> Cualquier acción que retorna validado en login.jsp debería navegar a menu.jspx </description> <from-outcome>validado</from-outcome> <to-view-id>/menu.jspx</to-view-id> </navigation-case> <navigation-case> <description> Cualquier acción que retorna fallo en login.jsp debería navegar a errorEntrada.jsp </description> <from-outcome>fallo</from-outcome> <to-view-id>/errorEntrada.jsp</to-view-id> </navigation-case> … 70