La Biblioteca Estándar de Etiquetas JSP (JSTL) es un conjunto de etiquetas reutilizables que simplifican el desarrollo de aplicaciones web Java al encapsular funcionalidades comunes.
JSTL facilita tareas estructuradas como:
- Iteración sobre colecciones.
- Evaluación de condiciones lógicas.
- Manipulación de documentos XML.
- Etiquetas para internacionalización.
- Operaciones SQL directas desde JSP.
- Un marco para integrar etiquetas personalizadas.
Principalmente, JSTL, junto con las expresiones EL (Expression Lenguage), permite:
- Recuperar datos: EL reemplaza las expresiones scriptlets en JSP, accediendo a objetos y datos de diversos ámbitos (request, session, application, page). Soporta el acceso a propiedades de JavaBeans, eelmentos de listas, mapas y arrays.
- Realizar operaciones: EL facilita la ejecución de comparaciones relacionales, lógicas y aritméticas básicas directamente en la vista JSP.
- Acceder a objetos comunes de desarrollo web: EL proporciona objetos implícitos que ofrecen fácil acceso a objetos web comúnmente utilizados.
- Invocar métodos Java: A través de funciones EL personalizadas, es posible llamar a métodos de clases Java desde las expresinoes EL.
Instalación de la Biblioteca JSTL
Para integrar JSTL en un servidor Apache Tomcat:
Método Manual
-
Descarga: Obtenga el paquete binario de JSTL desde el repositorio oficial de Apache (ej.
jakarta-taglibs-standard-1.1.2.zip). -
Descompresión y Copia de JARs: Extraiga el archivo descargado. Copie los archivos
standard.jaryjstl.jarubicados en el directoriolib/del paquete descomprimido a la carpeta/WEB-INF/lib/de su proyecto web. -
Copia de Archivos TLD: Localice los archivos
.tlddentro del paquete JSTL descomprimido y cópielos en el directorio/WEB-INF/de su proyecto. -
Configuración en
web.xml: Añada la siguiente configuración al archivoweb.xmlde su aplicación para mapear los URIs de las bibliotecas de etiquetas a sus respectivas ubicaciones de archivos TLD: ```<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <jsp-config> <taglib> <taglib-uri>http://java.sun.com/jstl/fmt</taglib-uri> <taglib-location>/WEB-INF/fmt.tld</taglib-location> </taglib> <taglib> <taglib-uri>http://java.sun.com/jstl/fmt-rt</taglib-uri> <taglib-location>/WEB-INF/fmt-rt.tld</taglib-location> </taglib> <taglib> <taglib-uri>http://java.sun.com/jstl/core</taglib-uri> <taglib-location>/WEB-INF/c.tld</taglib-location> </taglib> <taglib> <taglib-uri>http://java.sun.com/jstl/core-rt</taglib-uri> <taglib-location>/WEB-INF/c-rt.tld</taglib-location> </taglib> <taglib> <taglib-uri>http://java.sun.com/jstl/sql</taglib-uri> <taglib-location>/WEB-INF/sql.tld</taglib-location> </taglib> <taglib> <taglib-uri>http://java.sun.com/jstl/sql-rt</taglib-uri> <taglib-location>/WEB-INF/sql-rt.tld</taglib-location> </taglib> <taglib> <taglib-uri>http://java.sun.com/jstl/x</taglib-uri> <taglib-location>/WEB-INF/x.tld</taglib-location> </taglib> <taglib> <taglib-uri>http://java.sun.com/jstl/x-rt</taglib-uri> <taglib-location>/WEB-INF/x-rt.tld</taglib-location> </taglib> </jsp-config> </web-app>
Método con Maven
Si utiliza Maven, puede añadir las siguientes dependencias a su archivo pom.xml para gestionar JSTL automáticamente:
<!-- JSTL Core &-->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.1.2</version>
<scope>runtime</scope>
</dependency>
<!-- Standard Taglibs (required by some JSTL versions) &-->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
<scope>runtime</scope>
</dependency>
Acceso a Datos con Expresiones EL
La sintaxis básica para acceder a datos con EL es ${identificador}. Al ejecutarse, una expresión EL invoca pageContext.findAttribute(identificador), buscando el objeto en los ámbitos page, request, session y application en ese orden. Si se encuentra, devuelve el objeto; de lo contrario, retorna una cadena vacía (no null).
EL simplifica la obtención de propiedades de JavaBeans, así como el acceso a elementos de arrays, colecciones y mapas.
Ejemplo de Acceso a Datos en JSP
datos_ejemplo.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page import="com.ejemplo.dominio.Persona"%>
<%@ page import="com.ejemplo.dominio.Direccion"%>
<html>
<head>
<title>Acceso a Datos con EL</title>
<meta charset="utf-8" />
</head>
<body>
<%
request.setAttribute("nombreUsuario", "Juan Pérez");
%>
<!-- ${nombreUsuario} es equivalente a pageContext.findAttribute("nombreUsuario") -->
Accediendo a un atributo simple: ${nombreUsuario}
<hr>
<%
Persona personaEjemplo = new Persona();
personaEjemplo.setEdad(30);
request.setAttribute("persona", personaEjemplo);
%>
Accediendo a una propiedad de Bean: ${persona.edad}
<hr>
<%
Persona personaConDireccion = new Persona();
Direccion dir = new Direccion();
dir.setNombreCalle("Avenida Siempre Viva");
personaConDireccion.setDireccion(dir);
request.setAttribute("personaCompleta", personaConDireccion);
%>
Accediendo a propiedad anidada: ${personaCompleta.direccion.nombreCalle}
<hr>
<%
Persona p1 = new Persona();
p1.setNombre("Ana");
Persona p2 = new Persona();
p2.setNombre("Luis");
List<Persona> listaPersonas = new ArrayList<>();
listaPersonas.add(p1);
listaPersonas.add(p2);
request.setAttribute("lista", listaPersonas);
%>
<!-- Accediendo a un elemento específico de la lista por índice -->
Elemento de lista en índice 1: ${lista[1].nombre}
<!-- Iterando sobre una lista con JSTL c:forEach -->
Iterando sobre la lista:
<c:forEach var="itemPersona" items="${lista}">
<span>${itemPersona.nombre}</span>
</c:forEach>
<hr>
<%
Map<String, String> mapaDatos = new LinkedHashMap<>();
mapaDatos.put("claveA", "Valor A");
mapaDatos.put("claveB", "Valor B");
mapaDatos.put("123", "Valor Numérico");
request.setAttribute("mapa", mapaDatos);
%>
<!-- Accediendo a datos de un mapa por clave -->
Valor para clave 'claveB': ${mapa.claveB}
Valor para clave '123': ${mapa["123"]}
<hr>
<!-- Iterando sobre un mapa con JSTL c:forEach -->
Iterando sobre el mapa:
<c:forEach var="entrada" items="${mapa}">
${entrada.key}=${entrada.value}<br/>
</c:forEach>
<hr>
</body>
</html>
Clase Persona.java (Ejemplo)
package com.ejemplo.dominio;
public class Persona {
private String nombre;
private Direccion direccion;
private Integer edad;
public Integer getEdad() {
return edad;
}
public void setEdad(Integer edad) {
this.edad = edad;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public Direccion getDireccion() {
return direccion;
}
public void setDireccion(Direccion direccion) {
this.direccion = direccion;
}
}
Clase Direccion.java (Ejemplo)
package com.ejemplo.dominio;
public class Direccion {
private String nombreCalle;
public String getNombreCalle() {
return nombreCalle;
}
public void setNombreCalle(String nombreCalle) {
this.nombreCalle = nombreCalle;
}
}