Está en la página 1de 16

Introduccin a JSTL

Qu es JSTL? (JSP Standard Tag Library)


La librera JSTL es un componente dentro de la especificacin del Java 2 Enterprise Edition (J2EE) y es controlada por Sun MicroSystems. JSTL no es ms que un conjunto de libreras de etiquetas simples y estndares que encapsulan la funcionalidad principal que es usada comnmente para escribir pginas JSP. Las etiquetas JSTL estn organizadas en 4 libreras: core: Comprende las funciones script bsicas como loops, condicionales, y entrada/salida. xml: Comprende el procesamiento de xml fmt: Comprende la internacionalizacin y formato de valores como de moneda y fechas. sql: Comprende el acceso a base de datos.

Cul es el problema con los scriptlets JSP?


Nota: Un scriptlet JSP: <% int contador = 100; %> La especificacin JSP ahora se ha convertido en una tecnologa estndar para la creacin de sitios Web dinmicos en Java, y el problema es que han aparecido algunas debilidades: El cdigo Java embebido en scriptlets es desordenado. Un programador que no conoce Java no puede modificar el cdigo Java embebido, anulando uno de los mayores beneficios de los JSP: permitir a los diseadores y personas que escriben la lgica de presentacin que actualicen el contenido de la pgina. El cdigo de Java dentro de scriptlets JSP no pueden ser reutilizados por otros JSP, por lo tanto la lgica comn termina siendo re-implementado en mltiples pginas. La recuperacin de objetos fuera del HTTP Request y Session es complicada. Es necesario hacer el Casting de objetos y esto ocasiona que tengamos que importar ms Clases en los JSP.

Cmo mejora esta situacin la librera JSTL?


Debido a que las etiquetas JSTL son XML, estas etiquetas se integran limpia y uniformemente a las etiquetas HTML. Las 4 libreras de etiquetas JSTL incluyen la mayora de funcionalidad que ser necesaria en una pgina JSP. Las etiquetas JSTL son muy sencillas de usarlas para personas que no conocen de programacin, a lo mucho necesitarn conocimientos de etiquetas del estilo HTML.

Las etiquetas JSTL encapsulan la lgica como el formato de fechas y nmeros. Usando los scriptlets JSP, esta misma lgica necesitara ser repetida en todos los sitios donde es usada, o necesitara ser movida a Clases de ayuda. Las etiquetas JSTL pueden referenciar objetos que se encuentren en los ambientes Request y Session sin conocer el tipo del objeto y sin necesidad de hacer el Casting. Los JSP EL (Expression Language) facilitan las llamadas a los mtodos Get y Set en los objetos Java. Esto no es posible en la versin JSP 1.2, pero ahora est disponible en JSP 2.0. EL es usado extensamente en la librera JSTL.

Cules son las desventajas de los JSTL?


Los JSTL pueden agregar mayor sobrecarga en el servidor. Los scriptlets y las libreras de etiquetas son compilados a servlets, los cuales luego son ejecutados por el contenedor. El cdigo Java embebido en los scriptlets es bsicamente copiado en el servlet resultante. En cambio, las etiquetas JSTL, causan un poco ms de cdigo en el servlet. En la mayora de casos esta cantidad no es mensurable pero debe ser considerado. Los scriptlets son ms potentes que las etiquetas JSTL. Si desea hacer todo en un script JSP pues es muy probable que insertar todo el cdigo en Java en l. A pesar que las etiquetas JSTL proporciona un potente conjunto de libreras reutilizables, no puede hacer todo lo que el cdigo Java puede hacer. La librera JSTL est diseada para facilitar la codificacin en el lado de presentacin que es tpicamente encontrado en la capa de Vista si hablamos de la arquitectura Modelo-Vista-Controlador.

Ejemplo: JSTL sin scriptlets


