JSTL y EL buena alternativa a Scriptlets

La creación de sitios Web dinámicos en Java, requiere la incrustación de scriptlets para algunos (código Java embebido). Se pueden identificar algunas debiladades en dicha práctica, entre las cuales se citan:

  • El código Java embebido en scriptlets es desordenado.
  • Un Desarrollador Web que no conoce Java no puede modificar el código Java embebido.
  • No permite a los diseñadores y personas que describen la lógica de presentación que actualicen el contenido de la página con facilidad.
  • El código de Java dentro de scriptlets JSP no pueden ser reutilizados por otros JSP, por lo tanto la lógica común termina siendo re-implementada en múltiples páginas.


JSTL Java Standard Tag Languages y EL Expretion Languages, son extenciones a la especificación Jsp de sun, surgieron para simplificar el desarrolllo de JSP's, y eliminar los problemas citados previamente.

En este post comentaremos la sintaxis de JSTL, en concreto de su librería core, que representa el lenguaje de control de flujo en una JSP, en paralelo hablaremos de EL que representa el lenguaje de acceso a datos.

Primero y ante todo, para poder escribir tags JSTL y que estos seán interpretables habrá que incluír la directrice:

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

Instrucciones de selección

A continuación, Veamos cual es la sintaxis de las instrucciones de selección que se pueden hacer con JSTL. Empezamos con las más simple, con un ejemplo. El codigo ilustrado abajo.

<c:if test="${!empty cookie.userName}">
Welcome back <c:out value="${cookie.userName.value}" />
</c:if>

En JSTL, la palabra reservada "empty" , comprueba que un valor es vacío (null, string vacío, o una collección vacía).

Seguimos con la estructuras de selección multiple, este ejmplo ilustra la sintaxis de un swith case:



<c:if test="${pageContext.request.method=='POST'}">

You entered:


<c:choose>
<c:when test="${param.enter=='1'}">One
<br />
</c:when>
<c:when test="${param.enter=='2'}">Two
<br />
</c:when>
<c:when test="${param.enter=='3'}">Three
<br />
</c:when>
<c:otherwise>
<c:out value="${param.enter}" />
<br />
</c:otherwise>
</c:choose>
</c:if>



Mencionar que un tag "else", no existe como tal en el core de JSTL. Pero se puede hacer una sentencia "if else", recuriendo a la estructura anterior, haciendo un "when" y un "otherwise". Ejemplo:


<c:choose>
<c:when test="${param.enter=='1'}"> HOLA</c:when>

lt;c:otherwise> ADIOS </c:otherwise>
</c:choose>




En los ejemplos anteriores habréis constatado, que se han usado expresiónes EL para recuperar valores de distintos atributos y distintos objetos. Para los objetos implicitos está la siguiente correspondencia que viene bien tener en claro:

//Solo recupera parametros Strings que se han mandado por la url, vía Post o Get.
${param.test} --> request.getParameter("test") ;

//Recuperan un objeto cuya clave se pasa como parametro, es un hashMap definido.
${requestScope.test} --> request.getAttribute("test");
${sessionScope.test} --> session.getAttribute("test");
${applicationScope.test} --> application.getAttribute("test");
${pageScope.test} --> pageContext.getAttribute("test");
${test} --> pageContext.findAttribute("test");


Definir una variable

La forma de definir una variable, es la siguiente:

<c:set var="noOfRows" value="10">

Se le puede especificar el atributo "scope" que puede tomar los siguientes valores: page, request, session o application. Por defecto cuando no se especifica el scope toma el valor page


Instrucciones de repetición

La forma de iterar con JST es mediante la instrucción "forEach" y además se le puede especificar los atributos begin y end.


<c:forEach items="${forecasts.rows}" var="${city}"
begin="${param.first}" end="${param.first + noOfRows - 1}">
City: <c:out value="${city.name}" />
Tomorrow's high: <c:out value="${city.high}" />
Tomorrow's low: <c:out value="${city.low}" />
</c:forEach>


Tratamiento de urls:

Los ejemplos anteriores funcionan bien mientras se utilicen las cookies para seguimiento de sesión. No está todo dado; el navegador podría tener desactivadas las cookies, o no soportarlas. Por lo tanto es una buena idea activar el contenedor para usar la reescritura de URL como backup de los cookies. La reescritura de URL, como podrías conocer, significa poner el ID de la sesión en todas las URLs usadas en los enlaces y formularios de la página. Una URL reescrita se parece a algo como esto:

myPage.jsp;jspsessionid=ah3bf5e317xmw5

Cuando el usuario pulsa en una línea como esta, el identificador de sesión ID se envía al contenedor como parte de la URL. La librería corazón de JSTL incluye la acción , que tiene cuidado de la reescritura de URL por nosotros. Aquí está como podemos usarla para mejorar la generación del enlace "Previous Page" del ejemplo anterior:


<c:url var="previous" value="foreach.jsp">
<c:param name="first" value="${param.first - noOfRows}" />
</c:url>

<a href="<c:out value="${previous}"/>">Previous Page</a>

Usar import ó include:

<c:import></c:import>
es una acción más flexible que la acción estándar <jsp:include></jsp:include>. Podemos usarla para incluir contenido desde los recursos dentro de la misma aplicación Web, desde otras aplicaciones Web en el mismo contenedor, o desde otros servidores, usando protocolos como HTTP y FTP.

En este post se ha intentado introducir a la buena practica de usar JSTL y EL, existen todavía otras librerías de JSTL, para formateo de datos y internacionalización, tratamiento xml y para la gestión conexiones a bases de datos. La core es la más útil ya que se ocupa de las cosas básicas como son iteraciones, condicionales, manipulación de URL y otras funciones generales, por esta razon he optado escribir sobre ello.

Comentarios