05 jsp tags

22
mayo de 2005 Páginas dinámicas con tags JSP

Transcript of 05 jsp tags

Page 1: 05 jsp tags

mayo de 2005

Páginas dinámicas con tags JSP

Page 2: 05 jsp tags

¿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

Page 3: 05 jsp tags

¿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

Page 4: 05 jsp tags

¿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

Page 5: 05 jsp tags

¿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;

}}

Page 6: 05 jsp tags

¿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>

Page 7: 05 jsp tags

¿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"/>

Page 8: 05 jsp tags

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)

Page 9: 05 jsp tags

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

Page 10: 05 jsp tags

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

Page 11: 05 jsp tags

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

Page 12: 05 jsp tags

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?

Page 13: 05 jsp tags

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”>

Page 14: 05 jsp tags

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

Page 15: 05 jsp tags

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

Page 16: 05 jsp tags

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>

Page 17: 05 jsp tags

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>

Page 18: 05 jsp tags

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

Page 19: 05 jsp tags

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

Page 20: 05 jsp tags

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>

Page 21: 05 jsp tags

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>

Page 22: 05 jsp tags

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'/>">