sábado, 22 de enero de 2011

Facelets framework.


¿Que es Facelets?
Cuando JSF fue ideado, la intención fue reutilizar JSP como principal tecnología para la creación de paginas web, dado que es un estándar en la comunidad web.
La idea fue hacer natural la adopción de JSF por medio de etiquetas naturales que ya tienen una adopción el el mundo java.

Desafortunadamente JSP y JSF no se complementan entre si. JSP se usa para crear paginas web dinámicas pero no para crear arboles de componentes. En JSP los elementos son procesados desde el principio de la pagina hasta el final. JSF, sin embargo, tiene un ciclo de vida mucho más complejo, generación de componentes, y una generación separada en faces claras.

Si se mezcla JSP con JSF, el JSF se renderizara a medida que se vaya encontrando, en cambio los componentes JSF tiene cada uno su propio renderizado. Esto puede traer ciertos problemas.

Facelets llena el gap entre JSP y JSF. Esta centrado en la creación de arboles de componentes y el entrelazamiento de contenido con el complejo ciclo de vida de JSF. Facelets remplaza a JSP con una muy simple API que es el reflejo de principios simples y esto incorpora numerosas características que facilitan el desarrollo.

¿Porque utilizar Facelets?
Hay muchas razones por las que usar Facelts antes que JSP para el desarrollo de JSF:
  • No depende del contenedor, Facelts puede trabajar con cualquier implementación y versión de JSF.
  • La interacción entre JSP y JSF puede traer problemas.
  • Facelets provee templates, que pueden ser reutilizados
  • Su simpleza maximiza la reutilización, es extensible y escalable.
  • Facets soporta EL (Unified Expression Language)
  • Facets no requiere ninguna librería especial para el renderizado.

Descargar Facelets.
Facelets se puede descargar de la siguiente URL: http://facelets.dev.java.net/
El jar que se necesita para trabajar con Facelets es jsf- facelets.jar y las dependencias puede ser buscadas en el directorio lib.

Si usan maven la dependencia es:


com.sun.facelets
jsf-facelets
1.1.6



Configuración
Para configurar un proyecto web para que use Facelets en necesario configurar el Web Descriptor (web.xml) agregando lo siguiente:



..............


javax.faces.DEFAULT_SUFFIX
.xhtml




De esta forma indicamos que nuestras paginas van a finalizar con el subfijo xhtml.
Además como cualquier proyecto JSF hay que agregar el servlet y el servlet-mapping



Faces Servlet
javax.faces.webapp.FacesServlet
1


Faces Servlet
/faces/*



Además es necesario crear un archivo Configuración de Faces Descriptor (faces-config.xml) como cualquier proyecto JSF, donde es necesario remplazar el ViewHandler traido por defecto por:
com.sun.facelets.FaceletViewHandler de la siguiente manera:





com.sun.facelets.FaceletViewHandler





En faces-config.xml también se define las reglas de navegación.




home
/index.xhtml




parrot
/parrot.xhtml




eagle
/eagle.xhtml




Como se puede ver se define cada uno de los links a que htmlx debe ir.


Tags
Es necesario que las paginas Facelets sean un XML valido, cuando se utiliza una librería es necesario que se declare como un namespace, donde podemos mapear la URI a un prefijo como se puede apreciar en el siguiente ejemplo:












En el ejemplo usamos 3 librerías, una XML sin prefijo, otra para Facetlet tag con el prefijo ui y otra básica de JSF con el prefijo h.
En la siguiente tabla se puede ver los namespace más comunes:


NAMESPACEPREFIX LIBRARY XHTML
http://www.w3.org/1999/xhtml -- Facelets Templating
http://java.sun.com/jsf/facelets ui JSF Core
http://java.sun.com/jsf/core f JSF HTML
http://java.sun.com/jsf/html h MyFaces Tomahawk
http://myfaces.apache.org/tomahawk t MyFaces Tomahawk
http://myfaces.apache.org/sandbox s Sandbox
http://myfaces.apache.org/trinidad tr MyFaces Trinidad
http://java.sun.com/jstl/core c JSTL Core
http://java.sun.com/jsp/jstl/fmt fn JSTL Functions


Si se agrega un componente pero no se agrega el espacio de nombre correspondiente para el componente, habrá un error en el momento de compilación de la pagina.

Carga de las librerías de Tags
Facelets usa la siguiente estrategia para cargar las librerías de etiquetas. Primero, busca las librerías en la carpeta /META-INF dentro de los jars. Intenta cargar los archivos que tienen la siguiente forma *.taglib.xml. De esta forma se cargan librería de etiquetas estándares.
Luego, facelets chequea las librerías definidas en web.xml, inicializado como parámetros facelets.LIBRARIES. Esta estrategia es ideal para cuando se desea cargar una librería de etiquetas propia.

Varias librerías de etiquetas ya son incluidas en el jar de facelets:
  • Templating library: Contiene las etiquetas para la creación de plantillas.
  • JSF libraries: Dos librerías de etiquetas las cuales son incluidas por la especificación de JSF, son librerías incluidas por defecto por Facelets.
  • JSTL: Facelets provee soporte parcial a etiquetas de JavaServer Pages Standard Tag
  • Library (JSTL). Mientras la librería Function es totalmente soportada, La Core es parcialmente soportada, las etiquetas soportadas son: c:if, c:forEach, c:catch y c:set.

Otras Librerías
Para incluir otra librería de etiquetas se debe agregar la misma en la carpeta /META-INF y además se debe incluir el import del Taglib dentro de la aplicación.

Creación de plantillas
En las plantillas nosotros definimos básicamente el layout de la pagina, y los estilos. Con la etiqueta ui:insert podemos definir las áreas en la pagina que pueden ser sobreescritas, por las paginas que usan la plantilla (clientes). Para usar esta etiqueta es necesario el espacio de nombre: http://java.sun.com/jsf/facelets
El cliente usa este template con los tags ui:component, ui:composition, ui:fragment, o ui:decorate. Veamos un ejemplo de plantilla:





The Happy Birds Directory




The Happy Birds Directory






Welcome to the nest!






La pagina que utilice esta plantilla sera algo así:







Hola Mundo!!





Es usada la etiquete ui:composition para referenciar la plantilla utilizada. La etiqueta ui:define es utilizada para indicar a Facelts cual area se va a redefinir.
Las plantillas no están limitadas a un nivel, es posible tener varios niveles de plantillas, de este modo un cliente para un template puede ser un template para otro cliente.