Transparencias - Departamento de Ingeniería Telemática

Anuncio
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
Descargar