8. La biblioteca de etiquetas JSTL
8.0.1. Introducción
Consideremos la vista [erreurs.jsp], que muestra una lista de errores:

Hay varias formas de escribir una página de este tipo. Aquí solo nos interesa la parte relativa a la visualización de los errores. Una primera solución es utilizar código Java, tal y como se ha hecho:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ page import="java.util.ArrayList" %>
<%
// se recuperan los datos del modelo
ArrayList erreurs=(ArrayList)request.getAttribute("erreurs");
String lienRetourFormulaire=(String)request.getAttribute("lienRetourFormulaire");
%>
<html>
<head>
<title>Personne</title>
</head>
<body>
<h2>Les erreurs suivantes se sont produites</h2>
<ul>
<%
for(int i=0;i<erreurs.size();i++){
out.println("<li>" + (String) erreurs.get(i) + "</li>\n");
}//for
%>
</ul>
<br>
<form name="frmPersonne" method="post">
<input type="hidden" name="action" value="retourFormulaire">
</form>
<a href="javascript:document.frmPersonne.submit();">
<%= lienRetourFormulaire %>
</a>
</body>
</html>
La página JSP recupera la lista de errores de la consulta (línea 8) y la muestra mediante un bucle de Java (líneas 19-23). La página combina código HTML y código Java, lo que puede suponer un problema si la página debe ser mantenida por un diseñador gráfico, que por lo general no entenderá el código Java. Para evitar esta mezcla, se utilizan bibliotecas de etiquetas que aportarán nuevas posibilidades a las páginas JSP. Con la biblioteca de etiquetas JSTL (Java Standard Tag Library), la vista anterior queda así:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ taglib uri="/WEB-INF/c.tld" prefix="c" %>
<html>
<head>
<title>Personne</title>
</head>
<body>
<h2>Les erreurs suivantes se sont produites</h2>
<ul>
<c:forEach var="erreur" items="${erreurs}">
<li>${erreur}</li>
</c:forEach>
</ul>
<br>
<form name="frmPersonne" method="post">
<input type="hidden" name="action" value="retourFormulaire">
</form>
<a href="javascript:document.frmPersonne.submit();">
${lienRetourFormulaire}
</a>
</body>
</html>
La etiqueta (línea 4)
indica el uso de una biblioteca de etiquetas cuya definición se encuentra en el archivo [/WEB-INF/c.tld]. Estas etiquetas se utilizarán en el código de la página, precedidas por la letra c (prefix="c"). Se puede utilizar cualquier prefijo que se desee. En este caso, c significa [core]. Los prefijos permiten utilizar bibliotecas de etiquetas que podrían tener los mismos nombres para determinadas etiquetas. El uso del prefijo elimina la ambigüedad. La nueva página ya no tiene código Java en los dos lugares donde lo tenía anteriormente:
- la recuperación de la plantilla de la página [erreurs, lienRetourFormulaire] (parte eliminada)
- la visualización de la lista de errores (líneas 13-15)
El bucle de visualización de errores se ha sustituido por el siguiente código:
<c:forEach var="erreur" items="${erreurs}">
<li>${erreur}</li>
</c:forEach>
- La etiqueta <forEach> sirve para delimitar un bucle
- la notación ${variable} sirve para escribir el valor de una variable
La etiqueta <forEach> tiene aquí dos atributos:
- items="${errores}" indica la colección de objetos sobre la que hay que iterar. En este caso, la colección es el objeto «errores». ¿Dónde se encuentra este? La página JSP busca un atributo llamado «errores» sucesivamente y en el siguiente orden:
- el objeto [request], que representa la solicitud enviada por el controlador: request.getAttribute("erreurs")
- el objeto [session], que representa la sesión del cliente: session.getAttribute(«errores»)
- el objeto [application], que representa el contexto de la aplicación web: application.getAttribute («errores»)
La colección designada por el atributo «items» puede adoptar diversas formas: tableau, ArrayList, un objeto que implemente la interfaz List, etc.
- var="error" sirve para asignar un nombre al elemento actual de la colección que se está procesando. El bucle <forEach> se ejecutará sucesivamente para cada elemento de la colección items. Dentro del bucle, el elemento de la colección que se está procesando se designará aquí como error.
La notación ${error} inserta el valor de la variable «error» en el texto. Esta variable no tiene por qué ser necesariamente una cadena de caracteres. JSTL utiliza el método erreur.toString() para insertar el valor de la variable «error». En lugar de la notación ${error}, también se puede utilizar la etiqueta <c:out value="${error}"/>.
Volviendo a nuestro ejemplo de visualización de errores:
- El controlador incluirá en la solicitud enviada a la página JSP un ArrayList de mensajes de error, es decir, un ArrayList de objetos String: request.setAttribute("errores", errores), donde «errores» es el ArrayList;
- debido al atributo items="${errores}", la página JSP buscará un atributo llamado «errores», sucesivamente en la consulta, la sesión y la aplicación. Lo encontrará en la solicitud: request.getAttribute("errores") devolverá el ArrayList colocado en la solicitud por el controlador;
- la variable erreur del atributo var="error" apuntará, por tanto, al elemento actual de ArrayList, es decir, a un objeto String. El método erreur.toString() insertará el valor de este String —en este caso, un mensaje de error— en el flujo HTML de la página.
Los objetos de la colección procesada por la etiqueta <forEach> pueden ser más complejos que simples cadenas de caracteres. Tomemos como ejemplo una página JSP que muestra una lista de artículos:
donde [listarticles] es un ArrayList de objetos de tipo [Article], que suponemos que es un Javabean con los campos [id, nom, prix, stockActuel, stockMinimum], cada uno de los cuales va acompañado de sus métodos get y set. El objeto [listarticles] ha sido incluido en la solicitud por el controlador. La página anterior JSP lo recuperará en el atributo «items» de la etiqueta forEach. Por lo tanto, el objeto actual «article» (var="article") hace referencia a un objeto de tipo [Article]. Consideremos la etiqueta de la línea 3:
¿Qué significa ${article.nom}? En realidad, varias cosas, dependiendo de la naturaleza del objeto «article». Para obtener el valor de article.nom, la página JSP intentará dos cosas:
- article.getNom() —fíjate en la ortografía de getNom— para recuperar el campo «nombre» (estándar JavaBean)
- article.get("nombre")
Por lo tanto, el objeto [article] puede ser un bean con un campo «nombre» o un diccionario con una clave «nombre».
No hay límites en la jerarquía del objeto procesado. Así, la etiqueta
permite procesar un objeto [individu] del siguiente tipo:
class Individu{
private String nom;
private String prénom;
private Individu[] enfants;
// métodos del estándar JavaBean
public String getNom(){ return nom;}
public String getPrénom(){ return prénom;}
public Individu getEnfants(int i){ return enfants[i];}
}
Para obtener el valor de ${individu.enfants[1].nom}, la página JSP probará varios métodos, entre ellos este, que dará resultado:
individu.getEnfants(1).getNom(), donde «individuo» designa un objeto de tipo «Individuo».
8.0.2. Instalar y explorar la biblioteca JSTL
Las explicaciones proporcionadas anteriormente serán suficientes para la aplicación que nos interesa, pero la biblioteca de etiquetas JSTL ofrece otras etiquetas además de las presentadas. Para descubrirlas, se puede instalar un tutorial incluido en el paquete de la biblioteca.
Utilizaremos la implementación JSTL 1.1 del proyecto [Jakarta Taglibs], disponible en la URL [http://jakarta.apache.org/taglibs/] (mayo de 2006):
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
El archivo zip descargado tiene un contenido similar al siguiente:

Los dos archivos con la extensión .war son archivos comprimidos de aplicaciones web:
- standard-doc: documentación sobre las etiquetas JSTL
- standard-examples: ejemplos de uso de las etiquetas
Vamos a desplegar esta última aplicación en Tomcat. Iniciamos Tomcat mediante la opción correspondiente del menú [Démarrer], a continuación introducimos la URL [http://localhost:8080] y seguimos el enlace [Tomcat Manager]:

A continuación, aparece una página de autenticación. Iniciamos sesión con las credenciales «manager / manager» o «admin / admin», tal y como se ha mostrado en el apartado 2.3.3.

Aparece una página con la lista de aplicaciones actualmente desplegadas en Tomcat:

Podemos añadir una nueva aplicación mediante los formularios que se encuentran al final de la página:

Utilizamos el botón [Parcourir] para seleccionar un archivo .war que se va a implementar.

La captura de pantalla no lo muestra, pero hemos seleccionado el archivo [standard-examples.war] de la distribución JSTL descargada. El botón [Deploy] guarda e implementa esta aplicación en Tomcat.

La aplicación [/standard-examples] se ha desplegado correctamente. La iniciamos:

Se invita al lector a seguir los distintos enlaces que ofrece esta página cuando busque ejemplos de uso de las etiquetas JSTL.
La aplicación [standard-doc] se podrá implementar de la misma manera a partir del archivo [standard-doc.war]. Ofrece acceso a información bastante técnica sobre la biblioteca JSTL. Resulta menos interesante para los principiantes.
8.0.3. Utilizar JSTL en una aplicación web
En los ejemplos que se incluyen con la biblioteca JSTL 1.2, las páginas JSP tienen al principio del archivo la siguiente etiqueta:
Ya nos hemos encontrado con esta etiqueta en el apartado 8.1.1, donde ofrecimos una breve explicación:
- [uri]: URI (Identificador Uniforme de Recursos), donde se encuentra la definición de las etiquetas utilizadas en la página. Esta etiqueta URI será utilizada por el servidor web cuando la página JSP se traduzca a código Java para convertirse en un servlet. También la utilizan las herramientas de desarrollo de páginas web para comprobar que la sintaxis de las etiquetas utilizadas en la página sea correcta o para ofrecer sugerencias de escritura. Al comenzar a escribir una etiqueta, una herramienta que conozca la biblioteca puede sugerir al usuario los atributos posibles para dicha etiqueta.
- [prefix]: prefijo que identifica estas etiquetas en la página
El URI [http://java.sun.com/jsp/jstl/core] no se puede utilizar si no se dispone de conexión a Internet pública. En ese caso, se puede guardar localmente el archivo de definición de etiquetas. Se incluyen varios archivos de este tipo con la distribución JSTL 1.2 en la carpeta [tld] (Tag Language Definition):

JSTL es, de hecho, un conjunto de bibliotecas de etiquetas. Solo utilizaremos la biblioteca [c.tld], conocida como biblioteca «core». Colocaremos el archivo [c.tld] mencionado anteriormente en la carpeta [WEB-INF] de nuestras aplicaciones:
![]()
e incluiremos la siguiente etiqueta en nuestras páginas JSP para declarar el uso de la biblioteca «core»:
Aunque el uso de bibliotecas de etiquetas nos permite evitar incluir código Java en las páginas JSP, estas etiquetas se traducen, por supuesto, a código Java durante la conversión de la página JSP en un servlet Java. Estas utilizan clases definidas en dos archivos [jstl.jar, standard.jar] que se encuentran en la carpeta [lib] de la distribución JSTL:

Estos dos archivos se encuentran en la carpeta [WEB-INF/lib] de nuestras aplicaciones:

Ahora ya tenemos las bases para abordar la siguiente versión de nuestra aplicación de ejemplo.





