Académique Documents
Professionnel Documents
Culture Documents
Entrar
Deseo registrarme He olvidado mis datos de acceso Inicio Quines somos Tutoriales Tutoriales Formacin Comparador de salarios Nuestro libro Charlas Ms
C onsultor tecnolgico de desarrollo de proyectos informticos. Puedes encontrarme en Autentia: Ofrecemos servicios de soporte a desarrollo, factora y formacin Somos expertos en Java/J2EE
ltimas Noticias
13.419
Pirineos on Tour VII Autentia C ycling Day Autentia patrocina la charla sobre Java SE 7 en Madrid Alfresco Day 2011
0. ndice de contenidos.
1. Introduccin. 2. Entorno. 3. El sistema de plantillas de Facelets. 3.1. Definicin de la plantilla de la aplicacin. 3.2. Definicin de la plantilla de men. 3.3. Uso de la plantilla. 4. C omponentes por composicin. 4.1. C onfiguracin. 4.2. C reacin de un componente por composicin. 4.3. Uso de un componente por composicin. 4.4. Exponer las propiedades y comportamientos de los componentes de un componente por composicin. 5. Referencias. 6. C onclusiones.
ltimos Tutoriales
Android: Leer correos de Gmail Exportacin del contenido de un dataTable de JSF con el soporte de Primefaces Spring schedule annotations Primeros pasos con Google+ Spring Security, Single Sign-On bajo plataformas Windows con Active Directory y Kerberos V5
1. Introduccin.
Ahora que ya conocemos las principales novedades de JSF 2 de la mano de Alejandro, en este tutorial vamos a realizar una introduccin al uso de Facelets en JSF 2, el sistema de plantillas estndar de facto en la versin 1.2 de JSF y que ahora, en la versin 2, forma parte de la propia especificacin. C on JSF 1.2, la versin anterior, exista la posibilidad de utilizar otros sistemas de plantillas: Tiles de Apache (siempre ms ligado al uso de Struts), JsfTemplating (asociado a Woodstock) o JTPL de IBM el sistema de plantillas estndar del entorno de desarrollo de IBM; si bien, para los que apostamos por facelets, al ver las mltiples ventajas frente a estos otros sistemas, ahora nos encontramos con que se soporta por defecto, puesto que ya forma parte del estndar y ya tenemos parte del camino recorrido. Es ms: ahora Facelets es el sistema por defecto para crear vistas basadas en rboles de componentes JSF, en detrimento de JSP, ya no hay que configurar el soporte de Facelets, al contrario, hay que habilitar el modo de compatibilidad con JSP, si queremos seguir usndolo. ninguna de las nuevas caractersticas de JSF 2 (el soporte nativo para Ajax, la gestin de eventos del ciclo de vida desde la vista, por supuesto la nueva definicin de componentes por composicin,...) estn disponibles usando JSP. En resumen, quien no haya migrado sus vistas de JSP a Facelets, ahora se va a perder lo bueno de JSF 2. C entrndonos en Facelets, a "grosso modo", en JSF 2: hace uso del mismo sistema de plantillas que venamos usando hasta ahora en JSF 1.2, y mejora la creacin de componentes por composicin, reduciendo complejidad en su configuracin y aadiendo rigidez en su parametrizacin, puesto que ahora vamos a tener la posibilidad de definir qu atributos acepta el componente por composicin, adems de exponer el comportamiento de los componentes que incluye. Esto no significa que los componentes por composicin que ya tenemos creados, basndonos en JSF 1.2, los tengamos que re-escribir para JSF 2, porque son totalmente vlidos.
2. Entorno.
El tutorial est escrito usando el siguiente entorno:
Hardware: Porttil MacBook Pro 17' (2.93 GHz Intel C ore 2 Duo, 4GB DDR3 SDRAM). Sistema Operativo: Mac OS X Snow Leopard 10.6.1 JDK 1.6.0_17. Maven 2.2.1. Eclipse 3.5: Ganymede, con IAM (plugin para Maven). Apache Tomcat 6.0.20. JSF 2 (2.0.2)
3.1. Definicin de la plantilla de aplicacin. Siguiendo las recomendaciones de facelets, las plantillas las incluiremos dentro del directorio WEB-INF/facelets/templates/, de modo que no sean visibles desde el contenedor web. Un ejemplo de plantilla, defaultLayout.xhtml, podra ser el siguiente: 01 <?xml version="1.0" encoding="UTF-8"?> 02 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1transitional.dtd"> 03 04 <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" 05 xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html"> 06 07 <h:head> 08 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 09 <h:outputStylesheet library="css" name="style.css" /> 10 <title><ui:insert name="title" /></title> 11 </h:head> 12 <h:body> 13 <div id="layout"> 14 <div id="header">
sanchezsuarezj
15 <div id="logo"></div> 16 <ui:include src="menu.xhtml"/> 17 </div> 18 19 <div id="content"> 20 <ui:insert name="content"> 21 <span>Pgina en construccin</span> 22 </ui:insert> 23 </div> 24 25 <div id="footer"> 26 <p><a href="#"></a></p> 27 </div> 28 </div> 29 </h:body> 30 </html> Definimos una maquetacin por capas y el contenido de nuestro site en tres secciones: header, content y footer Prevemos la inclusin de la definicin externa de dos contenidos nombrados: title (lnea 10) y content (lnea 20), de modo que la pgina que haga uso de la plantilla debe definir tales contenidos. Si no los define podemos prever un valor por defecto, en el caso de content "Pgina en construccin". Por ltimo, hemos hecho una inclusin en la lnea 16 del contenido de una mini-plantilla, que contendr el men de la aplicacin.
[Reader] Exportacin del contenido de un dataTable de JSF con el soporte de Primefaces http://bit.ly/pH92kE #java #javagt
7 hours ago reply retw eet fav orite
@adictosaltrabaj > http://t.co/FlrYIgT: cmo configurar una tarea con el soporte de spring y quartz con anotaciones.
2 day s ago reply retw eet fav orite
Profe, no va el envo de imgenes en los emails!, incluyo el cdigo pero aparece en verde y no se ejecuta. Anda, prueba a descomentarlo!! ;)
21 day s ago reply retw eet fav orite
3.3. Uso de la plantilla. Por ltimo, las pginas que hagan uso de la plantilla tendrn un contenido similar al siguiente: 01 <?xml version="1.0" encoding="UTF-8"?> 02 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1transitional.dtd"> 03 04 <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" 05 xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html"> 06 07 <ui:composition template="/WEB-INF/facelets/templates/defaultLayout.xhtml"> 08 <ui:define name="title"> 09 <h:outputText value="#{msg.edit_of} #{msg.menu_items}" /> 10 </ui:define> 11 <ui:define name="content"> 12 <h:form> 13 <!-- contenido de la pgina--> 14 </h:form> 15 </ui:define> 16 17 </ui:composition> 18 </html> De este modo, en el nico punto en el que se define la estructura del site es en la plantilla y el cdigo de las pginas queda centrado en el contenido individual de cada una de ellas y no nos repetimos - Please DRY: Don't Repeat Yourself -.
lado de los ManagedBeans a travs de Expression Language y la posibilidad de asignar a dicha vinculacin un conversor (outputText, outputLabel, outputFormat,...) composite:editableValueHolder: permite exponer las propiedades y eventos de los componentes que implementan la interfaz EditableValueHolder para que sean asignados desde el cliente que hace uso del componente por composicin. EditableValueHolder es una extensin de ValueHolder que permite asociar al componente que la implementa validadores y eventos de cambio de valor (inputText, inputSecret, selectOneMenu, selectManyMenu, selectBooleanC heckBox,...). composite:actionSource: permite exponer las propiedades y eventos de los componentes que implementan la interfaz ActionSource para que sean asignados desde el cliente que hace uso del componente por composicin. Los componentes que implementan ActionSource son aquellos que soportan eventos de accin y listeners de eventos de accin (commandButton y commandLink).
4.1. Configuracin.
JSF 2 deja abierta la posibilidad de configurar nuestros componentes por composicin a travs de la declaracin de los mismos en una taglib e incluyndola en el descriptor de despliegue web.xml. Si bien, adems, haciendo uso del concepto de convencin sobre configuracin, nos hace transparente dicha configuracin de modo que nos propone un prefijo de URI predefinida para hacer referencia a los mismos y el sufijo vendr dado por el directorio en el que se encuentren los xhtml que implementan los componentes por composicin. Es tan sencillo, como crear nuestros componentes bajo una estructura de directorios components/autentia dentro de la carpeta de recursos (resources) para que, cuando se empaquete se incluya dentro del directorio WEB-INF o META-INF. De este modo todos los xhtml que contengan la declaracin de componente sern incluidos en una librera de componentes cuya URI tendr una parte fija (http://java.sun.com/jsf/composite/) y un sufijo que se corresponder con la estructura de directorios en el que est incluido (components/autentia). El nombre del componente ser el nombre del fichero xhtml. As, podemos mantener la siguiente estructura de directorios:
e incluir el espacio de nombres de los mismos en nuestros xhtml de la siguiente forma: 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 2 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 3 <html xmlns="http://www.w3.org/1999/xhtml" 4 xmlns:tnt="http://java.sun.com/jsf/composite/components/autentia"> 5 ...
Para definir un componente por composicin en JSF 2, ahora se requiere la definicin de la interfaz y la implementacin. Qu mejor que mostrar un componente complejo para entenderlo, se trata de un componente de entrada de datos que encapsula la etiqueta, el propio componente de entrada y el componente de mensajes asociado al anterior. 01 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 02 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 03 <html xmlns="http://www.w3.org/1999/xhtml" 04 xmlns:h="http://java.sun.com/jsf/html" 05 xmlns:f="http://java.sun.com/jsf/core" 06 xmlns:ui="http://java.sun.com/jsf/facelets" 07 xmlns:composite="http://java.sun.com/jsf/composite"> 08 <h:head> 09 10 <title>This will not be present in rendered output</title> 11 12 </h:head> 13 14 <h:body> 15 16 <composite:interface displayName="Input text field with label, input and message components" > 17 <composite:attribute name="entity" required="true" /> 18 <composite:attribute name="field" required="true" /> 19 <composite:attribute name="label" required="false" default="#{cc.attrs.entity.class.simpleName}.# {cc.attrs.field}" /> 20 <composite:attribute name="required" required="false" default="false" /> 21 </composite:interface> 22 23 <composite:implementation> 24 25 <h:panelGroup id="containerOflabel"> 26 <h:outputLabel id="label" 27 for="#{cc.attrs.field}" value="#{msg[cc.attrs.label]}" /> 28 <ui:fragment rendered="#{cc.attrs.required}"> 29 <h:outputText value="(*)" styleClass="red"/> 30 </ui:fragment> 31 <h:outputText value=":" /> 32 </h:panelGroup> 33 34 <h:inputText id="input" required="#{cc.attrs.required}" 35 value="#{cc.attrs.entity[cc.attrs.field]}" > 36 <f:ajax render="message" /> 37 </h:inputText> 38 39 <h:message id="message" for="input" errorClass="errorMessages" /> 40 41 </composite:implementation> 42 43 </h:body> 44 45 </html> Ahora tenemos: por un lado la definicin de la interfaz en la que se pueden definir los parmetros que recibir o puede recibir el componente incluidos en la etiqueta composite:interface, esto es bastante til porque eliminamos la necesidad de
incluir tediosos bloques de <c:if comprobando el contenido de los parmetros. por otro lado, la propia implementacin dentro de la etiqueta composite:implementation, que har uso de los parmetros definidos en la intefaz: dentro de JSF 2 cc es una palabra reservada para hacer referencia al componente por composicin y que permite acceder al valor de los atributos definidos en la interfaz. Todo lo que no est incluido dentro de estas dos etiquetas no ser renderizado.
4.4. Exponer las propiedades y comportamientos de los componentes de un componente por composicin.
Adicionalmente podemos incluir dentro de la declaracin de la interfaz una serie de etiquetas que exponen los componentes que implementan ciertas interfaces hacia el exterior, de modo que el cliente que usa el componente puede redefinir sus propiedades y comportamientos frente a eventos. En el siguiente ejemplo exponemos el componente de entrada de texto de nuestro componente por composicin: 1 <composite:interface displayName="Input text field with label, input and message components" > 2 ... 3 <composite:editableValueHolder name="input" /> 4 ... 5 </composite:interface> De este modo, quien hace uso del componente puede asignar comportamientos tpicos de la interfaz de implementa (conversores, validadores, eventos de accin y de cambio de valor): 1 <tnt:inputText id="description" entity="#{beanTestView.item}" field="description">
2 <f:validateLength for="input" minimum="1" maximum="20" /> 3 </tnt:inputText> Para hacer esto en JSF 1.2 usbamos la etiqueta ui:insert y ahora podramos hacer uso de la etiqueta composite:insertC hildren, si bien slo podramos asignar el contenido de la etiqueta a un componente dentro del componente por composicin, ahora es ms parametrizable y permite crear componentes por composicin ms complejos. Adems, si pensamos en cmo parametrizamos en JSF 1.2 el mtodo del controlador que recibir un evento de cambio de valor y lo trasladamos a JSF 2, rpidamente veremos los beneficios. En general, se acabaron las etiquetas condicionales porque, al exponer los componentes haca fuera es el cliente que los usa quien define su comportamiento.
5. Referencias.
http://java.sun.com/javaee/javaserverfaces/2.0/docs/pdldocs/facelets/index.html http://www.ibm.com/developerworks/java/library/j-jsf2fu2/index.html http://blogs.sun.com/enterprisetechtips/entry/true_abstraction_composite_ui_components1
6. Conclusiones.
C ada vez nos gusta ms lo que vamos encontrando... ;-) Se produce adems la paradoja de que la mayora de las libreras de componentes visuales de terceros con las que trabajamos, que son adems en las que se ha inspirado la especificacin (el Ajax de JSF 2, esr inspirado en el de RichFaces: Ajax4JSF), por la complejidad de sus componentes, an no soportan JSF 2, lo cual nos est dando pie a evaluar otras liberas ms recientes que s lo soportan: vase Primefaces. Desde Autentia, continuaremos compartiendo el conocimiento que vamos adquiriendo y, si estis interesados en el contenido de nuestros tutoriales y tenis una necesidad formativa al respecto, no dudeis en poneros en contacto con nosotros. En Autentia nos dedicamos, adems de a la consultora, desarrollo y soporte a desarrollo, a impartir cursos de formacin de las tecnologas con las que trabajamos. Un saludo. Jose jmsanchez@autentia.com
Enviar comentario
(Slo para usuarios registrados)
COMENTARIOS
jmsanchez Buenas, Muchas gracias por los comentarios. La mayora de los mismos me llegan tambin a travs de c orreo electrnico y su respuesta c on es lo suficientemente trivial como par aadirla aqu, dan contenido para otros tutoriales que ir public ando. Stay tuned! Un saludo. Jose. eric1986
2011-06-27 - 17:42:36 2011-07-04 - 08:37:43
Muy bueno el tutorial, pero tengo un problema: en esta linea del punto 3.2 no se me permite realizar esta sentenc ia ya que no enc uentra en el contexto esa direcc ion, he probado con ac tion y c on ac tionlistener para usar el bean y al hacer clic k no me lleva a ninguna pagina, no hace nada. Quisiera saber com hac erlo,
Gracias eric1986
2011-06-27 - 17:39:08
Muy bueno el tutorial, pero tengo un problema: en esta linea del punto 3.2 no se me permite realizar esta sentenc ia ya que no enc uentra en el contexto esa direcc ion, he probado con ac tion y c on ac tionlistener para usar el bean y al hacer clic k no me lleva a ninguna pagina, no hace nada. Quisiera saber com hac erlo, Gracias eric1986
2011-06-27 - 17:23:41
Muy bueno el tutorial, pero tengo un problema: en esta linea del punto 3.2 no se me permite realizar esta sentenc ia ya que no enc uentra en el contexto esa direcc ion, he probado con ac tion y c on ac tionlistener para usar el bean y al hacer clic k no me lleva a ninguna pagina, no hace nada. Quisiera saber com hac erlo, Gracias chris456
2011-05-23 - 16:25:44
Super tu tutorial Jose pero tengo una duda. Si el menu lo cargo c on valores de la base de datos c ada vez q llame a una pagina que usa el template seguramente volvera a c argar el menu nuevamente, que no es muy logico. Como podria llamar a una pagina y que solo se actualize y se cargue en el tag ???. o de que manera podria plantear el problema ? jmsanchez Muchas gracias por los comentarios. william, tenemos experiencia con ICEfaces en la versin community, pero no en la Enterprise. An as envianos un c orreo con el problema y, si podemos, te echaremos una mano.
2011-03-16 - 22:56:42
Un saludo. Jose. ChristianPeru2731 Muchas gracias por el aporte, muy buen tutorial !!!! icreativa
2010-12-10 - 17:35:05 2011-03-16 - 22:48:10
hola jose muy buena informacin, una consulta pues he adquirido el icefac esEE, pero no logro implementar la suite del ic epack/composite-components no se hay algun documento q me pueda ayudar.. atte william gracias jcarmonaloeches Mola mola...
2010-07-12 - 18:11:04 2010-11-22 - 00:59:35
carlosgp
Muy bueno Jos.. slo te falt poner el c digo fuente para testear con el ejemplo.. pero muy bueno.
Esta obra est licenciada bajo licencia C reative C ommons de Reconocimiento-No comercial-Sin obras derivadas 2.5
Copyright 2003-2011 All Rights Reserved | Texto legal y condiciones de uso | Banners | Powered by Autentia | Contacto