Facelets | ||
---|---|---|
Información general | ||
Tipo de programa | Web template system | |
Licencia | licencia Apache | |
Información técnica | ||
Programado en | Java | |
Versiones | ||
Última versión estable | 2.0 ( 28 de junio de 2009 (15 años, 5 meses y 21 días)) | |
Enlaces | ||
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".[1]
Facelets se basa en algunas de las ideas de Apache Tapestry,[2][3] 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[3] 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).[4][5]
En Facelets se pueden introducir plantillas de etiquetas desde una biblioteca de etiquetas de dos formas:
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:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0
Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html">
<body>
<h:form>
<h:outputText value="Welcome, #{loggedInUser.name}" disabled="#{empty loggedInUser}" />
<h:inputText value="#{bean.property}" />
<h:commandButton value="OK" action="#{bean.doSomething}" />
</h:form>
</body>
</html>
Uso del atributo JSFC
, el mismo código también se puede expresar como el ejemplo dado a continuación:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0
Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html">
<body>
<form jsfc="h:form">
<span jsfc="h:outputText" value="Welcome, #{loggedInUser.name}" disabled="#{empty loggedInUser}" />
<input type="text" jsfc="h:inputText" value="#{bean.property}" />
<input type="submit" jsfc="h:commandButton" value="OK" action="#{bean.doSomething}" />
</form>
</body>
</html>
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:
La forma más sencilla para incluir el contenido de otro Facelet hace referencia por su nombre utilizando la etiqueta <ui:include>
.[6][7] 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
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0
Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
>
<ui:include src="html_head.xhtml" />
<h:body>
Standard header text for every page.
<ui:insert name="body_content" />
Standard footer text for every page.
</h:body>
</html>
html_head.xhtml
<ui:composition
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
>
<h:head>
<meta http-equiv="content-type" content="text/html;charset=UTF-8"/>
<meta http-equiv="pragma" content="no-cache"/>
</h:head>
</ui:composition>
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
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0
Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:my="http://example.com/my"
>
<ui:include src="html_head.xhtml" />
<h:body>
Standard header text for every page.
<my:spacer>
<ui:insert name="body_content" />
Standard footer text for every page.
</h:body>
</html>
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
<?xml version="1.0" encoding="UTF-8"?>
<facelet-taglib
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"
version="2.0"
>
<namespace>http://example.com/my</namespace>
<tag>
<tag-name>spacer</tag-name>
</tag>
</facelet-taglib>
A continuación se muestra un ejemplo de lo que el contenido real de Facelet podría ser:
spacer.xhtml
<ui:composition
xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
>
<h:outputText value="&nbsp;" escape="false"/>
</ui:composition>
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.[8][9] 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
<ui:composition
xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:cc="http://java.sun.com/jsf/composite"
>
<cc:interface/>
<cc:implementation>
<h:outputText value="&nbsp;" escape="false"/>
</cc:implementation>
</ui:composition>
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'.