Diferencia entre revisiones de «JSTL»
(→Recorrer colecciones) |
|||
(No se muestran 12 ediciones intermedias de 2 usuarios) | |||
Línea 7: | Línea 7: | ||
Para el ejemplo usaremos el siguiente objeto de dominio, que deberemos mostrar en una página. | Para el ejemplo usaremos el siguiente objeto de dominio, que deberemos mostrar en una página. | ||
− | < | + | <code java> |
public class Invasor { | public class Invasor { | ||
private Long id; | private Long id; | ||
Línea 17: | Línea 17: | ||
//getters y setters a continuación | //getters y setters a continuación | ||
} | } | ||
− | </ | + | </code> |
Para el ejemplo presupondremos que existe una instancia de Invasor subida al request bajo el nombre "invasor Activo". | Para el ejemplo presupondremos que existe una instancia de Invasor subida al request bajo el nombre "invasor Activo". | ||
Línea 39: | Línea 39: | ||
Finalmente, para importar estos tags en nuestro JSP quedaría el siguiente código: | Finalmente, para importar estos tags en nuestro JSP quedaría el siguiente código: | ||
− | + | <code xml> | |
− | + | <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> | |
+ | <%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt_rt" %> | ||
+ | </code> | ||
===EL para referenciar objetos=== | ===EL para referenciar objetos=== | ||
Línea 62: | Línea 64: | ||
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: | 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 | + | <code xml> |
+ | <c:set var="invasor" value="${requestScope['invasorActivo']}"/> | ||
+ | </code> | ||
Noten, este tag utiliza EL para hacer referencia al objeto "invasorActivo" del request. La variable "requestScope" es implícita | Noten, este tag utiliza EL para hacer referencia al objeto "invasorActivo" del request. La variable "requestScope" es implícita | ||
Línea 70: | Línea 74: | ||
Por ejemplo, supongamos que queremos armar un pequeño HTML para mostrar los datos del Invasor en cuestión: | Por ejemplo, supongamos que queremos armar un pequeño HTML para mostrar los datos del Invasor en cuestión: | ||
− | + | <code xml> | |
− | + | <div> | |
− | + | ID: ${invasor.id} | |
− | + | <br/> | |
− | + | Nombre: ${invasor.nombre} | |
− | + | </div> | |
+ | </code> | ||
===Formateando atributos=== | ===Formateando atributos=== | ||
Línea 81: | Línea 86: | ||
Usando los tags "fmt" podremos darle formato a números y fechas: | Usando los tags "fmt" podremos darle formato a números y fechas: | ||
− | + | <code xml> | |
+ | Reclutado el <fmt:formatDate dateStyle="short" value="${invasor.fechaReclutamiento}"/> | ||
+ | </code> | ||
===Condiciones=== | ===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. | 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. | ||
− | + | <code xml> | |
− | + | <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> | |
+ | </code> | ||
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: | 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: | ||
+ | <code xml> | ||
+ | <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> | ||
+ | </code> | ||
− | + | 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. | 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. | ||
+ | <code xml> | ||
+ | <c:forEach var="nave" items="${invasor.naves}"> | ||
+ | Modelo: ${nave.modelo} | ||
+ | Nombre: ${nave.nombre} | ||
+ | <br/> | ||
+ | </c:forEach> | ||
+ | </code> | ||
− | + | === 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: | |
− | + | <code xml> | |
− | < | + | <context-param> |
− | </ | + | <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name> |
+ | <param-value>ApplicationResources</param-value> | ||
+ | </context-param> | ||
+ | </code> | ||
+ | En este ejemplo, se buscará al archivo ''ApplicationResources.properties'' en la raíz del classpath. Este archivo puede contener por ejemplo: | ||
+ | <code ini> | ||
+ | saludo=Hola, mundo! | ||
+ | despedida=chau, nos vemos | ||
+ | </code> | ||
+ | |||
+ | Luego, podemos usar el tag ''fmt:message'' para mostrar el mensaje en cualquier página [[JSP]]: | ||
+ | |||
+ | <code xml> | ||
+ | <fmt:message key="saludo" /> | ||
+ | </code> | ||
+ | |||
+ | ==== ¿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: | ||
+ | |||
+ | <code xml> | ||
+ | <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> | ||
+ | </code> | ||
==Ver también== | ==Ver también== | ||
Línea 121: | Línea 162: | ||
* [http://javaboutique.internet.com/tutorials/expressions/Agregar lógica a los JSP usando EL] | * [http://javaboutique.internet.com/tutorials/expressions/Agregar lógica a los JSP usando EL] | ||
* [http://java.sun.com/developer/technicalArticles/javaserverpages/faster/Desarrollo de aplicaciones con JSTL] | * [http://java.sun.com/developer/technicalArticles/javaserverpages/faster/Desarrollo de aplicaciones con JSTL] | ||
+ | |||
+ | [[Category:JSF]] |
Revisión actual del 16:17 13 nov 2009
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.
Contenido
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>