Cómo crear un componente JSF con Facelets
Ver también: Facelets se ajusta a JSF como un guante.
Los pasos son los siguientes:
1. Instalar y configurar Facelets
Descargar la distribución y copiar jsf-facelets.jar en WEB-INF/lib.
Añadir los siguientes parámetros al fichero web.xml:
<context-param>2. Definir el componente
<param-name>javax.faces.DEFAULT_SUFFIX</param-name>
<param-value>.xhtml</param-value>
</context-param>
<application>
<locale-config>
<default-locale>en</default-locale>
</locale-config>
<view-handler>com.sun.facelets.FaceletViewHandler</view-handler>
</application>
Se hace con <ui:composition>.
Por ejemplo, suponiendo que va a tener los parámetros label, fieldName, sort, backingBean y entity:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"Prestar especial atención al uso de dos parámetros de la siguiente forma:
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:z="http://www.qualcomm.com/jsf/core"
xmlns:c="http://java.sun.com/jstl/core"
xmlns:fn="http://java.sun.com/jsp/jstl/functions">
THIS TEXT WILL BE REMOVED
<ui:composition>
<!-- The label attribute is optional. Generate it if it is missing. -->
<c:if test="${empty label}">
<c:set var="label" value="${fieldName}" />
</c:if>
<!-- The sort attribute is optional. Set it to true if it is missing. -->
<c:if test="${empty sort}">
<c:set var="sort" value="${true}" />
</c:if>
<h:column>
<f:facet name="header">
<h:panelGroup>
${label}
<c:if test="${sort}">
[
<h:commandLink styleClass="smallLink"
action="#{backingBean.sort}">
<h:outputText value="asc" />
<f:param name="by"
value="${fieldName}"/>
<f:param name="order" value="asc"/>
</h:commandLink>
,
<!-- Sort descending -->
<h:commandLink styleClass="smallLink"
action="#{backingBean.sort}">
<h:outputText value="asc" />
<f:param name="by"
value="${fieldName}"/>
<f:param name="order" value="dec"/>
</h:commandLink>
]
</c:if>
</h:panelGroup>
</f:facet>
<!-- Display the field name -->
<h:outputText value="${entity[fieldName]}"/>
</h:column>
</ui:composition>
THIS TEXT WILL BE REMOVED AS WELL
</html>
<h:outputText value="${entity[fieldName]}"/>
Por ejemplo, el fichero arcmind.taglib.xml declara 3 etiquetas: field, column y columnCommand.
Basta indicar el espacio de nombres, el nombre de cada etiqueta y el fichero de su implementación, cuya ruta es relativa a WEB-INF\facelets\tags.
<?xml version="1.0"?>4. Declarar la librería de etiquetas a Facelets en web.xml
<!DOCTYPE facelet-taglib PUBLIC
"-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN"
"facelet-taglib_1_0.dtd">
<facelet-taglib>
<namespace>http://www.arc-mind.com/jsf</namespace>
<tag>
<tag-name>field</tag-name>
<source>field.xhtml</source>
</tag>
<tag>
<tag-name>column</tag-name>
<source>column.xhtml</source>
</tag>
<tag>
<tag-name>columnCommand</tag-name>
<source>columnCommand.xhtml</source>
</tag>
</facelet-taglib>
Basta indicarlo en el parámetro de contexto facelets.LIBRARIES:
<context-param>Se pueden indicar múltiples fichero separados por comas.
<param-name>facelets.LIBRARIES</param-name>
<param-value>
/WEB-INF/facelets/tags/arcmind.taglib.xml
</param-value>
</context-param>
5. Importarlo y usarlo en las páginas
Importar la librería de etiquetas usando el espacio de nombres definido en el paso 3.
Y con esto, listo para usar.
Ejemplo:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:a="http://www.arc-mind.com/jsf">
...
<a:column entity="${cd}" fieldName="title"
backingBean="${CDManagerBean}"/>
...
21/10/2007
Algunas notas importantes:
¿Y si queremos que el componente tenga contenido?
Basta con anotar <ui:insert />, al definir el componente, en el lugar exacto donde se quiere que este contenido aparezca.
¿Y si queremos pasarle como parámetro un método (un "action" por ejemplo)?
Esto no se puede hacer con Facelets, pero puede resolverse pasándole un bean e indicando el método a ejecutar.
Por ejemplo:
<a:columnCommand label="Edit" action="editCD" backingBean="${CDManagerBean}"/>Y después se haría de esta forma al definir el componente:
<h:commandLink id="#{action}" value="#{label}" action="#{backingBean[action]}"/>

0 comentarios
Publicar un comentario en la entrada