Para demostrar el concepto de ordenamiento y mejor mantenimiento de los JSP, veamos 2 versiones de una pgina simple. La primera versin usa etiquetas scriptlets, y la segunda usa etiquetas JSTL. Ambas pginas implementan la misma lgica. Graban una lista de objetos AddressVO del Request y luego iteran a travs de la lista, imprimiendo el atributo apellido de cada objeto (si el apellido no es null y de longitud diferente a 0). En cualquier otro caso, imprimir "N/A". Finalmente, la pgina imprime la fecha actual. Con scriptlets JSP:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <%@ page import="com.ktaylor.model.AddressVO, java.util.*"%> <p><h1>Customer Names</h1></p> <% List addresses = (List)request.getAttribute("addresses"); Iterator addressIter = addresses.iterator(); while(addressIter.hasNext()) { AddressVO address = (AddressVO)addressIter.next(); if((null != address) && (null != address.getLastName()) && (address.getLastName().length() > 0)) { %> <%=address.getLastName()%><br/> <% } else {

17 18 19 20 21 22 23

%> N/A<br/> <% } } %> <p><h5>Last Updated on: <%=new Date()%></h5></p>

Con JSTL:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> <p><h1>Customer Names</h1></p> <c:forEach items="${addresses}" var="address"> <c:choose> <c:when test="${not empty address.lastName}" > <c:out value="${address.lastName}"/><br/> </c:when> <c:otherwise> N/A<br/> </c:otherwise> </c:choose><br/> </c:forEach><br/> <jsp:useBean id="now" class="java.util.Date" /> <p><h5>Last Updated on: <c:out value="${now}"/></h5></p>

Instalacin y configuracin del JSTL


