Programación en Java. Cursos de verano, Acción Estudiantil, 2003.

-1-

Capítulo 15: Introducción a JSP
* El estándar HTML propone el suministro de información mediante páginas estáticas. De esta forma es imposible suministrar páginas creadas al momento en base a requisitos del cliente. Ej: consultar una base de datos desde una página HTML y obtener otra página automáticamente sólo con los resultados deseados. * Otras tecnologías empleadas tradicionalmente han sido CGI, ASP, PHP.

S * Las principales ventajas de JSP sobre ellas son: • Mayor encapsulamiento:G T Uso de clases T Uso de JavaBeans R • Mayor escalabilidad
• • •

Uso de tags: similitud con HTML Mayor portabilidad Uso de un lenguaje estándar y muy difundido

* El lenguaje en que actualmente está basado JSP es Java
* Realmente una página JSP se convierte en un servlet que es quien se encarga de la comunicación con el cliente

Capítulo 15: Introducción a JSP.

Programación en Java. Cursos de verano, Acción Estudiantil, 2003.

-2-

Funcionamiento
* ¿Cuál es el funcionamiento básico? Muy sencillo: 1) El cliente solicita una página .jsp (en lugar de .html) 2) La solicitud llega al servidor 3) El servidor «ejecuta» la página .jsp y obtiene un texto en formato html 4) El servidor envía el texto html al cliente 5) El navegador del cliente visualiza el texto html como si realmente hubiera estado almacenado en el servidor * ¿Que hay dentro de un fichero .jsp? Un fichero .jsp es un fichero .html que tiene dentro «algunas cosas» que se pueden ejecutar y que producen como resultado más html * El siguiente dibujo resume el funcionamiento:

* Realmente, la solicitud de la página JSP le llega (en nuestros ejemplos) al motor JSP a través del puerto 8080
Capítulo 15: Introducción a JSP.

Programación en Java. Cursos de verano, Acción Estudiantil, 2003.

-3-

Instalación
* El motor o servidor JSP puede ser el JSWDK, o bien Apache Tomcat * Usaremos Tomcat ya que tiene soporte para tags. JSWDK no * Consideraciones de instalaciones de Tomcat: • Quitar el start de la invocación 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 • 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 .tld • 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 páginas JSP • La ubicación de los ficheros .tld se puede indicar a través del fichero /conf/web.xml

S G R

* Estas consideraciones de instalación son buen funcionamiento del servidor Tomcat

básicas para el

Capítulo 15: Introducción a JSP.

Programación en Java. Cursos de verano, Acción Estudiantil, 2003.

-4-

Componentes JSP
* Los componentes que se pueden meter enmedio de una página HTML para hacerla dinámica (hacerla JSP) son:

L

Expresiones: son de la forma: <%= expresión Java %> El motor traduce la expresión por la cadena que resulta de evaluarla Declaraciones: son de la forma: <%! declaraciones Java %> Lo que se escriba aquí será global a toda la página JSP (realmente se inserta tal cual en el cuerpo del servlet fuera de todo método) Pueden incluirse declaraciones de variables y de funciones Scriplets: son de la forma: <% código Java %> Código Java que se ejecutará en el punto concreto de la página JSP en que se encuentra

L

L

Capítulo 15: Introducción a JSP.

%> Permiten definir la estructura de todo el documento JSP. -5- Componentes JSP L Comentarios: son de la forma: <%-. 2003.jsp sea lo más parecido al . Las tres directivas existentes son: O <%@ page . %> O <%@ include file=”URL relativa” %> Sirve para incluir un fichero dentro de otro en el momento en que la página JSP se convierte en servlet O <%@ taglib . . Su utilidad principal es para comunicarse con los JavaBeans de forma que el código dela página .Programación en Java. Se procesan en el momento de convertir la página JSP en un servlet. %> L S G R L Etiquetas jsp: son de la forma: <jsp:etiqueta atributos /> Realizan operaciones diversas. Realmente indican aspectos básicos del servlet en que se convertirá el fichero JSP en que se encuentra..comentario –%> No se envían al cliente Directivas: son de la forma: <%@ directiva atributo1=" valor1" atributo2=" valor2" . Acción Estudiantil......html Capítulo 15: Introducción a JSP. Cursos de verano.

¡Así de sencillo! * Con esto lo único que conseguimos es que la página nos la sirva el servidor JSP en lugar del servidor web * Una vez visto que todo funciona bien. Acción Estudiantil. Cursos de verano.Programación en Java.jsp.getParameter("testParam") %> </UL> </BODY> </HTML> * Esta página puede ser llamada como: http://localhost:8080/jsp/Ejemplo. podemos probar con algo sencillo.toLocaleString() %> <LI>Su máquina: <%= request.getId() %> <LI>El parámetro <CODE>testParam</CODE>: <%= request.jsp?testParam=alguna+cosa Capítulo 15: Introducción a JSP.Date(). tal como <HTML> <HEAD> <TITLE>Expresiones JSP</TITLE> </HEAD> <BODY> <H2>Expresiones JSP</H2> <UL> <LI>Fecha actual: <%= new java.util. 2003. -6- Primer ejemplo * El ejemplo más sencillo consiste en cambiarle la extensión a cualquier fichero .getRemoteHost() %> <LI>Su ID de sesión: <%= session.html y ponerle . así como colocarlo en un sitio donde el servidor JSP la pueda encontrar. .jsp o como http://localhost:8080/jsp/Ejemplo.

Muy utilizado en las etiquetas para obtener el resto de objetos anteriores (que no son visibles en las etiquetas) S G R Capítulo 15: Introducción a JSP. * Los objetos más útiles que se nos suministran son: • request de tipo HttpServletRequest.Programación en Java. Representa la solicitud realizada por el cliente • response de tipo HttpServletResponse. Cursos de verano. Acción Estudiantil. Con setAttribute y getAttribute sirve para guardar objetos globales a todas las páginas JSP • pageContext de tipo PageContext. . -7- Expresiones JSP * Las páginas JSP son especialmente úitles cuando el usuario envía un formulario lleno de campos en los que expresa el tipo de información que solicita * Los parámetros que envía 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. Representa la sesión del cliente • out de tipo JspWriter (es un PrintWriter con buffer). no tiene porqué ser una página html sino cualquier otra cosa (ver setContentType()) • session de tipo HttpSession. Representa nuestra respuesta. 2003. Es el más utilizado y representa el canal de salida de texto y datos hacia el cliente • application de tipo ServletContext.

Programación en Java. Cursos de verano, Acción Estudiantil, 2003.

-8-

Scriptlets
* Un scriptlet es un trozo de código Java * Si se ha comprendido bien el fichero .jsp anterior, se puede comprender lo que hace un scriplet (y el funcionamiento del objeto out) viendo la siguiente equivalencia:
<LI>Fecha actual: <%= new java.util.Date().toLocaleString() %>

equivale a
<% String fecha new java.util.Date().toLocaleString(); out.println(“<LI>Fecha actual: “+fecha); %>

* Un ejemplo más completo puede ser:
<HTML> <HEAD><TITLE>Prueba de colorines</TITLE></HEAD> <% // Cuidado con mayúsculas y minúsculas String bgColor = request.getParameter("bgColor"); boolean hasExplicitColor; if (bgColor != null) { hasExplicitColor = true; } else { hasExplicitColor = false; bgColor = "WHITE"; } %> <BODY BGCOLOR="<%= bgColor %>"> <H2 ALIGN="CENTER">Color Testing</H2> <% if (hasExplicitColor) { out.println("Has indicado como color de fondo " + bgColor + "."); } else { out.println("Color de fondo por defecto BLANCO. " + "Indique un valor para el atributo bgColor, " + "que puede ser una cadena RRVVAA, o un color estándar " + "si su navegador soporta colores X11."); } %> </BODY> </HTML>

Capítulo 15: Introducción a JSP.

Programación en Java. Cursos de verano, Acción Estudiantil, 2003.

-9-

Scriptlets y condiciones
* Un scriptlet puede estar formado por varios trozos. Lo que hay entre ellos se considera cuerpo del scriptlet aunque sea código HTML. * 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 día. <% } else { %> Que tenga mucha suerte. <% } %><p> Y ahora la tabla del 7:<br> <% for (int i = 1; i <= 10; i++) { %> 7 x <%= i %> = <%= 7*i %> Perfecto <br> <% } %> </BODY> </HTML>

S G R

Capítulo 15: Introducción a JSP.

Programación en Java. Cursos de verano, Acción Estudiantil, 2003.

-10-

Declaraciones
* En las declaraciones se pueden incluir funciones y variables que pueden utilizarse en cualquier lugar de la página
<HTML> <HEAD><TITLE>Declaración de funciones</TITLE></HEAD> <%! void tabla(JspWriter out, int numero){ for (int i = 1; i <= 10; i++) try{ out.print(numero + " x " + i + " = " + numero*i+"<br>"); } catch (IOException ioe){ioe.printStackTrace();} } %> <BODY><H1>Declaración de funciones</H1> Ahora la tabla del 7 y luego la del 4:<br> <% tabla(out, 7); out.print("<p>"); tabla(out, 4); %> </BODY> </HTML>

* Una vez que la página JSP se carga en memoria por parte del servidor JSP se queda en ella (a menos que se modifique, en cuyo caso se recompila). Ej. que lo demuestra:
<HTML> <HEAD><TITLE>Declaración de variables en JSP</TITLE></HEAD> <%! private int accesos = 0; %> <BODY><H1>Declaración de variables en JSP</H1> <H2>Accesos a esta página desde que se cargó el servidor: <%= ++accesos %> </H2> </BODY> </HTML>

.
Punto indicado

* Probar a cargar la página varias veces. Luego quitar el punto indicado y volverla a cargar varias veces
Capítulo 15: Introducción a JSP.

Programación en Java. Cursos de verano, Acción Estudiantil, 2003.

-11-

Directiva page. Atributos
* La directiva page se aplica a toda la página en que se encuentra. Permite los siguientes atributos: • import. Permite hacer uso de paquetes Java, de manera análoga a como se importa en un programa Java. Se puede importar un solo package o varios separándolos por comas • contentType. Permite indicar el tipo de los datos que se van a enviar al cliente enformato MIME • isThreadSafe. Una página JSP se puede ejecutar varias veces simultáneamente antes peticiones de clientes concurrentes. Si se indica isThreadSafe=”false” las 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 página en servlet si se intenta utilizar • buffer. Cuando el servidor JSP envía la respuesta al cliente utiliza un buffer intermedio. Con este atributo se indica su tamaño en kB, o bien la palabra none si no se quiere usar buffer • autoflush. El buffer se envía al cliente de forma automática 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 página JSP que hereda de la clase que se indique en este atributo • errorPage. Sirve para indicar la URL de una página que se enviará al cliente en lugar de la actual si, por cualquier circunstancia, ésta se rompe • isErrorPage. Indica si la página actual es o no una página de suministro elegante de errores

S G R

Capítulo 15: Introducción a JSP.

