Java Server Pages Standard Tag Library JSTL Dr
Java. Server Pages Standard Tag Library (JSTL) Dr. Diego Lz. de Ipiña Gz. de Artaza
JSTL n Objetivo: n n n Simplificar y agilizar el desarrollo de aplicaciones web 3 ra iteración después de servlets y JSPs Sirven para la generación dinámica de páginas web
Instalar JSTL n Asumimos que ya has instalado Tomcat 4. 1 en tu máquina, si no consíguelo de: n n Bajar JSTL de: n n http: //apache. rediris. es/jakarta/tomcat 4/v 4. 1. 29/bin/jakarta-tomcat-4. 1. 29 -LE-jdk 14. exe http: //apache. rediris. es/jakarta/taglibs/standard 1. 0/jakarta-taglibs-standard-current. zip Copiar archivos standard. jar y jstl. jar a Tomcat 4. 1commonlib
Usar JSTL en una aplicación Web n n Para cualquier aplicación web desde la cual quieres usar JSTL, copiar los ficheros. tld al directorio WEB-INF de tu aplicación web. Edita el web. xml de tu aplicación web añadiendo las siguientes entradas <taglib> <taglib-uri>http: //java. sun. com/jstl/fmt</taglib-uri> <taglib-location>/WEB-INF/fmt. tld</taglib-location> </taglib> <taglib-uri>http: //java. sun. com/jstl/core</taglib-uri> <taglib-location>/WEB-INF/c. tld</taglib-location> </taglib> <taglib-uri>http: //java. sun. com/jstl/sql</taglib-uri> <taglib-location>/WEB-INF/sql. tld</taglib-location> </taglib> <taglib-uri>http: //java. sun. com/jstl/x</taglib-uri> <taglib-location>/WEB-INF/x. tld</taglib-location> </taglib> n Estas entradas permiten a tu aplicación web usar las librerías de etiquetas JSTL que usan el lenguaje de expresiones. La posición de estas entradas tiene importancia.
Características n n Las páginas JSTL son también páginas JSP. JSTL es un superconjunto de JSP. JSTL provee un conjunto de cuatro librerías estándar: n n n Core Internationalization/format XML y SQL Además JSTL define un nuevo lenguaje de expresiones llamado EL Una etiqueta JSTL corresponde a una acción; llamándolas acción nos indica que añaden comportamiento dinámico a una, de otra manera, página estática.
Soporte para EL I n El lenguaje de expresiones EL simplemente define un poderoso mecanismo para expresar expresiones simples en una sintáxis muy sencilla. n n n Es algo entre Java. Script y Perl. Su combinación con las etiquetas de las 4 librerías antes mencionadas proveen mucha flexibilidad y poder para el desarrollo de páginas dinámicas. En EL las expresiones están delimitadas por ${ }.
Soporte para EL II n Algunos ejemplos del uso de EL son: n n n n ${an. Expression} ${a. List[4]} ${a. List[some. Variable]} acceso a un elemento de una colección ${an. Object. a. Property} acceso a la propiedad de un objeto ${an. Object["a. Property. Name"]} entrada en un mapa con propiedad a. Property. Name ${an. Object[a. Variable. Containing. Property. Name]} Existen una serie de variables implícitas definidas en EL: n n n page. Context: el contexto del JSP actual page. Scope, request. Scope, session. Scope, and application. Scope: colecciones de mapas que mapean nombres de variables en esos contextos a valores param and param. Values: parámetros pasados con la petición de la página, lo micmo que en JSP header and header. Values: cabeceras pasadas en la petición de la página cookie: mapa que mapea nombres de cookies a los valores de las mismas
JSTL Tag Libraries Librería Prefijo librería EL Prefijo de Librería Request-time (RT) Core c c_rt Internationalization/form at fmt_rt SQL/DB support sql_rt XML x x_rt
Uso de las librerías JSTL en un JSP La siguiente directiva ha de incluirse al comienzo de la página: <%@ taglib prefix="c" uri=http: //java. sun. com/jstl/core %> n Para utilizar una etiqueta de una librería simplemente se ha de preceder con el prefijo de la librería utilizada: <c: out value="${an. Expression}"/> n
La librería de etiquetas Core n Permiten llevar a cabo las siguientes acciones: n n n Visualizar/asignar valores y manejar excepciones Control de flujo Otras acciones de utilidad
Visualizar/asignar valores y manejar excepciones con Core I Para visualizar valores utilizamos: <c: out: value="${application. Scope. product. inventory. Count}" escape. Xml="true" default="0" /> of those items in stock. n n escape. Xml indica si hay que aplicar códigos de escape a los caracteres <, >, & y. Asignar una variable en una página: <c: set var="customer. ID" value="$param: customer. Number" scope="session" /> n n n scope indica el contexto en el que se define la variable También podemos asignar el contenido de una etiqueta a una variable: <c: set var="cell. Contents"> <td> <c: out value="${my. Cell}"/> </td> </c: set>
Visualizar/asignar valores y manejar excepciones con Core II n n Normalmente en un JSP o incluimos un bloque try/catch o usamos la directiva error. Page: <c: catch> <!--. . . some set of nested JSTL tags below which would be hit on an exception--> </c: catch> Para borrar una variable se puede utilizar <c: remove>
Control de flujo con JSTL Core I n n Para llevar a cabo simples condiciones (c: if): <c: if test="${status. total. Visits == 1000000}" var="visits"> You are the millionth visitor to our site! Congratulations! </c: if> El switch de un lenguaje de programación se puede emular con c: choose: <c: choose> <c: when test="${item. type == 'book'}">. . . </c: when> <c: when test="${item. type == 'electronics'}">. . . </c: when> <c: when test="${item. type == 'toy'}">. . . </c: when> <c: otherwise>. . . </c: otherwise> </c: choose>
Control de flujo con JSTL Core II n Para iterar sobre una colección se define c: foreach. Se pueden especificar índice de comienzo, final e incremento con los atributos begin, end y step. <table> <c: for. Each var="name" items="${customer. Names}"> <tr><td><c: out value="${name}"/></td></tr> </c: for. Each> </table>
Control de flujo con JSTL Core III n Funcionalidad similar a String. Tokenizer puede ser obtenida en JSTL con c: for. Tokens: <table> <c: for. Tokens items="47, 52, 53, 55, 46, 22, 16, 2" delims=", " var="daily. Price"> <tr><td><c: out value="${daily. Price}"/></td></tr> </c: for. Tokens> </table>
Listar todos los parámetros pasados a una petición <%@ taglib uri="http: //java. sun. com/jstl/core" prefix="c" %> <html> <body> <head> <title>Parameter Listing Example</title> </head> <b>Parameter values passed to this page for each parameter: </b> <table border="2"> <c: for. Each var="current" items="${param}"> <tr> <td> <b><c: out value="${current. key}" /></b> </td> <c: for. Each var="a. Val" items="${param. Values[current. key]}"> <td> <c: out value="${a. Val}" /> </td> </c: for. Each> </tr> </c: for. Each> </table> </body> </html>
Otras acciones Para codificar URLs se puede utilizar c: url: <c: url value="http: //acme. com/exec/register" var="my. Url"> <c: param name="name" value="${param. name}"/> <c: param name="country" value="${param. country}"/> </c: url> <a href='<c: out value="${my. Url}"/>'>Register</a> n Se pueden importar otros JSPs o incluso otros recursos en una URL arbitraria usando c: import (análogo to jsp: include) n Para manejar redireccionamiento se puede utilizar la etiqueta c: redirect n
La librería de etiquetas de internacionalización I n Cubre dos áreas: n n n Etiquetas (acciones) de formateo Acciones de internacionalización Acciones de formateo: Inspiradas en el funcionamiento de las clases Date. Format y Number. Format n Para formatear un número usamos format. Number con los atributos number para el número y pattern para el patrón de formateo a aplicar. <fmt: format. Number value="1000. 001" pattern="#, #00. 0#"/> n Si queremos parsear un número a partir de un string usamos parse. Number: <fmt: parse. Number value="${currency. Input}" type="currency" var="parsed. Number"/> n Para formatear una fecha usamos format. Date y para parsear un string parse. Date: <jsp: use. Bean id="now" class="java. util. Date" /> <fmt: format. Date value="${now}" time. Style="long" date. Style="long"/> <fmt: parse. Date value="${date. Input}" pattern="MM dd, YYYY" /> n
La librería de etiquetas de internacionalización II n Acciones de internacionalización: n Una pieza imporante de la localización en Java es la clase Resource. Bundle. Las acciones JSTL que permiten trabajar con esta clase son: n n n fmt: bundle para obtener un Resource. Bundle correspondiente al Locale actual y fmt: message para hacer lookups en el Resource. Bundle Ejemplo: <fmt: bundle basename="my. Bundle"> <%-- Use values in my. Bundle --%> <fmt: message key="Introduction"> <fmt: param value="${login. Name}"/> <fmt: param value="${login. Count}"/> </fmt: message> <fmt: format. Date value="${now}" var="parsed. Date"/> </fmt: bundle>
La librería de etiquetas SQL I n n n JSTL permite una fácil integración con bases de datos No gestiona bien connection pooling, por tanto son solamente adecuadas para llevar a cabo prototipos o aplicaciones de bajo volumen. Ejemplo: seleccionar y visualizar un conjunto de elementos <sql: set. Data. Source driver="com. cheap. Drivers. jdbc. Driver" url="jdbc: cheap. Drivers: . " user="guest" password="password" var="data. Source" /> <sql: query var="order. Items" data. Source="${data. Source}"> SELECT * FROM items WHERE order_id = <cout value="${order. ID}"/> ORDER BY price </sql: query> <table> <c: for. Each var="row" items="${order. Items. rows}"> <tr> <td><c: out value="${row. item. Name}"/></td> <td><c: out value="${row. price}"/></td> <td><c: out value="${row. weight}"/></td> </tr> </c: for. Each> </table>
La librería de etiquetas SQL II n También se soportan acciones para manejar transacciones (sql: transaction), sql: update soporta no sólo updates sino que también insert y delete e incluso create, es decir todas las acciones SQL que no devuelven un resultado: <sql: transaction data. Source="${data. Source}"> <sql: update> UPDATE account SET account_balance =account_balance -? WHERE account. No = ? <sql: param value="${transfer. Amount}"/> <sql: param value="${source. Account}"/> </sql: update> <sql: update> UPDATE account SET account_balance =account_balance +? WHERE account. No = ? <sql: param value="${transfer. Amount}"/> <sql: param value="${dest. Account}"/> </sql: update> </sql: transaction>
La librería de etiquetas XML I n n n El soporte de XML que lleva a cabo JSTL conforma con la especificación XPath. Xpath provee una sintáxis clara para acceder a partes jerárquicas de un documento. Acciones c: import es utilizada para importar un documento, mientras x: parse para genera un árbol DOM a partir de él. x: set crea una variable a partir de un extracto de XML <!-- Find and parse our XML document (somewhere on the WWW) --> <c: import url="http: //www. cheapstuff. com/order. Status? id=2435" var="xml"/> <x: parse xml="${xml}" var="doc"/> <!-- access XML data via XPath expressions --> <x: out select="$doc/name"/> <x: out select="$doc/shipping. Address"/> <x: out select="$doc/delivery. Date"/> <!-- Set a scoped variable --> <x: set var="cust. Name" scope="request" select="$doc/name"/>
La librería de etiquetas XML II n JSTL se integra fenomenálmente con XSTL <%@ taglib uri="http: //java. sun. com/jstl/core" prefix="c" %> <%@ taglib uri="http: //java. sun. com/jstl/xml" prefix="x" %> <c: set var="xslt. Source"> <? xml version="1. 0"? > <xsl: stylesheet xmlns: xsl="http: //www. w 3. org/1999/XSL/Transform" version="1. 0"> <xsl: template match="/"> <xsl: apply-templates/> </xsl: template> <xsl: template match="music"> <html> <head></head> <body marginheight="0" marginwidth="0" topmargin="0" leftmargin="0"> <table cellpadding="0" cellspacing="0" border="1" bgcolor="#ffffff"> <tr> <td><STRONG>Artist</STRONG></td> <td><STRONG>Album</STRONG></td> <td><STRONG>Year</STRONG></td> <td><STRONG>Genre</STRONG></td> </tr>
La librería de etiquetas XML III <!---Set up for loop to collect all the artist information //--> <!-- <xsl: for-each select=". /*[name()='artists']"> --> <xsl: for-each select="artists"> <tr> <td><xsl: value-of select="artist"/></td> <td><xsl: value-of select="album"/></td> <td><xsl: value-of select="year"/></td> <td><xsl: value-of select="genre"/></td> </tr> </xsl: for-each> </table> </body> </html> </xsl: template> </xsl: stylesheet> </c: set> <x: transform xslt="${xslt. Source}" > <music> <artists> <artist>Jonny B</artist> <album>Feedback and Distortion</album> <year>2001</year> <genre>Rock</genre> </artists> <artist>Harmony's Nieces</artist> <album>Sappy Pop Ballads</album> <year>2002</year> <genre>Pop</genre> </artists> </music> </x: transform>
La librería de etiquetas XML IV n Una manera más sencilla de realizar una transformación XSLT sería: <%@ taglib uri="http: //java. sun. com/jstl/core" prefix="c"%> <%@ taglib uri="http: //java. sun. com/jstl/x" prefix="x"%> <c: import var="xml. Source" url=“${some. Document. URL}" /> <c: import var="xslt. Source" url=“${another. Document. URL}" /> <x: transform xml="${xml. Source}" xslt="${xslt. Source}"/>
Recursos Javadoc de JSTL APIs es disponible en: http: //www. jcp. org/about. Java/community process/final/jsr 052/ n
Conclusiones n n A codificar ahora que lo sabes todo sobre JSTL Tarea: transformar la aplicación de JSPs que realizasteis usando JSTL
- Slides: 27