La librera JSTL es distribuida como un conjunto de archivos JAR que simplemente tenemos que agregarlo en el classpath del contenedor de servlets. 1. Debemos usar un contenedor de servlets compatible con la versin JSP 2.0 para usar el JSTL 1.1. El Apache Tomcat 5.0 [http://jakarta.apache.org/tomcat/] por ejemplo. En caso contrario, es posible usar el JSTL 1.0 en un contenedor que soporte por lo menos el JSP 1.2 y servlets 2.3. 2. Descargar la implementacin JSTL de la pgina de proyecto Jakarta TagLibs [http://jakarta.apache.org/taglibs/binarydist.html]. La distribucin binaria viene empaquetada como .zip o tar.gz. Desempaquete estos archivos en un directorio temporal. 3. Del directorio temporal, copie todos los archivos JAR que se encuentran en jakarta-taglibs/standard-1.0/lib al directorio /WEB-INF/lib de su aplicacin Web. Esto incluir los JAR especficos del JSTL as como tambin los otros JAR que depende de l. 4. Finalmente, importamos en las pginas JSP cada librera JSTL que la pgina necesitar. Eso lo hacemos agregando las directivas taglib apropiadas al inicio de la pgina JSP. Las directivas son:

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

Ahora, creamos una pgina JSP y probamos algunas etiquetas simples para asegurarnos que la configuracin del JSTL est bien hecha.
1 2 3 4 5 6 <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> Setting the value: "Hello World!" <c:set var="hello" value="Hello World!"/> <p/> <c:out value="${hello}"/>

Cuando accedemos a esta pgina desde el navegador Web, si la configuracin es correcta, deberamos ver: Setting the value: "Hello World!" Hello World! Qu est sucediendo en la pgina JSP? En la lnea 1 la pgina helloword.jsp usa la directiva taglib para importar la librera ncleo de la etiqueta y asigna la letra "c" como prefijo. La letra "c" es usada para referenciar a las etiquetas ncleo en la pgina JSP. Las nicas 2 etiquetas que usamos en el ejemplo son c:set y c:out. En la lnea 4 c:set lo usamos para asignar el valor "Hello World" a la variable hello. En la lnea 6 c:out es usado para evaluar la variable hello con la expresin EL ${$hello}.

Proyecto demoJSTL
Crear el proyecto demoJSTL:

Aadir las librera JSTL:

Se debe observar:

Editar index.jsp:
<%@page contentType="text/html" pageEncoding="ISO-8859-1"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSTL</title> </head> <body> <form action="index.jsp" method="post"> <input type="hidden" name="pinta" value="SI"> <table> <tr> <td>Nombre</td> <td> <input type="text" name="nombre"> </td> </tr> <tr> <td valign="top">Gnero</td> <td> <input type="radio" name="genero" value="Msculino" checked>Msculino<br> <input type="radio" name="genero" value="Femenino">Femenino </td> </tr> <tr> <td valign="top">Deporte</td> <td> <input type="checkbox" name="deporte"

value="Ciclismo">Ciclismo<br> <input type="checkbox" name="deporte" value="Tenis">Tenis<br> <input type="checkbox" name="deporte" value="Natacin">Natacin<br> <input type="checkbox" name="deporte" value="Karate">Karate </td> </tr> <tr> <td colspan=2> <input type="submit" value="Enviar"> </td> </tr> </table> </form> <c:set var="si" value="${param.pinta}"/> <c:if test="${si == 'SI'}"> Variable recogida: <c:out value="${si}" /><br> Ingresos<br> Nombre: <c:out value="${param.nombre}" /> <br> Gnero: <c:out value="${param.genero}" /> <br> Deportes: <c:forEach items="${paramValues.deporte}" var="x"> <c:out value="${x}" /> &nbsp; </c:forEach> </c:if> </body> </html> Ejecutar:

Resultado al enviar:

Proyecto appPeru
Este es un proyecto con acceso a base de datos usando JSTL. Previamente deberamos tener instalado y configurado el DBMS MySQL como en Prac00 JavaServer Pages.docx Primero creamos el datasource: Creacin del datasource No es necesario abrir proyecto alguno para la creacin del datasource:

10

11

12

Ejecutar los comando del archivo peruMySQL.sql, tenga cuidado de ejecutarlo una sola vez.

13

Creacin y configuracin del proyecto appPeru Crear el proyecto appPeru, el proyecto es de la categora Java Web y tipo Web Application, aadirle la librera JSTL 1.1. Editar el archivo context.xml

<?xml version="1.0" encoding="UTF-8"?> <Context antiJARLocking="true" path="/appPeru"> <Resource auth="Container" driverClassName="com.mysql.jdbc.Driver" maxActive="20" maxIdle="10" maxWait="-1" name="jdbc/peru_MySQL" password="mysql" type="javax.sql.DataSource" url="jdbc:mysql://localhost:3306/peru" username="root"/> </Context>

Editar index.jsp
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%> <%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page</title> </head> <body> <sql:query var="result" dataSource="jdbc/peru_MySQL"> SELECT departamento, provincia, distrito FROM departamentos INNER JOIN provincias ON departamentos.idDepartamento=provincias.idDepartamento INNER JOIN distritos ON provincias.idProvincia=distritos.idProvincia </sql:query> <table border="1"> <!-- titulos de columnas --> <tr> <c:forEach var="columnName" items="${result.columnNames}"> <th><c:out value="${columnName}"/></th>

14

</c:forEach> </tr> <!-- columnas de datos --> <c:forEach var="row" items="${result.rowsByIndex}"> <tr> <c:forEach var="column" items="${row}"> <td><c:out value="${column}"/></td> </c:forEach> </tr> </c:forEach> </table> </body> </html>

Resultado Ejecutar el proyecto:

E JERCICIO P ROPUESTO 01 Desarrolle una base de datos en MySQL que le permita administrar la informacin de los alumnos de su saln, como si fuese una agenda, recuerde que un alumno puede tener muchas direcciones, muchos nmeros de telfonos fijos, muchos nmeros de telfonos celulares y varias direcciones e-mail. Insertar por lo menos los datos de 4 alumnos con la informacin relacionada. Luego crear un proyecto en el NetBeans que permita conectarse a esa base de datos y mostrar a travs de JSTL, la relacin de alumnos con sus respectivos datos. Seguimos en el proyecto appPeru: Crear combo.jsp
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%> <%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

15

"http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page</title> </head> <body> <sql:query var="query" dataSource="jdbc/peru_MySQL"> SELECT idDepartamento, departamento FROM departamentos </sql:query> <select name="idDepartamento"> <c:forEach var="query" items="${query.rows}"> <option value="${query.idDepartamento}"> ${query.departamento} </option> </c:forEach> </select> </body> </html>

Ejecucin de combo.jsp Ejecutar el archivo con Shift + F6, el resultado es:

Mayor informacin de JSTL en: http://download.oracle.com/docs/cd/E17802_01/products/products/jsp/jstl/1.1/docs/tlddocs/index.html http://download.oracle.com/javaee/1.4/tutorial/doc/index.html (Chapter 14) E JERCICIO P ROPUESTO 2 Modifique el proyecto appPeru de tal forma que se tenga un combo que permita elegir el departamento del cual se ver la informacin de sus provincias y distritos.

16