Monday, February 15, 2010

Utilizar Contexts and Dependency Injection (CDI) en proyectos JSF 2.0

En la entrada anterior se explicaron cuales eran las distintas maneras de implementar un JavaServer Faces (JSF) 2.0 backing bean. En esta entrada vamos a ver como crear un proyecto web JSF 2.0 en Netbeans 6.8 que soporte Context and Dependency Injection (CDI) Managed Beans.

Lo primero que tenemos que hacer es crear un proyecto web:



En el paso de elegir Frameworks, seleccionar JavaServer Faces. En la pestaña de Libraries seleccionar la librería JSF que viene por defecto (JSF 2.0) y en la pestaña de Configuration, seleccionar el lenguaje de pagina preferido como Facelets.



A diferencia de otros motores de manejo de beans, CDI no necesita de ninguna anotación para que una clase se registre y sea manejada. Por defecto todas las clases de un archivo (jar) son manejadas por CDI. La anotación @Named tan solo hace que los atributos de la clase sean accesible desde expresiones EL.

La búsqueda de clases y el registro de las mismas en el motor de CDI hace que el deploy de una aplicación sea mas lento. Por lo tanto, necesitamos de una manera de decirle al container si queremos o no usar CDI. La manera de especificar esto es creando un archivo xml vacío (beans.xml) en los directorios WEB-INF o META-INF.

La sola existencia del archivo WEB-INF/beans.xml o MET-INF/beans.xml ya activa CDI.

Por lo tanto, el ultimo paso consiste en crear el archivo WEB-INF/beans.xml.



Se puede por ejemplo tener varios jar, donde uno solo contiene un archivo beans.xml. De esta manera, el contenedor solo registraría las clases de este jar y no de los otros, haciendo que el deploy de la aplicacion sea mas rápido. Gavin King en su blog explica el porque de la necesidad del archivo beans.xml.

En la Figura podemos ver como queda la jerarquía de directorios del proyecto y como el archivo beans.xml esta vacío, la sola presencia del archivo ya es suficiente para activar el motor CDI.


Esto es todo, ahora lo único que tenemos que hacer es agregar clases y estas ya van a ser manejadas por CDI.

Si deployamos la aplicación, vamos a ver en el log del glassfish que se esta utilizando CDI, cuales son las clases manejadas y el ámbito de cada una.

En la siguiente entrada voy a explicar como utilizar las clases manejadas por CDI como backing beans JSF y como estas pueden ser accesibles desde expresiones EL en paginas Facelets. Para esto voy a utilizar un ejemplo que va a ilustrar las facilidades que nos brinda CDI.

Para hacer mas útil el blog, cree un proyecto en la plataforma Kenai donde voy a ir subiendo los ejemplos de las entradas que vaya publicando.

El primer ejemplo (JSF-CDI) es una pequeña aplicación que utiliza CDI Managed Beans para persistir el estado de los componentes UI de paginas JSF 2.0 con Facelets.

Actualización:

Si se realiza una actualizacion del Netbeans 6.8, ahora al crear un proyecto web, hay una opcion para habilitar CDI en el proyecto.



En la siguiente imagen podemos ver que en la sección de configuraciones, hay un checkbox para elegir si activar o no activar CDI. Por lo tanto lo único que se tiene que hacer es seleccionar esa opción y automáticamente se crea el archivo WEB-INF/beans.xml.