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.

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 (14 años, 10 meses y 10 días))
Enlaces

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]

Conversión de elementos editar

En Facelets se pueden introducir plantillas de etiquetas desde una biblioteca de etiquetas de dos formas:

  1. Directamente como un elemento xml calificado
  2. 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:

<!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>

Reutilización de contenido editar

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 editar

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>

Etiquetas personalizadas editar

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="&amp;nbsp;" escape="false"/>
</ui:composition>

Componentes compuestos editar

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="&amp;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'.

Véase también editar

Referencias editar

  1. Hans Bergsten (6 de junio de 2004). «Improving JSF by Dumping JSP» (en inglés). O'Reilly Media. 
  2. https://web.archive.org/web/20070706220453/https://facelets.dev.java.net/
  3. a b https://web.archive.org/web/20130113100928/http://www.jsfcentral.com/articles/facelets_1.html
  4. JavaServer Faces 2.0, The Complete Reference by Ed Burns and Chris Schal, page 55: 'The expert group decided to move forward with Facelets as the basis for new features while letting JSP remain as a backward compatibility layer'.
  5. JSF 2.0 (JSR 314, http://jcp.org/en/jsr/detail?id=314) specification, maintenance release 2, section 10.1: 'Facelets is a replacement for JSP that was designed from the outset with JSF in mind. New features introduced in version 2 and later are only exposed to page authors using Facelets. JSP is retained for backwards compatibility.'
  6. http://download.oracle.com/javaee/6/javaserverfaces/2.0/docs/pdldocs/facelets/ui/include.html
  7. http://pilhuhn.blogspot.com/2009/12/facelets-uiinclude-considered-powerful.html
  8. http://download.oracle.com/javaee/6/javaserverfaces/2.0/docs/pdldocs/facelets/composite/tld-summary.html
  9. http://andyschwartz.wordpress.com/2009/07/31/whats-new-in-jsf-2/#composite-components

Bibliografía editar

Enlaces externos editar