JSTL

De Dos Ideas.
Saltar a: navegación, buscar

Java Standard Tag Library (JSTL) es un conjunto de tags JSP que resuelven las situaciones más comunes de presentación. JSTL provee tags para setear, obtener y mostrar variables del entorno, iterar colecciones, crear condiciones lógicas y formatear fechas y números, entre otras cosas.

JSTL comienza a ser sumamente útil cuando se combina con un nuevo lenguaje de expresiones para JSP: Expression Language (EL). EL es una nueva sintáxis para referenciar objetos, atributos y crear expresiones lógicas. EL y JSTL en conjunto forman una solución muy simple y poderosa para resolver la presentación en los JSP.

Una página de ejemplo

El objeto de dominio en el request

Para el ejemplo usaremos el siguiente objeto de dominio, que deberemos mostrar en una página.

   public class Invasor {
       private Long id;
       private String nombre;
       private Date fechaReclutamiento;
       private boolean esCapitan;
       private Collection<Nave> naves;
       //getters y setters a continuación
   }

Para el ejemplo presupondremos que existe una instancia de Invasor subida al request bajo el nombre "invasor Activo".

Importando JSTL en la página

Para usar JSTL es necesario incluir los siguientes JAR al proyecto:

  • standard.jar
  • jstl.jar

Estos JAR son solamente necesarios para que los IDE compilen las páginas, y no deben quedar en los distribuibles (ya que el application server los proveerá en tiempo de ejecución).

JSTL está compuesto por un conjunto de tags separados en diferentes TLDs. Los dos grupos de tags principales son:

  • Core (prefijo "c"): funcionalidad básica, como seteo de variables, iteraciones de colecciones, lógica, etc.
  • Format (prefijo "fmt"): utilidades para formateo de fechas y números.

Pueden ver todos los grupos y URIs correspondientes a cada uno en standard.jar/META-INF (allí se encuentran todos los TLD).

Finalmente, para importar estos tags en nuestro JSP quedaría el siguiente código:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt_rt" %>

EL para referenciar objetos

EL permite referenciar atributos y objetos a través de sus nombres de variables. Las expresiones EL cumplen la forma:

   ${expresion}

Por ejemplo, si tuvieramos una variable "invasor" definida, podriamos hacer referencia a su nombre:

   ${invasor.nombre}

O crear una condición lógica:

   ${invasor.esCapitan == false}

Pero primero deberemos definir nuestra variable "invasor" antes de utilizarla.

Creando una variable

Usaremos EL para mostrar los atributos de nuestro invasor. Sin embargo, primero deberemos crear una variable local que contenga una referencia al invsasor en el request. Para esto, usaremos el tag "set" provisto por JSTL:

   <c:set var="invasor" value="${requestScope['invasorActivo']}"/>

Noten, este tag utiliza EL para hacer referencia al objeto "invasorActivo" del request. La variable "requestScope" es implícita Mostrando atributos

Mostrar atributos en el JSP es tan simple como referenciar a los atributos con EL.

Por ejemplo, supongamos que queremos armar un pequeño HTML para mostrar los datos del Invasor en cuestión:

   ID: ${invasor.id}
   
Nombre: ${invasor.nombre}

Formateando atributos

Usando los tags "fmt" podremos darle formato a números y fechas:

Reclutado el <fmt:formatDate dateStyle="short" value="${invasor.fechaReclutamiento}"/>

Condiciones

Además, es posible crear bloques con condiciones lógicas. Para esto se utiliza el tag "if", el cual ejecuta el bloque que contiene si su condición da verdadero. <c:if test="${invasor.esCapitan == true}">

   Este invasor es Capitan de una nave.

</c:if> <c:if test="${persona.esMayorDeEdad == false}">

   Este invasor es un soldado.

</c:if>

Se pueden crear condiciones múltiples con el tag "choose". Este tag permite evaluar varias condiciones. El mismo bloque anterior reescribo con choose sería: <c:choose>

   <c:when test="${invasor.esCapitan}">
       La persona es mayor de edad.
   </c:when>
   <c:otherwise>
       La persona es menor de edad.
   </c:otherwise>

</c:choose>

Cuando existe más de una rama de decisión, el tag "choose" es mucho más práctico.

Recorrer colecciones

Los tags "core" traen tambien utilidades para recorrer colecciones facilmente. Recorreremos la colección de naves que tiene el Invasor usando el tag "forEach", y mostraremos su modelo y nombre. <c:forEach var="nave" items="${invasor.naves}">

   Modelo: ${nave.modelo}
   Nombre: ${nave.nombre}
   

</c:forEach>

Imprimir mensajes de un bundle

Los tags "fmt" traen utilidades para imprimir mensajes de un MessageBundle (un archivo de properties que contiene mensajes de la aplicación, que pueden ser internacionalizados). Para esto primero debemos agregar la siguiente configuración al archivo web.xml del proyecto, indicando el nombre del bundle:

   <context-param>
       <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
       <param-value>ApplicationResources</param-value>
   </context-param>

En este ejemplo, se buscará al archivo ApplicationResources.properties en la raíz del classpath. Este archivo puede contener por ejemplo: saludo=Hola, mundo! despedida=chau, nos vemos

Luego, podemos usar el tag fmt:message para mostrar el mensaje en cualquier página JSP:

<fmt:message key="saludo" />

¿Cómo verificar si existe una clave?

Si la clave que usamos en fmt:message no existe, se imprimirá un texto del estilo ???clave.que.no.existe???. Estos tags no tienen una forma simple para determinar si la clave no existe (y poder así establecer un mensaje predeterminado). Sin embargo, podemos lograr este comportamiento con algo de código:

<fmt:message var="titulo" key="una.clave.opcional" /> <c:if test='${fn:startsWith(titulo, "??")}'>

   <fmt:message var="titulo" key="una.clave.con.el.valor.predeterminado" /> 

</c:if>

Ver también