JSP (II) Mario Muñoz Organero & Norberto Fernández* Departamento de Ingeniería Telemática http://www.it.uc3m.es/mario http://www.it.uc3m.es/berto (*) Agradecimientos a Florina Almenárez en cuyo material se basa parcialmente esta presentación Lógica en páginas JSP (I) Mezclar lógica y presentación es una mala práctica Dificulta la mantenibilidad Dificulta las pruebas Los diseñadores gráficos de la interfaz no tienen por qué saber Java Conviene limitar en la medida de lo posible el uso de elementos de scripting en JSP Ya avanzamos en esa dirección al ver JavaBeans… … sin embargo estos tienen limitaciones P.ej.: Por defecto no tienen acceso a los objetos implícitos (request, response, out, …) Mario Muñoz Organero & Norberto Fernández Servidores de información 2 Lógica en páginas JSP (II) JEE proporciona otros mecanismos para incluir lógica sin incluir directamente Java en el JSP EL (Expression Language) JSTL (JSP Standard Tag Lib) Acciones de uso común definidas en librerías Custom Tags Acciones definidas por el usuario Mario Muñoz Organero & Norberto Fernández Servidores de información 3 Servidores de información 4 EL & JSTL Mario Muñoz Organero & Norberto Fernández Expression Language (EL) Ayudar a producir scriptlets en páginas JSP Sintaxis: ${expression} El primer elemento de expresión es un objeto implícito EL o un atributo almacenado en cualquier ámbito (página, solicitud, sesión o aplicación) Pueden ser usadas: Como valores de atributos en acciones <jsp:include page=“${location}”> Dentro del texto de una plantilla, como HTML <h1>Welcome ${variable}</h1> Mario Muñoz Organero & Norberto Fernández Servidores de información 5 Expression Language (EL) Objetos implícitos EL ¡No coinciden con los de JSP! Son entre otros: pageScope, requestScope, sessionScope, applicationScope representan Maps de los atributos en esos ámbitos param Map de los parámetros de la solicitud cookie Map de cookies header Map de las cabeceras de la solicitud HTTP initParam Map con los parámetros de inicialización del contexto de aplicación Ej.: Si en un formulario HTML hay un input de nombre name en la página JSP que procesa el formulario utilizaremos ${param.name} Ej.: Para acceder al campo name de un atributo llamado person almacenado en sesión ${sessionScope.person.name} (person es un Bean con getName o un Map con una clave name) Mario Muñoz Organero & Norberto Fernández Servidores de información 6 JSP Standard Tag Library (JSTL) JSTL especifica un conjunto de librerías de etiquetas Encapsula funcionalidad JSP común a muchas aplicaciones Sintaxis como las acciones estándar (tags específicos) Área URI Acciones core Prefijo http://java.sun.com/jsp/jstl/core Acciones de http://java.sun.com/jsp/jstl/xml procesamiento XML Acciones de formato c x http://java.sun.com/jsp/jstl/fmt fmt Acciones de acceso http://java.sun.com/jsp/jstl/sql a base de datos relacionales sql Acciones funciones fn de http://java.sun.com/jsp/jstl/functions Mario Muñoz Organero & Norberto Fernández Servidores de información 7 Etiquetas core JSTL (I) Etiqueta set Crea una variable EL Actualiza el valor de una variable ya existente o el valor de una propiedad de un JavaBean <c:set var=“varName“ value=“value“ [scope=“{page|request|session|application}“] [target="variable.bean"][property="bean.property"] /> Mario Muñoz Organero & Norberto Fernández Servidores de información 8 Etiquetas core JSTL (II) Etiqueta remove Borra una variable EL <c:remove var=“varName” [scope=“{page|request|session|application}”] /> Mario Muñoz Organero & Norberto Fernández Servidores de información 9 Etiquetas core JSTL (IV) Etiqueta if <c:if test=“expression” var=“varName” [scope=“{page|request|session|application}”] body if expression is true </c:if> Algunos ejemplos de expresiones EL de comparación: ${num > 3}, ${num == 5}, ${num gt 3}, ${num eq 5} (eq,ne,lt,gt,le,ge) ${empty var} (true si var null o empty) Mario Muñoz Organero & Norberto Fernández Servidores de información 10 Etiquetas core JSTL (V) Etiqueta forEach Mecanismo de iteración sobre el cuerpo de la etiqueta <c:forEach items=“collection” [var=“varName”] > body content </c:forEach> Mario Muñoz Organero & Norberto Fernández Servidores de información 11 Etiquetas core JSTL (VI) Etiqueta out Evalúa una expresión y escribe el resultado al actual JSPWriter <c:out value=“value” [default=“defaultValue”] [escapeXml=“{true|false}”] /> Mario Muñoz Organero & Norberto Fernández Servidores de información 12 Ejemplo JSTL core y EL <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <c:if test=“${not empty errorMsgs}”> <p>Please correct the following errors: <ul> <c:forEach var=“message” items=“${errorMsgs}”> <li>${message}</li> </c:forEach> </ul> </p> </c:if> Mario Muñoz Organero & Norberto Fernández Servidores de información 13 Otras librerías de JSTL: XML Procesamiento de documentos XML y acceso (vía XPath) a sus componentes Mario Muñoz Organero & Norberto Fernández Servidores de información 14 Otras librerías de JSTL: Formato Dar formato a cierta información (fechas, números) de acuerdo a cierto Locale (localización). Mensajes en distintos idiomas (internacionalización) Ejs.: (asumimos now predefinido) <fmt:setLocale value=“en_US”/> <fmt:formatDate value=“${now}”/> // Nov 2, 2008 <fmt:setLocale value=“es_Es”/> <fmt:formatDate value=“${now}”/> // 02-nov-2008 Mario Muñoz Organero & Norberto Fernández Servidores de información 15 Otras librerías de JSTL: SQL Acceso a base de datos Fuente: http://www.oracle.com/technology/sample_code/tech/java/codesnippet/jsps/jstlsql.html Mario Muñoz Organero & Norberto Fernández Servidores de información 16 Otras librerías de JSTL: Funciones Proporciona funciones básicas de uso común Implementadas como funciones EL (no como etiquetas) Ejs.: <c:if test="${fn:startsWith(product.id, "100-")}"> <c:if test="${fn:contains(param.name,”XX”)}"> <h3>Hola ${fn:trim(name)}</h3> Mario Muñoz Organero & Norberto Fernández Servidores de información 17 Custom Tags (Etiquetas personalizadas) Mario Muñoz Organero & Norberto Fernández Servidores de información 18 Custom Tags Permiten definir acciones personalizadas Sintaxis muy simple, como código HTML Tienen acceso a todos los objetos implícitos de las páginas JSP Facilitan la reutilización de código porque pueden ser usadas en cualquier aplicación web Custom TagLibs: librerías de etiquetas personalizadas Se pueden anidar, consiguiendo interacciones complejas Las acciones pueden ser configuradas a través de atributos Mario Muñoz Organero & Norberto Fernández Servidores de información 19 Custom Tag Ejemplo de aplicación: Definir tags específicos para incluir elementos concretos de la página (en lugar de método genérico usando jsp:include) Ej.: <x:logoHeader/> Desde JSP 2.0 mecanismos más usados para la definición de tags de usuario Fichero de Tag Extender SimpleTagSupport Mario Muñoz Organero & Norberto Fernández Servidores de información 20 Definiendo tags: Fichero de Tag (I) Comportamiento similar a un jsp:include Renombrar fichero JSP a .tag Ej.: hola.jsp hola.tag Ubicar el fichero de tag en directorio $WEB_APP/WEBINF/tags o descendientes Declarar con directiva @taglib en página JSP que usa el tag (atributo tagdir para indicar la ruta al fichero de tag) Partimos de un fichero JSP que tiene lo que queremos incluir Ej.: Fichero de tag: $WEB_APP/WEB-INF/tags/hola.tag incluir en JSP que usa tag: <%@ taglib prefix=”myTags” tagdir=”/WEB-INF/tags” %> Nombre del tag: nombre del fichero sin la extensión .tag Ej.: <myTags:hola/> Mario Muñoz Organero & Norberto Fernández Servidores de información 21 Definiendo tags: Fichero de Tag (II) Desde fichero de tag se tiene acceso a objetos implícitos de JSP (request, response, out, …) Directiva @attribute para declarar en el fichero .tag los atributos que puede tomar la nueva etiqueta Required es o no obligatorio (defecto false) Rtexprvalue si false el valor del atributo es texto, si true, puede ser expresión ${…} o <%= … %> (defecto true) Ej.: Contenido de hola.tag <%@ attribute name=”nombre” required=”true” rtexprvalue=”true” %> <em><strong>Hola ${nombre}</strong></em> <br> Usar en el fichero JSP: <myTags:hola nombre=”Pepe” /> Mario Muñoz Organero & Norberto Fernández Servidores de información 22 Definiendo tags: Fichero de Tag (III) Los tags también pueden tener contenido En el fichero .tag … Usar directiva @tag para indicar que hay contenido en el tag (por defecto sin contenido) Sólo texto: Texto, EL y acciones (NO scripting <% %>, <%= %>,<%! %>): <%@ tag body-content=”tagdependent” %> <%@ tag body-content=”scriptless” %> Usar <jsp:doBody/> para acceder al contenido <em><strong>Hola <jsp:doBody/></strong></em> <br> En el fichero JSP que usa el tag… Incluir el texto del contenido dentro de la etiqueta <myTags:hola>este es un contenido</myTags:hola> Mario Muñoz Organero & Norberto Fernández Servidores de información 23 Fichero de tag: Ejemplo (I) $TOMCAT/webapps/TagTest/WEB-INF/tags/Title.tag Mario Muñoz Organero & Norberto Fernández Servidores de información 24 Fichero de tag: Ejemplo (II) $TOMCAT/webapps/TagTest/index.jsp Mario Muñoz Organero & Norberto Fernández Servidores de información 25 Definiendo tags:Extendiendo SimpleTagSupport (I) El código asociado al tag se implementa directamente en Java Se implementa una clase que extiende… Javax.servlet.jsp.tagext.SimpleTagSupport … y se sobreescribe el método void doTag() Se utiliza un TLD (Tag Library Descriptor) para configurar los tags (en lugar de directivas) Fichero XML en el que se declara qué tags hay, qué atributos tienen, si tienen o no contenido, etc. Ubicar en directorio: WEB-INF, en uno de sus subdirectorios (usualmente WEB-INF/tlds), o en el directorio META-INF de un .jar ubicado en WEB-INF/lib Mario Muñoz Organero & Norberto Fernández Servidores de información 26 Definiendo tags:Extendiendo SimpleTagSupport (II) Misma forma de uso que tags declarados en ficheros: <prefix:name atrib*/> <prefix:name atrib*>Cont</prefix:name> Implementar setters en la clase para acceso a atributos Utilizar directiva taglib con atributo URI para referenciar a la librería desde la página JSP <%@ taglib prefix="misTags" uri="/WEB-INF/tlds/MisTags" %> Mario Muñoz Organero & Norberto Fernández Servidores de información 27 Ver el TLD Ver el TLD Mario Muñoz Organero & Norberto Fernández Servidores de información 28 Extendiendo SimpleTagSupport: Ejemplo (II) $TOMCAT/webapps/TagTest/index.jsp Mario Muñoz Organero & Norberto Fernández Ver el TLD Servidores de información 29 Extendiendo SimpleTagSupport: Ejemplo (III) $TOMCAT/webapps/TagTest/WEB-INF/tlds/MisTags.tld Mario Muñoz Organero & Norberto Fernández Servidores de información 30