Ejemplo de JSTLEtiquetas de internacionalización JSTL (fmt)
fmt:setLocale establece la configuración regional del usuario; fmt:formatDate formatea fechas; fmt:requestEncoding establece la codificación de solicitud; fmt:bundle y fmt:message acceden a recursos internacionalizados; fmt:formatNumber formatea números; fmt:timeZone establece una zona horaria temporal.
Ejemplo con fmt:setLocale y fmt:formatDate
<body>
<%
pageContext.setAttribute("fechaActual", new java.util.Date());
%>
Fecha en chino:
<fmt:setLocale value="zh_CN"/>
<fmt:formatDate value="${fechaActual}"/>
<hr/>
Fecha en inglés:
<fmt:setLocale value="en_US"/>
<fmt:formatDate value="${fechaActual}"/>
</body>
Ejemplo con fmt:requestEncoding
<body>
<fmt:requestEncoding value="UTF-8"/>
</body>
Recursos para internacionalización
Archivos de propiedades: mensajes_es.properties y mensajes_en.properties.
mensajes_es.properties:
nombreUsuario=Ana
saludo=Usuario actual{0}: Bienvenido al sistema
mensajes_en.properties:
nombreUsuario=Ana
saludo=Current user{0}: Welcome to the system
Ejemplo con fmt:bundle y fmt:message
<body>
<fmt:setLocale value="es_ES"/>
<fmt:bundle basename="mensajes">
<fmt:message key="nombreUsuario" var="usuarioNombre"/>
</fmt:bundle>
<h2>Nombre: ${usuarioNombre}</h2>
<fmt:bundle basename="mensajes">
<fmt:message key="saludo" var="saludoInfo">
<fmt:param value="<font color='blue'>Visitante</font>"/>
</fmt:message>
</fmt:bundle>
<h2>Información: ${saludoInfo}</h2>
<hr/>
<fmt:setLocale value="en_US"/>
<fmt:bundle basename="mensajes">
<fmt:message key="nombreUsuario" var="usuarioNombre"/>
</fmt:bundle>
<h2>Name: ${usuarioNombre}</h2>
<fmt:bundle basename="mensajes">
<fmt:message key="saludo" var="saludoInfo">
<fmt:param value="<font color='blue'>Visitor</font>"/>
</fmt:message>
</fmt:bundle>
<h2>Information: ${saludoInfo}</h2>
</body>
Ejemplo con fmt:formatNumber
<body>
<!-- valor: número; tipo: tipo de dato; patrón: formato -->
<fmt:formatNumber value="15" type="currency" pattern="$#,##0.00"/>
<fmt:formatNumber value="1234567.891" pattern="#,##0.0#"/>
</body>
Ejemplo con fmt:formatDate
<body>
<%
java.util.Date timestamp = new java.util.Date();
pageContext.setAttribute("timestamp", timestamp);
%>
<fmt:formatDate value="${timestamp}" pattern="dd-MM-yyyy HH:mm:ss"/>
<hr/>
<fmt:formatDate value="${timestamp}" pattern="dd-MM-yyyy"/>
</body>
Ejemplo con fmt:timeZone
<body>
<%
java.util.Date horario = new java.util.Date();
pageContext.setAttribute("horario", horario);
%>
Hora actual: <fmt:formatDate value="${horario}" pattern="yyyy-MM-dd HH:mm:ss"/>
<hr/>
Hora GMT:
<fmt:timeZone value="GMT">
<fmt:formatDate value="${horario}" pattern="yyyy-MM-dd HH:mm:ss"/>
</fmt:timeZone>
</body>
Etiquetas SQL JSTL (sql)
sql:setDataSource configura la conexión JDBC; sql:query ejecuta consultas; sql:update realiza inserciones, actualizaciones o eliminaciones; sql:transaction maneja transacciones.
Configuración y consulta con sql:setDataSource y sql:query
Se asume una tabla 'estudiantes' en la base de datos.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Ejemplo SQL JSTL</title>
</head>
<body>
<h1>Configurar conexión JDBC</h1>
<sql:setDataSource driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/mi_base" user="usuario" password="clave" />
<sql:query var="resultado">
SELECT * FROM estudiantes;
</sql:query>
<h2>Total de registros: ${resultado.rowCount}</h2>
<table>
<tr>
<th>ID</th>
<th>Matrícula</th>
<th>Nombre</th>
<th>Fecha nacimiento</th>
</tr>
<c:forEach var="est" items="${resultado.rows}">
<tr>
<td>${est.id}</td>
<td>${est.matricula}</td>
<td>${est.nombre}</td>
<td>${est.fecha_nacimiento}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
Inserción con sql:update
<body>
<sql:setDataSource driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/mi_base" user="usuario" password="clave"/>
<h1>Insertar datos</h1>
<sql:update var="operacion">
INSERT INTO estudiantes VALUES(NULL, 'MAT010', 'Luis', '2000-05-15');
</sql:update>
</body>
Actualización con sql:update
<body>
<sql:setDataSource driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/mi_base" user="usuario" password="clave"/>
<h1>Actualizar datos</h1>
<sql:update var="operacion">
UPDATE estudiantes SET matricula='MAT020', nombre='María' WHERE id=7;
</sql:update>
</body>
Eliminación con sql:update
<body>
<sql:setDataSource driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/mi_base" user="usuario" password="clave"/>
<h1>Eliminar datos</h1>
<sql:update var="operacion">
DELETE FROM estudiantes WHERE id=7;
</sql:update>
</body>
Transacciones con sql:transaction
<body>
<sql:setDataSource driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/mi_base" user="usuario" password="clave"/>
<h1>Transacción</h1>
<sql:transaction>
<sql:update var="paso1">
INSERT INTO estudiantes VALUES(NULL, 'MAT030', 'Carlos', '1999-12-01');
</sql:update>
</sql:transaction>
</body>
Etiquetas XML JSTL (x)
Requiere la librería xalan.jar. Se usan para procesar documentos XML.
Archivos XML de ejemplo
datosUsuarios.xml:
<?xml version="1.0" encoding="UTF-8"?>
<usuarios>
<usuario>
<nombre id="u1">Pedro</nombre>
<fechaNac>2000-01-10</fechaNac>
</usuario>
</usuarios>
listaUsuarios.xml:
<?xml version="1.0" encoding="UTF-8"?>
<usuarios>
<usuario>
<nombre id="u1">Pedro</nombre>
<fechaNac>2000-01-10</fechaNac>
</usuario>
<usuario>
<nombre id="u2">Laura</nombre>
<fechaNac>2001-03-20</fechaNac>
</usuario>
<usuario>
<nombre id="u3">Jorge</nombre>
<fechaNac>1999-07-15</fechaNac>
</usuario>
</usuarios>
Parseo y extracción con x:parse y x:out
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Ejemplo XML JSTL</title>
</head>
<body>
<c:import var="datosXml" url="datosUsuarios.xml" charEncoding="UTF-8"/>
<x:parse var="docXml" doc="${datosXml}"/>
<h2>Nombre: <x:out select="$docXml/usuarios/usuario/nombre"/>
(ID: <x:out select="$docXml/usuarios/usuario/nombre/@id"/>)</h2>
<h2>Fecha de nacimiento: <x:out select="$docXml/usuarios/usuario/fechaNac"/></h2>
</body>
</html>
Almacenamiento con x:set
<body>
<c:import var="datosXml" url="datosUsuarios.xml" charEncoding="UTF-8"/>
<x:parse var="docXml" doc="${datosXml}"/>
<x:set var="nodoUsuario" select="$docXml/usuarios/usuario"/>
<h2>Nombre: <x:out select="$nodoUsuario/nombre"/></h2>
</body>
Condición con x:if
<body>
<c:import var="datosXml" url="datosUsuarios.xml" charEncoding="UTF-8"/>
<x:parse var="docXml" doc="${datosXml}"/>
<x:if select="$docXml/usuarios/usuario/nombre/@id='u1'">
<h2>Existe un usuario con ID u1</h2>
</x:if>
</body>
Condicional múltiple con x:choose, x:when, x:ohterwise
<body>
<c:import var="datosXml" url="datosUsuarios.xml" charEncoding="UTF-8"/>
<x:parse var="docXml" doc="${datosXml}"/>
<x:choose>
<x:when select="$docXml/usuarios/usuario/nombre/@id='u2'">
<h2>Existe un usuario con ID u2</h2>
</x:when>
<x:otherwise>
<h2>No existe un usuario con ID u2</h2>
</x:otherwise>
</x:choose>
</body>
Iteración con x:forEach
<body>
<c:import var="listaXml" url="listaUsuarios.xml" charEncoding="UTF-8"/>
<x:parse var="docLista" doc="${listaXml}"/>
<x:forEach select="$docLista/usuarios/usuario" var="nodo">
<h2>Nombre: <x:out select="$nodo/nombre"/> - Fecha: <x:out select="$nodo/fechaNac"/></h2>
<hr/>
</x:forEach>
</body>
Etiquetas de funciones JSTL (fn)
Proporcionan funciones de manipulación de cadenas y colecciones.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Funciones JSTL</title>
</head>
<body>
<%
pageContext.setAttribute("cadena", "www.ejemplo.com");
%>
<h2>Posición de 'ejemplo': ${fn:indexOf(cadena, "ejemplo")}</h2>
<h2>Contiene 'ejemplo': ${fn:contains(cadena, "ejemplo")}</h2>
<h2>Subcadena: ${fn:substring(cadena, 0, 10)}</h2>
<h2>Separar: ${fn:split(cadena, ".")[1]}</h2>
</body>
</html>
Otro uso común es verificar la longitud de una lista:
<c:if test="${fn:length(miLista) > 0}">
<!-- Contenido si la lista no está vacía -->
</c:if>