05 jsp tags
TRANSCRIPT
mayo de 2005
Páginas dinámicas con tags JSP
¿Qué son?
JSP incorpora tags <jsp:xxx …> Generalmente manejo de propiedades de beans,
incluir otros JSPs … Funcionalidad limitada
Extensiones: Definición de nuevos Tags <mi-tag:mi-funcion> Llamada a función Java a través de sintáxis XML Hacen uso de Java Tag Extension API
¿Para qué sirven? JSPs resolvían problema de servlets
Más elegancia al escribir HTML Ventajas de JSPs
Más fáciles de mantener por no programadores HTML estático Limitación presentación. Necesaria cierta lógica en
presentación. Solución JSP: Scriptlets (<% %>)
Rápidos Menos familiar para diseñador Páginas pierden estilo y claridad
Extensiones Más costosas de programar en un principio Más sencillas de utilizar Mejor mantenimiento Separación más clara Lógica – Presentación Utilización más sencilla por diseñador (son tags XML) Mejor integración con
HTML
¿Qué aporta Struts?
Struts ha escrito sus propias extensiones para tareas comunes
Manejo de beans Internacionalización Lógica (iteracción, chequeo de propiedades, etc.) Simplificación controles HTML <html:xxx>
Alternativas Especificación JSTL (Java Standard Tag Library)
Definición oficial Sun Estándar oficial. Requiere JSP 2.0 (p.e. Tomcat 5). Primera implementación Jakarta Apache Taglibs Puede
usarse con Struts Funcionalidad complementaria o alternativa a tags Struts
¿Cómo se escribe una Tag Extension?
Definición formato de tag Fichero tld con sintaxis XML.
Debe verificar DTD de acuerdo a versión JSP utilizada<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
Codificación lógica de tag:public class BaseTag extends TagSupport {// ...public int doStartTag() throws JspException {
HttpServletRequest request = (HttpServletRequest)pageContext.getRequest();StringBuffer buf = new StringBuffer("<base href=\"");buf.append(request.getScheme());buf.append("://");buf.append(request.getServerName());buf.append(request.getRequestURI());buf.append("\"");if (target != null) {
buf.append(" target=\"");buf.append(target);buf.append("\"");
}buf.append(">");JspWriter out = pageContext.getOut();try {
out.write(buf.toString());}catch (IOException e) {
pageContext.setAttribute(Action.EXCEPTION_KEY, e,PageContext.REQUEST_SCOPE);throw new JspException(messages.getMessage("common.io", e.toString()));
}return EVAL_BODY_INCLUDE;
}}
¿Cómo se utilizan Tag Extensions?
Instalar ficheros TLD y JAR\WEB-INF\lib\struts.jar
\WEB-INF\struts-bean.tld
\WEB-INF\struts-html.tld
\WEB-INF\struts-logic.tld
Configurar web.xml<web-app>
<!-- ... Otros elementos ... -->
<taglib>
<taglib-uri>/tags/struts-bean</taglib-uri>
<taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
</taglib>
</web-app>
¿Cómo se utilizan Tag Extensions? (II)
Referenciar definiciones taglib en JSP<%@ taglib uri="/tags/struts-bean" prefix="bean" %>
<%@ taglib uri="/tags/struts-html" prefix="html" %>
Atributo URI especificado en web.xml
Utiliza los tags dentro del JSP<bean:write name="userForm" property="firstName"/>
Tipos taglibs de Struts
Librerías incluidas Bean
Acceso a propiedades de JavaBeans Html
Relaciona campos formularios HTML con framework Struts Logic
Generación condicional de salida (HTML) en base a recorrido de colecciones, control de flujo, etc
Nested Proporcionan capacidades de anidamiento a otras tags
Tiles Permiten crear páginas en base a piezas (tiles). (Vistas
más adelante)
Características comunes
Ámbito automático Los objetos se almacenan en uno de estos ámbitos (menor a
mayor persistencia): page, request, session o application Todos los tags buscan el objeto referido en todos los ámbitos:
Se quedan con primera estancia Puede fijarse el ámbito de búsqueda: argumento scope
Nombres de propiedades comunes Propiedades típicas de cada tag:
Id: nombre de variable creada por un tag Name: nombre simbólico del bean (nombre del atributo) Property: propiedad del bean Scope: ámbito donde buscar el bean
Características comunes (II)
Sintaxis extendida Referencia anidada
property=“a.b.c” getA().getB().getC() / getA().getB()setC(valor)
Referencia indexada (desde 1.1)property=“a[2]” getA(2) / setA(2, valor)
Scriptlets dentro de tags Uso como último recurso, pero posible
<html:link href=‘<%= "/" + name + "/index.jsp" %>’>
Gestión de errores común Atributo “org.apache.struts.action.EXCEPTION” del
request Nombre de JSP de tratamiento
Taglib <bean>
Lista de tagsNombre Tag Descripción
cookie Define variable scripting basado en el valor de una cookie
define Define variable scripting basado en el valor de una propiedad de bean
header Define variable scripting basado en el valor de una cabecera del request
include Carga el objeto response y lo hace disponible como bean
message Muestra mensaje internacionalizado desde etiqueta
page Hace disponible un objeto del contexto page como bean
parameter Hace disponible un parámetro del contexto request como variable
resource Carga recurso web y lo hace disponible como bean
size Define un bean que contiene el número de elementos de una colección
struts Expone la configuración de struts como un objeto
write Imprime valor de una propiedad de un bean
Taglib <bean> (II)
Tags más importantes: Tag <bean:write>
Acceso de lectura a propiedades de beans<bean:write name="shoppingCart" property="itemSum"/>
Tag <bean:message> Imprime mensaje internacionalizado Se fija en el locale solicitado por el cliente en el request Extrae literal de fichero properties especificado en struts-
config.xml.(Puede haber varios bundle)<bean:message key=“inquiry” /> es_ES ¿Cómo está usted? de_DE Wie geht es Ihnen?
Taglib <html> (I)
Diseñados para rellenar formularios con datos dinámicos
<input type="text" name="firstName“ value="<%=formBean.getFirstName()%>"/> equivale
<html:text property="firstName"/>
El bean no necesita ser referenciado. Por defecto el mismo para toda el formulario
Hay tantos tags como controles HTML. P.e.:<html:file> <input type=“file”/><html:img> <img><html:radio> <input type=“radio”>
Taglib <html> (II)
Todos los tags tienen los mismos atributos
name: Nombre del ActionForm o JavaBean on*: Tags de eventos Javascript accesskey: Tecla de acceso rápido de
acceso a este elemento tabindex: Orden para focus con tabulador style: Estilo CSS StyleClass: Hoja de estilos CSS
Taglib <logic> (I) Tres tipos:
Evaluación: Valor ==, >, <, o presente Control de flujo: Redirección/Forward del request Repetición: Iteración sobre colección
Tags de evaluación Generalmente para diferentes vistas dentro de una misma
página<logic:notPresent name="logonForm">
<html:link forward="logon">Sign in here</html:link></logic:notPresent><logic:present name="logonForm">
<html:link forward="logoff">Sign out</html:link></logic:present>
Pueden comparar valor con cookie, cabecera HTTP, paramero del request, bean o propiedad de un bean
Taglib <logic> (II)
Tags de control de flujo Uso típico redirección index.jsp a un action
<%@ taglib uri="/tags/struts-logic" prefix="logic" %>
<logic:forward name="welcome"/>
Tags de repetición<UL>
<logic:iterate id="item" name="list">
<LI><bean:write name="item"/></LI>
</logic:iterate>
</UL>
Usos habituales
Ejemplo. Login:<%@ taglib uri="/tags/struts-html" prefix="html" %><html:html><HEAD><TITLE>Sign in, Please!</title></head><BODY><html:errors/><html:form action="/logonSubmit"name="logonForm" type="app.LogonForm" scope="request"><TABLE border="0" width="100%"><TR><TH>Username: </TH><TD><html:text property="username"/></TD></TR><TR><TH>Password: </TH><TD><html:password property="password"/></TD></TR><TR><TD><html:submit/></TD><TD><html:reset/></TD></TR></TABLE></html:form></BODY></html:html>
Usos habituales (II)
Declaración de un formulario <html:form></html:form>
<html:form action="/logonSubmit"
name="logonForm" type="app.LogonForm" scope="request">
Todo elemento dentro del formulario referenciará por defecto al Bean (o ActionForm) logonForm que es una instancia de LogonForm en el contexto del objeto request
<html:errors/> Imprime errores anteriores al rellenar formulario
Usos habituales (III)
Rellenar control HTML<html:text property="username"/>
Equivale a (ejemplo anterior):<input type="text“ name=“username” value="<%= logonForm.getUsername() %>""> logonForm es un bean obtenido del request
Selección de radio button<html:radio property="expectedVia" value="UPS"/>UPS<html:radio property="expectedVia"
value="FEDX"/>Federal Express<html:radio property="expectedVia"
value="AIRB"/>Airborne Habilita como checked la opción cuyo valor coincida con el valor
de la propiedad
Usos habituales (IV) Utilizar una colección para control options
Colección propiedad de un ActionForm<TR><TD>Item Image Source:</TD><TD><html:select property="hasImage"><html:options property="imageOptions" /></html:select></TD></TR>
Colección propiedad de un Bean aparte (de request, session o application)<TR><TD>Item Image Source:</TD><TD><html:select property="hasImage"><html:options collection="imageOptions" /></html:select></TD></TR>
Usos avanzados (I)
Iterar sólo sobre una parte de una colección
P.e. avanzar de 5 en 5 elementos empezando del 5º:<logic:iterate id="element" name="list" offset="5"
length="5">
Hacer disponible variable de iteración<OL><logic:iterate id="element" name="list" indexId="index"><LI><EM><bean:write name="element"/></EM>[<bean:write name="index"/>]</LI></logic:iterate></OL>
Usos avanzados (II)
Anidar expresiones de lógica Verificar que un bean existe y su propiedad no es nula
<logic:present name="bean"><logic:notEmpty name="bean" property="value">
<bean:write name="bean" property="value"/></logic:empty></logic:present>
Utilización de <html:rewrite> para referenciar recursos HTML (.js, .css, etc)
Convierte URI relativa al contexto en URI relativa a la aplicación (visible desde fuera)
Se puede definir como ActionForward en struts-config.xml y referenciarla simbólicamente:
<LINK rel="stylesheet" type="text/css"href="<html:rewrite forward='baseStyleSheet'/>">