You are on page 1of 96

Introduccin a JSP

El estndar HTML propone el suministro de informacin mediante pginas estticas. De esta forma es imposible suministrar pginas creadas al momento en base a requisitos del cliente. Ej: consultar una base de datos desde una pgina HTML y obtener otra pgina automticamente slo con los resultados deseados.
1 2

Otras tecnologas empleadas tradicionalmente han sido CGI, ASP, PHP.

T Uso de T Uso de JavaBeans Mayor escalabilidad

clases

SGR
* Las principales ventajas de JSP

sobre

ellas son: Mayor encapsulamiento:

Uso de tags: similitud con HTML

Mayor portabilidad

1 2

Uso de un lenguaje estndar y muy difundido El lenguaje en que actualmente est basado JSP es Java

Realmente una pgina JSP se convierte en un servlet que es quien se encarga de la comunicacin con el cliente

Instalacin
El motor o servidor JSP puede ser el JSWDK, o bien Apache Tomcat
1 2 3

Usaremos Tomcat ya que tiene soporte para tags. JSWDK no Consideraciones de instalaciones de Tomcat:

Quitar el start de la invocacin a javac en tomcat.bat Al comienzo de startup.bat poner: set JAVA_HOME=d:\jdk1.3 El puerto de escucha se puede modificar en /conf/server.xml

.tld

SGR

Los servlets se ubican en /WEB-INF/classes Los ficheros .jsp y .tld se encuentran a partir de ROOT Tomcat no acepta la etiqueta bodycontent en un fichero Modificar el classpath para que se encuentren todos los .class necesarios, especialmente jdk1.3/lib/tools.jar Cuando se usan etiquetas, los ficheros .class que heredan de Tag deben pertenecer a un paquete Tomcat se arranca con startup Es conveniente crear en el directorio ROOT un directorio jsp para guardar las pginas JSP La ubicacin de los ficheros .tld se puede indicar a travs del fichero /conf/web.xml

* Estas consideraciones de instalacin son funcionamiento del servidor Tomcat

bsicas para el buen

Componentes JSP

arios: son de la forma: <%-- comentario %> No se envan al cliente

Directivas: son de la forma: <%@ directiva atributo1=" valor1" atributo2=" valor2" ... %> Permiten definir la estructura de todo el documento JSP. Realmente indican aspectos bsicos del servlet en que se

SGR
convertir el fichero JSP en que se encuentra. Se procesan en el momento de convertir la pgina JSP en un servlet. Las tres directivas existentes son: O <%@ include file=URL relativa %> Sirve para incluir un fichero dentro de otro en el momento en que la pgina JSP se convierte en servlet O <%@ page ... %>

O <%@ taglib ... %>

tas jsp: son de la forma: <jsp:etiqueta atributos /> Realizan operaciones diversas. Su utilidad principal es para comunicarse con los JavaBeans de forma que el cdigo dela pgina .jsp sea lo ms parecido al .html

Expresiones JSP
Las pginas JSP son especialmente itles cuando el usuario enva un formulario lleno de campos en los que expresa el tipo de informacin que solicita
1

Los parmetros que enva el usuario se pueden conocer enviando el mensaje getParameter(String) al objeto request, que es uno de los varios objetos que el motor JSP nos suministra para que tengamos mayor control.
2 3

Los objetos ms tiles que se nos suministran son:

SGR
request de tipo HttpServletRequest. Representa la solicitud realizada por el cliente response de tipo HttpServletResponse. nuestra respuesta. no tiene porqu ser una pgina html sino cualquier otra cosa (ver setContentType()) session de tipo HttpSession. Representa la sesin del

Representa cliente out de tipo JspWriter (es un PrintWriter con buffer). Es el ms utilizado y representa el canal de salida de texto y datos hacia el cliente application de tipo ServletContext. Con setAttribute y getAttribute sirve para guardar objetos globales a todas las pginas JSP pageContext de tipo PageContext. Muy utilizado en las etiquetas para obtener el resto de objetos anteriores (que no son visibles en las etiquetas)

</HTML>

Scriptlets y condiciones
Un scriptlet puede estar formado por varios trozos. Lo que hay entre ellos se considera cuerpo del scriptlet aunque sea cdigo HTML.
1 2

Ejemplo:

<HTML> <HEAD> <TITLE>Cuerpos dentro de bloques JSP</TITLE> </HEAD> <BODY> <H1>Cuerpos dentro de <i>Scriptlets</i></H1> <% if (Math.random() < 0.5) {%> Que tenga un buen da. <% } else { %> <% } %><p> Y ahora la tabla del 7:<br>

<% } %> </BODY> </HTML>

