Contacto

Nos puedes enviar un artículo a publicar (si te fue útil, seguro que a otros también).
Nos puedes sugerir temas/profundidad de interés.
correo-e - perfil

Busquedas

Introducción a JSTL - JSP Standard Tag Lib

 En esta  introducción a JSTL, no se explica como crear nuestra propia biblioteca de tag (tag lib).

 JSTL es una colección de funciones de uso común, cuando se desarrolla páginas dinámicas (como ser bucles, bloques condicionales, formateo de textos, internacionalización, etc), prontas para ser usados desde paginas JSP, y con una apariencia similar a tags de xml (ej: <c:out value="se muestra este texto en la pagina" />).
 El uso de estas funcionalidades (JSTL) permiten que las páginas sean mas fáciles de leer y de mantener, evitando agregar gran cantidad de código java insertado en las páginas. Están divididas en diferentes bibliotecas que cubren varias áreas, como ser procesamiento de xml,  Core, internacionalización y formateo de datos, acceso a base de datos relacional (sql).

Para poder usar JSTL en un proyecto web, primero es necesario copiar dos bibliotecas en nuestro proyecto, estos son: jstl.jar y standard.jar (en WEB-INF/lib).
En la aplicación de ejemplo que se baja con tomcat, se puede obtener estas bibliotecas (o podemos bajarlas desde la web).

Para poder usar una tag lib en una página, es necesario importarla usando el identificador asociado al tag (la uri ), y dar un nombre de prefijo, el cual es usado para llamar luego a las funciones disponibles.
 Para esto, en la pagina usamos:

  <%@ taglib uri="uri_taglib" prefix="myPrefix" %>

 A continuación, una lista de las librerias disponibles, con su URI, y el prefijo que se usa normalmente:

 XML    http://java.sun.com/jsp/jstl/xml    x
 Core     http://java.sun.com/jsp/jstl/core  c
 i18n      http://java.sun.com/jsp/jstl/fmt    fmt
 SQL     http://java.sun.com/jsp/jstl/sql     sql

Para poder usar en nuestra página, por ej. la funcionalidades dentro del Core, primero tenemos que importar el tag lib correspondiente:
 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

nota: Es posible ver en paginas que usa una versión anterior de jstl, usar una uri diferente (no usa el "jsp" uri="http://java.sun.com/jstl/core" ).

 Sobre el lenguaje de expresión:
  Vamos a ver anotaciones del tipo: ${...}.
  De esta forma se indica que la información ingresada dentro de las llaves, no es leída literalmente, sino que se tiene que evaluar, y usar el resultado de esta evaluación.
  Como ejemplo simple, si tenemos: ${8+2}, el valor usado es "10".

  Si tenemos una expresión como: ${ valorEntero}, se busca en los diferentes alcances de variables disponibles para la jsp, esa variable, en el siguiente orden:
 page -> request -> session -> application. Se retorna el primer valor encontrado.
  En caso de ser necesario obtener el valor desde un alcance en particular, se indica dentro de la expresion:
 ${pageScope.valorEntero} || ${requestScope.valorEntero} ||${sessionScope.valorEntero} || ${applicationScope.valorEntero}

 Para acceder a los parámetros dentro de un request (por ejemplo, los datos desde un formulario), simplemente agregamos "param." antes del nombre del parámetro:  ${param.nombre}.
 En caso de que el parámetro pueda tener varios valores, en lugar de 'param' usamos: 'paramValues.'

 Vamos a crear una pagina para usar con ejemplos, y probar algunas funciones.

 <c:out> => Imprime texto en pantalla
uso: <c:out value="Prueba JSTL" />
------------------------
 Ejemplo: index.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
    <head>
        <title>JSP Page</title>
    </head>
    <body>
        <c:out value="Prueba JSTL" />
    </body>
</html>

-----------------