2003.html" %> <% String formato = request.html <HTML><BODY> Esta página se obtiene en lugar del error tradicional <BODY><HTML> Capítulo 15: Introducción a JSP.ms-excel").setContentType("text/plain").Programación en Java. Acción Estudiantil. Cursos de verano.getParameter("formato").setContentType("application/vnd. } %> <TABLE BORDER=1> <TR><TH></TH><TH>Peras<TH>Manzanas <TR><TH>Primer trimestre<TD>2307<TD>4706 <TR><TH>Segundo trimestre<TD>2982<TD>5104 <TR><TH>Tercer trimestre<TD>3011<TD>5220 <TR><TH>Cuarto trimestre<TD>3055<TD>5287 </TABLE> </CENTER></BODY> </HTML> Fichero Error.equals("excel")) { response. -12- Ejemplo con page Fichero EjemploPage.jsp <HTML> <HEAD><TITLE>Comparación entre peras y manzanas</TITLE></HEAD> <BODY><CENTER> <H2>Comparación entre peras y manzanas</H2> <%@ page errorPage="Error. // Si el parámetro no existe se eleva un NullPointerException if (formato. } else { response. .

se puede usar el paquete com. out.servlet. out.// . in.println("name: " + name). .println("fileContent: " + s2+"<br>").*" %> <% try{ MultipartRequest multi = new MultipartRequest(request.getParameter("line")+"<br>").println("Files:"). } }catch(IOException e){ //No es un error.getContentType(name).10MB out.nextElement().length(): " + f.length()+"<br>"). String type = multi.". if (f==null) continue.oreilly.println("f. while((s = in.*: es muy útil la clase MultipartRequest. // Por si el parámetro no está cargado BufferedReader in = new BufferedReader(new FileReader(f)). Cursos de verano. ya que el formulario de envío debe ser multiparte. String s.getFilesystemName(name). java. Enumeration files = multi.*.close().io.println("type: " + type).servlet. File f = multi.10000000).util. java.Programación en Java. 2003.hasMoreElements()) { String name = (String)files.jsp"> <INPUT TYPE="text" NAME="line"> <INPUT TYPE="file" NAME="mptest"> <INPUT TYPE="submit" VALUE="upload"> </FORM> Capítulo 15: Introducción a JSP.getFileNames(). out.jsp <%@ page import="com. ". s2 = new String(). Fichero upload. out.*. Acción Estudiantil. sino tan sólo la primera vez que se llama a esta página } %> S G R <FORM ENCTYPE="multipart/form-data" method="POST" action="upload. out. while (files.readLine())!= null) s2 += s + "<br>".oreilly.println(multi. -13- Ejemplo de upload * Para subir ficheros al servidor. String filename = multi. out.getFile(name). etc.println("filename: " + filename). fotos.

se pueden considerar una etiqueta HTML más. 2003. Hace que la página actual no sea la que se envíe al cliente. A este respecto hay que considerar lo siguiente: En el momento en que la página actual responda al cliente lo más mínimo ya no es posible hacer un forward. sino los resultados de otros servlets. permite no sólo incluir ficheros. Capítulo 16: Etiquetas jsp: y JavaBeans. El resultado incluido NO puede contener JSP • jsp:forward. . etc. -1- Capítulo 16: Etiquetas jsp: y JavaBeans * Las etiquetas jsp: difieren de las directivas en que son interpretadas para cada petición del cliente y. * Las etiquetas jsp: existentes son: • jsp:include... Cursos de verano. pues se produce un error. Además. S G R * El formato de ambas etiquetas es muy parecido: <jsp:include page=”URLRelativa” flush=”true”> <jsp:param name=”nombreParámetro” value=”valor”> . mientras que en el include es oblitarorio y además siempre true. Acción Estudiantil. sino la que se especifique en el forward. Es por ello que JSP utiliza un buffer (por defecto de 8 kB). Se utiliza para incluir ficheros en situaciones condicionales (a diferencia de la directiva @ include que los incluye siempre). </jsp:include> * En el forward el atributo flush no existe. por tanto. páginas JSP.Programación en Java.

html <H1>Esto es un ejemplo de algo que se incluye</H1> * Nótese como en uno.jsp <% String bgColor = request.html" flush="true"/> <% } %> </BODY></HTML> Fichero uno. Acción Estudiantil. Invocar includes.jsp de la forma: http://betelgeuse:8080/jsp/includes. .jsp se utiliza tanto el atributo recibido por includes.getParameter("color"). if (bgColor == null) bgColor = "WHITE". %> <H2 ALIGN="CENTER"> <FONT COLOR="<%= bgColor %>" ><%= texto %></FONT> </H2> Fichero dos. <%! boolean biestable = true. 2003. if (biestable) { %> <jsp:include page="uno.jsp como el que éste le envía.jsp?texto=prueba Capítulo 16: Etiquetas jsp: y JavaBeans.Programación en Java. -2- Ejemplo de jsp:page * Con el cuerpo opcional jsp:param es posible enviar campos al formulario destino. if (texto == null) texto = "Prueba de color".jsp" flush="true"> <jsp:param name="color" value="red"/> </jsp:include> <% } else { %> <jsp:include page="dos. String texto = request.jsp <HTML><BODY> <H1>Includes selectivos</H1> Lo que se incluye a partir de aquí se va alternando. Cursos de verano. Fichero includes. %> <% biestable = !biestable.getParameter("texto").

La URL completa en la que es posible encontrar el plug-in para Internet Explorer * Además de applets tambien se pueden cargar JavaBeans Capítulo 16: Etiquetas jsp: y JavaBeans. éstos se pasan igual que en <jsp:plugin type=”applet” code=”MiApplet. La URL completa en la que es posible encontrar el plug-in para Netscape • iepluginurl. . -3- La etiqueta jsp:plugin * Es transformada automáticamente 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). entre <jsp:params> y </jsp:params> * Además de losmismo atributos que permite la etiqueta APPLET. 2003.Programación en Java.class” width=”465" height=”350"> </jsp:plugin> jsp:include. otros atributos que posee son: • jreversion.class” WIDTH=465 HEIGHT=350> </APPLET> equivale a S G R * Si el applet tiene parámetros. Acción Estudiantil. Un ejemplo comparativo puede ser: <APPLET CODE=”MiApplet. * Su formato es muy parecido al de la etiqueta APPLET. Cursos de verano. a su vez. aunque deben ir. Versión del JRE que requiere el applet • nspluginurl.

-4- Uso de JavaBeans * Desde nuestro punto de vista. Visualiza el resultado devuelto por un método getXxx de un JavaBean previamente creado Capítulo 16: Etiquetas jsp: y JavaBeans. se suministran varias etiquetas jsp: que permiten gestionar los JavaBeans de forma natural * Las etiquetas jsp: para gestionar JavaBeans son: • jsp:useBean. Invoca un método setXxx de un JavaBean previamente creado • jsp:getProperty. Acción Estudiantil. . 2003. A partir de este momento ese objeto se utilizará por su nombre • jsp:setProperty.Programación en Java. un JavaBean es una clase con las siguientes características: • Posee un constructor sin parámetros • No posee campos públicos • Para conocer el valor de un campo llamado xxx debe disponer de una función getXxx (o isXxx si es de tipo boolean) • Para asignarle valor a un campo llamado xxx debe disponer de una función setXxx * La utilización de los JavaBeans permite encapsular diversas funcionalidades aumentando la orientación a objetos del sistema * Para no «ensuciar» el código HTML de la página JSP. Crea un objeto (si no existe ya) de una clase que cumple ser un JavaBean y le da un nombre. Cursos de verano.

Nombre del campo cuyo valor se desea guardar value=”valor”. Nombre de la clase de la que se crea el objeto type=”Clase. Nombre del campo cuyo valor se desea visualizar * Los atributos que admite jsp:setProperty son: name=”nombre”. Nombre que se le da a ese objeto scope=”page|request|session|application”.class”. Valor que se desea guardar. Nombre del objeto del que tomar el campo property=”nombreCampo”. Disponible para todo el mundo siempre. pero sólo para ese usuario O application: Existirá hasta que se cierre el servidor JSP.class”. . 2003. Por si se quiere hacer un upcasting S G * Los atributos que admite jsp:getProperty son: R name=”nombre”. Acción Estudiantil. Se hace una conversión automática en función del tipo del campo Capítulo 16: Etiquetas jsp: y JavaBeans. class=”Clase.Programación en Java. Cursos de verano. Nombre del objeto en que guardar el valor property=”NombreCampo”. -5- Sintaxis * Los atributos que admite jsp:useBean son: id=”nombre”. Indica dónde se puede usar dicho objeto: O page: sólo en esta página O request: si hay un forward o un include también se podrá usar en las páginas destino O session: se puede usar en la sesión de usuario a través de varias páginas.

. public class StringBean { private String mensaje = "Ningún mensaje". public String getMensaje() { return(mensaje).jsp <HTML> <HEAD><TITLE>Uso de JavaBeans con JSP</TITLE></HEAD> <BODY> <TABLE BORDER=5 ALIGN="CENTER"> <TR><TH CLASS="TITLE">Uso de JavaBeans con JSP </TABLE> <jsp:useBean id="stringBean" class="jsp.Programación en Java. } public void setMensaje(String mensaje) { this. Forman.getMensaje() %></I> <LI><jsp:setProperty name="stringBean" property="mensaje" value="El mejor lenguaje: Java" /> Valor después de haber cambiado el campo con setProperty: <I><jsp:getProperty name="stringBean" property="mensaje" /></I> <LI><% stringBean. Capítulo 16: Etiquetas jsp: y JavaBeans.java /** Un JavaBean sencillito que sólo tiene un campo * llamado mensaje de tipo String */ package jsp. -6- Ejemplo de JSP y JavaBeans Fichero StringBean.jsp.class debe ir en el directorio WEB-INF\classes de la aplicación donde esté metida la página StringBean.StringBean" /> <OL> <LI>Valor inicial (getProperty): <I><jsp:getProperty name="stringBean" property="mensaje" /></I> <LI>Valor inicial (expresión JSP): <I><%= stringBean. } } Fichero StringBean. Igualdad y Fraternidad").mensaje = mensaje.setMensaje("Libertad.getMensaje() %></I> </OL> </BODY> </HTML> * El nombre dado al JavaBean puede usarse desde un scriptlet * El StringBean. %> Valor después de haber cambiado el campo con un <i>scriptlet</i>: <I><%= stringBean. 2000.