SGR
Que tenga mucha suerte. <% for (int i = 1; i <= 10; i++) { %> 7 x <%= i %> = <%= 7*i %> Perfecto <br>

Directiva page. Atributos


* La directiva page se aplica a toda la pgina en que se encuentra. Permite los siguientes atributos: import. Permite hacer uso de paquetes Java, de manera anloga a como se importa en un programa Java. Se puede importar un solo package o varios separndolos por comas contentType. Permite indicar el tipo de los datos que se van a enviar al cliente enformato MIME isThreadSafe. Una pgina JSP se puede ejecutar varias veces simultneamente antes peticiones de clientes concurrentes. Si se indica isThreadSafe=false las

SGR
peticiones se resuelven secuencialmente session. Un valor false indica que el objeto session no existe y se producir un error en el momento de convertir la pgina en servlet si se intenta utilizar buffer. Cuando el servidor JSP enva la respuesta al cliente utiliza un buffer intermedio. Con este atributo se indica su tamao en kB, o bien la palabra none si no se quiere usar buffer autoflush. El buffer se enva al cliente de forma automtica cada vez que se llena. Si se indica false se produce un error de overflow si el buffer se llega a llenar extends. Se usa para crear una pgina JSP que hereda de la clase que se indique en este atributo errorPage. Sirve para indicar la URL de una pgina que se enviar al cliente en lugar de la actual si, por cualquier circunstancia, sta se rompe isErrorPage. Indica si la pgina actual es o no una pgina de suministro elegante de errores

Ejemplo de upload
* Para subir ficheros al servidor, fotos, etc. se puede usar el paquete com.oreilly.servlet.*: es muy til la clase MultipartRequest, ya que el formulario de envo debe ser multiparte. Fichero upload.jsp
<%@ page import="com.oreilly.servlet.*, java.util.*, java.io.*" %> <% try{ MultipartRequest multi = new MultipartRequest(request, ".",10000000);// 10MB out.println(multi.getParameter("line")+"<br>"); out.println("Files:"); while (files.hasMoreElements()) {

File f = multi.getFile(name); String s, s2 = new String(); while((s = in.readLine())!= null) s2 += s + "<br>"; out.println("name: " + name);

SGR
Enumeration files = multi.getFileNames(); String name = (String)files.nextElement(); String filename = multi.getFilesystemName(name); String type = multi.getContentType(name); if (f==null) continue; // Por si el parmetro no est cargado BufferedReader in = new BufferedReader(new FileReader(f));

out.println("filename: " + filename); out.println("type: " + type); out.println("f.length(): " + f.length()+"<br>"); out.println("fileContent: " + s2+"<br>"); in.close(); } }catch(IOException e){ //No es un error, sino tan slo la primera vez que se llama a esta pgina } %> <FORM ENCTYPE="multipart/form-data" method="POST" action="upload.jsp"> <INPUT TYPE="text" NAME="line"> <INPUT TYPE="file" NAME="mptest"> <INPUT TYPE="submit" VALUE="upload"> </FORM>

Captulo 16: Etiquetas jsp: y JavaBeans


Las etiquetas jsp: difieren de las directivas en que son interpretadas para cada peticin del cliente y, por tanto, se pueden considerar una etiqueta HTML ms.
1 2

Las etiquetas jsp: existentes son:

jsp:include. Se utiliza para incluir ficheros en situaciones condicionales (a diferencia de la directiva @ include que los incluye siempre). Adems, permite no slo incluir

SGR

ficheros, sino los resultados de otros servlets, pginas JSP, etc. El resultado incluido NO puede contener JSP jsp:forward. Hace que la pgina actual no sea la que se enve al cliente, sino la que se especifique en el forward. A este respecto hay que considerar lo siguiente: En el momento en que la pgina actual responda al cliente lo ms mnimo ya no es posible hacer un forward, pues se produce un error. Es por ello que JSP utiliza un buffer (por defecto de 8 kB). * El formato de ambas etiquetas es muy parecido: <jsp:include page=URLRelativa flush=true> <jsp:param name=nombreParmetro value=valor> ... </jsp:include> * En el forward el atributo flush no existe, mientras que en el include es oblitarorio y adems siempre true.

La etiqueta jsp:plugin
Es transformada automticamente por el servidor JSP en una etiqueta que incluye un applet que puede utilizar las extensiones del JDK 1.2 y superiores (no es necesario que se haya descargado el plug-in de Java para los navegadores).
1

Su formato es muy parecido al de la etiqueta APPLET. Un ejemplo comparativo puede ser:


2

<APPLET CODE=MiApplet.class WIDTH=465 HEIGHT=350> </APPLET>

equivale a
<jsp:plugin type=applet

</jsp:plugin>

SGR
code=MiApplet.class width=465" height=350">

* Si el applet tiene parmetros, stos se pasan igual que en jsp:include, aunque deben ir, a su vez, entre <jsp:params> y </jsp:params> * Adems de losmismo atributos que permite la etiqueta APPLET, otros atributos que posee son: jreversion. Versin del JRE que requiere el applet nspluginurl. La URL completa en la que es posible encontrar el plug-in para Netscape iepluginurl. La URL completa en la que es posible encontrar el plug-in para Internet Explorer

* Adems de applets tambien se pueden cargar JavaBeans

Sintaxis
* Los atributos que admite jsp:useBean son: id=nombre. Nombre que se le da a ese objeto scope=page|request|session| application. Indica dnde se puede usar dicho objeto: O page: slo en esta pgina O request: si hay un forward o un include tambin se podr usar en las pginas destino O session: se puede usar en la sesin de usuario a travs de varias pginas, pero slo para ese usuario O application: Existir hasta que se cierre el servidor JSP. objeto

SGR
Disponible para todo el mundo siempre. class=Clase.class. Nombre de la clase de la que se crea el type=Clase.class. Por si se quiere hacer un upcasting * Los atributos que admite jsp:getProperty son: name=nombre. Nombre del objeto del que tomar el campo property=nombreCampo. Nombre del campo cuyo valor se desea visualizar * Los atributos que admite jsp:setProperty son: name=nombre. Nombre del objeto en que guardar el valor property=NombreCampo. Nombre del campo cuyo valor se desea guardar value=valor. Valor que se desea guardar. Se hace una conversin automtica en funcin del tipo del campo

Ejemplo de JSP y JavaBeans


Fichero StringBean.java
/** Un JavaBean sencillito que slo tiene un campo * String} llamado mensaje de tipo

Asignacin de parmetros
* Si una pgina recibe parmetros que hay que asignarlos a campos de un JavaBean, jsp:setProperty suministra una forma de hacerlo de forma elegante. De esta guisa, los dos trozos de cdigo siguientes son equivalentes:
<% int numElementos = 1; try { numElementos = Integer.parseInt(request.getParameter(num)); } catch (NumberFormatException nfe) {} %> <jsp:setProperty name=articulo property=numero value=<%= numElementos %> />

equivale a
<jsp:setProperty name=articulo param=num />

SGR
property=numero

* El atributo param en lugar de value toma el valor de un parmetro de entrada a la pgina JSP, lo convierte al tipo del campo y guarda su valor en el campo. * Para asociar todos los parmetros de entrada con campos de un JavaBean basta con indicar un asterisco como property. Ej.:
<jsp:setProperty name=articulo property=* />

* En ste ltimo caso, los nombres de los parmetros y de los campos del JavaBean han de ser idnticos

verdad

Captulo 17: Biblioteca de etiquetas (Tags)


Permiten construir pginas JSP con una estructura ms parecida a la del HTML.
1 2 3 4

Se utilizan etiquetas de la misma forma que en HTML. Las etiquetas pueden tener parmetros y englobar un cuerpo. Las etiquetas funcionalmente relacionadas se agrupan en

SGR
ficheros llamados bibliotecas de etiquetas. Cada etiqueta se asocia a un bloque de cdigo Java ubicado en la clase cuyo nombre se indica.
1

Estas clases deben heredar y utilizar clases estndares almacenadas en el paquete java.servlet.jsp.tagext.*
2

Cuando el motor JSP se encuentra una de estas etiquetas, la sustituye por su cdigo asociado y lo ejecuta.
3 4

Por tanto, necesitamos tres ficheros:

La pgina JSP que utiliza las etiquetas: *.jsp La clase que contiene el cdigo a ejecutar: *.class Un fichero que indica qu clase se corresponde con cada etiqueta: *.tld (Tag Library Descriptor) * En el cdigo asociado podemos acceder al objeto pageContext y, a travs de l, a los objetos out, request, parameter, etc.

<BODY><H1><csajsp:example /></H1><csajsp:example /></BODY> </HTML>

La clase Tag
Las etiquetas se forman por un inicio, un cuerpo y un final. Cuando el sistema se encuentra el inicio ejecuta doStartTag(), y cuando encuentra el final ejecuta doEndTag().
1

Estas funciones deben reescribirse en una clase que hereda de la interfaz Tag. Sun suministra dos clases de partida que heredan de Tag:
2

O TagSupport, si la etiqueta no gestiona el cuerpo O BodyTagSupport, si se quiere tener un control completo del cuerpo

SGR
doStartTag() retorna un entero que puede ser: SKIP_BODY. Ignora lo que haya entre el inicio de etiqueta y el final de etiqueta. Contina con el resto de la pgina EVAL_BODY_INCLUDE. Evala el cuerpo que haya entre el inicio de etiqueta y el final de etiqueta. Slo TagSupport EVAL_BODY_TAG. Igual que el anterior, pero con ms control. Slo BodyTagSupport
1

doEndTag() retorna un entero que puede ser: SKIP_PAGE. Ignora el resto de la pgina HTML EVAL_PAGE. Contina normalmente la evaluacin del resto de la pgina
2

Como en cualquier otra etiqueta HTML, las etiquetas pueden tener atributos asociados. Si una etiqueta tiene asociado el atributo miAtributo, el sistema (antes de llamar a doStartTag()) busca y llama automticamente a una funcin llamada setMiAtributo(String) y que deberemos definir en la clase asociada a la etiqueta.
3

esta etiqueta. Contiene:

Tag Library Descriptor


<attribute> Diferentes atributos que puede contener esta etiqueta. Contiene: <name> Nombre del atributo <required> Si el atributo es obligatorio o no <rtexprvalue> Indica si el valor del atributo debe ser constante, o si puede ser una expresin JSP que vare de una ejecucin a otra de la pgina * Los atributos son siempre de tipo String y es necesario

posee como parmetros: uri La direccin del fichero .tld que contiene la directorio ROOT

SGR
convertirlos a su tipo correcto controlando posibles errores. * Para utilizar una biblioteca se emplea la directiva taglib que traduccin de las etiquetas. Direccin a partir del prefix Prefijo que deben tener todas las etiquetas que procedan del uri anterior. Se utiliza para evitar conflictos de etiquetas procedentes de varios tld * La ubicacin de un fichero .tld se puede indicar a travs del fichero de configuracin web.xml, de la forma:
<taglib> <taglib-uri>/myPRlibrary</taglib-uri> <taglib-location>/WEBINF/tlds/PRlibrary_1_4.tld</taglib-uri> </taglib>

de forma que en el fichero JSP se puede invocar simplemente como:


<%@ taglib uri=/myPRlibrary prefix=x %>

Etiquetas con cuerpo


* El cuerpo se encuentra entre el inicio de etiqueta y el final de etiqueta: <prefijo:etiqueta>cuerpo</prefijo:etiqueta> * El cuerpo puede contener cualquier componente de los que hay en el resto de la pgina Si no se desea un control especial sobre el cuerpo de una etiqueta, no es necesario heredar de BodyTagSupport, sino que en doStartTag() retornamos SKIP_BODY o EVAL_BODY_INCLUDE

depuracin

SGR
En el siguiente ejemplo se observa como es posible retornar cualquiera de sendas etiquetas en base a un condicin de
1 2

Podemos invocar a la pgina como:

http://localhost:8080/jsp/EjemploDebug.jsp o bien como: http://localhost:8080/jsp/EjemploDebug.jsp?debug=si segn queramos que aparezca el cuerpo o no * Ntese como el cuerpo tambin puede contener elementos JSP

</HTML>

Manipulacin del cuerpo


* Si se hereda de BodyTagSupport se incorporan varios mtodos nuevos: T doInitBody(). Se invoca automticamente antes de la primera evaluacin dle cuerpo T doAfterBody(). Se invoca automticamente despus de cada evaluacin del cuerpo. Puede retornar: SKIP_BODY. Finaliza la ejecucin del cuerpo EVAL_BODY_TAG. Reevala el cuerpo

SGR
De esta forma el cuerpo se evala una y otra vez mientras doAfterBody() retorne EVAL_BODY_TAG T getBodyContent(). Devuelve un objeto de tipo BodyContent * Un objeto de tipo BodyContent representa el resultado de haber evaluado el cuerpo de una etiqueta. Los cuerpos se evalan y el resultado se mete en un BodyContent. A continuacin, el BodyContent se suele volcar en out. BodyContent posee los siguientes mtodos: getString(). Devuelve una cadena que representa la evaluacin del cuerpo getReader(). Permite leer a travs de un Reader el BodyContent clearBody(). Resetea el contenido del BodyContent getEnclosingWriter() writeOut(Writer). Vuelca el contenido del BodyContent en el Writer especificado

</tag>

mbito de objetos
Fichero RepetirEjemplo.jsp
<HTML> <HEAD><TITLE>Algunos nmeros aleatorios</TITLE></HEAD> <BODY> <H1>Algunos nmeros aleatorios</H1> Cada nmero de la lista siguiente es un nmero aleatorio <%@ taglib uri="/WEB-INF/tlds/csajsp-taglib.tld" prefix="csajsp" %> <OL> <!-- Se repite N veces. Si reps es null se repite una sola vez. --> <csajsp:repetir reps='< %= request.getParameter("repeats") %>'> <LI><csajsp:example3 maximo="1000000" /> </csajsp:repetir> </OL> </BODY> </HTML>

SGR
* Como se observa en este y anteriores ejemplos, el nmero aleatorio que se obtiene es siempre el mismo, ya que por cada invocacin de una etiqueta se vuelve a crear un objeto de su clase asociada. Si un objeto se quiere reutilizar de una invocacin a otra en la misma pgina, se puede almacenar en el objeto request con: request.setAttribute(clave, objeto) y se recupera con request.getAttribute(clave) * Ejemplo que soluciona el problema (SimpleTag.java)
JspWriter out = pageContext.getOut(); ServletRequest request = pageContext.getRequest(); Random rnd = (Random) request.getAttribute("rnd"); if (rnd == null){ rnd = new Random(); request.setAttribute("rnd", rnd); out.println("Creando el Random()"); } out.print(rnd.nextLong() % maximo);

Bases de Datos
* En este ejemplo completo se ilustra la utilizacin de una base de datos mediante el uso de etiquetas anidadas *El cdigo JSP producido es muy similar al HTML con la ventaja con respecto a la legibilidad que ello conlleva * Las etiquetas que se usan son: T queryBlock que toma como parmetros el nombre de la fuente de datos (en ODBC). Opcionalmente podra incluir el nombre de usuario y la clave consulta SQL opcionales)

SGR

T queryStatement que tiene como cuerpo el texto de una T queryCreateRows que prepara la lectura del nmero de tuplas que se indique desde un inicio a un final (ambos T queryDisplay que visualiza el contenido del campo que se indique * Ejemplo de uso:
<html> <%@ taglib uri=http://acme.com/taglibs/simpleDB.tld prefix=x %> <x:queryBlock connData=conData1> <x:queryStatement> SELECT nombre, apellidos FROM Clientes </x:queryStatement> Los primeros diez clientes son: <table> <tr><th>ACCOUNT</th><th>BALANCE</th></tr> <x:queryCreateRows from=1 to=10> <tr> <td><x:queryDisplay field=nombre/></td> <td><x:queryDisplay field=apellidos/></td> </tr> </x:queryCreateRows> </table> </x:queryBlock> </html>

Etiquetas Java
Fichero QueryStatementTag.java
package jsp; import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; import java.sql.*; import java.io.*; public class QueryStatementTag extends BodyTagSupport{ public int doAfterBody(){ BodyContent body = getBodyContent(); try{ QueryBlockTag padre = (QueryBlockTag)findAncestorWithClass(this, QueryBlockTag.class); if (padre ==null) throw new SQLException("Padre es null"); Statement sentencia = padre.conexin.createStatement(); padre.resultado = sentencia.executeQuery(body.getString()); }catch(SQLException se){ } return SKIP_BODY; } }

package jsp; import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; import java.sql.*; import java.io.*;

SGR
Util.prueba(body.getEnclosingWriter(), "No se puede crear la sentencia.");

Fichero QueryDisplayTag.java

public class QueryDisplayTag extends TagSupport{ private String field; public int doStartTag(){ ResultSet resultado = ((QueryBlockTag)findAncestorWithClass(this, QueryBlockTag.class)).resultado; JspWriter out = pageContext.getOut(); try{ out.print(resultado.getString(field)); }catch(Exception ioe){ Util.prueba(out, "Imposible cargar el campo: "+ field); } return SKIP_BODY; } public void setField(String field){ this.field = field; } }

Descriptor de etiquetas
Fichero bbdd-taglib.tld
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE taglib PUBLIC "-//Sun MicroSystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd"> <taglib> <tlibversion>1.0</tlibversion> <jspversion>1.1</jspversion> <shortname>bbdd</shortname> <info>http://www.coreservlets.com/.</info> <tag> <name>queryBlock</name> <tagclass>jsp.QueryBlockTag</tagclass> <info>Comienzo de una consulta. Conexin</info> <attribute> <name>connData</name> <required>false</required> </attribute> </tag> <tag>

</tag> <tag>

SGR
<name>queryStatement</name> <tagclass>jsp.QueryStatementTag</tagclass> <info>Ejecuta una consulta que es su propio cuerpo</info> <name>queryCreateRows</name> <tagclass>jsp.QueryCreateRowsTag</tagclass> <info>Se posiciona al comienzo de la tupla deseada</info> <attribute> <name>from</name> <required>false</required> </attribute> <attribute> <name>to</name> <required>false</required> </attribute> </tag> <tag> <name>queryDisplay</name> <tagclass>jsp.QueryDisplayTag</tagclass> <info>Visualiza el campo que se indica</info> <attribute> <name>field</name> <required>false</required> </attribute> </tag> </taglib>

JSTL
El objetivo de JSTL (biblioteca de etiquetas estndar de Java) es facilitar el trabajo a los desarrolladores de JSP.
1

Desde un punto de vista general, JSTL proporciona las


2

siguientes capacidades:

SGR
Acciones de propsito general mediante un lenguaje de expresiones, atributos con mbito y captura de excepciones 2 Acciones de control de flujo dentro de una pgina JSP 3 Validaciones de bibliotecas de etiquetas que obligan a que un proyecto cumpla con ciertas reglas de estilo
1

* Desde el punto de vista de las bibliotecas concretas que suministra, JSTL nos da las siguientes: 1 Etiquetas de propsito general (gestin de variables) 2 Etiquetas de control de flujo y de iteracin 3 Etiquetas asociadas a URLs 4 Etiquetas de internacionalizacin y formateo 5 Etiquetas para trabajar con bases de datos 6 Etiquetas para trabajar con XML 7 Etiquetas de manipulacin de cadenas 8 * Como se ver a lo largo de nuestro estudio, JSTL

utiliza ciertas convenciones que hacen ms fcil al desarrollador el recordar la estructura interna de las etiquetas.

Lenguaje de expresiones
El lenguaje de expresiones (EL) sirve para facilitar la escritura de expresiones restringidas Java dentro de una pgina JSP.
1 2

Una expresin EL se escribe de la forma

${expresion} y entre las llaves puede usarse cualquier operador binario o unario que se quiera, ya sea matemtico, de cadena, relacional o lgico. Es muy til el operador unario empty para saber si algo es null o no. * Como operandos pueden usarse: Variables con mbito. Literales numricos, de cadena o lgicos. Componentes Java Beans. Colecciones. Funciones definidas en un fichero .tld * La gran ventaja de las expresiones EL es que son evaluadas por el propio motor JSP que las sustituye bajo demanda por el resultado de la evaluacin. Por tanto, las expresiones pueden usarse en cualquier lugar de una pgina JSP: 1 Como sustituta de un literal HTML 2 Como valor de un atributo de una etiqueta * Ejemplos: ${10 mod 3} devuelve 1 ${1 > 3} devuelve false <c:set var=numeroSS value=124578" /> ${numeroSS == 124578} devuelve true

Contenido expresiones
1

de

Una expresin EL unifica el uso del punto y de los corchetes. De esta guisa, expr-a.ident-b es equivalente a expr-a[identb]. Para evaluar expr-a[expr-b] se evala expr-a a valor-a y expr-b a valor-b, y en base a valor-a se hacen diferentes acciones:
2

b).

Si es null el resultado es null. Si es de tipo Map, se retorna valor-a.get(valor-

S
Si es de tipo List el resultado es valora.get((int)valor-b). Si es un array el resultado es Array(.get(valor-a, valor-b).

G
Si es un Java Bean se retorna la propiedad valor-b. * Las siguientes variables directamente (todas son listas): pueden usarse

R
param: lista con los nombres de los parmetros. paramValues: lista con los valores de los parmetros. header: lista con los campos de la cabecera. headerValues: lista con los valores de los campos de la cabecera. cookie: lista con los nombres de las cookies.

applicationScope: lista definidas en cada mbito. ,requestScope ,pageScope * Ejemplo:


<c:forEach item=unaCookie {unaCookie}<br> </c:forEach>

sessionScope y con las variables

values=${cookie}>

Core Tag Library


* Esta biblioteca posee etiquetas de propsito general, entre las que se incluyen las de manipulacin de variables y gestin de errores. El prefijo estndar para esta biblioteca es c. Para usarla hay que incluir en la pgina JSP: <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> * Las etiquetas ms importantes que posee son: 1 <c:out> utilizada con el mismo objetivo que el scriptlet

<c:if> emite por la salida el cuerpo que contiene slo si la condicin a que se refiere es cierta
2

<c:choose>, <c:when> y <c:otherwise> permiten formar una estructura de ifs en cascada con parte else
3

<c:forEach> permite recorrer una coleccin o un array, as como ejecutarse como un bucle FOR de BASIC
4

<c:forTokens> divide una cadena en trozos y se

ejecuta para cada trozo 6 * Las etiquetas de URL tambin forman parte de las core pero las veremos aparte por su complejidad.

<c:out >
* La sintaxis de esta etiqueta es: <c:out value=valor [escapeXml=true| false] [default=valorSiEsNull ] /> * Emite por la salida el valor del atributo value. Si este es nulo, se saca por pantalla el valor del atributo default.

S
Por defecto escapeXml est puesto a true, lo que quiere decir que se traducen algunos caracteres para evitar errores:
1

El valor dado al atributo value se convierte en String y se emite, a no se que sea un objeto de tipo java.io.Reader, en cuyo caso lo que se emite es el
2

resultado de leer por completo dicho canal de entrada.

Puede probarse como ejemplo con la pgina completa:


3

Cdigo Car de cter carct er < > &

G
&lt; &gt; &amp;

&#039; &#034;

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <c:out value="Trabajo en Gar & ca" />

<c:out> y Reader
* Sea el siguiente Bean:
package org.apache.jsp; import java.io.*; public class StringBean { private String nombreFichero = "Ningun nombreFichero"; public String getNombreFichero() { return(nombreFichero); } public void setNombreFichero(String nombreFichero) { this.nombreFichero = nombreFichero; } } } } public Reader getLector() throws IOException { return new FileReader(getNombreFichero());

public void setLector(String lector) {

* Y el JSP:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <jsp:useBean id="stringBean" class="org.apache.jsp.StringBean" /> <jsp:setProperty name="stringBean" property="lector" value="e:/prueba.txt" /> <c:out value="${stringBean.lector}"/><br> <c:out value="Otra cosa" /><br>

* La salida de la lnea marcada es el contenido del fichero e:\prueba.txt. De una sola tacada se ha emitido el contenido de un fichero entero.

<c:set> y <c:remove>
* La sintaxis de <c:set> es: . Para asignar valor a una variable con mbito <c:set value=valor var=nombreVar [scope=page|request|session| application] /> . Para asignar una propiedad a un Java Bean, o un elemento de un mapa <c:set value=valor />

sintaxis de <c:remove> es: target=nombreVar

SGR
property=nombrePropiedad . Para establecer un valor en diferido. Un valor diferido quiere decir que se asigna una expresin que se evala de forma perezosa, o sea, no en este momento, sino cuando se utilice la variable.

Realmente esto slo tiene utilidad cuando se trabaja con JSF (Java Server Faces) y no volveremos a tratar el tema. * <c:remove> slo tiene sentido para variables con mbito. La

emove var=nombreVar [scope=page|request| session|application] /> <c:set> hace asignaciones a variable con mbito o a propiedades de Java Beans o a datos de Mapas. <c:remove> elimina variables con mbito. 2 El subrayado quiere decir que slo pueden especificarse literales.
1

<c:catch >
* La sintaxis de <c:catch> es: <c:catch [var=nombreVar]> // Acciones que pueden excepciones </c:catch>
1

producir

<c:catch> permite capturar excepciones dentro de bloques JSP. La idea es que los errores graves no sean capturados, sino que
2

tanto, lo que suele venir a continuacin del <c:catch> es una accin condicional que testa dicha variable para hacer la accin correctora que sea. * Sino se quiere incluir accin correctora, entonces incluso puede omitirse el atributo var de <c:catch>.

Ejemplo con core


* En este ejemplo se ve el uso de <c:set> (no olvidar la directiva taglib:
<c:set var="aux" value="1" /> ${aux}<br> <c:set var="aux" value="${aux + 1}" /> ${aux}<br> <c:set var="cadena" value="mi nombre" /> ${cadena}<br> <c:set var="cadena" value="${cadena} es Sergio" /> ${cadena}<br>

S
* Como puede verse, la concatenacin de cadenas se hace mediante una mera yuxtaposicin.

G
* En este ejemplo se ve el uso de <c:catch>:
<c:catch var="fallo"> Esto sale bien<br> <%

if (1==1) throw new Exception("Fallo que se me ocurre"); Esto ya no sale<br> </c:catch> ${fallo}<br> Continua la cosa bien<br> * Si se quita la clusula <c:catch> se produce un fallo en la pgina y no se carga nada. >%

Etiquetas de control de flujo 1 A menudo una pgina debe devolver al cliente diferentes textos en funcin de los datos de entrada o almacenados en una base de datos. 2 Estas etiquetas evitan el tener que recurrir a Java directamente, lo que suele ser propenso a errores debido al uso intensivo de llaves. 3 No tienen la misma potencia que las sentencias de control de flujo en Java, sino que simulan bsicamente un if sin else y la sentencia if en cascada. 4 No existe nada parecido a un for, while o do while. Las nicas sentencias de bucle que hay son las que permiten recorrer estructuras y, por ello, estn ms asociadas al concepto de iterador que al de control de flujo. Por esto no las veremos en este apartado, sino ms adelante.

<c:if> * La sintaxis de <c:if> es: <c:if test=condicion [var=nombreVar [scope=page|request|session|application]] > // Acciones que se ejecutan si la condicion se cumple </c:if> S * Si la etiqueta <c:if> se autocierra y se indica un nombre de variable, entonces es como si se utilizara para cargar un valor booleano en dicha variable.

G * Como puede verse, esta etiqueta carece de clusula else. El motivo es que la clusula else, utilizada a discrecin, se convierte en unos ifs en cascada mutuamente excluyentes; y para eso, la biblioteca core suministra otras etiquetas * Ej. de control: R

<c:if test="${ empty param.nombre}" > Se le ha olvidado escribir un valor para el nombre.<br> </c:if> Puede probarse a cargar una pgina que contenga esto psando o no pasando en la direccin URL el parmetro nombre.

* Ejemplo de carga de valor booleano: <c:if var="existeNombre" test="${ empty param.nombre}" /> $ {existeNombre}<br>

<c:when> y <c:otherwise> * Estas tres etiquetas se emplean conjuntamente segn la siguiente sintaxis <c:choose> <c:when test=condicion1> // Cuerpo que se emite si condicion1 es cierta </c:when> <c:when test=condicion2>

</c:when> .... <c:otherwise>

</c:otherwise> </c:choose> * La estructura de estas etiquetas es la intuitiva: una vez entrado en un <c:choose> se evalan los <c:when> en secuencia; en el primero en que la condicin sea cierta, se emite su cuerpo y se sale del <c:choose>. Si todas las condiciones son falsas se emite el cuerpo de <c:otherwise>.

Ejemplo con <c:choose> * El siguiente ejemplo completo comprueba los parmetros de entrada a un formulario y emite diferentes salida en base a estos: <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <h3>Saludos</h3> <c:choose> <c:when test="${empty param.nombre}" > Necesito un nombre.<br> </c:when> <c:when test="${empty param.tiempo}" > S Necesito un tiempo.<br> </c:when> G

<c:otherwise> Hombre ${param.nombre}!.<br> Cunto tiempo sin verte!<br> Qu da ms ${param.tiempo} hace.<br> </c:otherwise>

</c:choose> R

Etiquetas para recorridos 1 Este tipo de etiquetas permite repetir la emisin de un trozo JSP en base al nmero de elementos de una coleccin, array, etc. 2 Tambin se permite la iteracin sobre mapas y sobre iteradores y enumeradores. Con estos ltimos hay que tener cuidado ya que no se pueden resetear y no pueden recorrerse, a su vez, varias veces. 3 Tambin es posible realizar recorridos un nmero determinado de veces, con variables lmite de inicio, final y paso. 4 El desarrollador puede hacer uso de la clase LoopTag para construir sus propias etiquetas que interaccionen con <c:forEach>

<c:forEach> 1 La sintaxis es diferente segn se recorra una estructura o se itere un determinado nmero de veces. 2 La sintaxis que recorre una estructura es: S

<c:forEach [var=nombreVar] items=coleccion [varStatus=nombreVarEstado] [begin=comienzo] [end=final] [step=paso] >

// Cuerpo a repetir </c:forEach> G

* Para ejecutarse un determinado nmero de veces, la sintaxis

es: R

<c:forEach [var=nombreVar] [varStatus=nombreVarEstado] begin=comienzo end=final [step=paso] >

// Cuerpo a repetir </c:forEach> * Ejemplo que saca los nmeros del 1 al 20:

<c:forEach var="cont" begin="1" end="20"> $ {cont}<br> </c:forEach>

<c:forEach> 1 La sintaxis de la ejecucin un determinado nmero de veces parece clara: la variable nombreVar parte del valor comienzo hasta el valor final incrementndose en cada iteracin por paso unidades. 2 Si el recorrido de una coleccin hace uso de begin y dems, quiere decir que se comienza en el tem de la coleccin situado en posicin comienzo. Si hay menos tems que comienzo, entonces el bucle ni se ejecuta. El primer elemento de la que son del tipo Map.Entry. 1 Como coleccin tambin puede indicarse un array tradicional e incluso un String. En este ltimo caso, se supone que el String posee palabras separadas por comas, y el <c:forEach> se ejecuta para cada una de tales palabras. La coma hace las veces de carcter delimitador. 2 Ejemplo de recorrido de los elementos de la cabecera (header):

<c:forEach var="elemento" items="${header}"> $ {elemento}<br> -> ${elemento.value}<br> </c:forEach>

<c:forTokens> 1 El comportamiento de <c:forTokens> es muy parecido al de <c:forEach> cuando se recorre un String. En el caso de <c:forTokens> esposible indicar nuestros propios delimitadores. 2 La sintaxis de esta etiqueta es: S <c:forTokens items=cadenaDeTokens delims=delimitadores [var=nombreVar] [varStatus=nombreVarEstado] [begin=comienzo]

G [end=final] [step=paso] > // Cuerpo a repetir </c:forEach> R * El funcionamiento de esto es como el de un StringTokenizer que tiene como argumentos la cadenaDeTokens y los delimitadores. * Ntese la diferencia entre: <c:forEach var="elemento" items="uno, dos, tres, cuatro,"> ${elemento}<br> </c:forEach> Adios.<br> y <c:forTokens var="elem" items="uno,dos,tres,cuatro," delims=",o" > ${elem}<br> </c:forTokens> Adios.<br>

Transferencia de variables

* En el siguiente ejemplo se puede apreciar cmo intercambiar informacin entre un scriptlet y el entorno JSP. <% int[] miLista = new int[]{1, 3, 5, 7, 11, 13, 17, 19, 23, 29}; pageContext.getSession().putValue("miArray", miLista); %> <c:forEach var="elemento" items="${miArray}" > $ {elemento}<br> </c:forEach>

%> ${numero}<br> <c:set var="numero" value="16" scope="session" /> ${numero}<br> <%= miNumero %><br> <% miNumero = Integer.parseInt(pageContext.getSession(). getValue("numero").toString()); %> <%= miNumero %><br> Adios.<br>

Etiquetas para URLs * Las diversas etiquetas suministradas permiten, entre otras cosas: Asignar un nombre a una URL para usarla varias veces en la pgina JSP. Asociar parmetros a una URL sin codificarlos en la direccin en s. Importar contenidos de cualquier URL de internet (y no slo de recursos locales, como hace <jsp:include>). variable Importar contenidos y meterlos en una variable String o SGR Reader, en lugar de emitirlos directamente. Una URL puede ser absoluta, relativa, o relativa a un contexto diferente del de la pgina en que est. Redirigir la carga de la pgina a la URL que se indique. * Las etiquetas disponibles son: . <c:import> para disponer de contenidos de cualquier lugar de internet, ya sea in line o metindolos en una . <c:url> permite hacer referencia a una URL y meterla en una variable. Tambin permite indicar parmetros a la URL de forma fcil . <c:redirect> permite redirigir la carga de la pgina. . <c:param> permite pasar parmetros a una URL sin indicarlos directamente en la direccin.

<c:url> 1 Permite construir una URL completa rescribiendo las partes que sean necesarias. 2 La sintaxis de esta etiqueta es:

<c:url value=direccin [context=contexto] [var=nombreVar] [scope=page|request|session|application] > <c:param ...> <c:param ...> </c:url>

sistema se encarga de rescribirla convenientemente. 1 Si la direccion contiene caracteres raros, stos no son rescritos por el sistema. 2 Por defecto, la URL resultante es emitida (a travs del JspWriter actual); pero en lugar de esto puede almacenarse en una variable especificada en el atributo var. 3 Pueden indicarse parmetros, que se aadirn a la URL construida mediante la correspondiente recodificacin.

<c:param> 1 2 Permite aadir parmetros de forma indirecta a una URL. La sintaxis es:

m name=nombreParam value=valorParam /> o bien, si el valor del parmetro es muy complicado: <c:param name=nombreParam > valorParam </c:param> S G * Aunque hacer uso de esta etiqueta puede considerarse redundante, ya que se puede escribir directamente en la URL, hay que reconocer que el cdigo queda mucho ms claro. Adems, este mtodo es consistente con el utilizado por

<jsp:include>, que tambin puede contener <jsp:param>. R * He aqu un ejemplo de uso: <h3>Saludos</h3> <c:url value="http://www.google.es/search" var="google" > <c:param name="hl" value="es" /> <c:param name="q" value="$ {param.consulta}" /> </c:url> <a href="${google}">${google}</a><br> Pincha <a href="$ {google}">aqu</a> para ir al mismo sitio.

<c:import> 1 Esta etiqueta se va a la URL especificada y: o la mete en lnea donde se encuentra el <c:import>, o la mete en un objeto Reader para que las acciones siguientes hagan lo que quieran con el contenido. 2 En el primer caso la sintaxis es:

<c:import url=direccion [context=contexto] [var=nombreVar]

> <c:param ...> <c:param ...> </c:import> * Y en el segundo: <c:import url=direccion [context=contexto] varReader=nombreVarReader [charEncoding=codificacion] > // Cuerpo en el que consumir desde nombreVarReader </c:import> * Con la segunda sintaxis no se aceptan parmetros porque se confundiran con el cuerpo que consume el canal de entrada: no se sabra cundo acaban los parmetros y cundo hay que abrir el canal.

<c:redirect> * La sintaxis es:

rect url=direccion [context=contexto] /> * Tambin es posible indicar parmetros a esta URL, con lo que la etiqueta <c:import> quedara abierta. S * Esta etiqueta cancela el procesamiento de la pgina y redirige la carga hacia la URL indicada que: Puede ser absoluta, relativa o relativa a un contexto. El contexto, como en casos anterior, debe empezar por /. Puede poseer parmetros de la forma <c:param>. * Ejemplo de uso:

G <h3>Saludos</h3> <c:redirect url="StringBean.jsp" /> R * Como puede observarse, el <c:redirect> puede usarse incluso

despus de haber emitido ya algo.

Ejemplo de <c:import> * El ejemplo que vimos de <c:out > y Reader se podra haber hecho como: <h3>Saludos</h3> <c:import url="file:///e:/prueba.txt" /> Adis<br> * Tambin el texto que se lee se puede meter en una variable de mbito y leerlo lnea a lnea: <h3>Saludos</h3> <c:import url="file:///e:/prueba.txt" var="lector" /> <c:forTokens var="elemento" items="${lector}" delims='< %="\n"%>' > ${elemento} -- </c:forTokens> <br> Adis<br> * Tambin puede hacerse con un Reader: <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@page import="java.io.*" %> <h3>Saludos</h3> <c:import url="file:///e:/prueba.txt" varReader="lector" > BufferedReader in = new BufferedReader( (Reader)(pageContext.findAttribute("lector"))); String s; while((s = in.readLine()) != null) out.println(s+"<br>"); </c:import> Adios.<br> %<

>%

SQL Tag Library * El prefijo estndar para esta biblioteca es sql. Para usarla hay que incluir en la pgina JSP: <%@ taglib uri="http://java.sun.com/jstl/sql" prefix="sql" %> * Esta biblioteca permite: 1 Ejecutar consultas con SELECT. 2 Acceder fcilmente a los resultados de una consulta. 3 Ejecutar actualizaciones con INSERT, UPDATE y DELETE. 4 Agrupar operaciones SQL en una transaccin. 5 Cambiar rpidamente de base de datos. S * Las operaciones de esta biblioteca trabajan con objetos de tipo DataSource que retorna uno de tipo Connection. El DataSource sirve para hacer referencia a una base de datos en concreto. G

* El DataSource con que trabajar puede especificarse de varias formas: R

Directamente en el atributo dataSource de algunas etiquetas, de dos formas: dando directamente la informacin que necesita el DriverManager: url [, driver] [, usuario, contrasea]. Ej.: jdbc:pointbase:server://localhost:9092/sample, com.pointbase.jdbc.jdbcUniversalDriver,pbPublic,pbPublic dando un valor de JNDI que ser traducido por el motor JNDI a la informacin necesaria de acceso a la base de datos. Este mtodo tiene la ventaja de que permite acceder a un pool de conexiones. Como valor del atributo de configuracin: javax.servlet.jsp.jstl.sql.dataSource

<sql:setDataSource> 1 Esta etiqueta permite especificar la fuente de datos de las etiquetas sql que vendrn a continuacin. No obstante, no es obligatorio especificarlo, puesto que la fuente de datos tambin puede indicarse como atributo de un inicio de transaccin. 2 La sintaxis es:

<sql:setDataSource var=nombreVar [scope=page|request|session| application] [ |

] /> * El campo fuenteDeDatos, si se especifica, debe ser del tipo javax.sql.DataSource.

<sql:transaction> * La sintaxis de esta etiqueta es: <sql:transaction [dataSource=fuenteDeDatos] [isolation= read_uncommited | read_commited | repeatable_read | serializable ] > // Cuerpo HTML que puede hacer uso de // cuantas sentencias SQL se quiera </sql:transaction>

contrario. el anterior: SGR 1 La transaccin ejecuta automticamente el COMMIT o el ROLLBACK. El ROLLBACK lo ejecuta si captura alguna excepcin en la ejecucin del cuerpo, y el COMMIT en caso 2 Cada tipo de aislamiento en la transaccin es ms potentes que

read_uncommited: lo lee todo, hasta lo que todava no se le ha hecho un COMMIT. read_uncommited: no hace lecturas sucias (datos a los que no se ha hecho un COMMIT; pero s pueden suceder relecturas ambiguas: una transaccin lee un registro, otra transaccin modifica el registro, y la primera vuelve a leer el registro otra vez, pero con un valor diferente! repeatable_read: no hace relecturas ambiguas; pero s pueden suceder lecturas fantasma: una transaccin lee registros con WHERE, otra transaccin mete un nuevo registro que satisface la condicin, y la primera vuelve a leer los registros otra vez, pero con un nuevo registro aparecido! serializable: evita todos los problemas de inconsistencia.

<sql:query> * La sintaxis de esta etiqueta es: <sql:query var=nombreVar [scope=page|request|session| application] [dataSource=fuenteDeDatos] [startRow=numRegistroInicio] [maxRows=numMaxRegistrosDevueltos] > // de cada parmetro <sql:param ...> <sql:param ...> </sql:query>

interrogacin ?. Las posteriores etiquetas <sql:param> permiten sustituir cada uno de estos parmetros por un valor real. 1 La sentencia SELECT se ejecuta contra el DataSource especificado en la etiqueta <sql:transaction> dentro de la que se incluye, o bien contra el especificado en su atributo dataSource. 2 La variable indicada en el atributo var sirve para referenciar el resultado que devuelve la sentencia SELECT ejecutada y posee gran cantidad de campos.

Lo que retorna <sql:query> * El objeto retornado en var por <sql:query> pertenece a la interfaz: public interface Result { public String[] getColumnNames(); public int getRowCount() public Map[] getRows(); public Object[][] getRowsByIndex(); public boolean isLimitedByMaxRows();

}
S* El siguiente ejemplo muestra cmo procesar un SELECT simple: G <sql:transaction dataSource="jdbc:pointbase:server://localhost:9092/sample,co m.pointbase.jdbc.jdbcUniversalDriver,pbPublic,pbPublic" >

<sql:query var="clientes"> SELECT name FROM customer_tbl </sql:query> R

<c:forEach var="cliente" items="${clientes.rows}" > ${cliente.name}<br> </c:forEach> </sql:transaction> ----------<br> * Es posible procesar un SELECT genrico haciendo uso de los componentes de los mtodos de la interfaz Result.

Recursos de Tomcat 1 Para no tener que estar repitiendo constantemente en cada pgina los datos de una DataSource, es posible especificar en el fichero server.xml de Tomcat un recurso DataSource, darle un nombre, y luego usarlo en las etiquetas JSTL por su nombre. 2 De esta forma, cualquier modificacin a la cadena de conexin queda centralizada en la declaracin de este recurso en server.xml. 3 Ejemplo: driverClassName="oracle.jdbc.driver.OracleDriver" url="jdbc:oracle:thin:@localhost:1521:orcl"/> </Context> que slo ser accesible a las pginas JSP del contexto %TOMCAT_HOME %\webapps\patata5 * Una transaccin har uso de este recurso de la forma. <sql:transaction dataSource="jdbc/orcl" >

Uso de la interfaz Result * El siguiente es un ejemplo completo de acceso genrico a bases de datos: <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %> <h3>Consulta genrica</h3> <sql:transaction dataSource="jdbc:pointbase:server://localhost:9092/sample,co m.pointbase.jdbc.jdbcUniversalDriver,pbPublic,pbPublic" > S

<sql:query var="clientes"> select * from customer_tbl </sql:query> <table border="1">

<tr>

G
R

rEach var="nombreCampo" items="${clientes.columnNames}" > <th>$ {nombreCampo}</th> </c:forEach> </tr> <c:forEach var="registro" items="$ {clientes.rowsByIndex}" > <tr>

<c:forEach var="datoCampo" items="${registro}" > <td>${datoCampo}</td> </c:forEach> </tr> </c:forEach> </table> </sql:transaction> ----------<br>

<sql:param> y <sql:dateParam> * Esta etiqueta sirve para pasar parmetros a sentencias SQL preparadas. La sintaxis es: <sql:paramvalue=valor /> o bien <sql:param> // valor del parmetro </sql:param> * Esta etiqueta sirve para sustituir los smbolos ? que se hayan incluido en la sentencia SQL dentro de la cual se enmarca el propio <sql:param>. Sirve para indicar parmetros de cualquier tipo excepto fecha, para lo cual se usa la etiqueta <sql:dateParam> cuya sintaxis es: <sql:dateParam value=valorDeTipoDateDeJava type=timestamp | time | date /> * Lo ms normal es que los parmetros de entrada a una pgina JSP sean los que se utilicen para parametrizar una consulta SQL. Estos parmetros entrada deberan validarse antes de enviarlos a la consulta.

>% Ejemplo de <sql:query> * El siguiente es un ejemplo de pgina completa: <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %> <h3>Consulta genrica</h3> <c:choose> <c:when test="${empty param.limite || empty param.hora}"> <form action="index.jsp" method="GET"> Lmite de crdito: <input size=10 name="limite" value="0" /><br> Hora a partir de la cual: <input size=8 name="hora" value="0:0" /><br> <input type=submit value="Buscar" /> </form> </c:when> <c:otherwise> S <% pageContext.setAttribute("horaDate", new java.util.Date("1/1/1 "+ request.getParameter("hora"))); G <sql:transaction dataSource="jdbc:pointbase:server://localhost:9092/sample, com.pointbase.jdbc.jdbcUniversalDriver,pbPublic,pbPublic"> R <sql:query var="clientes"> SELECT name, credit_limit, last_sale_time FROM customer_tbl WHERE credit_limit >= ? AND last_sale_time > ?

<sql:param value="${param.limite}" /> <sql:dateParam value="${horaDate}" type="time" /> </sql:query> <table border="1"> <c:forEach var="cliente" items="${clientes.rows}" > <tr> <td>${cliente.name}</td> <td>$ {cliente.credit_limit}</td> <td>$ {cliente.last_sale_time}</td> </tr> </c:forEach> </table> </sql:transaction> </c:otherwise> </c:choose>

<sql:update> * Esta etiqueta permite ejecutar cualquier sentencia SQL que no sea un SELECT. La sintaxis es: <sql:update [var=nombreVar] [scope=page|request|session|application] [dataSource=fuenteDeDatos] > // Sentencia SQL de DDL o DML con el smbolo ? // en el lugar de cada parmetro <sql:param ...> <sql:param ...> </sql:update>

UPDATE y DELETE. 1 Con esta etiqueta tambin pueden crearse tablas, borrarlas, cambiarlas, crear restricciones, etc. 2 Ejecutar <sql:update sql=rollback /> o <sql:update sql=commit /> no est permitido y puede producir resultados impredecibles.

Ejemplo de <sql:update> * El siguiente ejemplo crea una tabla, la rellena, la visualiza y la borra: <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %> <h3>Procesamiento</h3> <sql:transaction dataSource="jdbc:pointbase:server://localhost:9092/sample, com.pointbase.jdbc.jdbcUniversalDriver,pbPublic,pbPublic" > S <sql:update> CREATE TABLE a (campo1 NUMBER) </sql:update>

<c:forEach var="contador" begin="1" end="20" step="3" > G <sql:update> INSERT INTO a VALUES (?) <sql:param value="$ {contador}" /> </sql:update> R </c:forEach> <sql:query var="registros" > SELECT campo1 FROM a </sql:query> <c:forEach var="registro" items="${registros.rows}"> ${registro.campo1}<br> </c:forEach> <sql:update> DROP TABLE a </sql:update> </sql:transaction> ----------<br>

I18n Formatting Tag Library * Esta biblioteca posee etiquetas que permiten formatear una pgina en base a un idioma seleccionado posibilitando que sea leda por personas de todo el mundo. El prefijo estndar para esta biblioteca es fmt. Para usarla hay que incluir en la pgina JSP: <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> * Hace uso de los conceptos de internacionalizacin que ya se han estudiado en captulos anteriores. Algunas etiquetas interesantes son: . <fmt:setLocale> especifica el Locale actual. . <fmt:bundle> especifica el nombre base de los ficheros de recursos. . <fmt:message> emite el mensaje de cdigo especificado en el idioma del Locale actual. El mensaje lo busca en el fichero de recursos del bundle actual. Se le pueden pasar parmetros. . <fmt:requestEncoding> sirve para trabajar con parmetros que proceden de un cdigo diferente al ISO8859-1. * Nosotros nos vamos a centrar principalmente en las etiquetas de formateo. <fmt:timeZone> y <fmt:setTimeZone> no las veremos.

<fmt:formatNumber> y <fmt:parseNumber> * Estas etiquetas permiten emitir un nmero que siga el formato que se le indice, as como traducir un texto a un nmero siguiendo un patrn concreto de anlisis. Las sintaxis son: <fmt:formatNumber value=valorNumrico [var=nombreVar] [scope=page|request|session|application]

SGR [type=number | currency | percent ] [pattern=patronPersonalizado] [currencyCode=codigoDeMoneda] [currencySymbol=simboloDeMoneda] [groupingUsed=true | false ] [maxIntegerDigits=maximoNumeroDeDigitos] [minIntegerDigits=minimoNumeroDeDigitos] [maxFractionDigits=maximoNumeroDeDecimales] [minFractionDigits=minimoNumeroDeDecimales] /> y <fmt:parseNumber value=valorNumricoEnUnaCadena [var=nombreVar] [scope=page|request|session|application] [type=number | currency | percent ] [pattern=patronPersonalizado] [parseLocale=LocaleDelParser] [integerOnly=true | false] />

<fmt:formatNumber> y <fmt:parseNumber> 1 El patrn de formateo debe seguir las reglas de la clase java.text.DecimalFormat. 2 El atributo groupingUsed permite decir si se va ausar algn carcter de agrupacin. Ver java.text.NumberFormat. setGroupingUsed() para ms informacin. 3 Por ejemplo, el formateo :

<fmt:formatNumber value="${100000000 / 3}" type="currency" currencySymbol="" groupingUsed="true" maxIntegerDigits="4" maxFractionDigits="2" minFractionDigits="2" /> produce: 3.333,33 as que cuidado con maxIntegerDigits, ya que el resultado debiera haber sido: 33.333.333,33

<fmt:formatDate> y <fmt:parseDate> * Estas etiquetas permiten trabajar con fechas. Las sintaxis son: <fmt:formatDate value=valorDeFecha [var=nombreVar] [scope=page|request|session|application] [type=date | time | both]

/> y <fmt:parseDate [pattern=patronPersonalizado] SGR [dateStyle=default | long | medium | short | full] [timeStyle=default | long | medium | short | full] [timeZone=zonaTemporal]

value=valorFechaEnUnaCadena [var=nombreVar] [scope=page| request|session|application] [type=date | time | both] [pattern=patronPersonalizado] [dateStyle=default | long | medium | short | full] [timeStyle=default | long | medium | short | full] [timeZone=zonaTemporal] [parseLocale=LocaleDelParser] /> * dateStyle y timeStyle siguien el formateo de java.text.DateFormat.

<fmt:formatDate> y <fmt:parseDate> * Algunos ejemplos de funcionamiento son: <jsp:useBean id="ahora" class="java.util.Date" /> <fmt:formatDate value="${ahora}" /><br> <fmt:formatDate value="${ahora}" type="both" /><br> <fmt:formatDate value="${ahora}" type="time" /><br> <fmt:formatDate value="${ahora}" type="time" timeStyle="short" /><br> <fmt:formatDate

cuya salida es: 30-ene-2006 30-ene-2006 20:46:56 20:46:56 20:46 30/01/2006

I18n Formatting Tag Library 1 El lenguaje de expresiones define el concepto de funciones para permitir a los desarrolladores crear sus propias extensiones a este lenguaje. El prefijo estndar para esta biblioteca es fn. Para usarla hay que incluir en la pgina JSP: <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> 2 Esto no son etiquetas realmente, sino funciones con prefijo que pueden usarse en el interior de una expresin del lenguaje de expresiones.

boolean SGR * Las funciones son las siguientes: De bsqueda en cadenas: .fn:contains(string, substring) devuelve boolean .fn:containsIgnoreCase(string, .fn:endsWith(string, sufijo) devuelve boolean .fn:startsWith(string, prefijo) devuelve boolean .fn:indexOf(string, substring) devuelve int. La primera substring) devuelve

posicin de string es la 0. Si no est se devuelve -1. De obtencin de subcadenas: .fn:substring(string, beginIndex, endIndex) devuelve String. Las posiciones comienzan a partir de la 0. El carcter en beginIndex se incluye y el de enIndex se excluye. .fn:substringAfter(string, substring) devuelve String .fn:substringBefore(string, substring) devuelve String

Funciones (cont.) Traduccin de cadenas: .fn:replace(inputString, beforeSubstring, afterSubstring) devuelve String .fn:toLowerCase(string) devuelve String .fn:toUpperCase(string) devuelve String .fn:trim(string) devuelve String. Elimina los espacios a ambos extremos de la cadena. Gestin de arrays y cadenas: .fn:length(input) devuelve integer. La entrada puede ser una cadena o un array o una coleccin y devuelve su longitud o el nmero de elementos respectivamente.

Otras: .fn:escapeXml(string) devuelve String. Vase el atributo escapeXml de <c:out>.

Ejemplos de funciones * Algunos ejemplos son: <%-- Trunca el nombre a 30 caracteres y lo visualiza en maysculas --%> $ {fn:toUpperCase(fn:substring(nombre, 0, 30))} <%-- Visualiza el texto que precede al primer asterisco --%> ${fn:substringBefore(texto, *)} <%-- La variable custId puede tener espacios en blanco en los extremos. Esto los quita --%> <c:url var="myUrl" value="${base}/cust"> <c:param nombre="custId" value="${fn:trim(custId)}"/> </c:url>

S <%-- Visualiza el texto entre parntesis --%>

R <%-- Visualiza los ltimos 10 caracteres --%> ${fn:substring(text, fn:length(texto)-10)} <%-- Visualiza un valor con bolillas en vez de guiones --%>

${fn:replace(texto, -, &#149;)}

XML Tag Library * Esta biblioteca posee etiquetas que permiten analizar, procesar y buscar informacin dentro de un documento XML. El prefijo estndar para esta biblioteca es x. Para usarla hay que incluir en la pgina JSP: <%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="xml" %> * No entraremos en detalle en sus etiquetas. Baste decir que son: . <x:parse> que analiza un documento XML y puede devolver un org.w3c.dom.Document. . <x:out> que evala una expresin Xpath y emite el resultado. . <x:set> igual al anterior pero guarda el resultado en una variable. ,<x:if> <x:otherwise> y <x:forEach> para contenidos basados en expresiones Xpath. . <x:transform> y <x:param> para aplicar hojas XSLT a un documento XML.

You might also like