Ir al contenido principal

JSF 2.0: El ciclo de vida


El ciclo de vida de JSF comienza cuando un usuario hace una petición HTTP a través de su navegador y termina cuando el servidor le responde con la página correspondiente. Como HTTP es un protocolo sin estado, no es capaz de "recordar" las transacciones anteriores que se han llevado a cabo entre el usuario y el servidor.
 
JSF soluciona esta "falta de memoria" manteniendo vistas en el lado del servidor. Una vista es un árbol de componentes que representa la UI del usuario. Así, mientras que nosotros nos centramos en desarrollar los componentes, el ciclo de vida de JSF se preocupa de sincronizar estas vistas del lado del servidor y lo que se le muestra al usuario.
Cuando un usuario pincha en un botón o un link comienza el ciclo de vida de JSF, que contiene varias fases:

1) Restore View

Se crea o restaura el árbol de componentes (la vista) en memoria. Cuando la vista se crea por primera vez, se almacena en un contenedor padre conocido como FacesContext, y se pasa directamente a la última fase (Render Response), ya que la petición no tendrá valores que estudiar. Todas las operaciones realizadas en el FacesContext utilizan un hilo por petición de usuario, así que no hay que preocuparse porque múltiples peticiones de usuarios puedan "liarla".

2) Apply Request Values

Se itera sobre los componentes del árbol, comprobando qué valor de la petición pertenece a qué componente, y los van guardando. Estos valores almacenados se llaman 'valores locales'.

3) Process Validations

Se realizan las validaciones y conversiones necesarias de los valores locales. Si ocurre algún error en esta fase, se pasa a la fase Render Response, mostrándole al usuario otra vez la página actual y dándole así una nueva oportunidad para que pueda introducir los datos correctos.

4) Update Model Values

Se modifican los valores de los beans asociados a los componentes de la vista con los valores locales. Ej. #{userBean.name}

5) Invoke Application

Se invoca el método asociado al action del botón o link que pinchó el usuario (Ej. #{userBean.addUser}), y que hizo que se activara el ciclo de vida de la petición. Estos métodos devuelven un String que le indica al gestor de navegación qué página tiene que devolverle al usuario.

6) Render Response

El servidor devuelve la página de respuesta al navegador del usuario y guarda el estado actual de la vista para poder restaurarla en una petición posterior.

Si añadimos a un botón o a un link el atributo immediate a true, se saltará la fase de validación. Por ejemplo, si tenemos un botón "Volver", normalmente no querremos que valide los valores que hay introducidos sino que nos devuelva diréctamente a la página anterior.

El tema del ciclo de vida suele ser un poco complicado de entender, sobre todo al principio, así que no hay que desanimarse :)

Comentarios

  1. Sin duda un impecable articulo ! :)

    ResponderEliminar
  2. El tema del ciclo de vida en JSF suele ser bastante feo así que me alegro mucho que te haya gustado :)

    ResponderEliminar
  3. Cómo me alegro de que alguien que haya trabajado conmigo haya entendido el concepto... ya era hora que me lo explicaran!!! Felicidades Ana!

    ResponderEliminar
  4. jeje es que tuve unos maestros excelentes!!! se os echa de menos :d

    ResponderEliminar

Publicar un comentario

Entradas populares de este blog

Leer un fichero properties con java.util.Properties

Los ficheros .properties son simples ficheros de texto que se suelen utilizar para guardar parámetros de configuración, en forma de pares clave-valor. Ejemplo de fichero: configuration.properties #User parameters user.name=Ana user.language=spanish Si estamos usando Java, podemos utilizar la clase java.util.Properties para leer los parámetros de este fichero: private static final String USER_NAME = "user.name"; private static final String USER_LANGUAGE = "user.language"; public void showProperties() throws Exception { Properties p = new Properties(); InputStream is = App.class.getResourceAsStream("/configuration.properties"); p.load(is); is.close(); String userName = p.getProperty(USER_NAME); String userCountry = p.getProperty(USER_LANGUAGE); System.out.println("userName: "+userName); System.out.println("userLanguage: "+userCountry); } Después de ejecutar este método, obtendríamos la siguiente salida: ...

JSF 2.0: Managed Beans (III)

Anteriormente ya hemos visto que cuando se declara un bean, tenemos que darle un scope: application, session, view, request, none. Un scope es un mapeo entre nombres y objetos que se almacena durante un determinado periodo de tiempo. En este post vamos a explicar cada uno de ellos. Si declaramos el bean desde el fichero faces-config.xml, indicamos el scope en <managed-bean-scope> y si queremos hacerlo con anotaciones, utilizaremos @{Application,Session,View,Request,None}Scoped Application Con este scope, se guarda la información durante toda la vida de la aplicación web, independientemente de todas las peticiones y sesiones que se realicen. Este bean se instancia con la primera petición a la aplicación y desaparece cuando la aplicación web se elimina del servidor. Si queremos que el bean se instancie antes de que se muestre la primera página de la aplicación, usamos la propiedad eager a true. @ManagedBean(eager=true) ó <managed-bean eager="true"> Session...

JSF 2.0: Message bundles

Los message bundles son ficheros .properties que guardan mensajes del tipo clave=valor. Si centralizamos todos los mensajes de nuestra aplicación en estos ficheros, es más fácil poder localizarlos si queremos realizar algún cambio y también nos ayuda para la internacionalización de la aplicación. Ejemplo: messages.properties (en src/java/com/examples) con dos mensajes name=Tu nombre: age=Tu edad: ¿Cómo los declaramos? 1) En cada página JSF donde lo necesitemos <f:loadBundle basename="com.examples.messages" var="msgs"/> 2) De manera global en faces-config.xml <application>      <resource-bundle>           <base-name>com.examples.messages</base-name>           <var>msg</var>      </resource-bundle> </application> Esta opción es más eficiente ya que sólo crea el bundle una v...