2. ¿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
3. ¿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
4. ¿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
5. ¿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;
}
}
6. ¿Cómo se utilizan Tag
Extensions?
Instalar ficheros TLD y JAR
WEB-INFlibstruts.jar
WEB-INFstruts-bean.tld
WEB-INFstruts-html.tld
WEB-INFstruts-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>
7. ¿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"/>
8. 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)
9. 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
10. 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
11. Taglib <bean>
Lista de tags
Nombre 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
12. 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?
13. 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”>
14. 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
15. 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
16. 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>
18. 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
19. 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
20. 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>
21. 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>
22. 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'/>">