# Facelets

En informática, Facelets es un sistema de código abierto de plantillas web bajo la Licencia Apache y la tecnología de controlador de JavaServer Faces (JSF). El lenguaje requiere documentos XML de entrada válidos para trabajar. Facelets es compatible con todos los componentes de la interfaz de usuario de JSF y se centra por completo en la construcción del árbol de componentes, lo que refleja el punto de vista de una aplicación JSF.
Aunque ambas tecnologías JSF y JSP han mejorado para trabajar mejor juntas, Facelets elimina los problemas señalados en el artículo de Hans Bergsten "Improving JSF by Dumping JSP".
Facelets se basa en algunas de las ideas de Apache Tapestry, y es lo suficientemente similar para hacer una comparación. El proyecto es conceptualmente similar a Tapestry, que trata los bloques de los elementos HTML como componentes del marco apoyados por las clases de Java. Facelets también tiene algunas similitudes con el framework Apache Tiles con respecto al soporte de plantillas, así como en la composición.
Facelets fue creado originalmente por Jacob Hookom en 2005 como una visión alternativa al lenguaje para JavaServer Faces (JSF) 1.1 y JavaServer Faces (JSF) 1.2, que utiliza tanto JSP como lenguaje por defecto. A partir de JSF 2.0, Facelets ha sido promovido por el grupo de expertos JavaServer Faces (JSF) siendo el lenguaje por defecto. JSP ha quedado obsoleto en forma de legado (legacy).

## Conversión de elementos

En Facelets se pueden introducir plantillas de etiquetas desde una biblioteca de etiquetas de dos formas:
* Directamente como un elemento xml calificado
* Indirectamente a través del JSFC como atributo de un elemento no calificado arbitrariamente.
En este último caso el compilador Facelet ignorará el elemento actual y procesará el elemento que era dado por JSFC.
El siguiente ejemplo muestra el uso directo de las etiquetas calificadas:
Uso del atributo JSFC, el mismo código también se puede expresar como el ejemplo dado a continuación:

## Reutilización de contenido

Además de las plantillas, Facelets provee apoyo para su reutilización al permitir al usuario incluir contenido que reside en un archivo diferente. Incluyendo dicho contenido se puede realizar en 3 formas diferentes:
* Hacer referencia a un archivo
* Las etiquetas personalizadas
* Componentes compuestos

### Referencia a un archivo

La forma más sencilla para incluir el contenido de otro Facelet hace referencia por su nombre utilizando la etiqueta <ui:include>. Esto hace que el contenido en el archivo de referencia para ser incluido directamente en el facelet que llama por el compilador Facelets. Además de la reutilización de contenidos en múltiples lugares, esto puede ser utilizado para romper un gran Facelet en partes más pequeñas.
A continuación un ejemplo:
templates/master_template.xhtml
html_head.xhtml

### Etiquetas personalizadas

Facelets soporta indirection para la inclusión de contenidos a través de encargo Dicha etiqueta personalizada puede estar asociada con una Facelet en taglib archivo. Los casos de esa etiqueta serán luego reemplazadas por el contenido de la Facelet asociada.
A continuación se muestra un ejemplo de esto:
templates/master_template.xhtml
El código anterior utiliza la etiqueta <my:spacer> para marcar el punto en el Facelet donde el contenido se va a insertar. Tal etiqueta tiene que ser declarada en un archivo Taglib donde puede estar asociada con un Facelet de la siguiente manera:
example.taglib.xml
A continuación se muestra un ejemplo de lo que el contenido real de Facelet podría ser:
spacer.xhtml

### Componentes compuestos

Además de incluir el contenido directamente, Facelets proporciona el mecanismo de componente compuesto que hace al contenido disponible como un componente de primera clase JSF. Los componentes compuestos no necesitan ser declaradas en un archivo Taglib, sino que tienen que ser puestos en un directorio especial. Via convención sobre configuración al contenido se le asigna automáticamente un espacio de nombres y un nombre de etiqueta. El espacio de nombres se construye de la cuerda fija 'http://java.sun.com/jsf/composite/' concatenado con el nombre del directorio en el que reside el archivo de contenido con respecto al directorio de los "recursos". [17] El nombre de la etiqueta se convierte en el nombre del archivo sin la extensión. sufijo .xhtml
A continuación se muestra un ejemplo de esto:
resources/my/spacer.xhtml
El Facelet de arriba está disponible de forma automática como un componente de espacio de nombres 'http://java.sun.com/jsf/composite/my' y con nombre de tag 'spacer'.