los dos trozos de código siguientes son equivalentes: <% int numElementos = 1. 2003. * Para asociar todos los parámetros de entrada con campos de un JavaBean basta con indicar un asterisco como property. los nombres de los parámetros y de los campos del JavaBean han de ser idénticos Capítulo 16: Etiquetas jsp: y JavaBeans. . Cursos de verano. -7- Asignación de parámetros * Si una página recibe parámetros que hay que asignarlos a campos de un JavaBean. } catch (NumberFormatException nfe) {} %> <jsp:setProperty name=”articulo” property=”numero” value=”<%= numElementos %>” /> S G * El atributo param en lugar de value toma el valor de un R parámetro de entrada a la página JSP. try { numElementos = Integer.Programación en Java. De esta guisa. Acción Estudiantil.parseInt(request. jsp:setProperty suministra una forma de hacerlo de forma elegante.getParameter(“num”)).: <jsp:setProperty /> name=”articulo” property=”*” * En éste último caso. Ej. lo convierte al tipo del equivale a <jsp:setProperty name=”articulo” property=”numero” param=”num” /> campo y guarda su valor en el campo.

public class StringBean2 { private String mensaje = "Ningún mensaje". } } Fichero StringBean2. Cursos de verano.Programación en Java. con jsp:useBean se crea un objeto si éste no existía ya. .jsp"> <INPUT TYPE="TEXT" NAME="mensaje" VALUE="Algo que contar"> <INPUT TYPE="TEXT" NAME="dato" VALUE="67. public String getMensaje() { return(mensaje).java /** Un JavaBean sencillito que sólo tiene un campo * mensaje de tipo String y un campo dato de tipo double */ package jsp. } public void setDato(double dato) { this.StringBean2" scope ="session" /> <% if (request. } public void setMensaje(String mensaje) { this.> y </jsp:useBean> se puede introducir un bloque JSP que sólo se ejecutará si el JavaBean se crea de verdad Capítulo 16: Etiquetas jsp: y JavaBeans. 2003..dato = dato. -8- Ejemplo Fichero StringBean2.9"> <INPUT TYPE="SUBMIT"> </FORM> <% } %> </BODY> </HTML> * Como se dijo antes.0. private double dato = 0. Acción Estudiantil.. Si ya existía se usa el preexistente y ya está * Entre <jsp:useBean .jsp <HTML> <HEAD><TITLE>Uso de JavaBeans con JSP</TITLE></HEAD> <BODY> <jsp:useBean id="articulo" class="jsp.mensaje = mensaje.getParameter("mensaje") != null) { %> <jsp:setProperty name="articulo" property="*" /> <jsp:getProperty name="articulo" property="mensaje" /><br> <jsp:getProperty name="articulo" property="dato" /><br> <% } else {%> <FORM ACTION="StringBean2. } public double getDato() { return(dato).

* Se utilizan etiquetas de la misma forma que en HTML. la sustituye por su código asociado y lo ejecuta. . a través de él. S * Cada etiqueta se asocia a un bloque de código Java ubicado en la clase cuyo nombre se indica. * Por tanto.servlet. request.jsp • La clase que contiene el código a ejecutar: *.tagext.tld (Tag Library Descriptor) * En el código asociado podemos acceder al objeto pageContext y. a los objetos out. Capítulo 17: JSP y bibliotecas de etiquetas. necesitamos tres ficheros: • La página JSP que utiliza las etiquetas: *. parameter. * Las etiquetas funcionalmente relacionadas se agrupan en ficheros llamados bibliotecas de etiquetas. G * Estas clases deben heredar y utilizar clases estándares R almacenadas en el paquete java. Acción Estudiantil. -1- Capítulo 17: Biblioteca de etiquetas (Tags) * Permiten construir páginas JSP con una estructura más parecida a la del HTML. * Las etiquetas pueden tener parámetros y englobar un cuerpo.* * Cuando el motor JSP se encuentra una de estas etiquetas. 2003. Cursos de verano. etc.jsp.Programación en Java.class • Un fichero que indica qué clase se corresponde con cada etiqueta: *.

tld <?xml version="1.*. /** Utilización de etiquetas con JSP. import javax.print("Custom tag example (ExampleTag)").sun. * El nombre real de la etiqueta no se da aquí.tld" prefix="csajsp" %> <TITLE><csajsp:example /></TITLE> </HEAD> <BODY><H1><csajsp:example /></H1><csajsp:example /></BODY> </HTML> Capítulo 17: JSP y bibliotecas de etiquetas.com/j2ee/dtds/web-jsptaglibrary_1_1.servlet. Cursos de verano.</info> <tag> <name>example</name> <tagclass>ExampleTag</tagclass> <info>Simplest example: inserts one line of output</info> </tag> </taglib> Fichero Ejemplo.0</tlibversion> <jspversion>1. 2003. } catch(IOException ioe) { System.tagext.0" encoding="ISO-8859-1" ?> <!DOCTYPE taglib PUBLIC "-//Sun MicroSystems. Inc. import java.jsp.java package jsp.*.Programación en Java.servlet. . out. Acción Estudiantil. -2- Primer ejemplo Fichero ExampleTag.out.*. Ejemplo que saca un sencillo mensaje.getOut().1</jspversion> <shortname>csajsp</shortname> <info>http://www.jsp <HTML> <HEAD> <%@ taglib uri="/csajsp-taglib.println("Error in ExampleTag: " + ioe).dtd"> <taglib> <tlibversion>1. sino en el fichero tld referenciado * en la página JSP a través de la directiva taglib */ public class ExampleTag extends TagSupport { public int doStartTag() { try { JspWriter out = pageContext.1//EN" "http://java.io.jsp. import javax.coreservlets. } } Fichero csajsp-taglib.com/.//DTD JSP Tag Library 1. } return(SKIP_BODY).

Programación en Java. Ignora lo que haya entre el inicio de etiqueta y el final de etiqueta. Ignora el resto de la página HTML EVAL_PAGE. si la etiqueta no gestiona el cuerpo O BodyTagSupport. si se quiere tener un control completo del cuerpo * doStartTag() retorna un entero que puede ser: SKIP_BODY. el sistema (antes de llamar a doStartTag()) busca y llama automáticamente a una función llamada setMiAtributo(String) y que deberemos definir en la clase asociada a la etiqueta. Sólo TagSupport EVAL_BODY_TAG. Evalúa el cuerpo que haya entre el inicio de etiqueta y el final de etiqueta. -3- La clase Tag * Las etiquetas se forman por un inicio. Cursos de verano. Cuando el sistema se encuentra el inicio ejecuta doStartTag(). . Si una etiqueta tiene asociado el atributo miAtributo. Acción Estudiantil. Sólo BodyTagSupport S G R * doEndTag() retorna un entero que puede ser: SKIP_PAGE. Continúa con el resto de la página EVAL_BODY_INCLUDE. * Estas funciones deben reescribirse en una clase que hereda de la interfaz Tag. 2003. Capítulo 17: JSP y bibliotecas de etiquetas. Igual que el anterior. Sun suministra dos clases de partida que heredan de Tag: O TagSupport. un cuerpo y un final. y cuando encuentra el final ejecuta doEndTag(). Continúa normalmente la evaluación del resto de la página * Como en cualquier otra etiqueta HTML. las etiquetas pueden tener atributos asociados. pero con más control.

class <info> Descripción opcional de esta etiqueta <attribute> Diferentes atributos que puede contener esta etiqueta. (No obligatorio) <uri> URI donde se encuentra este tld <info> Descripción de este tld. . 2003. Acción Estudiantil. -4- Tag Library Descriptor * El fichero *.class asociado a la etiqueta <teiclass> Fichero . subclase de TagExtraInfo <bodycontent> Puede contener tres valores: EMPTY Debe estar vacío JSP Posee cualquier cosa válida en una página . * La etiqueta <taglib> engloba todas las etiquetas que vamos a definir en este fichero.sun.tld tiene estructura del fichero XML conforme al estándar http://java. Contiene: <name> Nombre de la etiqueta <tagclass> Fichero .com/j2ee/dtds/web-jsptaglibrary_1_1. Cursos de verano. Contiene: <tlibversion> La versión de este tld <jspversion> La versión más pequeña con que funciona este tld <shortname> Prefijo que se debe usar cuando se referencien las etiquetas de este tld.Programación en Java. Contiene: Capítulo 17: JSP y bibliotecas de etiquetas.jsp TAGDEPENDENT El contenido será interpretado por el código del . <tag> Diferentes etiquetas definidas en este biblioteca.dtd * La primera parte del fichero es común para todos ellos.class opcional.

tld se puede indicar a través del fichero de configuración web. S * Para utilizar una biblioteca se emplea la directiva taglib que posee como parámetros: G uri La dirección del fichero .Programación en Java.tld que contiene la traducción de las etiquetas. Cursos de verano. Se utiliza para evitar conflictos de etiquetas procedentes de varios tld * La ubicación de un fichero . Contiene: <name> Nombre del atributo <required> Si el atributo es obligatorio o no <rtexprvalue> Indica si el valor del atributo debe ser constante. 2003. Dirección a partir del R directorio ROOT prefix Prefijo que deben tener todas las etiquetas que procedan del uri anterior. -5- Tag Library Descriptor <attribute> Diferentes atributos que puede contener esta etiqueta.xml. de la forma: <taglib> <taglib-uri>/myPRlibrary</taglib-uri> <taglib-location>/WEB-INF/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” %> Capítulo 17: JSP y bibliotecas de etiquetas. o si puede ser una expresión JSP que varíe de una ejecución a otra de la página * Los atributos son siempre de tipo String y es necesario convertirlos a su tipo correcto controlando posibles errores. Acción Estudiantil.

-6- Segundo ejemplo Fichero SimpleTag.servlet.*. */ public class SimpleTag extends TagSupport { protected long maximo = 100. Acción Estudiantil. 2003.nextLong() % maximo).*. Ejemplo que saca un número aleatorio * entre 0 y el parámetro que se le pasa. import java. import javax. .maximo = new Long(maximo).maximo=100.println("Error in SimpleTag: " + ioe).*. } catch(IOException ioe) { System. } catch(NumberFormatException nfe){ this.jsp.tld <tag> <name>example3</name> <tagclass>jsp. } public void setMaximo(String maximo){ try{ this. /** Utilización de etiquetas con JSP.servlet. import javax.Programación en Java. public int doStartTag() { try { JspWriter out = pageContext. out.out. import java.tagext.jsp.longValue().*.getOut(). Cursos de verano.io. } return(SKIP_BODY). } } } Tag del fichero csajsp-taglib.java package jsp.print(new Random().util.SimpleTag</tagclass> <info>Saca un numero aleatorio por la salida</info> <attribute> <name>maximo</name> <required>false</required> </attribute> </tag> Ejemplo de uso <csajsp:example3 maximo="10000"/> Capítulo 17: JSP y bibliotecas de etiquetas.

jsp?debug=si según queramos que aparezca el cuerpo o no * Nótese como el cuerpo también puede contener elementos JSP Capítulo 17: JSP y bibliotecas de etiquetas. 2003. sino que en doStartTag() retornamos SKIP_BODY o EVAL_BODY_INCLUDE S * En el siguiente ejemplo se observa como es posible retornar cualquiera de sendas etiquetas en base a un condición de G depuración R * Podemos invocar a la página como: http://localhost:8080/jsp/EjemploDebug. Cursos de verano. .jsp o bien como: http://localhost:8080/jsp/EjemploDebug. -7- 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 página Si no se desea un control especial sobre el cuerpo de una etiqueta. Acción Estudiantil. no es necesario heredar de BodyTagSupport.Programación en Java.

import javax.tld" prefix="csajsp" %> Comienzo de página. String debugFlag = request.*. Cursos de verano. chiu.io.getId() %> </UL> </csajsp:debug> <P> Final de página. chiu.jsp <HTML> <HEAD><TITLE>Using the Debug Tag</TITLE></HEAD> <BODY> <H1>Uso de la etiqueta depurar</H1> <%@ taglib uri="/WEB-INF/tlds/csajsp-taglib. Bla. */ public class DebugTag extends TagSupport { public int doStartTag() { ServletRequest request = pageContext.<P> </BODY> </HTML> Capítulo 17: JSP y bibliotecas de etiquetas. Depuración Fichero DebugTag. chiu.getParameter("debug").jsp.jsp. bla.tagext.*. Bla.servlet. 2003.getRemoteHost() %> <LI>Id de Sesión: <%= session.*. Ejemplo que evalúa el cuerpo o no * en función de un parámetro de formulario llamado debug. .equalsIgnoreCase("no"))) return SKIP_BODY.servlet. chiu. import java.java package jsp.Programación en Java. chiu. -8- Tercer ejemplo. } } Fichero EjemploDebug. bla. import javax.toLocaleString() %> <LI>Host remoto: <%= request. if ((debugFlag == null) || (debugFlag.util. /* Utilización de etiquetas con JSP.getRequest(). bla.<P> <csajsp:depurar> <B>Debug:</B> <UL> <LI>Fecha actual: <%= new java. bla. Acción Estudiantil. import javax.servlet.*. chiu. else return EVAL_BODY_INCLUDE.Date().

Se invoca automáticamente después de cada evaluación del cuerpo. Vuelca el contenido del BodyContent en el Writer especificado Capítulo 17: JSP y bibliotecas de etiquetas. Resetea el contenido del BodyContent • getEnclosingWriter() • writeOut(Writer). Finaliza la ejecución del cuerpo EVAL_BODY_TAG. 2003. Devuelve una cadena que representa la evaluación del cuerpo • getReader().Programación en Java. el BodyContent se suele volcar en out. Cursos de verano. -9- Manipulación del cuerpo * Si se hereda de BodyTagSupport se incorporan varios métodos nuevos: T doInitBody(). A continuación. Acción Estudiantil. BodyContent posee los siguientes métodos: • getString(). Los cuerpos se evalúan y el resultado se mete en un BodyContent. Devuelve un objeto de tipo BodyContent G * Un objeto de tipo BodyContent representa el resultado de R haber evaluado el cuerpo de una etiqueta. . Puede retornar: SKIP_BODY. Se invoca automáticamente antes de la primera evaluación dle cuerpo T doAfterBody(). Reevalúa el cuerpo De esta forma el cuerpo se evalúa una y otra vez mientras doAfterBody() retorne EVAL_BODY_TAG S T getBodyContent(). Permite leer a través de un Reader el BodyContent • clearBody().

import java. 2003.println("Error en RepeatTag: " + ioe). import javax.Programación en Java. Cursos de verano. import javax. .servlet.out.tagext. } else { return(SKIP_BODY). body.parseInt(repeats). Acción Estudiantil. } } public int doAfterBody() { if (reps-.clearBody().*.getString()). /* Etiqueta que repite el cuerpo un número de veces. public void setReps(String repeats) { try { reps = Integer.println(body.*.jsp.>= 1) { BodyContent body = getBodyContent().java package jsp.getEnclosingWriter().RepeatTag</tagclass> <info>Ejecuta el cuerpo varias veces</info> <attribute> <name>reps</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> Capítulo 17: JSP y bibliotecas de etiquetas. -10- Ejemplo de bucle Fichero RepeatTag.io. } } } Tag del fichero csajsp-taglib. } catch(NumberFormatException nfe) { reps = 1. } return(EVAL_BODY_TAG).*. out.jsp.tld <tag> <name>repetir</name> <tagclass>jsp. try { JspWriter out = body. */ public class RepeatTag extends BodyTagSupport { private int reps. // Borra para el ciclo siguiente } catch(IOException ioe) { System.servlet.

getAttribute("rnd"). 2003. } out. el número aleatorio que se obtiene es siempre el mismo. objeto) y se recupera con request.getParameter("repeats") %>'> <LI><csajsp:example3 maximo="1000000" /> </csajsp:repetir> </OL> </BODY> </HTML> S * Como se observa en este yG anteriores ejemplos. Random rnd = (Random) request. Acción Estudiantil. ya que por cada R invocación de una etiqueta se vuelve a crear un objeto de su clase asociada. Cursos de verano. --> <csajsp:repetir reps='<%= request. Si un objeto se quiere reutilizar de una invocación a otra en la misma página.getAttribute(“clave”) * Ejemplo que soluciona el problema (SimpleTag. out.nextLong() % maximo).setAttribute("rnd".getRequest(). ServletRequest request = pageContext.java) JspWriter out = pageContext.getOut(). Capítulo 17: JSP y bibliotecas de etiquetas.Programación en Java.println("Creando el Random()"). -11- Ámbito de objetos Fichero RepetirEjemplo.jsp <HTML> <HEAD><TITLE>Algunos números aleatorios</TITLE></HEAD> <BODY> <H1>Algunos números aleatorios</H1> Cada número de la lista siguiente es un número aleatorio <%@ taglib uri="/WEB-INF/tlds/csajsp-taglib.setAttribute(“clave”.tld" prefix="csajsp" %> <OL> <!-. rnd). if (rnd == null){ rnd = new Random(). request.print(rnd.Se repite N veces. Si reps es null se repite una sola vez. se puede almacenar en el objeto request con: request. .

Cursos de verano. 2003. Acción Estudiantil. -12- Etiquetas anidadas * Hay situaciones en las que se sabe que una etiqueta debe aparecer siempre dentro del cuerpo de alguna otra.class) Capítulo 17: JSP y bibliotecas de etiquetas. Class) * Los parámetros definen de quién se busca la etiqueta ancestro (normalmente this) y. que tipo de etiqueta ancestro es la que se busca (p. La etiqueta exterior puede contener alguna información útil para las internas * Desde una etiqueta interna podemos acceder al objeto de la externa mediante la función: Object findAncestorWithClass(Object. por si el anidamiento es de varios niveles.Programación en Java. EtiquetaExterna.ej. .

Cursos de verano. 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> Capítulo 17: JSP y bibliotecas de etiquetas. Acción Estudiantil. .com/taglibs/simpleDB. 2003.Programación en Java.tld” prefix=”x” %> <x:queryBlock connData=”conData1”> <x:queryStatement> SELECT nombre. -13- Bases de Datos * En este ejemplo completo se ilustra la utilización de una base de datos mediante el uso de etiquetas anidadas *El código 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 parámetros el nombre de la fuente de datos (en ODBC). Opcionalmente podría incluir el nombre de usuario y la clave T queryStatement que tiene como cuerpo el texto de una consulta SQL T queryCreateRows que prepara la lectura del número de tuplas que se indique desde un inicio a un final (ambos opcionales) T queryDisplay que visualiza el contenido del campo que se indique S G R * Ejemplo de uso: <html> <%@ taglib uri=”http://acme.

jsp. }catch(IOException ioe){ ioe. Class.printStackTrace(). }catch(SQLException se){se. import javax.servlet. import javax. } return EVAL_BODY_INCLUDE.} return EVAL_PAGE. JspWriter out .*.getConnection("jdbc:odbc:"+connData.prueba(out.getOut(). 2003. return SKIP_BODY. import java.*. . "". Acción Estudiantil.printStackTrace().jdbc. public void setConnData(String connData){ this. }catch(Exception e){ e. Cursos de verano.*. protected ResultSet resultado. conexión = DriverManager.sql.print(cadena). } public int doStartTag(){ try{ out = pageContext.tagext.connData = connData. } } Capítulo 17: JSP y bibliotecas de etiquetas.close().*.java package jsp.servlet.JdbcOdbcDriver"). "").jsp. } } } public class QueryBlockTag extends TagSupport{ protected Connection conexión. class Util { public static void prueba(JspWriter out. import java.Programación en Java.forName("sun. Util. private String connData = "prueba1".odbc.io. String cadena){ try { out. -14- Etiquetas Java Fichero QueryBlockTag.printStackTrace(). "Error en la apertura de la base de datos"). } public int doEndTag(){ try{ conexión.

*.*.resultado. if (padre ==null) throw new SQLException("Padre es null").getEnclosingWriter(). import javax.java R package jsp. QueryBlockTag.sql.io. import java.servlet.getOut(). Acción Estudiantil. . try{ out.executeQuery(body.*.resultado = sentencia.prueba(out. }catch(Exception ioe){ Util. import javax. public int doStartTag(){ ResultSet resultado = ((QueryBlockTag)findAncestorWithClass(this. } } Capítulo 17: JSP y bibliotecas de etiquetas.servlet. "Imposible cargar el campo: "+ field). padre.jsp. JspWriter out = pageContext.Programación en Java.getString(field)).print(resultado.createStatement().conexión.*.jsp. import java. import javax. import java.field = field. -15- Etiquetas Java Fichero QueryStatementTag.*. public class QueryDisplayTag extends TagSupport{ private String field.tagext. Cursos de verano.sql. } return SKIP_BODY.*. import java. public class QueryStatementTag extends BodyTagSupport{ public int doAfterBody(){ BodyContent body = getBodyContent().getString()). "No se puede crear la sentencia.servlet. 2003. } return SKIP_BODY.*. }catch(SQLException se){ Util.prueba(body. } } S G Fichero QueryDisplayTag.servlet.jsp. try{ QueryBlockTag padre = (QueryBlockTag)findAncestorWithClass(this.class). QueryBlockTag.jsp.io. Statement sentencia = padre. } public void setField(String field){ this. import javax.").tagext.java package jsp.*.class)).

next()) contador ++.} public void setTo(String to){ this.next()) return SKIP_BODY. } if (++from > to) return SKIP_BODY. Cursos de verano.clearBody(). Acción Estudiantil.*.prueba(out. } public int doAfterBody(){ BodyContent body = getBodyContent().io. } public int doStartTag(){ re s u lt a d o = ((Q u e ryB lo c kT ag)f indAncest o rW it h Cla s s (t h is. body.*. "Error en los registros. import java. to = 1. try{ out.prueba(out.from = Integer.servlet.prueba(pageContext. }catch(SQLException se){ se.jsp. // Este bucle se posiciona en el registro anterior al que hay que mostrar try{ while ((contador < from) && resultado. -16- Etiquetas Java Fichero QueryCreateRowsTag.sql.").resultado.getOut(). import java. } } } Capítulo 17: JSP y bibliotecas de etiquetas. public class QueryCreateRowsTag extends BodyTagSupport{ int from = 1.getEnclosingWriter().*. QueryBlockTag. } return EVAL_BODY_TAG.*.java package jsp. import javax. }catch(SQLException se){ Util.to = Integer.getString()). 2003. }catch(IOException ioe){Util. int contador = 1. }catch(SQLException sqle){ Util. return SKIP_BODY. ResultSet resultado. JspWriter out = body.servlet.Programación en Java.next()) return SKIP_BODY.tagext. public void setFrom(String from){ this.print(body.parseInt(from). } try{ if(!resultado.class)). else{ try{ if (!resultado.jsp. "Imposible emitir registro"). return SKIP_BODY. "No se puede mostrar el registro"). import javax.parseInt(to).printStackTrace(). . } return EVAL_BODY_TAG.

Inc.1//EN" "http://java. 2003.com/j2ee/dtds/web-jsptaglibrary_1_1.coreservlets.dtd"> <taglib> <tlibversion>1. Conexión</info> <attribute> <name>connData</name> <required>false</required> </attribute> </tag> <tag> <name>queryStatement</name> <tagclass>jsp. Acción Estudiantil.0</tlibversion> <jspversion>1.Programación en Java. Cursos de verano.1</jspversion> <shortname>bbdd</shortname> <info>http://www. .QueryBlockTag</tagclass> <info>Comienzo de una consulta.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.0" encoding="ISO-8859-1" ?> <!DOCTYPE taglib PUBLIC "-//Sun MicroSystems.com/.tld <?xml version="1.</info> <tag> <name>queryBlock</name> <tagclass>jsp.QueryStatementTag</tagclass> <info>Ejecuta una consulta que es su propio cuerpo</info> </tag> <tag> <name>queryCreateRows</name> <tagclass>jsp.sun. -17- Descriptor de etiquetas Fichero bbdd-taglib.//DTD JSP Tag Library 1.QueryDisplayTag</tagclass> <info>Visualiza el campo que se indica</info> <attribute> <name>field</name> <required>false</required> </attribute> </tag> </taglib> S G R Capítulo 17: JSP y bibliotecas de etiquetas.

. JSTL proporciona las siguientes capacidades: O Acciones de propósito general mediante un lenguaje de expresiones. JSTL utiliza ciertas convenciones que hacen más fácil al desarrollador el recordar la estructura interna de las etiquetas. atributos con ámbito y captura de excepciones O Acciones de control de flujo dentro de una página JSP O Validaciones de bibliotecas de etiquetas que obligan a que un proyecto cumpla con ciertas reglas de estilo * Desde el punto de vista de las bibliotecas concretas que suministra. * Desde un punto de vista general. JSTL nos da las siguientes: O Etiquetas de propósito general (gestión de variables) O Etiquetas de control de flujo y de iteración O Etiquetas asociadas a URLs O Etiquetas de internacionalización y formateo O Etiquetas para trabajar con bases de datos O Etiquetas para trabajar con XML O Etiquetas de manipulación de cadenas * Como se verá a lo largo de nuestro estudio. -1- Capítulo 18: JSTL (Java Standard Tag Library) * El objetivo de JSTL (biblioteca de etiquetas estándar de Java) es facilitar el trabajo a los desarrolladores de JSP. 2006. Universidad de Málaga. S G R Capítulo 18: JSTL (Java Standard Tag Library).Programación en Java.

de cadena. • Componentes Java Beans. las expresiones pueden usarse en cualquier lugar de una página JSP: T Como sustituta de un literal HTML T 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 Capítulo 18: JSTL (Java Standard Tag Library). • Colecciones.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 evaluación. relacional o lógico. • Funciones definidas en un fichero .Programación en Java. Universidad de Málaga. ya sea matemático. . * Una expresión EL se escribe de la forma ${expresion} y entre las llaves puede usarse cualquier operador binario o unario que se quiera. Por tanto. Es muy útil el operador unario empty para saber si algo es null o no. -2- Lenguaje de expresiones * El lenguaje de expresiones (EL) sirve para facilitar la escritura de expresiones restringidas Java dentro de una página JSP. * Como operandos pueden usarse: • Variables con ámbito. de cadena o lógicos. 2006. • Literales numéricos.

Programación en Java. 2006. • Si es un Java Bean se retorna la propiedad valor-b. • headerValues: lista con los valores de los campos de la cabecera. requestScope . • pageScope . De esta guisa. • Si es de tipo Map. se retorna valor-a. -3- Contenido de expresiones * Una expresión EL unifica el uso del punto y de los corchetes. * Para evaluar expr-a[expr-b] se evalúa expr-a a valor-a y expr-b a valor-b. • Si es de tipo List el resultado es valor-a. * Ejemplo: <c:forEach item=”unaCookie” values=${cookie}”> ${unaCookie}<br> </c:forEach> Capítulo 18: JSTL (Java Standard Tag Library). expr-a.ident-b es equivalente a expr-a[“identb”]. sessionScope y applicationScope: lista con las variables definidas en cada ámbito.get((int)valor-b). Universidad de Málaga. • header: lista con los campos de la cabecera. • Si es un array el resultado es Array(. valorb). • paramValues: lista con los valores de los parámetros.get(valor-a. • cookie: lista con los nombres de las cookies. y en base a valor-a se hacen diferentes acciones: • Si es null el resultado es null.get(valor-b). S G R . * Las siguientes variables pueden usarse directamente (todas son listas): • param: lista con los nombres de los parámetros.

2006.. -4- Core Tag Library * Esta biblioteca posee etiquetas de propósito general. Universidad de Málaga. . entre las que se incluyen las de manipulación de variables y gestión de errores. Para usarla hay que incluir en la página JSP: <%@ taglib uri="http://java. así como ejecutarse como un bucle FOR de BASIC O <c:forTokens> divide una cadena en trozos y se ejecuta para cada trozo * Las etiquetas de URL también forman parte de las core pero las veremos aparte por su complejidad. <c:when> y <c:otherwise> permiten formar una estructura de ifs en cascada con parte else O <c:forEach> permite recorrer una colección o un array.sun. Capítulo 18: JSTL (Java Standard Tag Library).com/jsp/jstl/core" prefix="c" %> * Las etiquetas más importantes que posee son: O <c:out> utilizada con el mismo objetivo que el scriptlet <%= expresion %> tiene algunas funcionalidades adicionales O <c:set> permite asignar valores a variables (p.ej.Programación en Java. y supone el complemento perfecto para la página de error JSP O <c:if> emite por la salida el cuerpo que contiene sólo si la condición a que se refiere es cierta O <c:choose>. y sirve para destruir variables con ámbito O <c:catch> permite recuperar un error. El prefijo estándar para esta biblioteca es c. de sesión) o a propiedades de Java Beans O <c:remove> es el complemento natural al anterior.

en cuyo caso lo que se emite es el resultado de leer por completo dicho canal de entrada. * Por defecto escapeXml está puesto a true. Si este es nulo. S G R * El valor dado al atributo value se convierte en String y se emite. se saca por pantalla el valor del atributo default. &#034. .sun.Programación en Java. 2006. a no se que sea un objeto de tipo java. lo que quiere decir que se traducen algunos caracteres para evitar errores: Carácter < > & ‘ “ Código de carácter &lt. Universidad de Málaga.com/jsp/jstl/core" prefix="c" %> <c:out value="Trabajo en Gar & cía" /> Capítulo 18: JSTL (Java Standard Tag Library). &gt.Reader. &#039. &amp.io. * Puede probarse como ejemplo con la página completa: <%@ taglib uri="http://java. -5- <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.

} public Reader getLector() throws IOException { return new FileReader(getNombreFichero()). public class StringBean { private String nombreFichero = "Ningun nombreFichero". Capítulo 18: JSTL (Java Standard Tag Library).io.Programación en Java. De una sola tacada se ha emitido el contenido de un fichero entero.nombreFichero = nombreFichero.lector}"/><br> <c:out value="Otra cosa" /><br> * La salida de la línea marcada es el contenido del fichero e:\prueba.StringBean" /> <jsp:setProperty name="stringBean" property="lector" value="e:/prueba. Universidad de Málaga.jsp.nombreFichero = lector.apache.txt. public String getNombreFichero() { return(nombreFichero). } public void setLector(String lector) { this. } } * Y el JSP: <%@ taglib uri="http://java. } public void setNombreFichero(String nombreFichero) { this. -6- <c:out> y Reader * Sea el siguiente Bean: package org.txt" /> <c:out value="${stringBean.com/jsp/jstl/core" prefix="c" %> <jsp:useBean id="stringBean" class="org.*. . 2006. import java.jsp.apache.sun.

Programación en Java. * El subrayado quiere decir que sólo pueden especificarse literales. 2006. * <c:remove> sólo tiene sentido para variables con ámbito. La sintaxis de <c:remove> es: <c:remove 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. no en este momento. S G R Capítulo 18: JSTL (Java Standard Tag Library). Un valor diferido quiere decir que se asigna una expresión que se evalúa de forma perezosa. . o sea. sino cuando se utilice la variable. <c:remove> elimina variables con ámbito. Universidad de Málaga. -7- <c:set> y <c:remove> * La sintaxis de <c:set> es: O Para asignar valor a una variable con ámbito <c:set value=”valor” var=”nombreVar” [scope=”page|request|session|application”] /> O Para asignar una propiedad a un Java Bean. o un elemento de un mapa <c:set value=”valor” target=”nombreVar” property=”nombrePropiedad” /> O Para establecer un valor en diferido. Realmente esto sólo tiene utilidad cuando se trabaja con JSF (Java Server Faces) y no volveremos a tratar el tema.

Los errores secundarios son los que se deben capturar con <c:catch> para que no interfieran con el desarrollo normal de la página. entonces la excepsión se guarda en ella.Programación en Java. entonces esa variable se destruye con <c:remove> si es que existía. 2006. * La idea es que los errores graves no sean capturados. -8- <c:catch> * La sintaxis de <c:catch> es: <c:catch [var=”nombreVar”]> // Acciones que pueden producir excepciones </c:catch> * <c:catch> permite capturar excepciones dentro de bloques JSP. lo que suele venir a continuación del <c:catch> es una acción condicional que testa dicha variable para hacer la acción correctora que sea. Por tanto. Si no se produce excepción. sino que se propaguen hasta la página de error especificada. . entonces incluso puede omitirse el atributo var de <c:catch>. Capítulo 18: JSTL (Java Standard Tag Library). * Si se indica un nombre de variable. Universidad de Málaga. * Sino se quiere incluir acción correctora.

-9- 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> * Como puede verse. Universidad de Málaga. Capítulo 18: JSTL (Java Standard Tag Library). %> Esto ya no sale<br> </c:catch> ${fallo}<br> Continua la cosa bien<br> S G R * Si se quita la cláusula <c:catch> se produce un fallo en la página y no se carga nada. . la concatenación de cadenas se hace mediante una mera yuxtaposición.Programación en Java. * 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"). 2006.

* Estas etiquetas evitan el tener que recurrir a Java directamente. Las únicas sentencias de bucle que hay son las que permiten recorrer estructuras y. 2006. sino más adelante. por ello.Programación en Java. están más asociadas al concepto de iterador que al de control de flujo. sino que simulan básicamente un if sin else y la sentencia if en cascada. Universidad de Málaga. * No existe nada parecido a un for. lo que suele ser propenso a errores debido al uso intensivo de llaves. while o do while. * No tienen la misma potencia que las sentencias de control de flujo en Java. Capítulo 18: JSTL (Java Standard Tag Library). . -10- Etiquetas de control de flujo * A menudo una página debe devolver al cliente diferentes textos en función de los datos de entrada o almacenados en una base de datos. Por esto no las veremos en este apartado.

y para eso.<br> </c:if> S G R Puede probarse a cargar una página que contenga esto psando o no pasando en la dirección URL el parámetro nombre. Universidad de Málaga. . El motivo es que la cláusula else. la biblioteca core suministra otras etiquetas * Ej. * Como puede verse.nombre}" /> ${existeNombre}<br> Capítulo 18: JSTL (Java Standard Tag Library). utilizada a discreción. de control: <c:if test="${ empty param. esta etiqueta carece de cláusula else. -11- <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> * Si la etiqueta <c:if> se autocierra y se indica un nombre de variable. * Ejemplo de carga de valor booleano: <c:if var="existeNombre" test="${ empty param.Programación en Java. se convierte en unos ifs en cascada mutuamente excluyentes.nombre}" > Se le ha olvidado escribir un valor para el nombre. 2006. entonces es como si se utilizara para cargar un valor booleano en dicha variable.

Universidad de Málaga. <c:when> y <c:otherwise> * Estas tres etiquetas se emplean conjuntamente según la siguiente sintaxis <c:choose> <c:when test=”condicion1”> // Cuerpo que se emite si condicion1 es cierta </c:when> <c:when test=”condicion2”> // Cuerpo que se emite si condicion2 es cierta // y condicion1 es falsa </c:when> . Si todas las condiciones son falsas se emite el cuerpo de <c:otherwise>.. Capítulo 18: JSTL (Java Standard Tag Library).. en el primero en que la condición sea cierta. .Programación en Java. <c:otherwise> // Cuerpo que se emite si ninguna de las // condiciones anteriores es cierta </c:otherwise> </c:choose> * La estructura de estas etiquetas es la intuitiva: una vez entrado en un <c:choose> se evalúan los <c:when> en secuencia. se emite su cuerpo y se sale del <c:choose>. 2006. -12- <c:choose>..

-13- Ejemplo con <c:choose> * El siguiente ejemplo completo comprueba los parámetros de entrada a un formulario y emite diferentes salida en base a estos: <%@ taglib uri="http://java.<br> </c:when> <c:when test="${empty param. Universidad de Málaga.<br> </c:otherwise> </c:choose> S G R Capítulo 18: JSTL (Java Standard Tag Library).nombre}!.com/jsp/jstl/core" prefix="c" %> <h3>Saludos</h3> <c:choose> <c:when test="${empty param.tiempo}" > Necesito un tiempo.<br> </c:when> <c:otherwise> ¡Hombre ${param.Programación en Java.nombre}" > Necesito un nombre.sun. .<br> ¡Cuánto tiempo sin verte!<br> Qué día más ${param. 2006.tiempo} hace.

en este último caso se hace una traducción automática al tipo wrapper correspondiente. Universidad de Málaga. etc. * También se permite la iteración sobre mapas y sobre iteradores y enumeradores. * El desarrollador puede hacer uso de la clase LoopTag para construir sus propias etiquetas que interaccionen con <c:forEach> Capítulo 18: JSTL (Java Standard Tag Library). con variables límite de inicio. final y paso. a su vez. etc. . * También es posible realizar recorridos un número determinado de veces. Con estos últimos hay que tener cuidado ya que no se pueden resetear y no pueden recorrerse. array. 2006. Para ello se utiliza la clase LoopTagStatus. el número de componente por el que va el recorrido. * El recorrido puede ser sobre objetos o sobre tipos primitivos.Programación en Java. * La iteración también puede proporcionar un estado que puede indicar. varias veces. -14- Etiquetas para recorridos * Este tipo de etiquetas permite repetir la emisión de un trozo JSP en base al número de elementos de una colección.

.Programación en Java. 2006. * La sintaxis que recorre una estructura es: <c:forEach [var=”nombreVar”] items=”coleccion” [varStatus=”nombreVarEstado”] [begin=”comienzo”] [end=”final”] [step=”paso”] > // Cuerpo a repetir </c:forEach> * Para ejecutarse un determinado número de veces. Universidad de Málaga. -15- <c:forEach> * La sintaxis es diferente según se recorra una estructura o se itere un determinado número de veces. la sintaxis es: <c:forEach [var=”nombreVar”] [varStatus=”nombreVarEstado”] begin=”comienzo” end=”final” [step=”paso”] > // Cuerpo a repetir </c:forEach> * Ejemplo que saca los números del 1 al 20: <c:forEach var="cont" begin="1" end="20"> ${cont}<br> </c:forEach> S G R Capítulo 18: JSTL (Java Standard Tag Library).

quiere decir que se comienza en el ítem de la colección situado en posición comienzo. -16- <c:forEach> * La sintaxis de la ejecución un determinado número de veces parece clara: la variable nombreVar parte del valor comienzo hasta el valor final incrementándose en cada iteración por paso unidades. 2006. que son del tipo Map. El primer elemento de la colección está en la posición 0. * Si el recorrido de una colección hace uso de begin y demás.value}<br> </c:forEach> Capítulo 18: JSTL (Java Standard Tag Library).Programación en Java. Universidad de Málaga.Entry. En este último caso. * Ejemplo de recorrido de los elementos de la cabecera (header): <c:forEach var="elemento" items="${header}"> ${elemento}<br> -> ${elemento. lo que se recorren son las entradas. . entonces el bucle ni se ejecuta. Si hay menos ítems que comienzo. se supone que el String posee palabras separadas por comas. * El <c:forEach> se usa para recorrer una colección de forma que cada elemento visitado es apuntado por nombreVar * Si la colección es un mapa. * Como colección también puede indicarse un array tradicional e incluso un String. y el <c:forEach> se ejecuta para cada una de tales palabras. La coma hace las veces de carácter delimitador.

<br> Capítulo 18: JSTL (Java Standard Tag Library). -17- <c:forTokens> * El comportamiento de <c:forTokens> es muy parecido al de <c:forEach> cuando se recorre un String.tres.cuatro.dos.<br> S G R y <c:forTokens var="elem" items="uno. * Nótese la diferencia entre: <c:forEach var="elemento" items="uno. En el caso de <c:forTokens> esposible indicar nuestros propios delimitadores. * La sintaxis de esta etiqueta es: <c:forTokens items=”cadenaDeTokens” delims=”delimitadores” [var=”nombreVar”] [varStatus=”nombreVarEstado”] [begin=”comienzo”] [end=”final”] [step=”paso”] > // Cuerpo a repetir </c:forEach> * El funcionamiento de esto es como el de un StringTokenizer que tiene como argumentos la cadenaDeTokens y los delimitadores. dos. Universidad de Málaga. cuatro.Programación en Java. . tres. 2006." delims=".o" > ${elem}<br> </c:forTokens> Adios."> ${elemento}<br> </c:forEach> Adios.

parseInt(pageContext. 17. 7. 29}. pageContext. getValue("numero"). <% int[] miLista = new int[]{1. 5.putValue("numero".getSession(). . %> <%= miNumero %><br> Adios. pageContext. 3. -18- Transferencia de variables * En el siguiente ejemplo se puede apreciar cómo intercambiar información entre un scriptlet y el entorno JSP. Luego se cambia la variable en JSP y se recarga desde otro scriptlet: <h3>Saludos</h3> <% int miNumero = 234544.getSession().putValue("miArray". 23. miNumero). 11. 13. En el siguiente ejemplo se le pasa un valor a JSP desde un scriptlet. %> ${numero}<br> <c:set var="numero" value="16" scope="session" /> ${numero}<br> <%= miNumero %><br> <% miNumero = Integer.<br> Capítulo 18: JSTL (Java Standard Tag Library). 19.Programación en Java. %> <c:forEach var="elemento" items="${miArray}" > ${elemento}<br> </c:forEach> * Las variables Java también se pueden cambiar desde JSP.toString()). miLista). Universidad de Málaga. 2006.getSession().

. ya sea in line o metiéndolos en una variable O <c:url> permite hacer referencia a una URL y meterla en una variable. relativa. en lugar de emitirlos directamente. -19- Etiquetas para URLs * Las diversas etiquetas suministradas permiten.Programación en Java. o relativa a un contexto diferente del de la página en que está. • Importar contenidos de cualquier URL de internet (y no sólo de recursos locales. • Asociar parámetros a una URL sin codificarlos en la dirección en sí. 2006. como hace <jsp:include>). • Redirigir la carga de la página a la URL que se indique. • Importar contenidos y meterlos en una variable String o Reader. • Una URL puede ser absoluta. O <c:param> permite pasar parámetros a una URL sin indicarlos directamente en la dirección. Universidad de Málaga. * Las etiquetas disponibles son: O <c:import> para disponer de contenidos de cualquier lugar de internet. También permite indicar parámetros a la URL de forma fácil O <c:redirect> permite redirigir la carga de la página. S G R Capítulo 18: JSTL (Java Standard Tag Library). entre otras cosas: • Asignar un nombre a una URL para usarla varias veces en la página JSP.

Capítulo 18: JSTL (Java Standard Tag Library).. * Por defecto. la URL resultante es emitida (a través del JspWriter actual).. * Si la direccion contiene caracteres raros. en este caso el sistema se encarga de rescribirla convenientemente.. * Pueden indicarse parámetros. 2006. También puede ser relativa a un contexto que no sea el de la página actual. . pero en lugar de esto puede almacenarse en una variable especificada en el atributo var. -20- <c:url> * Permite construir una URL completa rescribiendo las partes que sean necesarias. Universidad de Málaga. éstos no son rescritos por el sistema. * La sintaxis de esta etiqueta es: <c:url value=”dirección” [context=”contexto”] [var=”nombreVar”] [scope=”page|request|session|application”] > <c:param .. que se añadirán a la URL construida mediante la correspondiente recodificación.> <c:param . Si es relativa se rescribe para hacerla absoluta.> </c:url> * La direccion puede ser absoluta o relativa.Programación en Java.

* He aquí un ejemplo de uso: <h3>Saludos</h3> <c:url value="http://www. . S G R Capítulo 18: JSTL (Java Standard Tag Library). 2006.google. Además. que también puede contener <jsp:param>. * La sintaxis es: <c:param name=”nombreParam” value=”valorParam” /> o bien. Universidad de Málaga. hay que reconocer que el código queda mucho más claro. ya que se puede escribir directamente en la URL.consulta}" /> </c:url> <a href="${google}">${google}</a><br> Pincha <a href="${google}">aquí</a> para ir al mismo sitio.Programación en Java.es/search" var="google" > <c:param name="hl" value="es" /> <c:param name="q" value="${param. si el valor del parámetro es muy complicado: <c:param name=”nombreParam” > valorParam </c:param> * Aunque hacer uso de esta etiqueta puede considerarse redundante. -21- <c:param> * Permite añadir parámetros de forma indirecta a una URL. este método es consistente con el utilizado por <jsp:include>.

> <c:param .. Universidad de Málaga. Capítulo 18: JSTL (Java Standard Tag Library). o la mete en un objeto Reader para que las acciones siguientes hagan lo que quieran con el contenido.> </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 parámetros porque se confundirían con el cuerpo que consume el canal de entrada: no se sabría cuándo acaban los parámetros y cuándo hay que abrir el canal.. 2006.Programación en Java. -22- <c:import> * Esta etiqueta se va a la URL especificada y: o la mete en línea donde se encuentra el <c:import>. ... * En el primer caso la sintaxis es: <c:import url=”direccion” [context=”contexto”] [var=”nombreVar”] [scope=”page|request|session|application”] [charEncoding=”codificacion”] > <c:param .

S G R Capítulo 18: JSTL (Java Standard Tag Library). * Esta etiqueta cancela el procesamiento de la página y redirige la carga hacia la URL indicada que: • Puede ser absoluta. el <c:redirect> puede usarse incluso después de haber emitido ya algo.jsp" /> * Como puede observarse.Programación en Java. • Puede poseer parámetros de la forma <c:param>. * Ejemplo de uso: <h3>Saludos</h3> <c:redirect url="StringBean. debe empezar por “/”. Universidad de Málaga. El contexto. -23- <c:redirect> * La sintaxis es: <c:redirect url=”direccion” [context=”contexto”] /> * También es posible indicar parámetros a esta URL. como en casos anterior. . con lo que la etiqueta <c:import> quedaría abierta. relativa o relativa a un contexto. 2006.

.*" %> <h3>Saludos</h3> <c:import url="file:///e:/prueba.txt" varReader="lector" > <% BufferedReader in = new BufferedReader( (Reader)(pageContext.println(s+"<br>").io. String s.readLine()) != null) out.Programación en Java.com/jsp/jstl/core" prefix="c" %> <%@page import="java. Universidad de Málaga. %> </c:import> Adios. 2006.sun. while((s = in.<br> Capítulo 18: JSTL (Java Standard Tag Library).txt" /> Adiós<br> * También el texto que se lee se puede meter en una variable de ámbito y leerlo línea a línea: <h3>Saludos</h3> <c:import url="file:///e:/prueba.txt" var="lector" /> <c:forTokens var="elemento" items="${lector}" delims='<%="\n"%>' > ${elemento} -</c:forTokens> <br> Adiós<br> * También puede hacerse con un Reader: <%@ taglib uri="http://java. -24- Ejemplo de <c:import> * El ejemplo que vimos de <c:out > y Reader se podría haber hecho como: <h3>Saludos</h3> <c:import url="file:///e:/prueba.findAttribute("lector"))).

pbPublic S G R • • dando un valor de JNDI que será traducido por el motor JNDI a la información necesaria de acceso a la base de datos. T Ejecutar actualizaciones con INSERT. -25- SQL Tag Library * El prefijo estándar para esta biblioteca es sql. * El DataSource con que trabajar puede especificarse de varias formas: • Directamente en el atributo dataSource de algunas etiquetas. driver] [. T Cambiar rápidamente de base de datos.pointbase.sun. de dos formas: • dando directamente la información que necesita el DriverManager: url [. Ej. contraseña]. usuario.jsp.sql. 2006. Universidad de Málaga.com/jstl/sql" prefix="sql" %> * Esta biblioteca permite: T Ejecutar consultas con SELECT.servlet.Programación en Java. T Acceder fácilmente a los resultados de una consulta. Como valor del atributo de configuración: javax.jdbcUniversalDriver. UPDATE y DELETE.dataSource Capítulo 18: JSTL (Java Standard Tag Library). T Agrupar operaciones SQL en una transacción. Para usarla hay que incluir en la página JSP: <%@ taglib uri="http://java.: jdbc:pointbase:server://localhost:9092/sample. com.jstl. Este método tiene la ventaja de que permite acceder a un pool de conexiones. .pbPublic.jdbc. El DataSource sirve para hacer referencia a una base de datos en concreto. * Las operaciones de esta biblioteca trabajan con objetos de tipo DataSource que retorna uno de tipo Connection.

-26- <sql:setDataSource> * Esta etiqueta permite especificar la fuente de datos de las etiquetas sql que vendrán a continuación. No obstante. si se especifica. debe ser del tipo javax. Capítulo 18: JSTL (Java Standard Tag Library). . no es obligatorio especificarlo.sql. * La sintaxis es: <sql:setDataSource var=”nombreVar” [scope=”page|request|session|application”] [ dataSource=”fuenteDeDatos” | url=”URL_JDBC” [driver=”claseJavaDelDriver”] [user=”nombreUsuario”] [password=”contraseña”] ] /> * El campo fuenteDeDatos. Universidad de Málaga. puesto que la fuente de datos también puede indicarse como atributo de un inicio de transacción. 2006.DataSource.Programación en Java.

• read_uncommited: no hace lecturas sucias (datos a los que no se ha hecho un COMMIT. pero sí pueden suceder relecturas ambiguas: una transacción lee un registro. 2006. El ROLLBACK lo ejecuta si captura alguna excepción en la ejecución del cuerpo. otra transacción modifica el registro. otra transacción mete un nuevo registro que satisface la condición. y la primera vuelve a leer el registro otra vez. S G R Capítulo 18: JSTL (Java Standard Tag Library). -27- <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> * La transacción ejecuta automáticamente el COMMIT o el ROLLBACK. ¡pero con un nuevo registro aparecido! • serializable: evita todos los problemas de inconsistencia. .Programación en Java. y el COMMIT en caso contrario. ¡pero con un valor diferente! • repeatable_read: no hace relecturas ambiguas. hasta lo que todavía no se le ha hecho un COMMIT. * Cada tipo de aislamiento en la transacción es más potentes que el anterior: • read_uncommited: lo lee todo. pero sí pueden suceder lecturas fantasma: una transacción lee registros con WHERE. y la primera vuelve a leer los registros otra vez. Universidad de Málaga.

Universidad de Málaga. .. Cada parámetro se identifica por un símbolo de interrogación ?.. Capítulo 18: JSTL (Java Standard Tag Library). Las posteriores etiquetas <sql:param> permiten sustituir cada uno de estos parámetros por un valor real.> </sql:query> * Esta etiqueta permite ejecutar una sentencia select parametrizada. * La sentencia SELECT se ejecuta contra el DataSource especificado en la etiqueta <sql:transaction> dentro de la que se incluye. -28- <sql:query> * La sintaxis de esta etiqueta es: <sql:query var=”nombreVar” [scope=”page|request|session|application”] [dataSource=”fuenteDeDatos”] [startRow=”numRegistroInicio”] [maxRows=”numMaxRegistrosDevueltos”] > // Sentencia SQL con el símbolo ? en el lugar // de cada parámetro <sql:param . o bien contra el especificado en su atributo dataSource. 2006..Programación en Java. * La variable indicada en el atributo var sirve para referenciar el resultado que devuelve la sentencia SELECT ejecutada y posee gran cantidad de campos.> <sql:param ..

public Object[][] getRowsByIndex().Programación en Java.rows}" > ${cliente. -29- Lo que retorna <sql:query> * El objeto retornado en var por <sql:query> pertenece a la interfaz: public interface Result { public String[] getColumnNames().pbPublic. public int getRowCount() public Map[] getRows(). . Capítulo 18: JSTL (Java Standard Tag Library).pbPublic" > <sql:query var="clientes"> SELECT name FROM customer_tbl </sql:query> <c:forEach var="cliente" items="${clientes. 2006. public boolean isLimitedByMaxRows().jdbcUniversalDriver.name}<br> </c:forEach> </sql:transaction> ----------<br> S G R * Es posible procesar un SELECT genérico haciendo uso de los componentes de los métodos de la interfaz Result.co m. } * El siguiente ejemplo muestra cómo procesar un SELECT simple: <sql:transaction dataSource="jdbc:pointbase:server://localhost:9092/sample.pointbase.jdbc. Universidad de Málaga.

* De esta forma.xml.xml de Tomcat un recurso DataSource. cualquier modificación a la cadena de conexión queda centralizada en la declaración de este recurso en server.DataSource" maxActive="100" maxIdle="3" maxWait="10000" username="galvez" password="alfa00" driverClassName="oracle. Universidad de Málaga. darle un nombre. y luego usarlo en las etiquetas JSTL por su nombre. * Ejemplo: <Context docBase="patata5" path="/patata5" reloadable="true" debug="0"> <Resource name="jdbc/orcl" auth="Container" type="javax.OracleDriver" url="jdbc:oracle:thin:@localhost:1521:orcl"/> </Context> que sólo será accesible a las páginas JSP del contexto %TOMCAT_HOME%\webapps\patata5 * Una transacción hará uso de este recurso de la forma.jdbc.Programación en Java.driver. 2006. <sql:transaction dataSource="jdbc/orcl" > Capítulo 18: JSTL (Java Standard Tag Library). es posible especificar en el fichero server. -30- Recursos de Tomcat * Para no tener que estar repitiendo constantemente en cada página los datos de una DataSource.sql. .

. -31- Uso de la interfaz Result * El siguiente es un ejemplo completo de acceso genérico a bases de datos: <%@ taglib uri="http://java.sun.pointbase.jdbcUniversalDriver.com/jsp/jstl/sql" prefix="sql" %> <h3>Consulta genérica</h3> <sql:transaction dataSource="jdbc:pointbase:server://localhost:9092/sample.sun.pbPublic" > <sql:query var="clientes"> select * from customer_tbl </sql:query> <table border="1"> <tr> <c:forEach var="nombreCampo" items="${clientes.Programación en Java.pbPublic.rowsByIndex}" > <tr> <c:forEach var="datoCampo" items="${registro}" > <td>${datoCampo}</td> </c:forEach> </tr> </c:forEach> </table> </sql:transaction> ----------<br> S G R Capítulo 18: JSTL (Java Standard Tag Library).co m.com/jsp/jstl/core" prefix="c" %> <%@ taglib uri="http://java. 2006.columnNames}" > <th>${nombreCampo}</th> </c:forEach> </tr> <c:forEach var="registro" items="${clientes.jdbc. Universidad de Málaga.

La sintaxis es: <sql:paramvalue=”valor” /> o bien <sql:param> // valor del parámetro </sql:param> * Esta etiqueta sirve para sustituir los símbolos ? que se hayan incluido en la sentencia SQL dentro de la cual se enmarca el propio <sql:param>. para lo cual se usa la etiqueta <sql:dateParam> cuya sintaxis es: <sql:dateParam value=”valorDeTipoDateDeJava” type=”timestamp | time | date” /> * Lo más normal es que los parámetros de entrada a una página JSP sean los que se utilicen para parametrizar una consulta SQL. . Universidad de Málaga. 2006. -32- <sql:param> y <sql:dateParam> * Esta etiqueta sirve para pasar parámetros a sentencias SQL preparadas.Programación en Java. Estos parámetros entrada deberían validarse antes de enviarlos a la consulta. Sirve para indicar parámetros de cualquier tipo excepto fecha. Capítulo 18: JSTL (Java Standard Tag Library).

Universidad de Málaga.setAttribute("horaDate".pointbase.jdbc.sun. %> <sql:transaction dataSource="jdbc:pointbase:server://localhost:9092/sample.credit_limit}</td> <td>${cliente.Programación en Java.hora}"> <form action="index.rows}" > <tr> <td>${cliente.pbPublic. new java.jdbcUniversalDriver.com/jsp/jstl/core" prefix="c" %> <%@ taglib uri="http://java. credit_limit.Date("1/1/1 "+ request.limite || empty param.last_sale_time}</td> </tr> </c:forEach> </table> </sql:transaction> </c:otherwise> </c:choose> S G R Capítulo 18: JSTL (Java Standard Tag Library).util. com. last_sale_time FROM customer_tbl WHERE credit_limit >= ? AND last_sale_time > ? <sql:param value="${param.sun.getParameter("hora"))).pbPublic"> <sql:query var="clientes"> SELECT name. .jsp" method="GET"> Límite de crédito: <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> <% pageContext. 2006. -33- Ejemplo de <sql:query> * El siguiente es un ejemplo de página completa: <%@ taglib uri="http://java.com/jsp/jstl/sql" prefix="sql" %> <h3>Consulta genérica</h3> <c:choose> <c:when test="${empty param.limite}" /> <sql:dateParam value="${horaDate}" type="time" /> </sql:query> <table border="1"> <c:forEach var="cliente" items="${clientes.name}</td> <td>${cliente.

crear restricciones. . cambiarlas. etc. 2006. * Con esta etiqueta también pueden crearse tablas. -34- <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 símbolo ? // en el lugar de cada parámetro <sql:param . Capítulo 18: JSTL (Java Standard Tag Library)..> <sql:param .Programación en Java. Es de especial utilidad en sentencias UPDATE y DELETE.> </sql:update> * La variable var hace referencia al número de elementos afectados por la sentencia... borrarlas.. * Ejecutar <sql:update sql=”rollback” /> o <sql:update sql=”commit” /> no está permitido y puede producir resultados impredecibles. Universidad de Málaga.

com/jsp/jstl/sql" prefix="sql" %> <h3>Procesamiento</h3> <sql:transaction dataSource="jdbc:pointbase:server://localhost:9092/sample.rows}"> ${registro.jdbc. Universidad de Málaga. la visualiza y la borra: <%@ taglib uri="http://java.pointbase. -35- Ejemplo de <sql:update> * El siguiente ejemplo crea una tabla.com/jsp/jstl/core" prefix="c" %> <%@ taglib uri="http://java. la rellena. .Programación en Java. com. 2006.pbPublic" > <sql:update> CREATE TABLE a (campo1 NUMBER) </sql:update> <c:forEach var="contador" begin="1" end="20" step="3" > <sql:update> INSERT INTO a VALUES (?) <sql:param value="${contador}" /> </sql:update> </c:forEach> <sql:query var="registros" > SELECT campo1 FROM a </sql:query> <c:forEach var="registro" items="${registros.sun.jdbcUniversalDriver.sun.campo1}<br> </c:forEach> <sql:update> DROP TABLE a </sql:update> </sql:transaction> ----------<br> S G R Capítulo 18: JSTL (Java Standard Tag Library).pbPublic.

Algunas etiquetas interesantes son: O <fmt:setLocale> especifica el Locale actual. O <fmt:requestEncoding> sirve para trabajar con parámetros que proceden de un código diferente al ISO8859-1. Capítulo 18: JSTL (Java Standard Tag Library).Programación en Java. 2006. Se le pueden pasar parámetros. El mensaje lo busca en el fichero de recursos del bundle actual.sun. . O <fmt:message> emite el mensaje de código especificado en el idioma del Locale actual. Para usarla hay que incluir en la página JSP: <%@ taglib uri="http://java. El prefijo estándar para esta biblioteca es fmt.com/jsp/jstl/fmt" prefix="fmt" %> * Hace uso de los conceptos de internacionalización que ya se han estudiado en capítulos anteriores. <fmt:timeZone> y <fmt:setTimeZone> no las veremos. * Nosotros nos vamos a centrar principalmente en las etiquetas de formateo. O <fmt:bundle> especifica el nombre base de los ficheros de recursos. Universidad de Málaga. -36- I18n Formatting Tag Library * Esta biblioteca posee etiquetas que permiten formatear una página en base a un idioma seleccionado posibilitando que sea leída por personas de todo el mundo.

Programación en Java. -37- <fmt:formatNumber> y <fmt:parseNumber> * Estas etiquetas permiten emitir un número que siga el formato que se le indice. 2006. así como traducir un texto a un número siguiendo un patrón concreto de análisis. . Las sintaxis son: <fmt:formatNumber value=”valorNumérico” [var=”nombreVar”] [scope=”page|request|session|application”] [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=”valorNuméricoEnUnaCadena” [var=”nombreVar”] [scope=”page|request|session|application”] [type=”number | currency | percent “] [pattern=”patronPersonalizado”] [parseLocale=”LocaleDelParser“] [integerOnly=”true | false”] /> S G R Capítulo 18: JSTL (Java Standard Tag Library). Universidad de Málaga.

333. * El atributo parseLocale sirve para decir el Locale en base al cual hay que hacer el análisis del número almacenado en la cadena de entrada. Universidad de Málaga. ya que el resultado debiera haber sido: €33.text. * El atributo integerOnly especifica que sólo debe reconocerse la parte entera del número guardado en la cadena. . * Por ejemplo.DecimalFormat. el formateo : <fmt:formatNumber value="${100000000 / 3}" type="currency" currencySymbol="€" groupingUsed="true" maxIntegerDigits="4" maxFractionDigits="2" minFractionDigits="2" /> produce: €3.Programación en Java.33 Capítulo 18: JSTL (Java Standard Tag Library). 2006.333.333. Ver java.33 así que cuidado con maxIntegerDigits.NumberFormat. * El atributo groupingUsed permite decir si se va ausar algún carácter de agrupación. -38- <fmt:formatNumber> y <fmt:parseNumber> * El patrón de formateo debe seguir las reglas de la clase java. setGroupingUsed() para más información.text.

-39- <fmt:formatDate> y <fmt:parseDate> * Estas etiquetas permiten trabajar con fechas.text. Capítulo 18: JSTL (Java Standard Tag Library). Universidad de Málaga.DateFormat. siguien el formateo de . Las sintaxis son: <fmt:formatDate value=”valorDeFecha” [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”] /> y <fmt:parseDate 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“] S G R /> * dateStyle y timeStyle java. 2006.Programación en Java.

util.Programación en Java.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 value="${ahora}" pattern="dd/MM/yyyy" /><br> cuya salida es: 30-ene-2006 30-ene-2006 20:46:56 20:46:56 20:46 30/01/2006 Capítulo 18: JSTL (Java Standard Tag Library). 2006. Universidad de Málaga. -40- <fmt:formatDate> y <fmt:parseDate> * Algunos ejemplos de funcionamiento son: <jsp:useBean id="ahora" class="java. .

. substring) devuelve boolean O fn:containsIgnoreCase(string.sun. Para usarla hay que incluir en la página JSP: <%@ taglib uri="http://java. El carácter en beginIndex se incluye y el de enIndex se excluye. 2006. O fn:substringAfter(string. substring) devuelve boolean O fn:endsWith(string. Si no está se devuelve -1. La primera posición de string es la 0. sino funciones con prefijo que pueden usarse en el interior de una expresión del lenguaje de expresiones. Universidad de Málaga. • De obtención de subcadenas: O fn:substring(string. substring) devuelve int. prefijo) devuelve boolean O fn:indexOf(string. sufijo) devuelve boolean O fn:startsWith(string. endIndex) devuelve String.com/jsp/jstl/functions" prefix="fn" %> * Esto no son etiquetas realmente. * Las funciones son las siguientes: • De búsqueda en cadenas: O fn:contains(string.Programación en Java. El prefijo estándar para esta biblioteca es fn. -41- I18n Formatting Tag Library * El lenguaje de expresiones define el concepto de “funciones” para permitir a los desarrolladores crear sus propias extensiones a este lenguaje. substring) devuelve String O fn:substringBefore(string. Las posiciones comienzan a partir de la 0. beginIndex. substring) devuelve String S G R Capítulo 18: JSTL (Java Standard Tag Library).

2006. • Otras: O fn:escapeXml(string) devuelve String.) • Traducción de cadenas: O fn:replace(inputString. separador) devuelve String.Programación en Java. Trocea una cadena en un array de cadenas. delimitadores) devuelve String[]. Convierte un array en una cadena. beforeSubstring. -42- Funciones (cont. afterSubstring) devuelve String O fn:toLowerCase(string) devuelve String O fn:toUpperCase(string) devuelve String O fn:trim(string) devuelve String. O fn:length(input) devuelve integer. O fn:split(string. • Gestión de arrays y cadenas: O fn:join(array. Los trozos estaban originalmente separados por cualquier carácter de los que aparece en delimitadores. Universidad de Málaga. Cada dos elementos están separados por la cadena separador. La entrada puede ser una cadena o un array o una colección y devuelve su longitud o el número de elementos respectivamente. . Capítulo 18: JSTL (Java Standard Tag Library). Elimina los espacios a ambos extremos de la cadena. Véase el atributo escapeXml de <c:out>.

Visualiza el texto entre paréntesis --%> ${fn:substring(text.Visualiza un valor con “bolillas” en vez de guiones --%> ${fn:replace(texto.’)} S G R Capítulo 18: JSTL (Java Standard Tag Library).Programación en Java.Trunca el nombre a 30 caracteres y lo visualiza en mayúsculas --%> ${fn:toUpperCase(fn:substring(nombre. ’-’. fn:length(texto)-10)} <%-.Visualiza los últimos 10 caracteres --%> ${fn:substring(text. ’*’)} <%-. ’(’)+1. 0. ’&#149. Esto los quita --%> <c:url var="myUrl" value="${base}/cust"> <c:param nombre="custId" value="${fn:trim(custId)}"/> </c:url> <%-. fn:indexOf(texto. 2006. ’)’))} <%-. searchString)}"> Encontrado en el nombre: ${nombre} </c:if> <%-. Universidad de Málaga.fn:indexOf(texto.Visualiza el nombre si contiene la cadena a buscar --%> <c:if test="${fn:containsIgnoreCase(nombre. -43- Ejemplos de funciones * Algunos ejemplos son: <%-. 30))} <%-. .La variable custId puede tener espacios en blanco en los extremos.Visualiza el texto que precede al primer asterisco --%> ${fn:substringBefore(texto.

sun. O <x:transform> y <x:param> para aplicar hojas XSLT a un documento XML. El prefijo estándar para esta biblioteca es x. O <x:set> igual al anterior pero guarda el resultado en una variable. 2006. Universidad de Málaga.Document. <x:choose>. <x:when>.com/jsp/jstl/xml" prefix="xml" %> * No entraremos en detalle en sus etiquetas. -44- XML Tag Library * Esta biblioteca posee etiquetas que permiten analizar. .Programación en Java. Para usarla hay que incluir en la página JSP: <%@ taglib uri="http://java. O <x:if>. Capítulo 18: JSTL (Java Standard Tag Library). procesar y buscar información dentro de un documento XML. O <x:out> que evalúa una expresión Xpath y emite el resultado. Baste decir que son: O <x:parse> que analiza un documento XML y puede devolver un org.dom.w3c. <x:otherwise> y <x:forEach> para recorrer contenidos basados en expresiones Xpath.