Tabla de Contenidos

JSTL

En nuestro código:

<%@ taglib uri="http://jakarta.apache.org/taglibs/{library}" prefix="x" %>
<%@ taglib prefix="c" uri="/WEB-INF/c-rt.tld" %>

En el web.xml:

<taglib>
  <taglib-uri>http://jakarta.apache.org/taglibs/{library}</taglib-uri>
  <taglib-location>/WEB-INF/{library}.tld</taglib-location>
</taglib>
<%@ taglib prefix="c" uri="/WEB-INF/c-rt.tld" %>
<c:out value="hola" />

Indice de etiquetas

Incluir etiquetas

Podremos incluir etiquetas a nuestro .jsp o podremos incluirlas en nuestro fichero web.xml, para que sean accesibles desde cualquier parte de nuestra aplicación.

Externas a nuestra aplicación

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

Internas en nuestra aplicación

<%@ taglib prefix="fmt" uri="/WEB-INF/fmt.tld" %>
<%@ taglib prefix="html" uri="/WEB-INF/struts-html-el.tld" %>

Ejemplos de salida y control de código

Tendrás que hacer la siguiente inclusión:

<%@ taglib prefix="c" uri="/WEB-INF/c-rt.tld" %>

Definir y usar una variable

<c:set var="car" value="renault" scope="page" />
${car}

Mostrar valores

<c:out value="coche"></c:out>
<c:out value="${car}" default="ferrari"></c:out>
<c:out value="${pageContext.request.method}" />
<c:out value="${param.msg}" />

Ifs

<c:if test="${1==1}">
  cierto!!!
</c:if>
 
<c:if test="$(1==1)" var="result" />
<c:out value="${result}" />

Control de errores

<c:catch var="exc">
${10/0}
<c:if test="${exc!=null}">
	Error: <c:out value="${exc}" />
</c:if>
</c:catch>

If...Else

<c:choose>
	<c:when test="${param.number == 1}">Solo uno</c:when>
	<c:otherwise>Varios</c:otherwise>
</c:choose>

Bucles

forEach

Para mostrar el uso del forEach añadiremos este código al servlet, al llamar al servlet se enviará a nuestra página jsp un array de integers:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	java.util.ArrayList<Integer> array = new ArrayList<Integer>();
	java.util.Random rnd = new Random();
	for (int i=0; i<20; i++) 
		array.add(rnd.nextInt(100));
	request.setAttribute("myArray", array);
	request.getRequestDispatcher("pp.jsp").forward(request, response);
}
<c:forEach begin="0" end="10" step="1" items="${myArray}" var="i">
	<c:out value="${i}"></c:out>
</c:forEach>
<c:forEach items="${myArray}" var="i" varStatus="stat">
	<jsp:useBean id="stat" type="javax.servlet.jsp.jstl.core.LoopTagStatus" />
	<c:if test="${stat.count %2 == 0}"><font color="grey"></c:if>
	<c:if test="${stat.count %2 != 0}"><font color="black"></c:if>
	<c:out value="${i}"></c:out>
	</font>
</c:forEach>

Se ha realizado una conversión implícita del objeto stat que en el bucle es un javax.servlet.jsp.jstl.core.LoopTagSupport y nosotros, mediante el atributo type, lo pasamos a javax.servlet.jsp.jstl.core.LoopTagStatus. De este objeto contiene varios métodos que pueden sernos útiles:

forTokens

Recorre un string, cada iteración será un elemento de este que será separado por los carácteres indicados en el atributo delims.

<c:set var="phrase" value="Hola, estoy en el trineo de SantaClous; me lo estoy pasando muy bien. Hasta luego." />
<c:forTokens items="${phrase}" var="i" delims=",.;">
	<c:out value="${i}"></c:out> <br />
</c:forTokens>

Ejemplos de formateo y parseo

Tendrás que hacer la siguiente inclusión:

<%@ taglib prefix="fmt" uri="/WEB-INF/fmt-rt.tld" %>

Con el fmt, a parte de dar formato a los datos, también podrás recoger un valor en string y convertirlo a integer o a date, para ello tendrás que utilizar las tags fmt:parseNumber y fmt:parseDate.

Formatear valores numéricos

Podemos hacerlo de dos formas: <fmt:formatNumber atributos>número</fmt:formatNumber> o <fmt:formatNumber value=“número” atributos/>. Los atributos que acepta son:

<fmt:formatNumber value="14525.2334" type="number" groupingUsed="true" maxFractionDigits="2" var="r"/>
<c:out value="${r}" />

Formatear fechas

Igual que con números, pero usando fmt:formatDate. Atributos:

<jsp:useBean id="now" class="java.util.Date"/>
<fmt:formatDate value="${now}" type="time" timeStyle="medium" />
<fmt:formatDate value="${now}" type="date" dateStyle="full" />

Lectura de XML

XML de ejemplo

<?xml version="1.0" encoding="ISO-8859-1"?>
<students>
 <student id="1">
  <name> 
   <first>John</first>
   <last>Smith</last>
   <middle>T</middle> 
  </name> 
  <grade> 
   <points>88</points> 
   <letter>B</letter> 
  </grade> 
 </student> 
 <student id="2"> 
  <name> 
   <first>James</first> 
   <last>Smith</last> 
   <middle>K</middle> 
  </name> 
  <grade> 
   <points>92</points> 
   <letter>A</letter> 
  </grade> 
 </student> 
 <student id="3">
  <name>
   <first>Kelly</first>
   <last>Lane</last>
   <middle>A</middle>
  </name>
  <grade>
   <points>72</points>
   <letter>C</letter>
  </grade> 
 </student>
</students>

Tag c:import

La tag c:import vuelca sobre una variable el contenido de un fichero. Nos va de puta madre para volcar un archivo .xml sobre una variable:

<c:import url="http://www.google.es" var="google" />
<c:out value="${google}" escapeXml="false" />
 
<c:import url="students.xml" var="docXml" />
<c:out value="${docXml}" escapeXml="true" />

Notas