Para recorrer una lista con jstl podemos usar la etiqueta <c:forEach>
<c:forEach> Recorre cada elemento de una colección dada, indicando la colección a recorrer por la propiedad: 'items', el nombre para el item actual lo indicamos por la propiedad 'var'.

 Ej:  En la página anterior podemos agregar un array para probar esta funcionalidad.
  Antes del tag '<html>' agregamos:
  <%
  String[ ] equiposUy = {"Peñarol", "Defensor", "Danubio"};
  request.setAttribute("equiposUy", equiposUy);
  %>


 Luego, dentro del body, agregamos el loop.
 <c:forEach var="equipo" items="${equiposUy}" >
       ${equipo}
 </c:forEach>


A este mismo ejemplo, vamos a agregarle un par de elementos para probar la propiedad "empty" que verifica si una variable existe (y no esta vacía), vamos a usar el alcance de variables (requestScope y sessionScope), y al final, obtener un dato por parámetro.
 El nuevo código completo de la página index.jsp:

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
String[] equiposUy = {"Peñarol", "Defensor", "Danubio"};
request.setAttribute("equiposUy", equiposUy);
%>
<html>
    <head>
        <title>JSP Page</title>
    </head>
    <body>
        <c:out value="Prueba de JSTL"/><br/>
        <c:out value="Existe el array equiposUy en la session : ${!empty sessionScope.equiposUy}" /> <br>
        <c:out value="Existe el array equiposUy en el request : ${!empty requestScope.equiposUy}" /> <br>
        <c:forEach var="equipo" items="${requestScope.equiposUy}" varStatus="equipLoopTag">
            ${equipLoopTag.count} : ${equipo} <br/>
        </c:forEach>

        Nombre por parametro: <c:out value='${param.nombre}' default=" No se ingreso el nombre"/>
    </body>
</html>

La llamada a la pagina la hacemos con un parámetro ('nombre') que pasamos en la url, por ejemplo: http://localhost:8080/TestWeb/?nombre=MiNombre
salida:
 Prueba de JSTL
Existe el array equiposUy en la session : false
Existe el array equiposUy en el request : true
1 : Peñarol
2 : Defensor
3 : Danubio
Nombre por parametro: MiNombre


Si no pasamos el parámetro en la llamada a la pagina (por ejemplo, simplemente hacemos: http://localhost:8080/TestWeb), la última linea imprime el valor por defecto dado a <c:out>: "Nombre por parametro: No se ingreso el nombre"

Vamos a ver un par de funciones mas:

<c:if> Bloque condicional. Nota: Este elemento no tiene un equivalente a: 'else'
uso: <c:if test="${ 5 > 3}"> <c:out value="Dentro del if" /> </c:if>
Este tag evalúa la expresión de la propiedad 'test', si es verdadero ('true'), ingresa al bloque del if correspondiente.

Si se necesita un equivalente a "if ... else", tenemos que usar:
<c:choose>
  <c:when> ... </c:when>
  <c:otherwise> ... </c:otherwise>
</c:choose>


Como ejemplo, agregamos el siguiente código a nuestra pagina:
<c:choose>
  <c:when test="${param.nombre == 'dlix' }">
    <c:out value="Hola ${param.nombre}" />
  </c:when>
  <c:when test="${param.nombre == 'd-lix' }">
    <c:out value="Usas otro nick" />
  </c:when>
  <c:otherwise>
    <c:out value="No eres dlix" />
  </c:otherwise>
</c:choose>


Y hacemos las siguientes llamadas a la página, para ver los resultados
http://localhost:8080/TestWeb/?nombre=dlix       (salida: Hola dlix)
http://localhost:8080/TestWeb/?nombre=d-lix      (salida: Usas otro nick)
http://localhost:8080/TestWeb/?nombre=MiNombre   (salida: No eres dlix)

Captura de excepciones
<c:catch> Es similar al uso de try/catch. Si el código dentro de este bloque genera una excepción, es capturado, y en lugar de mostrar el error,  se pasa a la siguiente línea luego del bloque
uso: <c:catch> 
           <%= 10/0 %>
        </c:catch>
Sin el bloque '<c:catch>', al ejecutar <%= 10/0 %> tendríamos el error: java.lang.ArithmeticException: / by zero

 Todo sobre JSTL en su propio lugar: http://java.sun.com/products/jsp/jstl

1 comentario:

Unknown dijo...

Muy padre post, gracias por el aporte