3. herramientas para el desarrollo de...

48
Modelos de Desarrollo WEB Primavera 2020 Dr. Mario Rossainz López 3. HERRAMIENTAS PARA EL DESARROLLO DE APLICACIONES WEB 3.1. SERVLETS Los servlets son la respuesta de la tecnología JAVA a la programación de CGIs. Aunque ambas tecnologías proporcionan la misma funcionalidad básica: “ofrecer un mecanismo para ejecutar programas en equipos servidores, en función de las peticiones que los clientes realicen haciendo uso de los navegadores Web”; al utilizar servlets con cada petición se inicia un hilo en vez de un proceso como lo hace CGI, lo cual reduce el uso de memoria del servidor y el tiempo de respuesta de éste al cliente. 3.1.1. VENTAJAS DE LOS SERVLETS SOBRE LOS CGIs Si comparamos los servlets con la tecnología CGI, llegaremos a la conclusión de que son bastante más simples y potentes que los segundos. Sus principales características son: Al estar escritos en JAVA, son independientes de la plataforma Consumen menos recursos de máquina, ya que sólo son cargados la primera vez que se solicitan sus servicios. Son más rápidos que los programas CGI Son seguros y portables ya que se ejecutan bajo la misma máquina virtual de JAVA No requieren soporte para JAVA del lado del cliente, pues operan en el dominio del servidor y envían los resultados en HTML. Los servlets son entonces programas que se ejecutan en un servidor Web, que fungen como una capa intermedia entre una petición proveniente de un navegador Web u otro cliente http, y las bases de datos o aplicaciones del servidor http. La figura anterior indica que un servlet acepta peticiones de un cliente, procesa la información relativa a la petición realizada por el cliente y le devuelve a éste los resultados que podrán ser mostrados mediante páginas HTML. 3.1.2. CICLO DE VIDA DE UN SERVLET 1. El cliente realiza una petición http haciendo uso de un navegador Web (ueden existir parámetros asociados). Explorador Servlet Petición HTTP Respuesta HTTP

Upload: others

Post on 28-Mar-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3 HERRAMIENTAS PARA EL DESARROLLO

DE APLICACIONES WEB

31 SERVLETS

Los servlets son la respuesta de la tecnologiacutea JAVA a la programacioacuten de CGIs Aunque

ambas tecnologiacuteas proporcionan la misma funcionalidad baacutesica ldquoofrecer un mecanismo para

ejecutar programas en equipos servidores en funcioacuten de las peticiones que los clientes

realicen haciendo uso de los navegadores Webrdquo al utilizar servlets con cada peticioacuten se inicia

un hilo en vez de un proceso como lo hace CGI lo cual reduce el uso de memoria del servidor

y el tiempo de respuesta de eacuteste al cliente

311 VENTAJAS DE LOS SERVLETS SOBRE LOS CGIs

Si comparamos los servlets con la tecnologiacutea CGI llegaremos a la conclusioacuten de que son

bastante maacutes simples y potentes que los segundos Sus principales caracteriacutesticas son

bull Al estar escritos en JAVA son independientes de la plataforma

bull Consumen menos recursos de maacutequina ya que soacutelo son cargados la primera vez que se

solicitan sus servicios

bull Son maacutes raacutepidos que los programas CGI

bull Son seguros y portables ya que se ejecutan bajo la misma maacutequina virtual de JAVA

bull No requieren soporte para JAVA del lado del cliente pues operan en el dominio del

servidor y enviacutean los resultados en HTML

Los servlets son entonces programas que se ejecutan en un servidor Web que fungen como

una capa intermedia entre una peticioacuten proveniente de un navegador Web u otro cliente http

y las bases de datos o aplicaciones del servidor http

La figura anterior indica que un servlet acepta peticiones de un cliente procesa la

informacioacuten relativa a la peticioacuten realizada por el cliente y le devuelve a eacuteste los resultados

que podraacuten ser mostrados mediante paacuteginas HTML

312 CICLO DE VIDA DE UN SERVLET

1 El cliente realiza una peticioacuten http haciendo uso de un navegador Web (ueden existir

paraacutemetros asociados)

Explorador Servlet Peticioacuten HTTP

Respuesta HTTP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

2 La peticioacuten y sus datos asociados los recoge el servidor Web a traveacutes de la red

3 El servidor Web detecta que hay que ejecutar un servlet y delega a esta accioacuten a un

contenedor de servlets que puede ser el mismo servidor Web para que sea ejecutado

4 Una vez ejecutado el servlet se traspasan los resultados (mediante paacuteginas Web) al

servidor Web

5 El servidor Web enviacutea las paacuteginas Web de resultados mediante la red

6 La paacutegina Web de respuesta le llega al cliente que la visualizaraacute haciendo uso del

navegador Web

Por lo tanto los servlets nos permiten crear paacuteginas Web dinaacutemicas en el sentido de que la

respuesta que ofrecen puede variar en funcioacuten de los datos que proporcione el cliente y la

situacioacuten de contexto existente De hecho existen varias razones por las que las paacuteginas Web

requieren ser dinaacutemicas (generadas al momento) como las siguientes

bull La paacutegina Web estaacute basada en los datos enviados por el usuario Por ejemplo paacuteginas

para confirmacioacuten de pedidos en Internet

bull La paacutegina Web se deriva de datos que cambian constantemente Por ejemplo paacuteginas de

informes de clima o encabezados noticiosos

bull La paacutegina Web utiliza informacioacuten de bases de datos corporativas u otros oriacutegenes de

datos que se encuentran del lado del servidor Por ejemplo un sitio de comercio

electroacutenico que liste precio y disponibilidad del punto de venta

313 ESTRUCTURA DE LOS SERVLETS

JAVA proporciona el soporte necesario para escribir servlets a traveacutes de los paquetes

javaxservlet y javaxservlethttp El primero de ellos contiene las interfaces y clases maacutes

geneacutericas que soportan el funcionamiento de los servlets Al programar servlets lo maacutes

habitual es hacer uso del segundo paquete que resulta maacutes especializado uacutetil y faacutecil de

utilizar pues responde a peticiones realizadas desde un cliente HTML

Por tanto un servlet no es maacutes que un objeto de alguna de las clases de la API Java Servlet

(ver figura de arriba) que implemente la interfaz Servlet como son GenericServlet y

Object_Servlet

javaxservletGenericServlet

javaxservlethttpHttpServlet

MiServlet

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

HttpServlet Como esta uacuteltima clase es la idoacutenea para servicios especiacuteficos http entonces el

tipo de servlet maacutes baacutesico puede ser de la forma siguiente Un objeto de una clase derivada

de HttpServlet que encapsula los meacutetodos init() para iniciar el servlet si procede doPost yo

DoGet para responder a las peticiones de los clientes y destroy() para realizar operaciones de

limpieza cuando se descarga el servlet

import javaio

import javaxservlet

import javaxservlethttp

public class MiServlet extends HttpServlet

public void init(ServletConfig config) throws ServletException

superinit(config)

Meacutetodo doPost para responder a una peticioacuten POST

public void doPost(HttpServletRequest request

HttpServletResponse response)

Throws ServletException IOException

Meacutetodo doGet para responder a una peticioacuten GET

public void doGet(HttpServletRequest request

HttpServletResponse response)

Throws ServletException IOException

public void destroy()

Liberar recursos

314 EJECUCIOacuteN DE UN SERVLET

Todo Servlet debe implementar la interfaz Sevlet ya que eacutesta es quien declara los meacutetodos

que definen el ciclo de vida del mismo init service y destroy

El meacutetodo init es invocado por el contenedor Web para iniciar la ejecucioacuten del servlet Eacuteste

meacutetodo se ejecuta una sola vez y tiene como misioacuten inicializar las variables y los recursos

necesarios para la ejecucioacuten del servlet Si la ejecucioacuten de este meacutetodo no se realiza con eacutexito

lanzaraacute la excepcioacuten ServletException

El meacutetodo service se llama cada vez que el servidor recibe una peticioacuten para el servlet Este

meacutetodo puede recibir varias llamadas simultaacuteneas Para cada una de ellas se crea un nuevo

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

hilo y examina el tipo de peticioacuten http (get post put delete trace options o head) con el

fin de llamar al meacutetodo adecuado para atenderla por ejemplo doGet doPost doPut etc El

tipo de peticioacuten por omisioacuten es GET

El meacutetodo service tiene dos paraacutemetros de tipos HttpServletRequest y

HttpServletResponse respectivamente que son pasados al meacutetodo invocado Si la

ejecucioacuten no se desarrolla con eacutexito se lanzaraacute una excepcioacuten del tipo ServletException o

IOException

El objeto de la clase HttpServletRequest encapsula los datos enviados por el cliente al

servidor El objeto de la clase HttpServletResponse encapsula los datos que el servidor

enviaraacute al cliente Este objeto proporciona dos formas para retornar los datos una mediante

un objeto PrintWriter devuelto por su meacutetodo getWriter y otra mediante un objeto

ServletOutputStream devuelto por su meacutetodo getOutputStream La primera forma

devuelve texto (cadenas de caracteres) y la segunda forma devuelve datos binarios (cadenas

de bytes)

El meacutetodo destroy es el uacuteltimo meacutetodo invocado justo antes de destruir el servlet

Normalmente se utiliza para liberar los recursos de maacutequina adquiridos por ejemplo borrar

archivos temporales

315 UN PRIMER SERVLET SENCILLO

Este primer servlet que se muestra a continuacioacuten implementa el caso maacutes sencillo posible

la aplicacioacuten ldquoHolaMundordquo que mostraraacute el texto ldquoHola Mundordquo en el navegador del cliente

En este caso independientemente del tipo de peticioacuten http GET o POST que se realice el

servlet responderaacute en ambos casos enviando la misma paacutegina Web

import javaio

import javaxservlet

import javaxservlethttp

public class HolaMundo extends HttpServlet

Manipular las posibles peticiones enviadas por el cliente

utilizando el atributo method=get o method=post

protected void procesarPeticion(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

responsesetContentType(texthtml)

PrintWriter out = responsegetWriter()

outprintln(lthtmlgt)

outprintln(ltheadgt)

outprintln(lttitlegtServlet HolaMundolttitlegt)

outprintln(ltheadgt)

outprintln(ltbodygt)

outprintln(ltfont size=7gt)

outprintln(iexcliexcliexclHola mundo)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

outprintln(ltfontgt)

outprintln(ltbodygt)

outprintln(lthtmlgt)

outclose()

Manipular la peticioacuten enviada por el cliente

utilizando el atributo method=get

protected void doGet(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

procesarPeticion(request response)

Manipular la peticioacuten enviada por el cliente

utilizando el atributo method=post

protected void doPost(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

procesarPeticion(request response)

En las primeras liacuteneas del coacutedigo anterior se colocan las sentencias import de los paquetes ya

citados El paquete javaio se requiere para las operaciones de entrada y salida de datos y

resultados a traveacutes de los objetos request y response La manera maacutes sencilla de definir un

servlet es heredar de la clase HttpServlet

Asiacute cuando este servlet recibe una peticioacuten del cliente el servidor lo carga para su ejecucioacuten

instante en el que se ejecuta el meacutetodo init() que lo inicia (en este caso el que se invoca es el

que se da por omisioacuten en la superclase de HolaMundo) Cuando init finaliza el servlet esta

en condiciones de atender a las peticiones de los clientes en el ejemplo para cada una de las

peticiones GET o POST se ejecuta el meacutetodo procesarPeticion que es invocado por doGet

o DoPost El servlet permaneceraacute cargado hasta que el servidor decida destruirlo ejecutando

el meacutetodo destroy si es que se implementoacute

Analizando el meacutetodo procesarPeticion se observa que el meacutetodo almacena en el objeto out

de la clase PrintWriter los datos que el servlet HolaMundo enviaraacute al cliente que realizoacute la

peticioacuten Este objeto forma parte del objeto response y es obtenido a traveacutes de su meacutetodo

getWriter Los datos se almacenan en out utilizando su meacutetodo println Los datos

almacenados como se puede ver se corresponden con una paacutegina HTML que seraacute enviada

al explorador del cliente

Ademaacutes de estos datos expliacutecitos tambieacuten se enviacutea otra informacioacuten de protocolo http como

son las cabeceras de respuesta generadas por el servidor Estas cabeceras de respuesta

incluyen la liacutenea Content-type texthtml

Esta liacutenea identifica el tipo de documento a enviar o a recibir en este caso se trata de un

documento HTML Cuando el navegador del cliente reciba esta informacioacuten sabraacute como

interpretar el tipo de documento que tiene que visualizar Para establecer este valor

procesarPeticion utiliza el meacutetodo setContentType del objeto response

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3151 PUESTA EN FUNCIONAMIENTO DEL SERVLET ldquoHolaMundordquo

Una vez escrito el servlet los pasos necesarios para ver el resultado que produce son

bull Compilarlo

bull Instalarlo en un servidor

bull Invocarlo para su ejecucioacuten desde un navegador Web

Como puede leerse no resulta tan sencillo desarrollar y ejecutar por vez primera un servlet a

diferencia de una aplicacioacuten JAVA normal que esteacute basada en el SDK estaacutendar Estos pasos

requieren proceder entonces de alguna de las dos formas siguientes

1 Suponiendo que se tiene instalado el J2SE SDK en particular la versioacuten 150 habraacute que

instalar el servidor Web de aplicaciones Tomcat 5 El servidor Tomcat soporta un

contenedor Web que permite ejecutar servlets y paacuteginas JSP (de las que se hablaraacuten en

la seccioacuten siguiente) En el apeacutendice B del presente documento se muestra la manera de

No obstante existen muchos tipos de servidores aparte del Tomcat que permiten el uso de

los servlets algunos de estos son

a JavaServer Web Development Kit (JSWDK) hoy llamado JWSDP (Java Web

Services Developer Pack o Paquete de desarrollo de servicios Web de Java)

b Allaire JRun (motor para JSP y Servlet que puede ser integrado en servidores de

Netscape Enterprise o Microsoft Personal Web Server)

c ServletExec de Nwe Atlanta (Motor para JSP y Servlet que puede ser integrado

en los servidores Web maacutes populares para Solaris Windows MacOs HP-UX y

Linux

d LiteWebServer (LWS) de Gefion Software (Es un pequentildeo servidor Web

gratuito derivado de Tomcat)

e Java Web Server de Sun (Servidor totalmente gratuito escrito en JAVA

2 Suponiendo que no se tiene instalado ninguacuten software para desarrollar aplicaciones

JAVA habraacute que instalar el Java 2 Enterprise Edition Software Development Kit o J2EE

SDK Este paquete proporciona la base para desarrollar y distribuir aplicaciones

multicapa distribuidas e incluye entre otras herramientas el J2SE y un servidor de

aplicaciones (J2EE Application Server) En el apeacutendice A se muestra la manera en que

se puede instalar y la forma en la que se puede lanzar el servidor de aplicaciones La

versioacuten que se esta suponiendo se trabajaraacute es la J2EE 14 SDK que incluye el J2SE

142_02 y ejemplos ademaacutes del J2EE 14 Application Server

Para ejecutar un servlet como el del HolaMundo del ejemplo anterior teniendo ya instalados

los paquetes J2SE 150 y Tomcat 5 siga los pasos siguientes

1 antildeada a la variable de entorno path de su sistema operativo la ruta de la carpeta bin del

J2SE que tiene instalado

2 Copie el archivo servlet-apijar que se encuentra en commonlib del tomcat que tiene

instalado a jrelibext del J2SE

3 Cambie al directorio de la aplicacioacuten es decir donde se encuentra el servlet

4 Compile el servlet en el ejemplo javac HolaMundojava

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

5 Antildeada el archivo class (HolaMundoclass) que resulta de la compilacioacuten a la carpeta

webappsROOTWEB-INFclasses del Tomcat

6 Edite el archivo confwebxml del Tomcat para definir el servlet invoquer que permite

ejecutar servlets anoacutenimos

7 Arranque el servidor Tomcat (este punto debe realizarse despueacutes del paso 5 para que el

servidor reconozca la aplicacioacuten que se acaba de instalar) Si el servidor ya estaba

arrancado cuando se realizoacute el punto 4 detengalo y vuelvalo a arrancar o abra el

explorador y escriba el URL httplocalhost8080managerhtml y recargue la

aplicacioacuten

8 Una vez arrancado el servidor verifique que funciona correctamente escribiendo en el

navegador httplocalhost8080 o http1270018080 8080 es el puerto utilizado para

acceder al servidor

9 Ejecute el servlet escribiendo en el navegador el URL

httpservidor[puerto]servletnombre_servlet que en el caso del ejemplo seriacutea

httplocalhost8080servletHolaMundo

En conclusioacuten para ejecutar un servlet habraacute que copiar el archivo class que lo define

en la carpeta ROOTWEB-INFclasses de la carpeta webapps del servidor a la que tienen

acceso los clientes Web y ejecutar httpservidor[puerto]servletnombre_servlet de

forma que el servlet HolaMundo se mostrariacutea en su ejecucioacuten como en la figura siguiente

Ahora bien lo maacutes interesante es invocar a los servlets desde paacuteginas Web Se puede solicitar

la ejecucioacuten de un servlet de igual manera que pedimos un recurso cualquiera basta con

definir el URL del servlet en el punto deseado en la paacutegina Web

El siguiente ejemplo muestra un servlet que ademaacutes de generar la paacutegina HTML donde se

manda a escribir ldquoHola Mundordquo devuelve la fecha y hora del servidor Con esto se trata de

dar a entender que por una parte un servlet no tiene porque generar soacutelo paacuteginas HTML sino

que ademaacutes un servlet es capaz de generar contenido dinaacutemico incluyendo cualquier proceso

escrito que pueda ejecutar JAVA (leer o escribir archivos ejecutar programas cargas

bibliotecas etc)

import javaio

import javaxservlet

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

import javaxservlethttp

import javautil

public class Saludo extends HttpServlet

Manipular la peticioacuten enviada por el cliente

utilizando el atributo method=get

protected void doGet(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

responsesetContentType(texthtml)

PrintWriter out = responsegetWriter()

outprintln(lthtmlgt)

outprintln(ltheadgt)

outprintln(lttitlegtServlet Saludolttitlegt)

outprintln(ltheadgt)

outprintln(ltbodygt)

outprintln(ltcentergt)

for (int tamantildeo = 1 tamantildeo lt= 7 ++tamantildeo)

outprintln(ltfont size=+tamantildeo+ color=bluegt)

outprintln(iexcliexcliexclHola mundo)

outprintln(ltbrgt)

outprintln(ltbrgt)

Calendar fechahora = new GregorianCalendar()

Random rnd = new Random()

int tamantildeo = rndnextInt(7)+1

outprintln(ltfont size=+tamantildeo+gt)

outprintln(ltfont color=greengt)

outprintln(Son las +

fechahoraget(CalendarHOUR_OF_DAY) + +

fechahoraget(CalendarMINUTE) + +

fechahoraget(CalendarSECOND) )

outprintln(ltbrgt)

outprintln(ltfont color=graygt)

outprintln(Del diacutea +

fechahoraget(CalendarDAY_OF_MONTH) + +

(fechahoraget(CalendarMONTH)+1) + +

fechahoraget(CalendarYEAR) )

outprintln(ltfontgt)

outprintln(ltcentergt)

outprintln(ltbodygt)

outprintln(lthtmlgt)

outclose()

Para ejecutar este servlet llamado Saludo podemos crear una carpeta dentro de webapps por

ejemplo saludoWEB-INFclasses y copiar dentro de classes Saludoclass

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Para ejecutar el servlet Saludo tendriacuteamos entonces que escribir

httplocalhost8080SaludoservletSaludo

Pero si queremos invocar a este servlet desde una paacutegina HTML se deberaacute utilizar este

mismo URL o bien el URL relativo a la carpeta del servidor donde copiemos el archivo html

que seraacute copiado en la carpeta Saludo

El coacutedigo HTML almacenado en saludohtml deberaacute incluir una de las dos liacuteneas siguientes

lta href=rdquohttplocalhost8080Saludoservletsaludordquogt ejecutar Saludo ltagt

lta href=rdquoservletSaludordquogt ejecutar Saludo ltagt

La segunda opcioacuten es la maacutes interesante porque no depende de la direccioacuten del servidor Para

ejecutar entonces el servlet a traveacutes de saludohtml basta con escribir el URL siguiente

httplocalhost8080Saludosaludohtml

316 EMPAQUETADO DE SERVLETS

Puede darse el caso en que diversos programadores en un entorno de produccioacuten dado

podriacutean estar desarrollando servlets para el mismo servidor El colocar todos estos servlets

en el directorio principal de estos programas podriacutea dar como resultado un directorio difiacutecil

de administrar ademaacutes de que se corre el riesgo de duplicar los nombres de los servlets si

dos desarrolladores distintos eligen el mismo nombre para el programa que desarrollan Los

paquetes son la solucioacuten loacutegica a este problema El uso de paquetes tiene como resultado

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

cambios en la forma en que se generan los servlets la forma en que se compilan y en la que

se invocan Para colocar los servlets en paquetes se requieren de dos pasos

1 Mover los archivos (class) a un subdirectorio que coincida con el nombre del paquete

pretendido

2 Insertar una instruccioacuten de paquete en el archivo de clase Para ello la primera liacutenea en

el coacutedigo fuente (java) del servlet deberaacute ser package nomPaquete

Por ejemplo el fragmento siguiente de coacutedigo Java presenta una variacioacuten del Servlet

HolaMundo que se encuentra en el paquete misServlets

package misServlets

import javaio

import javaxservlet

import javaxservlethttp

public class HolaMundo extends HttpServlet

Manipular las posibles peticiones enviadas por el cliente

utilizando el atributo method=get o method=post

protected void procesarPeticion(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

responsesetContentType(texthtml)

PrintWriter out = responsegetWriter()

outprintln(lthtmlgt)

El archivo class se encontraraacute dentro de una carpeta llamada misServlets que seraacute el paquete

creado o utilizado por la aplicacioacuten en este caso del HolaMundo dependiendo si exitiacutea o no

antes de compilar la aplicacioacuten A continuacioacuten deberemos copiar dentro de la carpeta

webappsROOTWEB-INFclasses del Tomcat la carpeta misServlets junto con el

HolaMundoclass que estaraacute dentro de ella y ejecutar el servlet en el explorador escribiendo

httplocalhost8080servletmisServletsHolaMundo

317 PROCESAMIENTO DE FORMULARIOS

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Hasta este punto los servlets que hemos estudiado soacutelo enviacutean informacioacuten al navegador del

cliente No obstante estos clientes Web pueden Mostar formularios que permitan solicitar

datos a los usuarios que seraacuten enviados al servidor para por ejemplo ser almacenados en

una base de datos para posteriores peticiones o para otros procesos o bien para dar al usuario

una respuesta ajustada a dicha peticioacuten

En el siguiente URL se invoca la ejecucioacuten de un servlet llamado Parametros aportando la

lista de pares (Nombre Mario)-(Edad 22) en formato GET

httplocalhost8080ParametrosservletParametrosNombre=MarioampEdad=22

Hay que observar la manera de colocar los datos tras el siacutembolo ldquordquo y de separarlos con el

siacutembolo ldquoamprdquo El coacutedigo del servlet es el siguiente

import javaio

import javaxservlet

import javaxservlethttp

public class Parametros extends HttpServlet

public void doGet(HttpServletRequest request HttpServletResponse

response)

throws IOException ServletException

responsesetContentType(texthtml)

PrintWriter out = responsegetWriter()

outprintln(lthtmlgt)

outprintln(ltbodygt)

String NombreRecibido = requestgetParameter(Nombre)

String EdadRecibida = requestgetParameter(Edad)

outprintln(lth1gt Hola + NombreRecibido + lth1gt)

outprintln(lth1gt Tienes + EdadRecibida + antildeos lth1gt)

outprintln(ltbodygt)

outprintln(lthtmlgt)

El objeto httpServletRequest en el coacutedigo anterior request contiene una serie de meacutetodos de

utilidad para recibir informacioacuten proveniente del usuario en concreto el meacutetodo

getParameter permite obtener el valor asociado a un nombre en la lista de pares (nombre

valor) que puede proporcionar un URL

Ademaacutes de poder introducir el URL anterior en el navegador proporcionando directamente

los datos enviados al servlet en dicha URL

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Tambieacuten podemos generar el URL mediante una paacutegina Web que podraacute utilizar el usuario

lthtmlgt

ltbodygt

lth1gt Cuestionario lth1gt

ltform action=httplocalhost8080ParametrosservletParametros

method=getgt

Nombre ltinput type=text name=Nombregt ltbrgt

Edad ltinput type=text name=Edadgt ltbrgtltbrgt

ltinput type=submit value=Enviar datosgt ltbrgt

ltformgt

ltbodygt

lthtmlgt

Los formularios en HTML permiten enviar datos al servidor Web En la liacutenea 5 de la paacutegina

Web mostrada se encuentra la etiqueta form que en el ejemplo contiene el atributo action

que indica la accioacuten que debe realizarse en el servidor en este caso ejecutar el servlet

Parametros y el atributo method que indica la manera en la que se enviacutean los datos (en este

caso la peticioacuten GET)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Peticioacuten HTTP GET Cuando el tipo de peticioacuten HTTP es GET los datos del formulario

son enviados al servidor a continuacioacuten del URL especificado por el atributo action de form

El tamantildeo de la cadena enviada estaacute limitado y al estar en ASCII es totalmente legible por

tanto no es un modo seguro

Es por ello que cuando se requiere del enviacuteo de datos seguros y ademaacutes el nuacutemero de datos

del formulario que son enviados al servidor son muchos resulta ser mejor el uso del meacutetodo

POST Veamos otro ejemplo

import javaio

import javaxservlet

import javaxservlethttp

import javautil

public class MostrarParametros extends HttpServlet

public void doGet(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

responsesetContentType(texthtml)

PrintWriter out= responsegetWriter()

String titulo=Lectura de todos los paraacutemetros de Peticioacuten

outprintln(ltdoctype html public -W3CDTD HTML 40 +

TransitionalENgt)

outprintln(lthtmlgt)

outprintln(ltheadgtlttitlegt+titulo+lttitlegtltheadgt)

outprintln(ltbody bgcolor=FDF5E6gtn+

lth1 align=centergt+titulo+lth1gtn+

lttable border=1 align=centergtn+

lttr bgcolor=FFAD00gtn+

ltthgtNombre del parampaacutemetroltthgtValor(es) del

parampaacutemetro)

Enumeration nombresParam=requestgetParameterNames()

while(nombresParamhasMoreElements())

String nombreParam= (String)nombresParamnextElement()

outprint(lttrgtlttdgt+nombreParam+nltTDgt)

String[]valoresParam=

requestgetParameterValues(nombreParam)

if (valoresParamlength==1)

String valorParam=valoresParam[0]

if (valorParamlength()==0)

outprintln(ltigt Sin valor ltigt)

else

outprintln(valorParam)

else

outprintln(ltulgt)

for (int i=0 iltvaloresParamlengthi++)

outprintln(ltligt+valoresParam[i])

outprintln(ltulgt)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

outprintln(lttablegtnltbodygtlthtmlgt)

public void doPost(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

doGet(requestresponse)

El servlet escrito utiliza un meacutetodo doPost que soacutelo ejecuta a Donet Esto es porque se quiere

que el servlet pueda manejar tanto las peticiones GET como las POST Por otro lado el

formulario es el siguiente

ltdoctype html public -W3CDTD HTML 40 TransitionalENgt

lthtmlgt

ltheadgt

lttitlegt Un Formulario de ejemplo que utiliza POST lttitlegt

ltheadgt

ltbody bgcolor=FDF5E6gt

lth1 align=centergt Un formulario de Ejemplo que utiliza POST

lth1gt

ltform action=httplocalhost8080MostrarParametros

servletMostrarParametros

method=postgt

Nuacutemero de elemento ltinput type=text name=elemNumgt ltbrgt

Cantidad ltinput type=text name=cantidadgt ltbrgt

Precio Unitario ltinput type=text name=precio value=$gt

ltbrgtlthrgt

Nombre de Pila ltinput type=text name=nombrePilagt ltbrgt

Apellido(s) ltinput type=text name=apellidogt ltbrgt

Iniciales ltinput type=text name=inicialesgt ltbrgt

Domicilio de envio lttextarea name=domicilio rows=3

cols=40gtlttextareagt ltbrgt

Tarjeta de creacutedito ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta value=VisagtVisa ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta value=Master Cardgt

Master Card ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta value=AmexgtAmerican

Expresss ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta

value=DiscovergtDiscover ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta

value=Java Smart CardgtTarjeta Inteligente de Java

ltbrgt

Nuacutemero de la tarjeta de creacutedito

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltinput type=password name=numTarjetagtltbrgt

Repita el nuacutemero de la tarjeta de creacutedito

ltinput type=password name=numTarjetagtltbrgtltbrgt

ltcentergt

ltinput type=submit value=Enviar pedidogt

ltcentergt

ltformgt

ltbodygt

lthtmlgt

El formulario HTML del listado anterior utiliza POST como deberiacutea ser en todos los campos

que tienen contrasentildea

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Si intenta ejecutar el servlet MostrarParametros directamente en el explorador con el URL

httplocalhost8080MostrarParametrosservletMostrarParametros se obtendraacute la paacutegina

Web sin resultados

Peticioacuten HTTP POST Cuando el tipo de peticioacuten HTTP es POST los datos son enviados

al servidor en el cuerpo de la peticioacuten Es el meacutetodo maacutes usual de enviar los datos de un

formulario Con este tipo de peticioacuten la informacioacuten del formulario se enviacutea despueacutes del URL

indicado por action en el cuerpo de la peticioacuten y el tamantildeo de la informacioacuten enviada no esta

limitado

Seguacuten lo expuesto escoger el meacutetodo para enviar la informacioacuten no es difiacutecil Si los datos

son pocos y no importa su confidencialidad o manipulacioacuten utilizamos GET Si son largos

privados o importantes utilizamos POST

318 ACCESO A BASES DE DATOS CON SERVLETS

Una aplicacioacuten Java que realiza accesos a bases de datos funciona seguacuten una arquitectura que

permite escribir los programas abstrayeacutendose de los detalles de los niveles inferiores (discos

controladores sistema operativo etc) como lo muestra la figura siguiente

JDBC (Java DataBase Connectivity ndash Conexioacuten con Bases de Datos desde Java) es una API

de Java que permite ejecutar instrucciones SQL para manipular y gestionar bases de datos

relacionales Para que una aplicacioacuten Java pueda hacer operaciones sobre una base de datos

previamente tiene que establecer una conexioacuten con la misma Esta conexioacuten se realiza a

traveacutes de un controlador (driver) seguacuten la figura de arriba La API-JDBC se proporciona en

dos paquetes javasql y javaxsql El primer paquete contiene las interfaces y clases Java

fundamentales de JDBC en tanto que el segundo paquete es una extensioacuten del primero e

APLICACION

SISTEMA OPERATIVO

CONTROLADOR

Oracle Access MySql

JVM

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

incluye las clases que interactuacutean con JNDI y otras que gestionan conjuntos de conexiones

con una misma base de datos Para maacutes detalles del uso de JDBC veacutease el apeacutendice A de

estas notas

El primer paso para crear una conexioacuten entre una aplicacioacuten Java y una base de datos es

registrar el controlador JDBC adecuado para esa base con el fin de que la JVM pueda

utilizarlo Existen distintos tipos de controladores JDBC por ejemplo

ldquocommysqljdbcDriverrdquo que es el controlador utilizado cuando el motor de base de datos

que se utiliza es MySql

En el supuesto caso de que la base de datos soacutelo permitiera el acceso a traveacutes de controladores

ODBC como lo hace ACCESS siempre podemos usar el controlador puente JDBC-ODBC

incluido como parte del JDK ldquosunjdbcodbcJdbcOdbcDriverrdquo Este tipo de controladores

es decir los basados en ODBC (Open DataBase Connectivity) son bastante utilizados en

entornos Windows pues este SO incluye ODBC El apeacutendice A describe al final como

administrar los oriacutegenes de datos ODBC en Windows

Asiacute pues la mayor ventaja de los servlets con respecto a la conexioacuten con bases de datos viacutea

JDBC es que su ciclo de vida les permite mantener conexiones abiertas con las mismas a lo

largo de toda una sesioacuten Esto permite recortar tiempo con respecto a otras tecnologiacuteas como

la CGI Ademaacutes JDBC es una tecnologiacutea independiente de las bases de datos

Como ejemplo vamos a implementar una simple aplicacioacuten Web basada en servlets que

muestre una especie de directorio de personas La aplicacioacuten podraacute consultar insertar

modificar borrar o listar la informacioacuten de cada una de las personas almacenadas en la base

de datos a la que se hace acceso (que estaraacute en formato access)

La estructura de la Base de Datos es una tabla con los siguientes campos

DNI Nombre Apellido Edad

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

53023767A Pedro Rubio 18

77459822P Luis Tejedor 47

123456MRL Mario Rossainz 35

La estructura de la aplicacioacuten se muestra en la figura siguiente

lthtmlgt

ltbodygt

lttable border=1gtlttrgtlttdgt

ltform action=httplocalhost8080directorioTelservletSvAccesoBD

method=getgt

DNI ltinput type=text name=DNIgt ltbrgt

Nombre ltinput type=text name=Nombregt ltbrgt

Apellido ltinput type=text name=Apellidogt ltbrgt

Edad ltinput type=text name=Edadgt ltbrgtltbrgt

ltinput type=submit value=Consultar name=BotonConsultargt

ltinput type=submit value=Insertar name=BotonInsertargt

ltinput type=submit value=Modificar name=BotonModificargt

ltinput type=submit value=Borrar name=BotonBorrargt

ltinput type=submit value=Listar name=BotonListargt ltbrgt

ltcentergt

ltinput type=submit value= |lt name=BotonPrimerogt

ltinput type=submit value= -- name=BotonMenosCincogt

ltinput type=submit value= - name=BotonAnteriorgt

ltinput type=submit value= + name=BotonSiguientegt

ltinput type=submit value= ++ name=BotonMasCincogt

ltinput type=submit value= gt| name=BotonUltimogt

ltcentergt

lttdgt

lttdgt

lttextarea name=AreaDeListado rows=10 cols=35gtlttextareagt

SvAccesoBDhtml

SvAccesoBD

ObBorrado ObListado ObConsulta

ObInsercion

ObModificacion

ObPosicionamiento

ObRegistro

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lttdgt

lttrgt

ltformgt

lttablegt

ltbodygt

lthtmlgt

SvAccesoBDhtml

import javaio

import javaxservlet

import javaxservlethttp

public class SvAccesoBD extends HttpServlet

private int PosicionBuscada = 1

private String AreaDeListado=

PrintWriter out

public void doGet(HttpServletRequest request HttpServletResponse response)

throws IOException ServletException

String DNI = requestgetParameter(DNI)

String Nombre = requestgetParameter(Nombre)

String Apellido = requestgetParameter(Apellido)

String Edad = requestgetParameter(Edad)

String BotonConsultar = requestgetParameter(BotonConsultar)

String BotonInsertar = requestgetParameter(BotonInsertar)

String BotonModificar = requestgetParameter(BotonModificar)

String BotonBorrar = requestgetParameter(BotonBorrar)

String BotonListar = requestgetParameter(BotonListar)

String BotonPrimero = requestgetParameter(BotonPrimero)

String BotonMenosCinco = requestgetParameter(BotonMenosCinco)

String BotonAnterior = requestgetParameter(BotonAnterior)

String BotonSiguiente = requestgetParameter(BotonSiguiente)

String BotonMasCinco = requestgetParameter(BotonMasCinco)

String BotonUltimo = requestgetParameter(BotonUltimo)

AreaDeListado = requestgetParameter(AreaDeListado)

responsesetContentType(texthtml)

out = responsegetWriter()

outprintln(lthtmlgt)

outprintln(ltbodygt)

if (BotonConsultar=null) ConsultarDatos(DNI)

if (BotonInsertar=null) InsertarDatos(DNINombreApellidoEdad)

if (BotonModificar=null) ModificarDatos(DNINombreApellidoEdad)

if (BotonBorrar=null) BorrarDatos(DNI)

if (BotonListar=null) ListarDatos(DNI)

if (BotonPrimero=null) Controles(1)

if (BotonMenosCinco=null) Controles(2)

if (BotonAnterior=null) Controles(3)

if (BotonSiguiente=null) Controles(4)

if (BotonMasCinco=null) Controles(5)

if (BotonUltimo=null) Controles(0)

outprintln(ltbodygt)

outprintln(lthtmlgt)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

private void ConsultarDatos(String DNI)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObRegistro InstanciaFila = InstanciaConsultaDameDatos()

GenerarRespuesta(InstanciaFilaDameDNI()InstanciaFilaDameNombre()

InstanciaFilaDameApellido()

StringvalueOf(InstanciaFilaDameEdad()))

else

GenerarRespuesta(DNI------------)

PosicionBuscada = 1

public void ListarDatos(String DNI)

ObListado InstanciaListado = new ObListado()

AreaDeListado = InstanciaListadoDameResultado()

ConsultarDatos(DNI)

PosicionBuscada = 1

public void BorrarDatos(String DNI)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObBorrado InstanciaBorrado = new ObBorrado(PosicionBuscada)

GenerarRespuesta()

else

GenerarRespuesta(----------------)

PosicionBuscada = 1

public void ModificarDatos(String DNI String Nombre String Apellido

String Edad)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObRegistro InstanciaFila = new ObRegistro(DNI Nombre Apellido

IntegerparseInt(Edad))

ObModificacion InstanciaModificacion = new ObModificacion(PosicionBuscada

InstanciaFila)

GenerarRespuesta(DNINombreApellidoEdad)

else

GenerarRespuesta(----------------)

PosicionBuscada = 1

public void InsertarDatos(String DNI String Nombre String Apellido

String Edad)

ObRegistro InstanciaFila = new ObRegistro(DNI Nombre Apellido

IntegerparseInt(Edad))

ObInserccion InstanciaInserccion = new ObInserccion(InstanciaFila)

GenerarRespuesta()

PosicionBuscada=1

public void Controles(String Identificador)

ObPosicionamiento InstanciaPosicionamiento =

new ObPosicionamiento(IdentificadorPosicionBuscada)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ObRegistro InstanciaFila = InstanciaPosicionamientoDameDatos()

GenerarRespuesta(InstanciaFilaDameDNI()InstanciaFilaDameNombre()

InstanciaFilaDameApellido()

StringvalueOf(InstanciaFilaDameEdad()))

PosicionBuscada = InstanciaPosicionamientoPosicion()

private void GenerarRespuesta(String DNI String Nombre String Apellido

String Edad)

outprintln(lttable border=1gt)

outprintln(lttrgt)

outprintln(lttdgt)

outprintln(ltform

action=httplocalhost8080directorioTelservletSvAccesoBD

method=getgt)

outprintln( DNI ltinput type=text name=DNI value=+DNI+gtltbrgt)

outprintln( Nombre ltinput type=text name=Nombre

value=+Nombre+gtltbrgt)

outprintln( Apellido ltinput type=text name=Apellido

value=+Apellido+gtltbrgt)

outprintln( Edad ltinput type=text name=Edad

value=+Edad+gtltbrgtltbrgt)

outprintln( ltinput type=submit value=Consultar

name=BotonConsultargt)

outprintln( ltinput type=submit value=Insertar

name=BotonInsertargt)

outprintln( ltinput type=submit value=Modificar

name=BotonModificargt)

outprintln( ltinput type=submit value=Borrar name=BotonBorrargt)

outprintln( ltinput type=submit value=Listar name=BotonListargt

ltbrgt)

outprintln( ltcentergt)

outprintln( ltinput type=submit value= |lt name=BotonPrimerogt)

outprintln( ltinput type=submit value= --

name=BotonMenosCincogt)

outprintln( ltinput type=submit value= - name=BotonAnteriorgt)

outprintln( ltinput type=submit value= +

name=BotonSiguientegt)

outprintln( ltinput type=submit value= ++

name=BotonMasCincogt)

outprintln( ltinput type=submit value= gt| name=BotonUltimogt)

outprintln( ltcentergt)

outprintln( lttdgt)

outprintln( lttdgt)

outprintln( lttextarea name=AreaDeListado rows=10

cols=35gt+AreaDeListado+lttextareagt)

outprintln( lttdgt)

outprintln( lttrgt)

outprintln( ltformgt)

outprintln( lttablegt)

SvAccesoBDjava

import javasql

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

public class ObBorrado

ObBorrado(int PosicionBuscada)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

Personasabsolute(PosicionBuscada)

PersonasdeleteRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

ObBorradojava

import javasql

import javaawtTextArea

public class ObListado

private String Resultado=

ObListado()

String DNI Nombre Apellido Linea

int Edad Posicion

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement()

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

while (Personasnext())

DNI = PersonasgetString(DNI)

Nombre = PersonasgetString(Nombre)

Apellido = PersonasgetString(Apellido)

Edad = PersonasgetInt(Edad)

Posicion = PersonasgetRow()

Linea = DNI+ +Nombre+ +Apellido+ +StringvalueOf(Edad)

Resultado=Resultado+StringvalueOf(Posicion)+ +Linea+n

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public String DameResultado()

return Resultado

ObListadojava

public class ObRegistro

private String DNI Nombre Apellido

private int Edad

ObRegistro (String DNI String Nombre String Apellido int Edad)

thisDNI = DNI

thisNombre = Nombre

thisApellido = Apellido

thisEdad = Edad

String DameDNI()

return DNI

String DameNombre()

return Nombre

String DameApellido()

return Apellido

int DameEdad()

return Edad

ObRegistrojava

import javasql

public class ObConsulta

private int Posicion = 0

private ObRegistro DatosPersona

ObConsulta(String DNIPedido)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement()

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

while (Personasnext())

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

String DNI = PersonasgetString(DNI)

if (DNIequalsIgnoreCase(DNIPedido))

Posicion = PersonasgetRow()

String Nombre = PersonasgetString(Nombre)

String Apellido = PersonasgetString(Apellido)

int Edad = PersonasgetInt(Edad)

DatosPersona = new ObRegistro(DNINombreApellidoEdad)

break

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public int PosicionEncontrada()

return Posicion

public ObRegistro DameDatos()

return DatosPersona

ObConsultajava

import javasql

public class ObInserccion

ObInserccion(ObRegistro Datos)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

PersonasmoveToInsertRow()

PersonasupdateString(DNI DatosDameDNI())

PersonasupdateString(NombreDatosDameNombre())

PersonasupdateString(Apellido DatosDameApellido())

PersonasupdateInt(EdadDatosDameEdad())

PersonasinsertRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

catch (SQLException e)

Systemoutprintln(e)

ObInsercionjava

import javasql

public class ObModificacion

ObModificacion(int PosicionBuscada ObRegistro Datos)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

Personasabsolute(PosicionBuscada)

PersonasupdateString(DNIDatosDameDNI())

PersonasupdateString(NombreDatosDameNombre())

PersonasupdateString(ApellidoDatosDameApellido())

PersonasupdateInt(EdadDatosDameEdad())

PersonasupdateRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

ObModificacionjava

import javasql

public class ObPosicionamiento

private ObRegistro DatosPersona

private int Posicion

ObPosicionamiento(String Accion int Posicion)

int IDAccionEdad

String DNINombreApellido

boolean PosicionCorrecta=false

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

FROM DatosPersonales)

Personasabsolute(Posicion)

IDAccion = IntegerparseInt(Accion)

switch (IDAccion)

case 0

PosicionCorrecta = Personaslast()

break

case 1

PosicionCorrecta = Personasfirst()

break

case 2

PosicionCorrecta = Personasrelative(-5)

break

case 3

PosicionCorrecta = Personasprevious()

break

case 4

PosicionCorrecta = Personasnext()

break

case 5

PosicionCorrecta = Personasrelative(+5)

break

if (PosicionCorrecta)

thisPosicion = PersonasgetRow()

DNI = PersonasgetString(DNI)

Nombre = PersonasgetString(Nombre)

Apellido = PersonasgetString(Apellido)

Edad = PersonasgetInt(Edad)

else

thisPosicion = Posicion

DNI = ----

Nombre = ----

Apellido = ----

Edad = 0

DatosPersona = new ObRegistro(DNINombreApellidoEdad)

Personasclose()

Conexionclose()

SentenciaSQLclose()

Systemoutprintln(StringvalueOf(Posicion)++StringvalueOf(thisPosicion))

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public int Posicion()

return Posicion

public ObRegistro DameDatos() return DatosPersona

ObPosicionamientojava

En este ejemplo se emplean servlets y paacuteginas Web Los clientes habitualmente trabajan en

una computadora remota y los programas se ejecutan en un servidor El mecanismo de

comunicaciones que soporta el protocolo http nos permite consultar en el servidor los datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

que ha seleccionado o escrito el usuario de esta manera se puede observar una disociacioacuten

entre la interfaz graacutefica de usuario (que se ejecuta en los equipos de los clientes) y el

programa que recoge los datos y ejecuta las acciones pertinentes (que se ejecuta en el

servidor)

Como puede observarse el coacutedigo SvAccessoBD es un servlet que lleva a cabo las siguientes

operaciones

1 Recoge los valores provenientes del usuario

2 Determina la naturaleza de la accioacuten a realizar

3 Realiza su cometido con la base de datos

4 Genera la respuesta que recibiraacute el usuario

32 JSP

JSP significa Java Server Pages que traducido quiere decir Paacuteginas de Servidor Java y es

por tanto una tecnologiacutea orientada a crear paacuteginas Web con programacioacuten en JAVA es decir

permite mezclar HTML estaacutendar y estaacutetico con un contenido dinaacutemico etiquetas especiales

(oacuterdenes) y trozos de coacutedigo JAVA (scriptlets o secuencias de oacuterdenes) o contenido dinaacutemico

generado por servlets Eacuteste contenido dinaacutemico se encuentra encerrado en etiquetas

especiales muchas de las cuales inician con lt y finalizan con gt El motor de las paacuteginas

JSP esta basado en los servlets de JAVA

En la tecnologiacutea JSP se crean paacuteginas parecidas a las paacuteginas que se crean en ASP (Active

Server Page de Microsoft) o PHP (Personal Home Page) que son dos tecnologiacuteas de paacuteginas

ejecutadas en el servidor Sin embargo JSP no se cintildee a un sistema operativo o servidor Web

en particular ademaacutes de que proporciona acceso a la tecnologiacutea de Servlets y a JAVA en la

parte dinaacutemica

El proceso para generar paacuteginas JSP accesibles en Web es mucho maacutes simple que en los

servlets Dando por hecho que se tiene un servidor Web que permite usar JSP el coacutedigo se

almacenaraacute en archivos con extensioacuten jsp que incluyen dentro de la estructuras de etiquetas

HTML las sentencias JAVA a ejecutar y tan soacutelo se colocaraacuten en cualquier lugar en donde

se pusiera una paacutegina Web normal sin compilacioacuten sin paquetes y sin configuracioacuten aunque

el servidor tendraacute que ser configurado para acceder a los archivos de clases Servlets y de

JSPs

Aunque lo que se escriba con frecuencia luciraacute como un archivo HTML estaacutendar detraacutes de

ello la paacutegina JSP se convierte automaacuteticamente en un servlet normal donde el HTML

estaacutetico tan soacutelo es enviado al flujo de salida asociado con el meacutetodo service del servlet Esta

traduccioacuten se realiza la primera vez que se solicita la paacutegina De acuerdo como este

configurado el servidor es posible ver el coacutedigo fuente de los servlets generados a partir de

sus paacuteginas JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Por ejemplo supongamos que se ha escrito el siguiente coacutedigo en el archivo Saludojsp

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtEjemplo JSPlttitlegtltheadgt

ltbody bgcolor=ffffccgt

ltcentergt

lth2gtHola mundolth2gt

ltjavautilDate hoy = new javautilDate()gt

La fecha de hoy es lt=hoygt

ltcentergt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional y un fragmento de un scriptlet de JAVA La etiqueta

lt identifica el comienzo del scriptlet y gt el final Una expresioacuten de la forma =variable

es sustituida por el valor de esa variable Para ejecutar esta paacutegina o cualquier otra paacutegina

JSP desde un navegador hay que instalarla en el servidor de aplicaciones de la misma manera

en como se hizo con los servlets Suponiendo entonces que se tiene instalado el Tomcat 5

siga los siguientes pasos

1 Antildeadir en el servidor la carpeta digamos JSP2 dentro de la carpeta webapps del Tomcat

y construir sobre ella la jerarquiacutea de clases ya conocida de los servlets

webappsrarrJSP2rarrWEB-INFrarrclasses

WEB-INFrarrlib

WEB-INFrarrtags

2 Editar en la carpeta WEB-INF el descriptor de despliegue webxml que se indica a

continuacioacuten Este archivo XML indica doacutende se localiza el esquema XML para la

especificacioacuten Servlet 24 que a suvez utiliza el esquema XML para la especificacioacuten

Java Server Page 20 que son las especificaciones que soporta en servidor Tomcat

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=

httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

3 Crear en JSP2 la carpeta saludo que contendraacute la aplicacioacuten y copiar en ella la paacutegina

Saludojsp

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

4 Arrancar el servidor Si el servidor ya estaba arrancado detenerlo y volverlo a arrancar o

bien abrir el explorador escribir el URL httplocalhost8080managerhtml e instalar

la aplicacioacuten

5 Una vez arrancado el servidor verificar si estaacute funcionando correctamente escribiendo

el URL siguiente en el explorador httplocalhost8080 El explorador debe mostrar la

paacutegina del Tomcat

6 Ejecutar la paacutegina JSP iniciando el explorador y escribiendo el URL siguiente

httplocalhost8080JSP2saludoSaludojsp donde la sintaxis geneacuterica es

httpservidor[puerto]MiCarpetapaginajsp

Cuando esta paacutegina (Saludojsp) es invocada por primera vez el motor JSP lleva a cabo una

fase de traduccioacuten de la misma en un servlet y el motor Servlet es el que ejecutaraacute eacuteste uacuteltimo

para generar el HTML dinaacutemico que seraacute enviado al explorador cliente seguacuten puede

deducirse de la figura siguiente La proacutexima vez que la paacutegina sea solicitada el motor JSP

ejecutaraacute el servlet que fue caragado la primera vez a no ser que la paacutegina haya cambiado

en cuyo caso seraacute compilada automaacuteticamente en un nuevo servlet y ejecutada

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Regresando al ejemplo el archivo java generado por el Tomcat a partir del archivo

Saludojsp se localiza en la carpeta workCatalinalocalhost de la instalacioacuten de Tomcat

321 ELEMENTOS PARA SECUENCIAS DE COMANDOS

Los elementos para secuencias de comandos permiten insertar coacutedigo en el servlet que seraacute

generado a partir de la paacutegina JSP Existen tres formas

1 Expresiones del tipo lt= expresioacuten gt que se evaluacutean e insertan en el resultado del

servlet

2 Los scriptlets del tipo lt codigo gt que se insertan en el meacutetodo _jspService del

servlet (ejecutado por service)

3 Las declaraciones del tipo lt Codigo gt que se insertan en el cuerpo de la clase del

servlet fuera de cualquier meacutetodo existente

NOTA Los comentarios en JSP se escriben lt-- Comentario JSP --gt en tanto que los

comentarios en HTML son de la forma lt--Comentario HTML --gt La diferencia

semaacutentica radica en que los comentarios HTML cuando se insertan en la respuesta enviada

por el servidor al cliente no se muestran cuando se visualiza el documento HTML pero si

Servidor Maacutequina Cliente

Explorador Web

Contenedor Web

Motor Servlet

Motor JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

los podemos ver cuando se visualiza el coacutedigo fuente en tanto que los comentarios JSP

aunque se inserten en la respuesta enviada por el servidor al cliente no son enviados al

explorador de forma que tampoco se muestran ni se ven cuando se visualiza el coacutedigo fuente

HTML desde el explorador

3211 EXPRESIONES

Se utiliza una expresioacuten JSP para insertar valores directamente en el resultado La sintaxis es

lt= expresioacuten gt Por ejemplo

lt= requestgetParameter(ldquoparNombre) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt lt= s gt

La fecha y hora actual es lt= new javautilDate() gt

La expresioacuten se evaluacutea se convierte a cadena y se inserta en la paacutegina Esta evaluacioacuten se

realiza durante la ejecucioacuten

32111 VARIABLES PREDEFINIDAS

Para simplificar estas expresiones se pueden utilizar cierta cantidad de variables

predefinidas Estos objetos impliacutecitos como tambieacuten se les llama estaacuten disponibles para su

uso durante la implementacioacuten de una paacutegina Web

bull pageContext Es un objeto de la clase PageContext que proporciona acceso a objetos

relacionados con los servlets

bull request Es un objeto de la clase HttpServletRequest que se puede obtener a traveacutes del

meacutetodo getRequest que encapsula los datos enviados por el cliente al servidor

bull response Es un objeto de la clase HttpServletResponse que puede obtenerse a traveacutes

del meacutetodo getResponse que encapsula los datos que el servidor enviaraacute al cliente

bull application Es un objeto de la clase ServletContext que se obtiene a traveacutes del meacutetodo

getServletContext que define un conjunto de meacutetodos que todo servlet utiliza para

comunicar con el contenedor de servlets

bull config Es un objeto de la clase ServletConfig que se obtiene a traveacutes del meacutetodo

getServletConfig y que se utiliza por el contenedor de servlets para pasar informacioacuten

al servlet durante la iniciacioacuten

bull session Es un objeto de la clase HttpSession que se obtiene a traveacutes del meacutetodo

getSession que proporciona una forma de identificar a un usuario que visita las paacuteginas

de un sitio Web

bull out Es un objeto de la clase JspWriter que se obtiene a traveacutes del meacutetodo getOut que

se utiliza para almacenar la respuesta que seraacute enviada al cliente que hizo la peticioacuten de

la paacutegina

bull page Es un objeto geneacuterico de la clase Object que se obtiene a traveacutes del meacutetodo

getPage y que representa al servlet obtenido a partir de la paacutegina JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

bull exception Es un objeto de la clase Exception que se obtiene a traveacutes del meacutetodo

getException que contendraacute informacioacuten a cerca de cualquier excepcioacuten que se lance

desde la paacutegina JSP

Un ejemplo del uso de uno de estos objetos impliacutecitos seriacutea el siguiente

El nombre de tu host es lt= requestgetRemoteHost() gt

El listado siguiente da un ejemplo de una paacutegina JSP que utiliza algunas variables

predefinidas como uso de expresiones JSP

ltDOCTYPE HTML PUBLIC -W3CDTD HTML 40 Transitional ENgt

lthtmlgt

ltheadgt

lttitlegt Expresiones JSP lttitlegt

ltheadgt

ltbodygt

lth2gt Expresiones JSP lth2gt

ltULgt

ltligt Fecha y hora en curso lt= new javautilDate() gt ltligt

ltligt Nombre de su host lt= requestgetRemoteHost() gt ltligt

ltligt Identificador de su sesioacuten lt= sessiongetId() gt ltligt

ltligt El paraacutemetro ltcodegt paramPrueba ltcodegt del formulario

lt= requestgetParameter(paramPrueba) gt ltligt

ltULgt

ltbodygt

lthtmlgt

Cuya salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3212 LOS SCRIPTLETS JSP

Si se desea hacer algo maacutes complejo que una simple expresioacuten los scriptlets permiten insertar

coacutedigo JAVA en el meacutetodo _jspService del servlet (que es ejecutado por service) La sintaxis

utilizada por los scriptlets es lt coacutedigo java gt Los escriptlets tienen acceso a las

mismas variables definidas de forma automaacutetica como expresiones A manera de ejemplo si

se desea que el resultado aparezca en la paacutegina generada deberiacutea de utilizarse la variable out

como en la siguiente instruccioacuten

lt String datosConsultados= requestgetQueryString()

outprintln(ldquoDatos GET adjuntos ldquo+datosConsultados)

gt

En este ejemplo podriacutea haberse obtenido el mismo resultado utilizando la siguiente expresioacuten

JSP

Datos GET adjuntos lt=requestgetQueryString() gt

En general los scriptlets pueden ejecutar varias tareas que no podriacutean realizarse con las

expresiones Tales tareas incluyen

bull La determinacioacuten de encabezados de respuesta

bull Actualizacioacuten de Bases de Datos

bull Ejecucioacuten de bucles condiciones y otras estructuras complejas

lt for (int i=1 ilt=6 i++)

gt

lth lt=i gtgt Hola Mundo lthlt=i gtgt

lt gt

Como un ejemplo concreto se muestra la siguiente paacutegina JSP llamada Cuentajsp en donde

se observa coacutemo se hace un seguimiento del nuacutemero de veces que un cliente accede a esta

paacutegina a traveacutes de distintas sesiones Para ello supondremos que dicha cuenta es el valor del

atributo atrCuenta del objeto impliacutecito application ya citado La primera vez que el cliente

accede a la paacutegina el valor de atrCuenta seraacute null debido a que auacuten no ha sido fijado este

atributo en este caso se fijaraacute con el valor 1 En los siguientes accesos se leeraacute el valor del

atributo atrCuenta se incrementaraacute en una unidad y se volveraacute a fijar Finalmente se enviacutea

la respuesta al cliente para que se muestre al usuario el valor del contador

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en el objeto impliacutecito application con el nombre

atrCuenta

--gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt

Integer cuenta = (Integer)applicationgetAttribute(atrCuenta)

String s = vez

if (cuenta == null)

cuenta = new Integer(1)

else

cuenta = new Integer(cuentaintValue() + 1)

s = veces

applicationsetAttribute(atrCuenta cuenta)

gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

Has visitado esta paacutegina lt= cuenta gt lt= s gt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional un fragmento de coacutedigo JAVA o scriptlet

expresiones y comentarioshellip

Aquiacute otro ejemplo de la ejecucioacuten de un coacutedigo demasiado complejo para una expresioacuten JSP

Este listado presenta una paacutegina JSP que utiliza el paraacutemetro de peticioacuten colorFondo para

establecer el color de fondo de la paacutegina

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgt

lttitlegt Prueba de Color lttitlegt

ltheadgt

lt

String colorFondo=requestgetParameter(colorFondo)

boolean tieneColorExplicito

if (colorFondo =null)

tieneColorExplicito=true

else

tieneColorExplicito=false

colorFondo=WHITE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt

ltbody bgcolor=lt= colorFondo gtgt

lth2 align=centergt Prueba de color lth2gt

lt

if (tieneColorExplicito)

outprintln(Ha indicado un color de fondo expliacutecito +

colorFondo +)

else

outprintln(Usareacute el color de fondo predeterminado WHITE +

Indique el atributo de peticioacuten

ltigtcolorFondoltigt+

para intentar un color estaacutendar un +

valor RRGGBB o para ver si el navegador Web +

permite el uso de nombres de color X11)

gt

ltbodygt

lthtmlgt

Cuyas posibles salidas son

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3213 DECLARACIONES JSP

Una declaracioacuten JSP permite definir meacutetodos o campos que seraacuten insertados en el cuerpo

principal de la clase del servlet (fuera del meacutetodo _jspService) Una declaracioacuten tiene la

sintaxis lt Coacutedigo Java gt Por ejemplo

lt int i=0 gt

lt

Public void jspinit()

coacutedigo de iniciacioacuten

gt

Una declaracioacuten no genera ninguacuten resultado y se usan junto con las expresiones JSP o los

scriptlets A continuacioacuten se muestra una paacutegina JSP que despliega la cantidad de veces que

se ha solicitado esta paacutegina desde que se arrancoacute el servidor haciendo uso de las

declaraciones JSP

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtDeclaraciones JSPlttitlegtltheadgt

ltbodygt

lth1gtDeclaraciones JSPlth1gt

lt-- Esto es un comentario en JSP --gt

lt private int recuentoAccesos=0 gt

lth2gt Accesos a la paacutegina desde el reinicio del servidor

lt= ++recuentoAccesos gt lth2gt

ltbodygt

lthtmlgt

La salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

322 EL LENGUAJE DE EXPRESION EN JSP 20

Anteriormente se ha visto la necesidad de utilizar fragmentos de coacutedigo java en el desarrollo

de paacuteginas JSP pero con la aparicioacuten de la especificacioacuten JSP 20 ya no hay necesidad de

utilizar fragmentos de coacutedigo Java para nada gracias al nuevo lenguaje de expresioacuten EL

(Expresioacuten Language) a la biblioteca de etiquetas estandar JSTL (JSP Standar Tag Library)

y a las nuevas formas para desarrollar etiquetas personalizadas

El lenguaje de expresioacuten JSP es maacutes un lenguaje de acceso a datos que un lenguaje de

programacioacuten Ya se ha visto que para pasar informacioacuten de un cliente a una paacutegina JSP se

utilizan paraacutemetros en la peticioacuten y atributos en la paacutegina El lenguaje de expresioacuten lo hace

posible sin tener que utilizar scriptlets o expresiones (lt= expresioacuten gt) Por ejemplo las

liacuteneas JSP 12 siguientes escritas utilizando coacutedigo Java

lt= requestgetParameter(ldquoparNombrerdquo) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt veces

bajo la especificacioacuten JSP 20 se pueden escribir de una forma maacutes sencilla como sigue

(ahora no se trata de coacutedigo JAVA)

$paramparNombre has visitado esta paacutegina

$atrCuenta veces

La sintaxis de JSP es sensible a mayuacutesculas y minuacutesculas pero un par de comillas simples es

equivalente a un par de comillas dobles

3221 VARIABLES PREDEFINIDAS (Objetos Impliacutecitos)

El lenguaje de expresioacuten JSP 20 soporta los objetos impliacutecitos siguientes

pageContext Objeto de javaxservletjspPageContext que proporciona acceso a los

datos de una peticioacuten

param Coleccioacuten (objeto de tipo javautilMap) de todos los valores de los paraacutemetros

enviados en una peticioacuten un String por paraacutemetro

paramValues Coleccioacuten de todos los valores de los paraacutemetros enviados en una

peticioacuten una matriz de tipo String por paraacutemetro

header Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten un

String por cabecera

headerValues Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten

una matriz de tipo String por cabecera

cookie Coleccioacuten de todos los valores de las cookies un objeto javaxservlethttpCookie

por cookie

initParam Coleccioacuten de todos los valores de los paraacutemetros de iniciacioacuten de la

aplicacioacuten un String por paraacutemetro

Tambieacuten hay objetos que permiten acceder a variables definidas en diferentes aacutembitos lo que

posibilita compartir informacioacuten

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

pageScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de paacutegina

requestScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

peticioacuten

sessionScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de sesioacuten

applicationScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

aplicacioacuten

3222 DIRECTRICES

Las directrices page incluye y taglib son mensajes para el motor JSP y son siempre incluidas

entre los siacutembolos lt y gt

32221 LA DIRECTRIZ PAGE

Define atributos que se aplican a toda la paacutegina JSP donde es incluida

lt page lista_de_atributos gt

Donde la lista_de_atributos puede contener algunos de los siguientes (aquellos que estaacuten

escritos en negrita son los tomados por omisioacuten)

language= ldquoscriptingLanguagerdquo

extends= rdquoclassNamerdquo

import= ldquoimportListrdquo

session= ldquotrue|falserdquo

buffer= ldquonone|sizeKb

autoflush= ldquotrue|falserdquo

isThreadSafe= rdquotrue|falserdquo

info= rdquoinfo_textrdquo

errorPage= ldquoerror_urlrdquo

isErrorPage= rdquotrue|falserdquo

contentType= rdquoctinfordquo

pageEncoding= rdquopeinfordquo

isELIgnored= ldquotrue|falserdquo

Tiacutepicamente se localiza al principio de la paacutegina JSP y puede haber cualquier nuacutemero de

ellas El lenguaje por omisioacuten es Java Ejemplos

lt page contentType=rdquotexthtmlrdquo language=rdquojavardquo gt

lt page import=rdquojavautil javalangrdquo gt

lt page buffer=rdquo5kbrdquo autoflush=rdquofalserdquo gt

32222 LA DIRECTRIZ INCLUDE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

La directriz include incluye un archivo (html jsp xml o de texto) en una paacutegina JSP Esto

permite dividir el contenido de la paacutegina en trozos maacutes manejables

lt incluye file=rdquoURL_relativordquo gt

El ejemplo siguiente muestra dos archivos el primero incluye al segundo para mostrar la

fecha y hora actuales

lt-- fichero mostrarFechaHorajsp --gt

lthtmlgt

ltheadgtlttitlegtIncluir un ficherolttitlegtltheadgt

ltbody bgcolor=whitegt

ltfont color=bluegt

La fecha y hora actuales son

lt include file=fechaHorajsp gt

ltfontgt

ltbodygt

lthtmlgt

lt-- fichero fechaHorajsp --gt

lt page import=javautil gt

lt= (new javautilDate())toLocaleString() gt

32223 LA DIRECTRIZ TAGLIB

La directriz taglib indica la biblioteca de acciones personalizadas que podremos utilizar en

la codificacioacuten de la paacutegina JSP Para distinguir esas acciones entre otras existentes se utiliza

un prefijo (prefix) Su sintaxis es

lt taglib (uri=rdquoURI_bibliotecardquo|tagdir=rdquoDir_biblioteca_tagrdquo)

prefix=rdquoprefijordquo gt

Cuando se trata de una biblioteca definida mediante una clase Java y un descriptor (archivo

tld) eacutesta se identifica mediante un URI (Uniform Resource Identifier- URL relativos) Por

ejemplo

lt taglib uri=rdquohttpMarioRossainzLopezmiBibliotecardquo

prefix=rdquofunrdquo gt

ltpgtltfunaccion01 gt

La uacuteltima liacutenea del ejemplo tiene dos etiquetas una etiqueta p HTML y otra accion01

perteneciente a la biblioteca miBiblioteca En cambio si la biblioteca se define mediante un

archivo tag entonces se identifica mediante su ruta relativa en el sistema de archivos

lt taglib tagdir=rdquoWEB-INFtagsrdquo prefix=rdquofunrdquo gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpgtltfunaccion01 gt

La directriz taglib debe colocarse antes de utilizar en la paacutegina JSP las acciones

personalizadas definidas por la misma Se puede utilizar maacutes de una directriz pero el prefijo

utilizado debe ser uacutenico para cada una de ellas

3223 ACTIVACION DEL LENGUAJE DE EXPRESION (LE)

La especificacioacuten JSP 20 define un lenguaje de expresioacuten como alternativa a elementos de

programacioacuten escritos con coacutedigo Java y especificaciones anteriores a la JSP 20 Para que

este lenguaje pueda ser interpretado tienen que cumplirse 2 requisitos

1 Que la propiedad isELIgnored de la directriz page valga false

lt page isELIgnored= ldquofalserdquo gt

2 Que el descriptor de despliegue webxml en la carpeta WEB-INF indique doacutende se

localiza el esquema XML para la especificacioacuten Servlet 24 que a su vez utiliza el

esquema XML para la especificacioacuten Java Server Page 20

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

Utilizando el lenguaje de expresioacuten se podriacutea modificar la paacutegina Cuentajsp de la seccioacuten

3212 de este documento como se muestra a continuacioacuten Esta nueva paacutegina

1 Especifica que utilizaraacute la biblioteca core de etiquetas estandar (de la que se hablaraacute maacutes

adelante)

2 La primera vez que sea accedida definiraacute la variable atrCuenta en el aacutembito de la

aplicacioacuten con un valor inicial nulo y la incrementaraacute en una unidad cuando sea accedida

sucesivas veces simplemente incrementaraacute esta variable en una unidad

3 Finalmente mostraraacute una paacutegina con un contenido anaacutelogo al siguiente Esta formado

por una cabecera y una segunda liacutenea compuesta por el valor del paraacutemetro parNombre

enviado con la peticioacuten un texto fijo el valor de la variable atrCuenta y otro texto fijo

dependiente del valor de esta variable

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

El coacutedigo completo es el siguiente

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

3224 VARIABLES Y EXPRESIONES

Para acceder a una simple variable se puede escribir algo como lo siguiente $nombre y

para acceder a una propiedad de un objeto podemos escribir algo como

$paramparNombre

$applicationScopeatrCuenta

$pageContextrequestrequestURI

La primera liacutenea del ejemplo anterior obtiene el valor de la propiedad parNombre del objeto

param la segunda el valor del atributo atrCuenta del objeto applicationScope y la tercera

el URL relativo de la paacutegina JSP solicitada

El lenguaje de expresioacuten es maacutes tolerante con respecto a las variables con valor null y ejecuta

muchas maacutes conversiones de forma automaacutetica sobre el tipo de los datos cuando la expresioacuten

a evaluar asiacute lo requiere Por ejemplo la etiqueta condicional siguiente incluye una expresioacuten

que compara el valor del atributo atrCuenta con aacutembito de aplicacioacuten con 10 (convirtiendo

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

impliacutecitamente el valor del atributo al tipo de la constante para poder realizar la comparacioacuten

El resultado seraacute un valor de tipo boolean

ltcif test=rdquo$applicationScopeatrCuenta gt 10rdquogt

ltcifgt

o bien

ltcif test=rdquo$atrCuenta gt 10rdquogt

ltcifgt

Para que una literal pueda incluir un caracter significativo para el lenguaje dicho caracter

debe ser especificado como una secuencia de escape (caracter) Por ejemplo la siguiente

expresioacuten da lugar al literal ldquovezrdquo o ldquovecesrdquo entre comillas dobles

$(atrCuenta gt 1) iquest ldquordquovecesrdquordquo ldquordquovezrdquordquo

Cualquier objeto o atributo de un objeto definido en algunos de los aacutembitos de una paacutegina

puede ser utilizado como una variable Por ejemplo $atrCuenta+1 es una expresioacuten que

realiza la suma de la variable atrCuenta con 1

Cuando se trate de una propiedad de un objeto para acceder a ella se utilizaraacute el operador

punto o bien la notacioacuten empleada para acceder a un elemento de una matriz Por ejemplo

$paramparNombre

$param[ldquoparNombrerdquo]

Una expresioacuten LE puede aparecer en cualquier lugar donde pueda aparecer un texto fijo Por

tanto para informar al contenedor JSP que se trata de una expresioacuten y no de un texto fijo se

utilizan los delimitadores $ al principio y al final

3225 OPERADORES

OPERADOR DESCRIPCIOacuteN Acceso a la propiedad de un objeto o a un elemento de un Map

[] Acceso al elemento de una matriz o de un objeto List

() Pareacutentesis para alterar la prioridad en la evaluacioacuten de una expresioacuten

If ternario condicion expresion1 expresioacuten 2

+ Suma

- Resta

Producto

oacute div Divisioacuten

oacute mod Moacutedulo o resto de una divisioacuten

== oacute eq Igualdad

= oacute ne Diferente

lt oacute lt Menor que

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt oacute gt Mayor que

lt= oacute le Menor o igual que

gt= oacute ge Mayor o igual que

ampamp oacute and Operacioacuten Loacutegica AND

|| oacute or Operacioacuten Loacutegica OR

oacute not Operacioacuten Loacutegica NOT

empty Verifica si el valor de una variable es null si un String esta vaciacuteo o si una matriz Map

o Collection no tienen elementos

func(args) Llamada a una funcioacuten donde func es el nombre de la funcioacuten y arg representa cero o

maacutes argumentos separados por comas

El ejemplo siguiente muestra una paacutegina JSP compuesta por elementos HTML expresiones

LE y objetos impliacutecitos

lthtmlgt

ltheadgtlttitlegtJSP 20lttitlegtltheadgt

ltbodygt

lth3gtLenguaje de expresioacuten (LE)lth3gt

ltpgtLa siguiente tabla ilustra algunas expresiones LE

ltbrgtltbrgtlttable border=1gt

lttrgt

ltthgtltbgtExpresioacutenltbgtltthgt

ltthgtltbgtValorltbgtltthgt

lttrgt

lttrgt

lttdgt$3 + 6lttdgt

lttdgt$3 + 6lttdgt

lttdgt

lttrgt

lttdgt$(7 gt 4) 7 4lttdgt

lttdgt$(7 gt 4) 7 4lttdgt

lttrgt

lttrgt

lttdgt$header[host]lttdgt

lttdgt$header[host]lttdgt

lttrgt

lttablegt

ltbodygt

lthtmlgt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

323 BIBLIOTECA ESTANDAR DE ETIQUETAS

La biblioteca estaacutendar de etiquetas JSP (JSTL ndash Java Server Page Estaacutendar Tag Library)

incluye una cantidad amplia de etiquetas para diferentes aacutereas de trabajo

Aacuterea baacutesica (su prefijo es c ndash core) y contiene

o Soporte de variables (remove y set)

o Control del flujo (choose when otherwise forEach forTokens if)

o Manejo de URL (import param redirect param y url param)

o Operaciones varias (match y out)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlcore

Aacuterea XML (su prefijo es x) y contiene

o Sentencias baacutesicas (out parse y set)

o Control del flujo (choosehellip whenhellip otherwise forEach e if)

o Transformacioacuten de Documentos (transformhellipparam)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlxml

Aacuterea Internacionalizacioacuten (su prefijo es fmt) Contiene

o Localidad (setLocale y requestEncoding)

o Mensajes (bundle message param y setBundle)

o Formateo de Fechas y nuacutemeros (formatNumber formateacuteate parseDate

parseNumber setTimeZone timeZone)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlfmt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Aacuterea SQL (su prefijo es sql) es el lenguaje estandar para interactuar con bases de datos

relacionales y contiene setDataSource Quero dateParam param transaction y

update dateParam param) El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlsql

Aacuterea Funciones (su prefijo es fn) y contiene

o Longitud de una coleccioacuten (length)

o Manipulacioacuten de String (toUpperCase toLowerCase substring

substringAfter substringBefore trim replace indexOf startsWith

endsWith contains containsIgnoreCase split join y escapeXml)

o El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlfunctions

3231 OPERACIONES CON ETIQUETAS BAacuteSICAS

En un ejemplo pasado teniacuteamos el siguiente coacutedigo

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

En este ejemplo se hace referencia al aacuterea baacutesica de JSTL con el prefijo c y se utiliza la

etiqueta cset para definir la variable atrCuenta Si la variable ya esta definida simplemente

se le asigna el valor especificado

La uacuteltima parte del ejemplo anterior podriacutea haberse escrito de esta otra forma

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcif test=rdquo$atrCuenta gt 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcifgt

$atrCuenta $str

La etiqueta cif permite la ejecucioacuten condicional de su cuerpo en funcioacuten del valor del

atributo de test

La etiqueta cchoose permite la ejecucioacuten del cuerpo de la primera etiqueta cwhen cuyo

atributo test sea evaluado a true Si ninguna de las condiciones se evaluacutea a true entonces se

evaluacutea el cuerpo de la etiqueta cotherwise si estaacute presente El siguiente coacutedigo muestra otra

manera de escribir el ejemplo anterior utilizando estas uacuteltimas etiquetas

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcchoosegt

ltcwhen test=rdquo$atrCuenta == 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcwhengt

ltcotherwisegt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcotherwisegt

ltcchoosegt

$atrCuenta $str

La etiqueta cforEach permite iterar sobre una coleccioacuten de objetos La coleccioacuten se

especifica por medio del atributo iacutetems y el elemento actual de la coleccioacuten estaacute disponible a

traveacutes de la variable establecida por el atributo var Por ejemplo el siguiente fragmento de

coacutedigo visualiza una tabla con las variables definidas a nivel de aacutembito de paacutegina

lttable border=rdquo1rdquogt

ltcforEach var=rdquoitemrdquo iacutetems=rdquo$pageScoperdquogt

lttrgt

lttdgt $item lttdgt

lttrgt

ltcforEachgt

lttablegt

La etiqueta ccatch atrapa una excepcioacuten que ocurra en el cuerpo de la misma Por ejemplo

el siguiente segmento de coacutedigo lanzaraacute una excepcioacuten si el paraacutemetro mes se escribe con

letras en vez de con nuacutemeros

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltbodygt

lthtmlgt

Un URL anaacutelogo al siguiente daraacute lugar a que la excepcioacuten sea lanzada cuando se ejecute la

expresioacuten $nMes 3 de la paacutegina anterior

httplocalhost8080JSP2exceppruebajspmes=marzo

La excepcioacuten indica que ha ocurrido un error al tratar de convertir ldquomarzordquo a un entero de

tipo Long Para cachar esta excepcioacuten y darle un tratamiento adecuado habraacute que modificar

la paacutegina JSP anterior como se indica a continuacioacuten

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltccatch var=rdquoerrorOcurridordquogt

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltccatchgt

ltcif test=rdquo$not empty errorOcurridordquogt

Error el paraacutemetro mes debe ser un nuacutemero ltbgt

ltbrgt Informacioacuten del error dada por el sistema

ltbrgt ltfont color=rdquoFF0000rdquogt $errorOcurrido ltfontgt

ltcifgt

ltbodygt

lthtmlgt

3232 ACCESO A BASES DE DATOS CON JSP

Las etiquetas que proporciona el aacuterea SQL permiten realizar

Conexioacuten con una base de datos

Realizacioacuten de consultas a la base de datos

Acceso al conjunto de resultados

Ejecucioacuten de actualizaciones y transacciones

Todas las etiquetas SQL actuacutean sobre una base de datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

32321 CONEXIOacuteN CON LA BASE DE DATOS

La conexioacuten con la base de datos puede realizarse con la etiqueta sqlsetDataSource Por

ejemplo si se esta utilizando el administrador de bases de datos MySql con el controlador

JDBC se puede realizar una conexioacuten con una base de datos digamos bd_tutorias de la

manera siguiente

ltsqlsetDataSource var=rdquobdrdquo

driver=rdquocommysqljdbcDriverrdquo

url=rdquojdbcmysqllocalhost3306bd_tutoriasrdquo

user=rdquoadminrdquo

password=rdquoadminadminrdquo gt

32322 CONSULTA A LA BASE DE DATOS

La etiqueta sqlQuero permite realizar una consulta a una base de datos Por ejemplo el

siguiente fragmento de coacutedigo realiza una consulta a la base de datos representada por bd y

obtiene un conjunto de resultados representado por cdr

ltsqlquery var=rdquocdrrdquo dataSource=rdquo$bdrdquogt

SELECT professor dia hora alumno

FROM profesores tutorias citas

WHERE profesoresid_profesor=tutoriasid_profesor

AND tutoriasid_tutoria=citasid_tutoria

ltsqlquerygt

32323 MODIFICACIONES SOBRE LA BASE DE DATOS

La etiqueta sqlupdate permite ejecutar una sentencia SQL INSERT UPDATE o DELETE

y cualquier otra sentencia SQL que no retorne ninguacuten valor Por ejemplo

ltsqlupdate var=rdquocontrdquo dataSource=rdquo$bdrdquo gt

UPDATE profesores

SET profesor=

WHERE profesor=

ltsqlparam value=rdquo$paramProfesorrdquo gt

ltsqlparam value=rdquo$paramIDrdquo gt

ltsqlupdategt

Una operacioacuten UPDATE puede utilizar el siacutembolo para indicar que el valor que tendriacutea que

evaluarse en esa posicioacuten seraacute suministrado por una etiqueta sqlparam como por ejemplo

httplocalhost8080JSP2sqlpruebajspProfesor=Mario+Rossainz+LopezampID=514

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

2 La peticioacuten y sus datos asociados los recoge el servidor Web a traveacutes de la red

3 El servidor Web detecta que hay que ejecutar un servlet y delega a esta accioacuten a un

contenedor de servlets que puede ser el mismo servidor Web para que sea ejecutado

4 Una vez ejecutado el servlet se traspasan los resultados (mediante paacuteginas Web) al

servidor Web

5 El servidor Web enviacutea las paacuteginas Web de resultados mediante la red

6 La paacutegina Web de respuesta le llega al cliente que la visualizaraacute haciendo uso del

navegador Web

Por lo tanto los servlets nos permiten crear paacuteginas Web dinaacutemicas en el sentido de que la

respuesta que ofrecen puede variar en funcioacuten de los datos que proporcione el cliente y la

situacioacuten de contexto existente De hecho existen varias razones por las que las paacuteginas Web

requieren ser dinaacutemicas (generadas al momento) como las siguientes

bull La paacutegina Web estaacute basada en los datos enviados por el usuario Por ejemplo paacuteginas

para confirmacioacuten de pedidos en Internet

bull La paacutegina Web se deriva de datos que cambian constantemente Por ejemplo paacuteginas de

informes de clima o encabezados noticiosos

bull La paacutegina Web utiliza informacioacuten de bases de datos corporativas u otros oriacutegenes de

datos que se encuentran del lado del servidor Por ejemplo un sitio de comercio

electroacutenico que liste precio y disponibilidad del punto de venta

313 ESTRUCTURA DE LOS SERVLETS

JAVA proporciona el soporte necesario para escribir servlets a traveacutes de los paquetes

javaxservlet y javaxservlethttp El primero de ellos contiene las interfaces y clases maacutes

geneacutericas que soportan el funcionamiento de los servlets Al programar servlets lo maacutes

habitual es hacer uso del segundo paquete que resulta maacutes especializado uacutetil y faacutecil de

utilizar pues responde a peticiones realizadas desde un cliente HTML

Por tanto un servlet no es maacutes que un objeto de alguna de las clases de la API Java Servlet

(ver figura de arriba) que implemente la interfaz Servlet como son GenericServlet y

Object_Servlet

javaxservletGenericServlet

javaxservlethttpHttpServlet

MiServlet

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

HttpServlet Como esta uacuteltima clase es la idoacutenea para servicios especiacuteficos http entonces el

tipo de servlet maacutes baacutesico puede ser de la forma siguiente Un objeto de una clase derivada

de HttpServlet que encapsula los meacutetodos init() para iniciar el servlet si procede doPost yo

DoGet para responder a las peticiones de los clientes y destroy() para realizar operaciones de

limpieza cuando se descarga el servlet

import javaio

import javaxservlet

import javaxservlethttp

public class MiServlet extends HttpServlet

public void init(ServletConfig config) throws ServletException

superinit(config)

Meacutetodo doPost para responder a una peticioacuten POST

public void doPost(HttpServletRequest request

HttpServletResponse response)

Throws ServletException IOException

Meacutetodo doGet para responder a una peticioacuten GET

public void doGet(HttpServletRequest request

HttpServletResponse response)

Throws ServletException IOException

public void destroy()

Liberar recursos

314 EJECUCIOacuteN DE UN SERVLET

Todo Servlet debe implementar la interfaz Sevlet ya que eacutesta es quien declara los meacutetodos

que definen el ciclo de vida del mismo init service y destroy

El meacutetodo init es invocado por el contenedor Web para iniciar la ejecucioacuten del servlet Eacuteste

meacutetodo se ejecuta una sola vez y tiene como misioacuten inicializar las variables y los recursos

necesarios para la ejecucioacuten del servlet Si la ejecucioacuten de este meacutetodo no se realiza con eacutexito

lanzaraacute la excepcioacuten ServletException

El meacutetodo service se llama cada vez que el servidor recibe una peticioacuten para el servlet Este

meacutetodo puede recibir varias llamadas simultaacuteneas Para cada una de ellas se crea un nuevo

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

hilo y examina el tipo de peticioacuten http (get post put delete trace options o head) con el

fin de llamar al meacutetodo adecuado para atenderla por ejemplo doGet doPost doPut etc El

tipo de peticioacuten por omisioacuten es GET

El meacutetodo service tiene dos paraacutemetros de tipos HttpServletRequest y

HttpServletResponse respectivamente que son pasados al meacutetodo invocado Si la

ejecucioacuten no se desarrolla con eacutexito se lanzaraacute una excepcioacuten del tipo ServletException o

IOException

El objeto de la clase HttpServletRequest encapsula los datos enviados por el cliente al

servidor El objeto de la clase HttpServletResponse encapsula los datos que el servidor

enviaraacute al cliente Este objeto proporciona dos formas para retornar los datos una mediante

un objeto PrintWriter devuelto por su meacutetodo getWriter y otra mediante un objeto

ServletOutputStream devuelto por su meacutetodo getOutputStream La primera forma

devuelve texto (cadenas de caracteres) y la segunda forma devuelve datos binarios (cadenas

de bytes)

El meacutetodo destroy es el uacuteltimo meacutetodo invocado justo antes de destruir el servlet

Normalmente se utiliza para liberar los recursos de maacutequina adquiridos por ejemplo borrar

archivos temporales

315 UN PRIMER SERVLET SENCILLO

Este primer servlet que se muestra a continuacioacuten implementa el caso maacutes sencillo posible

la aplicacioacuten ldquoHolaMundordquo que mostraraacute el texto ldquoHola Mundordquo en el navegador del cliente

En este caso independientemente del tipo de peticioacuten http GET o POST que se realice el

servlet responderaacute en ambos casos enviando la misma paacutegina Web

import javaio

import javaxservlet

import javaxservlethttp

public class HolaMundo extends HttpServlet

Manipular las posibles peticiones enviadas por el cliente

utilizando el atributo method=get o method=post

protected void procesarPeticion(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

responsesetContentType(texthtml)

PrintWriter out = responsegetWriter()

outprintln(lthtmlgt)

outprintln(ltheadgt)

outprintln(lttitlegtServlet HolaMundolttitlegt)

outprintln(ltheadgt)

outprintln(ltbodygt)

outprintln(ltfont size=7gt)

outprintln(iexcliexcliexclHola mundo)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

outprintln(ltfontgt)

outprintln(ltbodygt)

outprintln(lthtmlgt)

outclose()

Manipular la peticioacuten enviada por el cliente

utilizando el atributo method=get

protected void doGet(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

procesarPeticion(request response)

Manipular la peticioacuten enviada por el cliente

utilizando el atributo method=post

protected void doPost(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

procesarPeticion(request response)

En las primeras liacuteneas del coacutedigo anterior se colocan las sentencias import de los paquetes ya

citados El paquete javaio se requiere para las operaciones de entrada y salida de datos y

resultados a traveacutes de los objetos request y response La manera maacutes sencilla de definir un

servlet es heredar de la clase HttpServlet

Asiacute cuando este servlet recibe una peticioacuten del cliente el servidor lo carga para su ejecucioacuten

instante en el que se ejecuta el meacutetodo init() que lo inicia (en este caso el que se invoca es el

que se da por omisioacuten en la superclase de HolaMundo) Cuando init finaliza el servlet esta

en condiciones de atender a las peticiones de los clientes en el ejemplo para cada una de las

peticiones GET o POST se ejecuta el meacutetodo procesarPeticion que es invocado por doGet

o DoPost El servlet permaneceraacute cargado hasta que el servidor decida destruirlo ejecutando

el meacutetodo destroy si es que se implementoacute

Analizando el meacutetodo procesarPeticion se observa que el meacutetodo almacena en el objeto out

de la clase PrintWriter los datos que el servlet HolaMundo enviaraacute al cliente que realizoacute la

peticioacuten Este objeto forma parte del objeto response y es obtenido a traveacutes de su meacutetodo

getWriter Los datos se almacenan en out utilizando su meacutetodo println Los datos

almacenados como se puede ver se corresponden con una paacutegina HTML que seraacute enviada

al explorador del cliente

Ademaacutes de estos datos expliacutecitos tambieacuten se enviacutea otra informacioacuten de protocolo http como

son las cabeceras de respuesta generadas por el servidor Estas cabeceras de respuesta

incluyen la liacutenea Content-type texthtml

Esta liacutenea identifica el tipo de documento a enviar o a recibir en este caso se trata de un

documento HTML Cuando el navegador del cliente reciba esta informacioacuten sabraacute como

interpretar el tipo de documento que tiene que visualizar Para establecer este valor

procesarPeticion utiliza el meacutetodo setContentType del objeto response

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3151 PUESTA EN FUNCIONAMIENTO DEL SERVLET ldquoHolaMundordquo

Una vez escrito el servlet los pasos necesarios para ver el resultado que produce son

bull Compilarlo

bull Instalarlo en un servidor

bull Invocarlo para su ejecucioacuten desde un navegador Web

Como puede leerse no resulta tan sencillo desarrollar y ejecutar por vez primera un servlet a

diferencia de una aplicacioacuten JAVA normal que esteacute basada en el SDK estaacutendar Estos pasos

requieren proceder entonces de alguna de las dos formas siguientes

1 Suponiendo que se tiene instalado el J2SE SDK en particular la versioacuten 150 habraacute que

instalar el servidor Web de aplicaciones Tomcat 5 El servidor Tomcat soporta un

contenedor Web que permite ejecutar servlets y paacuteginas JSP (de las que se hablaraacuten en

la seccioacuten siguiente) En el apeacutendice B del presente documento se muestra la manera de

No obstante existen muchos tipos de servidores aparte del Tomcat que permiten el uso de

los servlets algunos de estos son

a JavaServer Web Development Kit (JSWDK) hoy llamado JWSDP (Java Web

Services Developer Pack o Paquete de desarrollo de servicios Web de Java)

b Allaire JRun (motor para JSP y Servlet que puede ser integrado en servidores de

Netscape Enterprise o Microsoft Personal Web Server)

c ServletExec de Nwe Atlanta (Motor para JSP y Servlet que puede ser integrado

en los servidores Web maacutes populares para Solaris Windows MacOs HP-UX y

Linux

d LiteWebServer (LWS) de Gefion Software (Es un pequentildeo servidor Web

gratuito derivado de Tomcat)

e Java Web Server de Sun (Servidor totalmente gratuito escrito en JAVA

2 Suponiendo que no se tiene instalado ninguacuten software para desarrollar aplicaciones

JAVA habraacute que instalar el Java 2 Enterprise Edition Software Development Kit o J2EE

SDK Este paquete proporciona la base para desarrollar y distribuir aplicaciones

multicapa distribuidas e incluye entre otras herramientas el J2SE y un servidor de

aplicaciones (J2EE Application Server) En el apeacutendice A se muestra la manera en que

se puede instalar y la forma en la que se puede lanzar el servidor de aplicaciones La

versioacuten que se esta suponiendo se trabajaraacute es la J2EE 14 SDK que incluye el J2SE

142_02 y ejemplos ademaacutes del J2EE 14 Application Server

Para ejecutar un servlet como el del HolaMundo del ejemplo anterior teniendo ya instalados

los paquetes J2SE 150 y Tomcat 5 siga los pasos siguientes

1 antildeada a la variable de entorno path de su sistema operativo la ruta de la carpeta bin del

J2SE que tiene instalado

2 Copie el archivo servlet-apijar que se encuentra en commonlib del tomcat que tiene

instalado a jrelibext del J2SE

3 Cambie al directorio de la aplicacioacuten es decir donde se encuentra el servlet

4 Compile el servlet en el ejemplo javac HolaMundojava

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

5 Antildeada el archivo class (HolaMundoclass) que resulta de la compilacioacuten a la carpeta

webappsROOTWEB-INFclasses del Tomcat

6 Edite el archivo confwebxml del Tomcat para definir el servlet invoquer que permite

ejecutar servlets anoacutenimos

7 Arranque el servidor Tomcat (este punto debe realizarse despueacutes del paso 5 para que el

servidor reconozca la aplicacioacuten que se acaba de instalar) Si el servidor ya estaba

arrancado cuando se realizoacute el punto 4 detengalo y vuelvalo a arrancar o abra el

explorador y escriba el URL httplocalhost8080managerhtml y recargue la

aplicacioacuten

8 Una vez arrancado el servidor verifique que funciona correctamente escribiendo en el

navegador httplocalhost8080 o http1270018080 8080 es el puerto utilizado para

acceder al servidor

9 Ejecute el servlet escribiendo en el navegador el URL

httpservidor[puerto]servletnombre_servlet que en el caso del ejemplo seriacutea

httplocalhost8080servletHolaMundo

En conclusioacuten para ejecutar un servlet habraacute que copiar el archivo class que lo define

en la carpeta ROOTWEB-INFclasses de la carpeta webapps del servidor a la que tienen

acceso los clientes Web y ejecutar httpservidor[puerto]servletnombre_servlet de

forma que el servlet HolaMundo se mostrariacutea en su ejecucioacuten como en la figura siguiente

Ahora bien lo maacutes interesante es invocar a los servlets desde paacuteginas Web Se puede solicitar

la ejecucioacuten de un servlet de igual manera que pedimos un recurso cualquiera basta con

definir el URL del servlet en el punto deseado en la paacutegina Web

El siguiente ejemplo muestra un servlet que ademaacutes de generar la paacutegina HTML donde se

manda a escribir ldquoHola Mundordquo devuelve la fecha y hora del servidor Con esto se trata de

dar a entender que por una parte un servlet no tiene porque generar soacutelo paacuteginas HTML sino

que ademaacutes un servlet es capaz de generar contenido dinaacutemico incluyendo cualquier proceso

escrito que pueda ejecutar JAVA (leer o escribir archivos ejecutar programas cargas

bibliotecas etc)

import javaio

import javaxservlet

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

import javaxservlethttp

import javautil

public class Saludo extends HttpServlet

Manipular la peticioacuten enviada por el cliente

utilizando el atributo method=get

protected void doGet(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

responsesetContentType(texthtml)

PrintWriter out = responsegetWriter()

outprintln(lthtmlgt)

outprintln(ltheadgt)

outprintln(lttitlegtServlet Saludolttitlegt)

outprintln(ltheadgt)

outprintln(ltbodygt)

outprintln(ltcentergt)

for (int tamantildeo = 1 tamantildeo lt= 7 ++tamantildeo)

outprintln(ltfont size=+tamantildeo+ color=bluegt)

outprintln(iexcliexcliexclHola mundo)

outprintln(ltbrgt)

outprintln(ltbrgt)

Calendar fechahora = new GregorianCalendar()

Random rnd = new Random()

int tamantildeo = rndnextInt(7)+1

outprintln(ltfont size=+tamantildeo+gt)

outprintln(ltfont color=greengt)

outprintln(Son las +

fechahoraget(CalendarHOUR_OF_DAY) + +

fechahoraget(CalendarMINUTE) + +

fechahoraget(CalendarSECOND) )

outprintln(ltbrgt)

outprintln(ltfont color=graygt)

outprintln(Del diacutea +

fechahoraget(CalendarDAY_OF_MONTH) + +

(fechahoraget(CalendarMONTH)+1) + +

fechahoraget(CalendarYEAR) )

outprintln(ltfontgt)

outprintln(ltcentergt)

outprintln(ltbodygt)

outprintln(lthtmlgt)

outclose()

Para ejecutar este servlet llamado Saludo podemos crear una carpeta dentro de webapps por

ejemplo saludoWEB-INFclasses y copiar dentro de classes Saludoclass

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Para ejecutar el servlet Saludo tendriacuteamos entonces que escribir

httplocalhost8080SaludoservletSaludo

Pero si queremos invocar a este servlet desde una paacutegina HTML se deberaacute utilizar este

mismo URL o bien el URL relativo a la carpeta del servidor donde copiemos el archivo html

que seraacute copiado en la carpeta Saludo

El coacutedigo HTML almacenado en saludohtml deberaacute incluir una de las dos liacuteneas siguientes

lta href=rdquohttplocalhost8080Saludoservletsaludordquogt ejecutar Saludo ltagt

lta href=rdquoservletSaludordquogt ejecutar Saludo ltagt

La segunda opcioacuten es la maacutes interesante porque no depende de la direccioacuten del servidor Para

ejecutar entonces el servlet a traveacutes de saludohtml basta con escribir el URL siguiente

httplocalhost8080Saludosaludohtml

316 EMPAQUETADO DE SERVLETS

Puede darse el caso en que diversos programadores en un entorno de produccioacuten dado

podriacutean estar desarrollando servlets para el mismo servidor El colocar todos estos servlets

en el directorio principal de estos programas podriacutea dar como resultado un directorio difiacutecil

de administrar ademaacutes de que se corre el riesgo de duplicar los nombres de los servlets si

dos desarrolladores distintos eligen el mismo nombre para el programa que desarrollan Los

paquetes son la solucioacuten loacutegica a este problema El uso de paquetes tiene como resultado

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

cambios en la forma en que se generan los servlets la forma en que se compilan y en la que

se invocan Para colocar los servlets en paquetes se requieren de dos pasos

1 Mover los archivos (class) a un subdirectorio que coincida con el nombre del paquete

pretendido

2 Insertar una instruccioacuten de paquete en el archivo de clase Para ello la primera liacutenea en

el coacutedigo fuente (java) del servlet deberaacute ser package nomPaquete

Por ejemplo el fragmento siguiente de coacutedigo Java presenta una variacioacuten del Servlet

HolaMundo que se encuentra en el paquete misServlets

package misServlets

import javaio

import javaxservlet

import javaxservlethttp

public class HolaMundo extends HttpServlet

Manipular las posibles peticiones enviadas por el cliente

utilizando el atributo method=get o method=post

protected void procesarPeticion(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

responsesetContentType(texthtml)

PrintWriter out = responsegetWriter()

outprintln(lthtmlgt)

El archivo class se encontraraacute dentro de una carpeta llamada misServlets que seraacute el paquete

creado o utilizado por la aplicacioacuten en este caso del HolaMundo dependiendo si exitiacutea o no

antes de compilar la aplicacioacuten A continuacioacuten deberemos copiar dentro de la carpeta

webappsROOTWEB-INFclasses del Tomcat la carpeta misServlets junto con el

HolaMundoclass que estaraacute dentro de ella y ejecutar el servlet en el explorador escribiendo

httplocalhost8080servletmisServletsHolaMundo

317 PROCESAMIENTO DE FORMULARIOS

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Hasta este punto los servlets que hemos estudiado soacutelo enviacutean informacioacuten al navegador del

cliente No obstante estos clientes Web pueden Mostar formularios que permitan solicitar

datos a los usuarios que seraacuten enviados al servidor para por ejemplo ser almacenados en

una base de datos para posteriores peticiones o para otros procesos o bien para dar al usuario

una respuesta ajustada a dicha peticioacuten

En el siguiente URL se invoca la ejecucioacuten de un servlet llamado Parametros aportando la

lista de pares (Nombre Mario)-(Edad 22) en formato GET

httplocalhost8080ParametrosservletParametrosNombre=MarioampEdad=22

Hay que observar la manera de colocar los datos tras el siacutembolo ldquordquo y de separarlos con el

siacutembolo ldquoamprdquo El coacutedigo del servlet es el siguiente

import javaio

import javaxservlet

import javaxservlethttp

public class Parametros extends HttpServlet

public void doGet(HttpServletRequest request HttpServletResponse

response)

throws IOException ServletException

responsesetContentType(texthtml)

PrintWriter out = responsegetWriter()

outprintln(lthtmlgt)

outprintln(ltbodygt)

String NombreRecibido = requestgetParameter(Nombre)

String EdadRecibida = requestgetParameter(Edad)

outprintln(lth1gt Hola + NombreRecibido + lth1gt)

outprintln(lth1gt Tienes + EdadRecibida + antildeos lth1gt)

outprintln(ltbodygt)

outprintln(lthtmlgt)

El objeto httpServletRequest en el coacutedigo anterior request contiene una serie de meacutetodos de

utilidad para recibir informacioacuten proveniente del usuario en concreto el meacutetodo

getParameter permite obtener el valor asociado a un nombre en la lista de pares (nombre

valor) que puede proporcionar un URL

Ademaacutes de poder introducir el URL anterior en el navegador proporcionando directamente

los datos enviados al servlet en dicha URL

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Tambieacuten podemos generar el URL mediante una paacutegina Web que podraacute utilizar el usuario

lthtmlgt

ltbodygt

lth1gt Cuestionario lth1gt

ltform action=httplocalhost8080ParametrosservletParametros

method=getgt

Nombre ltinput type=text name=Nombregt ltbrgt

Edad ltinput type=text name=Edadgt ltbrgtltbrgt

ltinput type=submit value=Enviar datosgt ltbrgt

ltformgt

ltbodygt

lthtmlgt

Los formularios en HTML permiten enviar datos al servidor Web En la liacutenea 5 de la paacutegina

Web mostrada se encuentra la etiqueta form que en el ejemplo contiene el atributo action

que indica la accioacuten que debe realizarse en el servidor en este caso ejecutar el servlet

Parametros y el atributo method que indica la manera en la que se enviacutean los datos (en este

caso la peticioacuten GET)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Peticioacuten HTTP GET Cuando el tipo de peticioacuten HTTP es GET los datos del formulario

son enviados al servidor a continuacioacuten del URL especificado por el atributo action de form

El tamantildeo de la cadena enviada estaacute limitado y al estar en ASCII es totalmente legible por

tanto no es un modo seguro

Es por ello que cuando se requiere del enviacuteo de datos seguros y ademaacutes el nuacutemero de datos

del formulario que son enviados al servidor son muchos resulta ser mejor el uso del meacutetodo

POST Veamos otro ejemplo

import javaio

import javaxservlet

import javaxservlethttp

import javautil

public class MostrarParametros extends HttpServlet

public void doGet(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

responsesetContentType(texthtml)

PrintWriter out= responsegetWriter()

String titulo=Lectura de todos los paraacutemetros de Peticioacuten

outprintln(ltdoctype html public -W3CDTD HTML 40 +

TransitionalENgt)

outprintln(lthtmlgt)

outprintln(ltheadgtlttitlegt+titulo+lttitlegtltheadgt)

outprintln(ltbody bgcolor=FDF5E6gtn+

lth1 align=centergt+titulo+lth1gtn+

lttable border=1 align=centergtn+

lttr bgcolor=FFAD00gtn+

ltthgtNombre del parampaacutemetroltthgtValor(es) del

parampaacutemetro)

Enumeration nombresParam=requestgetParameterNames()

while(nombresParamhasMoreElements())

String nombreParam= (String)nombresParamnextElement()

outprint(lttrgtlttdgt+nombreParam+nltTDgt)

String[]valoresParam=

requestgetParameterValues(nombreParam)

if (valoresParamlength==1)

String valorParam=valoresParam[0]

if (valorParamlength()==0)

outprintln(ltigt Sin valor ltigt)

else

outprintln(valorParam)

else

outprintln(ltulgt)

for (int i=0 iltvaloresParamlengthi++)

outprintln(ltligt+valoresParam[i])

outprintln(ltulgt)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

outprintln(lttablegtnltbodygtlthtmlgt)

public void doPost(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

doGet(requestresponse)

El servlet escrito utiliza un meacutetodo doPost que soacutelo ejecuta a Donet Esto es porque se quiere

que el servlet pueda manejar tanto las peticiones GET como las POST Por otro lado el

formulario es el siguiente

ltdoctype html public -W3CDTD HTML 40 TransitionalENgt

lthtmlgt

ltheadgt

lttitlegt Un Formulario de ejemplo que utiliza POST lttitlegt

ltheadgt

ltbody bgcolor=FDF5E6gt

lth1 align=centergt Un formulario de Ejemplo que utiliza POST

lth1gt

ltform action=httplocalhost8080MostrarParametros

servletMostrarParametros

method=postgt

Nuacutemero de elemento ltinput type=text name=elemNumgt ltbrgt

Cantidad ltinput type=text name=cantidadgt ltbrgt

Precio Unitario ltinput type=text name=precio value=$gt

ltbrgtlthrgt

Nombre de Pila ltinput type=text name=nombrePilagt ltbrgt

Apellido(s) ltinput type=text name=apellidogt ltbrgt

Iniciales ltinput type=text name=inicialesgt ltbrgt

Domicilio de envio lttextarea name=domicilio rows=3

cols=40gtlttextareagt ltbrgt

Tarjeta de creacutedito ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta value=VisagtVisa ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta value=Master Cardgt

Master Card ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta value=AmexgtAmerican

Expresss ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta

value=DiscovergtDiscover ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta

value=Java Smart CardgtTarjeta Inteligente de Java

ltbrgt

Nuacutemero de la tarjeta de creacutedito

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltinput type=password name=numTarjetagtltbrgt

Repita el nuacutemero de la tarjeta de creacutedito

ltinput type=password name=numTarjetagtltbrgtltbrgt

ltcentergt

ltinput type=submit value=Enviar pedidogt

ltcentergt

ltformgt

ltbodygt

lthtmlgt

El formulario HTML del listado anterior utiliza POST como deberiacutea ser en todos los campos

que tienen contrasentildea

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Si intenta ejecutar el servlet MostrarParametros directamente en el explorador con el URL

httplocalhost8080MostrarParametrosservletMostrarParametros se obtendraacute la paacutegina

Web sin resultados

Peticioacuten HTTP POST Cuando el tipo de peticioacuten HTTP es POST los datos son enviados

al servidor en el cuerpo de la peticioacuten Es el meacutetodo maacutes usual de enviar los datos de un

formulario Con este tipo de peticioacuten la informacioacuten del formulario se enviacutea despueacutes del URL

indicado por action en el cuerpo de la peticioacuten y el tamantildeo de la informacioacuten enviada no esta

limitado

Seguacuten lo expuesto escoger el meacutetodo para enviar la informacioacuten no es difiacutecil Si los datos

son pocos y no importa su confidencialidad o manipulacioacuten utilizamos GET Si son largos

privados o importantes utilizamos POST

318 ACCESO A BASES DE DATOS CON SERVLETS

Una aplicacioacuten Java que realiza accesos a bases de datos funciona seguacuten una arquitectura que

permite escribir los programas abstrayeacutendose de los detalles de los niveles inferiores (discos

controladores sistema operativo etc) como lo muestra la figura siguiente

JDBC (Java DataBase Connectivity ndash Conexioacuten con Bases de Datos desde Java) es una API

de Java que permite ejecutar instrucciones SQL para manipular y gestionar bases de datos

relacionales Para que una aplicacioacuten Java pueda hacer operaciones sobre una base de datos

previamente tiene que establecer una conexioacuten con la misma Esta conexioacuten se realiza a

traveacutes de un controlador (driver) seguacuten la figura de arriba La API-JDBC se proporciona en

dos paquetes javasql y javaxsql El primer paquete contiene las interfaces y clases Java

fundamentales de JDBC en tanto que el segundo paquete es una extensioacuten del primero e

APLICACION

SISTEMA OPERATIVO

CONTROLADOR

Oracle Access MySql

JVM

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

incluye las clases que interactuacutean con JNDI y otras que gestionan conjuntos de conexiones

con una misma base de datos Para maacutes detalles del uso de JDBC veacutease el apeacutendice A de

estas notas

El primer paso para crear una conexioacuten entre una aplicacioacuten Java y una base de datos es

registrar el controlador JDBC adecuado para esa base con el fin de que la JVM pueda

utilizarlo Existen distintos tipos de controladores JDBC por ejemplo

ldquocommysqljdbcDriverrdquo que es el controlador utilizado cuando el motor de base de datos

que se utiliza es MySql

En el supuesto caso de que la base de datos soacutelo permitiera el acceso a traveacutes de controladores

ODBC como lo hace ACCESS siempre podemos usar el controlador puente JDBC-ODBC

incluido como parte del JDK ldquosunjdbcodbcJdbcOdbcDriverrdquo Este tipo de controladores

es decir los basados en ODBC (Open DataBase Connectivity) son bastante utilizados en

entornos Windows pues este SO incluye ODBC El apeacutendice A describe al final como

administrar los oriacutegenes de datos ODBC en Windows

Asiacute pues la mayor ventaja de los servlets con respecto a la conexioacuten con bases de datos viacutea

JDBC es que su ciclo de vida les permite mantener conexiones abiertas con las mismas a lo

largo de toda una sesioacuten Esto permite recortar tiempo con respecto a otras tecnologiacuteas como

la CGI Ademaacutes JDBC es una tecnologiacutea independiente de las bases de datos

Como ejemplo vamos a implementar una simple aplicacioacuten Web basada en servlets que

muestre una especie de directorio de personas La aplicacioacuten podraacute consultar insertar

modificar borrar o listar la informacioacuten de cada una de las personas almacenadas en la base

de datos a la que se hace acceso (que estaraacute en formato access)

La estructura de la Base de Datos es una tabla con los siguientes campos

DNI Nombre Apellido Edad

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

53023767A Pedro Rubio 18

77459822P Luis Tejedor 47

123456MRL Mario Rossainz 35

La estructura de la aplicacioacuten se muestra en la figura siguiente

lthtmlgt

ltbodygt

lttable border=1gtlttrgtlttdgt

ltform action=httplocalhost8080directorioTelservletSvAccesoBD

method=getgt

DNI ltinput type=text name=DNIgt ltbrgt

Nombre ltinput type=text name=Nombregt ltbrgt

Apellido ltinput type=text name=Apellidogt ltbrgt

Edad ltinput type=text name=Edadgt ltbrgtltbrgt

ltinput type=submit value=Consultar name=BotonConsultargt

ltinput type=submit value=Insertar name=BotonInsertargt

ltinput type=submit value=Modificar name=BotonModificargt

ltinput type=submit value=Borrar name=BotonBorrargt

ltinput type=submit value=Listar name=BotonListargt ltbrgt

ltcentergt

ltinput type=submit value= |lt name=BotonPrimerogt

ltinput type=submit value= -- name=BotonMenosCincogt

ltinput type=submit value= - name=BotonAnteriorgt

ltinput type=submit value= + name=BotonSiguientegt

ltinput type=submit value= ++ name=BotonMasCincogt

ltinput type=submit value= gt| name=BotonUltimogt

ltcentergt

lttdgt

lttdgt

lttextarea name=AreaDeListado rows=10 cols=35gtlttextareagt

SvAccesoBDhtml

SvAccesoBD

ObBorrado ObListado ObConsulta

ObInsercion

ObModificacion

ObPosicionamiento

ObRegistro

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lttdgt

lttrgt

ltformgt

lttablegt

ltbodygt

lthtmlgt

SvAccesoBDhtml

import javaio

import javaxservlet

import javaxservlethttp

public class SvAccesoBD extends HttpServlet

private int PosicionBuscada = 1

private String AreaDeListado=

PrintWriter out

public void doGet(HttpServletRequest request HttpServletResponse response)

throws IOException ServletException

String DNI = requestgetParameter(DNI)

String Nombre = requestgetParameter(Nombre)

String Apellido = requestgetParameter(Apellido)

String Edad = requestgetParameter(Edad)

String BotonConsultar = requestgetParameter(BotonConsultar)

String BotonInsertar = requestgetParameter(BotonInsertar)

String BotonModificar = requestgetParameter(BotonModificar)

String BotonBorrar = requestgetParameter(BotonBorrar)

String BotonListar = requestgetParameter(BotonListar)

String BotonPrimero = requestgetParameter(BotonPrimero)

String BotonMenosCinco = requestgetParameter(BotonMenosCinco)

String BotonAnterior = requestgetParameter(BotonAnterior)

String BotonSiguiente = requestgetParameter(BotonSiguiente)

String BotonMasCinco = requestgetParameter(BotonMasCinco)

String BotonUltimo = requestgetParameter(BotonUltimo)

AreaDeListado = requestgetParameter(AreaDeListado)

responsesetContentType(texthtml)

out = responsegetWriter()

outprintln(lthtmlgt)

outprintln(ltbodygt)

if (BotonConsultar=null) ConsultarDatos(DNI)

if (BotonInsertar=null) InsertarDatos(DNINombreApellidoEdad)

if (BotonModificar=null) ModificarDatos(DNINombreApellidoEdad)

if (BotonBorrar=null) BorrarDatos(DNI)

if (BotonListar=null) ListarDatos(DNI)

if (BotonPrimero=null) Controles(1)

if (BotonMenosCinco=null) Controles(2)

if (BotonAnterior=null) Controles(3)

if (BotonSiguiente=null) Controles(4)

if (BotonMasCinco=null) Controles(5)

if (BotonUltimo=null) Controles(0)

outprintln(ltbodygt)

outprintln(lthtmlgt)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

private void ConsultarDatos(String DNI)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObRegistro InstanciaFila = InstanciaConsultaDameDatos()

GenerarRespuesta(InstanciaFilaDameDNI()InstanciaFilaDameNombre()

InstanciaFilaDameApellido()

StringvalueOf(InstanciaFilaDameEdad()))

else

GenerarRespuesta(DNI------------)

PosicionBuscada = 1

public void ListarDatos(String DNI)

ObListado InstanciaListado = new ObListado()

AreaDeListado = InstanciaListadoDameResultado()

ConsultarDatos(DNI)

PosicionBuscada = 1

public void BorrarDatos(String DNI)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObBorrado InstanciaBorrado = new ObBorrado(PosicionBuscada)

GenerarRespuesta()

else

GenerarRespuesta(----------------)

PosicionBuscada = 1

public void ModificarDatos(String DNI String Nombre String Apellido

String Edad)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObRegistro InstanciaFila = new ObRegistro(DNI Nombre Apellido

IntegerparseInt(Edad))

ObModificacion InstanciaModificacion = new ObModificacion(PosicionBuscada

InstanciaFila)

GenerarRespuesta(DNINombreApellidoEdad)

else

GenerarRespuesta(----------------)

PosicionBuscada = 1

public void InsertarDatos(String DNI String Nombre String Apellido

String Edad)

ObRegistro InstanciaFila = new ObRegistro(DNI Nombre Apellido

IntegerparseInt(Edad))

ObInserccion InstanciaInserccion = new ObInserccion(InstanciaFila)

GenerarRespuesta()

PosicionBuscada=1

public void Controles(String Identificador)

ObPosicionamiento InstanciaPosicionamiento =

new ObPosicionamiento(IdentificadorPosicionBuscada)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ObRegistro InstanciaFila = InstanciaPosicionamientoDameDatos()

GenerarRespuesta(InstanciaFilaDameDNI()InstanciaFilaDameNombre()

InstanciaFilaDameApellido()

StringvalueOf(InstanciaFilaDameEdad()))

PosicionBuscada = InstanciaPosicionamientoPosicion()

private void GenerarRespuesta(String DNI String Nombre String Apellido

String Edad)

outprintln(lttable border=1gt)

outprintln(lttrgt)

outprintln(lttdgt)

outprintln(ltform

action=httplocalhost8080directorioTelservletSvAccesoBD

method=getgt)

outprintln( DNI ltinput type=text name=DNI value=+DNI+gtltbrgt)

outprintln( Nombre ltinput type=text name=Nombre

value=+Nombre+gtltbrgt)

outprintln( Apellido ltinput type=text name=Apellido

value=+Apellido+gtltbrgt)

outprintln( Edad ltinput type=text name=Edad

value=+Edad+gtltbrgtltbrgt)

outprintln( ltinput type=submit value=Consultar

name=BotonConsultargt)

outprintln( ltinput type=submit value=Insertar

name=BotonInsertargt)

outprintln( ltinput type=submit value=Modificar

name=BotonModificargt)

outprintln( ltinput type=submit value=Borrar name=BotonBorrargt)

outprintln( ltinput type=submit value=Listar name=BotonListargt

ltbrgt)

outprintln( ltcentergt)

outprintln( ltinput type=submit value= |lt name=BotonPrimerogt)

outprintln( ltinput type=submit value= --

name=BotonMenosCincogt)

outprintln( ltinput type=submit value= - name=BotonAnteriorgt)

outprintln( ltinput type=submit value= +

name=BotonSiguientegt)

outprintln( ltinput type=submit value= ++

name=BotonMasCincogt)

outprintln( ltinput type=submit value= gt| name=BotonUltimogt)

outprintln( ltcentergt)

outprintln( lttdgt)

outprintln( lttdgt)

outprintln( lttextarea name=AreaDeListado rows=10

cols=35gt+AreaDeListado+lttextareagt)

outprintln( lttdgt)

outprintln( lttrgt)

outprintln( ltformgt)

outprintln( lttablegt)

SvAccesoBDjava

import javasql

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

public class ObBorrado

ObBorrado(int PosicionBuscada)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

Personasabsolute(PosicionBuscada)

PersonasdeleteRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

ObBorradojava

import javasql

import javaawtTextArea

public class ObListado

private String Resultado=

ObListado()

String DNI Nombre Apellido Linea

int Edad Posicion

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement()

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

while (Personasnext())

DNI = PersonasgetString(DNI)

Nombre = PersonasgetString(Nombre)

Apellido = PersonasgetString(Apellido)

Edad = PersonasgetInt(Edad)

Posicion = PersonasgetRow()

Linea = DNI+ +Nombre+ +Apellido+ +StringvalueOf(Edad)

Resultado=Resultado+StringvalueOf(Posicion)+ +Linea+n

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public String DameResultado()

return Resultado

ObListadojava

public class ObRegistro

private String DNI Nombre Apellido

private int Edad

ObRegistro (String DNI String Nombre String Apellido int Edad)

thisDNI = DNI

thisNombre = Nombre

thisApellido = Apellido

thisEdad = Edad

String DameDNI()

return DNI

String DameNombre()

return Nombre

String DameApellido()

return Apellido

int DameEdad()

return Edad

ObRegistrojava

import javasql

public class ObConsulta

private int Posicion = 0

private ObRegistro DatosPersona

ObConsulta(String DNIPedido)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement()

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

while (Personasnext())

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

String DNI = PersonasgetString(DNI)

if (DNIequalsIgnoreCase(DNIPedido))

Posicion = PersonasgetRow()

String Nombre = PersonasgetString(Nombre)

String Apellido = PersonasgetString(Apellido)

int Edad = PersonasgetInt(Edad)

DatosPersona = new ObRegistro(DNINombreApellidoEdad)

break

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public int PosicionEncontrada()

return Posicion

public ObRegistro DameDatos()

return DatosPersona

ObConsultajava

import javasql

public class ObInserccion

ObInserccion(ObRegistro Datos)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

PersonasmoveToInsertRow()

PersonasupdateString(DNI DatosDameDNI())

PersonasupdateString(NombreDatosDameNombre())

PersonasupdateString(Apellido DatosDameApellido())

PersonasupdateInt(EdadDatosDameEdad())

PersonasinsertRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

catch (SQLException e)

Systemoutprintln(e)

ObInsercionjava

import javasql

public class ObModificacion

ObModificacion(int PosicionBuscada ObRegistro Datos)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

Personasabsolute(PosicionBuscada)

PersonasupdateString(DNIDatosDameDNI())

PersonasupdateString(NombreDatosDameNombre())

PersonasupdateString(ApellidoDatosDameApellido())

PersonasupdateInt(EdadDatosDameEdad())

PersonasupdateRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

ObModificacionjava

import javasql

public class ObPosicionamiento

private ObRegistro DatosPersona

private int Posicion

ObPosicionamiento(String Accion int Posicion)

int IDAccionEdad

String DNINombreApellido

boolean PosicionCorrecta=false

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

FROM DatosPersonales)

Personasabsolute(Posicion)

IDAccion = IntegerparseInt(Accion)

switch (IDAccion)

case 0

PosicionCorrecta = Personaslast()

break

case 1

PosicionCorrecta = Personasfirst()

break

case 2

PosicionCorrecta = Personasrelative(-5)

break

case 3

PosicionCorrecta = Personasprevious()

break

case 4

PosicionCorrecta = Personasnext()

break

case 5

PosicionCorrecta = Personasrelative(+5)

break

if (PosicionCorrecta)

thisPosicion = PersonasgetRow()

DNI = PersonasgetString(DNI)

Nombre = PersonasgetString(Nombre)

Apellido = PersonasgetString(Apellido)

Edad = PersonasgetInt(Edad)

else

thisPosicion = Posicion

DNI = ----

Nombre = ----

Apellido = ----

Edad = 0

DatosPersona = new ObRegistro(DNINombreApellidoEdad)

Personasclose()

Conexionclose()

SentenciaSQLclose()

Systemoutprintln(StringvalueOf(Posicion)++StringvalueOf(thisPosicion))

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public int Posicion()

return Posicion

public ObRegistro DameDatos() return DatosPersona

ObPosicionamientojava

En este ejemplo se emplean servlets y paacuteginas Web Los clientes habitualmente trabajan en

una computadora remota y los programas se ejecutan en un servidor El mecanismo de

comunicaciones que soporta el protocolo http nos permite consultar en el servidor los datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

que ha seleccionado o escrito el usuario de esta manera se puede observar una disociacioacuten

entre la interfaz graacutefica de usuario (que se ejecuta en los equipos de los clientes) y el

programa que recoge los datos y ejecuta las acciones pertinentes (que se ejecuta en el

servidor)

Como puede observarse el coacutedigo SvAccessoBD es un servlet que lleva a cabo las siguientes

operaciones

1 Recoge los valores provenientes del usuario

2 Determina la naturaleza de la accioacuten a realizar

3 Realiza su cometido con la base de datos

4 Genera la respuesta que recibiraacute el usuario

32 JSP

JSP significa Java Server Pages que traducido quiere decir Paacuteginas de Servidor Java y es

por tanto una tecnologiacutea orientada a crear paacuteginas Web con programacioacuten en JAVA es decir

permite mezclar HTML estaacutendar y estaacutetico con un contenido dinaacutemico etiquetas especiales

(oacuterdenes) y trozos de coacutedigo JAVA (scriptlets o secuencias de oacuterdenes) o contenido dinaacutemico

generado por servlets Eacuteste contenido dinaacutemico se encuentra encerrado en etiquetas

especiales muchas de las cuales inician con lt y finalizan con gt El motor de las paacuteginas

JSP esta basado en los servlets de JAVA

En la tecnologiacutea JSP se crean paacuteginas parecidas a las paacuteginas que se crean en ASP (Active

Server Page de Microsoft) o PHP (Personal Home Page) que son dos tecnologiacuteas de paacuteginas

ejecutadas en el servidor Sin embargo JSP no se cintildee a un sistema operativo o servidor Web

en particular ademaacutes de que proporciona acceso a la tecnologiacutea de Servlets y a JAVA en la

parte dinaacutemica

El proceso para generar paacuteginas JSP accesibles en Web es mucho maacutes simple que en los

servlets Dando por hecho que se tiene un servidor Web que permite usar JSP el coacutedigo se

almacenaraacute en archivos con extensioacuten jsp que incluyen dentro de la estructuras de etiquetas

HTML las sentencias JAVA a ejecutar y tan soacutelo se colocaraacuten en cualquier lugar en donde

se pusiera una paacutegina Web normal sin compilacioacuten sin paquetes y sin configuracioacuten aunque

el servidor tendraacute que ser configurado para acceder a los archivos de clases Servlets y de

JSPs

Aunque lo que se escriba con frecuencia luciraacute como un archivo HTML estaacutendar detraacutes de

ello la paacutegina JSP se convierte automaacuteticamente en un servlet normal donde el HTML

estaacutetico tan soacutelo es enviado al flujo de salida asociado con el meacutetodo service del servlet Esta

traduccioacuten se realiza la primera vez que se solicita la paacutegina De acuerdo como este

configurado el servidor es posible ver el coacutedigo fuente de los servlets generados a partir de

sus paacuteginas JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Por ejemplo supongamos que se ha escrito el siguiente coacutedigo en el archivo Saludojsp

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtEjemplo JSPlttitlegtltheadgt

ltbody bgcolor=ffffccgt

ltcentergt

lth2gtHola mundolth2gt

ltjavautilDate hoy = new javautilDate()gt

La fecha de hoy es lt=hoygt

ltcentergt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional y un fragmento de un scriptlet de JAVA La etiqueta

lt identifica el comienzo del scriptlet y gt el final Una expresioacuten de la forma =variable

es sustituida por el valor de esa variable Para ejecutar esta paacutegina o cualquier otra paacutegina

JSP desde un navegador hay que instalarla en el servidor de aplicaciones de la misma manera

en como se hizo con los servlets Suponiendo entonces que se tiene instalado el Tomcat 5

siga los siguientes pasos

1 Antildeadir en el servidor la carpeta digamos JSP2 dentro de la carpeta webapps del Tomcat

y construir sobre ella la jerarquiacutea de clases ya conocida de los servlets

webappsrarrJSP2rarrWEB-INFrarrclasses

WEB-INFrarrlib

WEB-INFrarrtags

2 Editar en la carpeta WEB-INF el descriptor de despliegue webxml que se indica a

continuacioacuten Este archivo XML indica doacutende se localiza el esquema XML para la

especificacioacuten Servlet 24 que a suvez utiliza el esquema XML para la especificacioacuten

Java Server Page 20 que son las especificaciones que soporta en servidor Tomcat

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=

httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

3 Crear en JSP2 la carpeta saludo que contendraacute la aplicacioacuten y copiar en ella la paacutegina

Saludojsp

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

4 Arrancar el servidor Si el servidor ya estaba arrancado detenerlo y volverlo a arrancar o

bien abrir el explorador escribir el URL httplocalhost8080managerhtml e instalar

la aplicacioacuten

5 Una vez arrancado el servidor verificar si estaacute funcionando correctamente escribiendo

el URL siguiente en el explorador httplocalhost8080 El explorador debe mostrar la

paacutegina del Tomcat

6 Ejecutar la paacutegina JSP iniciando el explorador y escribiendo el URL siguiente

httplocalhost8080JSP2saludoSaludojsp donde la sintaxis geneacuterica es

httpservidor[puerto]MiCarpetapaginajsp

Cuando esta paacutegina (Saludojsp) es invocada por primera vez el motor JSP lleva a cabo una

fase de traduccioacuten de la misma en un servlet y el motor Servlet es el que ejecutaraacute eacuteste uacuteltimo

para generar el HTML dinaacutemico que seraacute enviado al explorador cliente seguacuten puede

deducirse de la figura siguiente La proacutexima vez que la paacutegina sea solicitada el motor JSP

ejecutaraacute el servlet que fue caragado la primera vez a no ser que la paacutegina haya cambiado

en cuyo caso seraacute compilada automaacuteticamente en un nuevo servlet y ejecutada

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Regresando al ejemplo el archivo java generado por el Tomcat a partir del archivo

Saludojsp se localiza en la carpeta workCatalinalocalhost de la instalacioacuten de Tomcat

321 ELEMENTOS PARA SECUENCIAS DE COMANDOS

Los elementos para secuencias de comandos permiten insertar coacutedigo en el servlet que seraacute

generado a partir de la paacutegina JSP Existen tres formas

1 Expresiones del tipo lt= expresioacuten gt que se evaluacutean e insertan en el resultado del

servlet

2 Los scriptlets del tipo lt codigo gt que se insertan en el meacutetodo _jspService del

servlet (ejecutado por service)

3 Las declaraciones del tipo lt Codigo gt que se insertan en el cuerpo de la clase del

servlet fuera de cualquier meacutetodo existente

NOTA Los comentarios en JSP se escriben lt-- Comentario JSP --gt en tanto que los

comentarios en HTML son de la forma lt--Comentario HTML --gt La diferencia

semaacutentica radica en que los comentarios HTML cuando se insertan en la respuesta enviada

por el servidor al cliente no se muestran cuando se visualiza el documento HTML pero si

Servidor Maacutequina Cliente

Explorador Web

Contenedor Web

Motor Servlet

Motor JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

los podemos ver cuando se visualiza el coacutedigo fuente en tanto que los comentarios JSP

aunque se inserten en la respuesta enviada por el servidor al cliente no son enviados al

explorador de forma que tampoco se muestran ni se ven cuando se visualiza el coacutedigo fuente

HTML desde el explorador

3211 EXPRESIONES

Se utiliza una expresioacuten JSP para insertar valores directamente en el resultado La sintaxis es

lt= expresioacuten gt Por ejemplo

lt= requestgetParameter(ldquoparNombre) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt lt= s gt

La fecha y hora actual es lt= new javautilDate() gt

La expresioacuten se evaluacutea se convierte a cadena y se inserta en la paacutegina Esta evaluacioacuten se

realiza durante la ejecucioacuten

32111 VARIABLES PREDEFINIDAS

Para simplificar estas expresiones se pueden utilizar cierta cantidad de variables

predefinidas Estos objetos impliacutecitos como tambieacuten se les llama estaacuten disponibles para su

uso durante la implementacioacuten de una paacutegina Web

bull pageContext Es un objeto de la clase PageContext que proporciona acceso a objetos

relacionados con los servlets

bull request Es un objeto de la clase HttpServletRequest que se puede obtener a traveacutes del

meacutetodo getRequest que encapsula los datos enviados por el cliente al servidor

bull response Es un objeto de la clase HttpServletResponse que puede obtenerse a traveacutes

del meacutetodo getResponse que encapsula los datos que el servidor enviaraacute al cliente

bull application Es un objeto de la clase ServletContext que se obtiene a traveacutes del meacutetodo

getServletContext que define un conjunto de meacutetodos que todo servlet utiliza para

comunicar con el contenedor de servlets

bull config Es un objeto de la clase ServletConfig que se obtiene a traveacutes del meacutetodo

getServletConfig y que se utiliza por el contenedor de servlets para pasar informacioacuten

al servlet durante la iniciacioacuten

bull session Es un objeto de la clase HttpSession que se obtiene a traveacutes del meacutetodo

getSession que proporciona una forma de identificar a un usuario que visita las paacuteginas

de un sitio Web

bull out Es un objeto de la clase JspWriter que se obtiene a traveacutes del meacutetodo getOut que

se utiliza para almacenar la respuesta que seraacute enviada al cliente que hizo la peticioacuten de

la paacutegina

bull page Es un objeto geneacuterico de la clase Object que se obtiene a traveacutes del meacutetodo

getPage y que representa al servlet obtenido a partir de la paacutegina JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

bull exception Es un objeto de la clase Exception que se obtiene a traveacutes del meacutetodo

getException que contendraacute informacioacuten a cerca de cualquier excepcioacuten que se lance

desde la paacutegina JSP

Un ejemplo del uso de uno de estos objetos impliacutecitos seriacutea el siguiente

El nombre de tu host es lt= requestgetRemoteHost() gt

El listado siguiente da un ejemplo de una paacutegina JSP que utiliza algunas variables

predefinidas como uso de expresiones JSP

ltDOCTYPE HTML PUBLIC -W3CDTD HTML 40 Transitional ENgt

lthtmlgt

ltheadgt

lttitlegt Expresiones JSP lttitlegt

ltheadgt

ltbodygt

lth2gt Expresiones JSP lth2gt

ltULgt

ltligt Fecha y hora en curso lt= new javautilDate() gt ltligt

ltligt Nombre de su host lt= requestgetRemoteHost() gt ltligt

ltligt Identificador de su sesioacuten lt= sessiongetId() gt ltligt

ltligt El paraacutemetro ltcodegt paramPrueba ltcodegt del formulario

lt= requestgetParameter(paramPrueba) gt ltligt

ltULgt

ltbodygt

lthtmlgt

Cuya salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3212 LOS SCRIPTLETS JSP

Si se desea hacer algo maacutes complejo que una simple expresioacuten los scriptlets permiten insertar

coacutedigo JAVA en el meacutetodo _jspService del servlet (que es ejecutado por service) La sintaxis

utilizada por los scriptlets es lt coacutedigo java gt Los escriptlets tienen acceso a las

mismas variables definidas de forma automaacutetica como expresiones A manera de ejemplo si

se desea que el resultado aparezca en la paacutegina generada deberiacutea de utilizarse la variable out

como en la siguiente instruccioacuten

lt String datosConsultados= requestgetQueryString()

outprintln(ldquoDatos GET adjuntos ldquo+datosConsultados)

gt

En este ejemplo podriacutea haberse obtenido el mismo resultado utilizando la siguiente expresioacuten

JSP

Datos GET adjuntos lt=requestgetQueryString() gt

En general los scriptlets pueden ejecutar varias tareas que no podriacutean realizarse con las

expresiones Tales tareas incluyen

bull La determinacioacuten de encabezados de respuesta

bull Actualizacioacuten de Bases de Datos

bull Ejecucioacuten de bucles condiciones y otras estructuras complejas

lt for (int i=1 ilt=6 i++)

gt

lth lt=i gtgt Hola Mundo lthlt=i gtgt

lt gt

Como un ejemplo concreto se muestra la siguiente paacutegina JSP llamada Cuentajsp en donde

se observa coacutemo se hace un seguimiento del nuacutemero de veces que un cliente accede a esta

paacutegina a traveacutes de distintas sesiones Para ello supondremos que dicha cuenta es el valor del

atributo atrCuenta del objeto impliacutecito application ya citado La primera vez que el cliente

accede a la paacutegina el valor de atrCuenta seraacute null debido a que auacuten no ha sido fijado este

atributo en este caso se fijaraacute con el valor 1 En los siguientes accesos se leeraacute el valor del

atributo atrCuenta se incrementaraacute en una unidad y se volveraacute a fijar Finalmente se enviacutea

la respuesta al cliente para que se muestre al usuario el valor del contador

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en el objeto impliacutecito application con el nombre

atrCuenta

--gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt

Integer cuenta = (Integer)applicationgetAttribute(atrCuenta)

String s = vez

if (cuenta == null)

cuenta = new Integer(1)

else

cuenta = new Integer(cuentaintValue() + 1)

s = veces

applicationsetAttribute(atrCuenta cuenta)

gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

Has visitado esta paacutegina lt= cuenta gt lt= s gt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional un fragmento de coacutedigo JAVA o scriptlet

expresiones y comentarioshellip

Aquiacute otro ejemplo de la ejecucioacuten de un coacutedigo demasiado complejo para una expresioacuten JSP

Este listado presenta una paacutegina JSP que utiliza el paraacutemetro de peticioacuten colorFondo para

establecer el color de fondo de la paacutegina

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgt

lttitlegt Prueba de Color lttitlegt

ltheadgt

lt

String colorFondo=requestgetParameter(colorFondo)

boolean tieneColorExplicito

if (colorFondo =null)

tieneColorExplicito=true

else

tieneColorExplicito=false

colorFondo=WHITE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt

ltbody bgcolor=lt= colorFondo gtgt

lth2 align=centergt Prueba de color lth2gt

lt

if (tieneColorExplicito)

outprintln(Ha indicado un color de fondo expliacutecito +

colorFondo +)

else

outprintln(Usareacute el color de fondo predeterminado WHITE +

Indique el atributo de peticioacuten

ltigtcolorFondoltigt+

para intentar un color estaacutendar un +

valor RRGGBB o para ver si el navegador Web +

permite el uso de nombres de color X11)

gt

ltbodygt

lthtmlgt

Cuyas posibles salidas son

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3213 DECLARACIONES JSP

Una declaracioacuten JSP permite definir meacutetodos o campos que seraacuten insertados en el cuerpo

principal de la clase del servlet (fuera del meacutetodo _jspService) Una declaracioacuten tiene la

sintaxis lt Coacutedigo Java gt Por ejemplo

lt int i=0 gt

lt

Public void jspinit()

coacutedigo de iniciacioacuten

gt

Una declaracioacuten no genera ninguacuten resultado y se usan junto con las expresiones JSP o los

scriptlets A continuacioacuten se muestra una paacutegina JSP que despliega la cantidad de veces que

se ha solicitado esta paacutegina desde que se arrancoacute el servidor haciendo uso de las

declaraciones JSP

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtDeclaraciones JSPlttitlegtltheadgt

ltbodygt

lth1gtDeclaraciones JSPlth1gt

lt-- Esto es un comentario en JSP --gt

lt private int recuentoAccesos=0 gt

lth2gt Accesos a la paacutegina desde el reinicio del servidor

lt= ++recuentoAccesos gt lth2gt

ltbodygt

lthtmlgt

La salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

322 EL LENGUAJE DE EXPRESION EN JSP 20

Anteriormente se ha visto la necesidad de utilizar fragmentos de coacutedigo java en el desarrollo

de paacuteginas JSP pero con la aparicioacuten de la especificacioacuten JSP 20 ya no hay necesidad de

utilizar fragmentos de coacutedigo Java para nada gracias al nuevo lenguaje de expresioacuten EL

(Expresioacuten Language) a la biblioteca de etiquetas estandar JSTL (JSP Standar Tag Library)

y a las nuevas formas para desarrollar etiquetas personalizadas

El lenguaje de expresioacuten JSP es maacutes un lenguaje de acceso a datos que un lenguaje de

programacioacuten Ya se ha visto que para pasar informacioacuten de un cliente a una paacutegina JSP se

utilizan paraacutemetros en la peticioacuten y atributos en la paacutegina El lenguaje de expresioacuten lo hace

posible sin tener que utilizar scriptlets o expresiones (lt= expresioacuten gt) Por ejemplo las

liacuteneas JSP 12 siguientes escritas utilizando coacutedigo Java

lt= requestgetParameter(ldquoparNombrerdquo) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt veces

bajo la especificacioacuten JSP 20 se pueden escribir de una forma maacutes sencilla como sigue

(ahora no se trata de coacutedigo JAVA)

$paramparNombre has visitado esta paacutegina

$atrCuenta veces

La sintaxis de JSP es sensible a mayuacutesculas y minuacutesculas pero un par de comillas simples es

equivalente a un par de comillas dobles

3221 VARIABLES PREDEFINIDAS (Objetos Impliacutecitos)

El lenguaje de expresioacuten JSP 20 soporta los objetos impliacutecitos siguientes

pageContext Objeto de javaxservletjspPageContext que proporciona acceso a los

datos de una peticioacuten

param Coleccioacuten (objeto de tipo javautilMap) de todos los valores de los paraacutemetros

enviados en una peticioacuten un String por paraacutemetro

paramValues Coleccioacuten de todos los valores de los paraacutemetros enviados en una

peticioacuten una matriz de tipo String por paraacutemetro

header Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten un

String por cabecera

headerValues Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten

una matriz de tipo String por cabecera

cookie Coleccioacuten de todos los valores de las cookies un objeto javaxservlethttpCookie

por cookie

initParam Coleccioacuten de todos los valores de los paraacutemetros de iniciacioacuten de la

aplicacioacuten un String por paraacutemetro

Tambieacuten hay objetos que permiten acceder a variables definidas en diferentes aacutembitos lo que

posibilita compartir informacioacuten

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

pageScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de paacutegina

requestScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

peticioacuten

sessionScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de sesioacuten

applicationScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

aplicacioacuten

3222 DIRECTRICES

Las directrices page incluye y taglib son mensajes para el motor JSP y son siempre incluidas

entre los siacutembolos lt y gt

32221 LA DIRECTRIZ PAGE

Define atributos que se aplican a toda la paacutegina JSP donde es incluida

lt page lista_de_atributos gt

Donde la lista_de_atributos puede contener algunos de los siguientes (aquellos que estaacuten

escritos en negrita son los tomados por omisioacuten)

language= ldquoscriptingLanguagerdquo

extends= rdquoclassNamerdquo

import= ldquoimportListrdquo

session= ldquotrue|falserdquo

buffer= ldquonone|sizeKb

autoflush= ldquotrue|falserdquo

isThreadSafe= rdquotrue|falserdquo

info= rdquoinfo_textrdquo

errorPage= ldquoerror_urlrdquo

isErrorPage= rdquotrue|falserdquo

contentType= rdquoctinfordquo

pageEncoding= rdquopeinfordquo

isELIgnored= ldquotrue|falserdquo

Tiacutepicamente se localiza al principio de la paacutegina JSP y puede haber cualquier nuacutemero de

ellas El lenguaje por omisioacuten es Java Ejemplos

lt page contentType=rdquotexthtmlrdquo language=rdquojavardquo gt

lt page import=rdquojavautil javalangrdquo gt

lt page buffer=rdquo5kbrdquo autoflush=rdquofalserdquo gt

32222 LA DIRECTRIZ INCLUDE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

La directriz include incluye un archivo (html jsp xml o de texto) en una paacutegina JSP Esto

permite dividir el contenido de la paacutegina en trozos maacutes manejables

lt incluye file=rdquoURL_relativordquo gt

El ejemplo siguiente muestra dos archivos el primero incluye al segundo para mostrar la

fecha y hora actuales

lt-- fichero mostrarFechaHorajsp --gt

lthtmlgt

ltheadgtlttitlegtIncluir un ficherolttitlegtltheadgt

ltbody bgcolor=whitegt

ltfont color=bluegt

La fecha y hora actuales son

lt include file=fechaHorajsp gt

ltfontgt

ltbodygt

lthtmlgt

lt-- fichero fechaHorajsp --gt

lt page import=javautil gt

lt= (new javautilDate())toLocaleString() gt

32223 LA DIRECTRIZ TAGLIB

La directriz taglib indica la biblioteca de acciones personalizadas que podremos utilizar en

la codificacioacuten de la paacutegina JSP Para distinguir esas acciones entre otras existentes se utiliza

un prefijo (prefix) Su sintaxis es

lt taglib (uri=rdquoURI_bibliotecardquo|tagdir=rdquoDir_biblioteca_tagrdquo)

prefix=rdquoprefijordquo gt

Cuando se trata de una biblioteca definida mediante una clase Java y un descriptor (archivo

tld) eacutesta se identifica mediante un URI (Uniform Resource Identifier- URL relativos) Por

ejemplo

lt taglib uri=rdquohttpMarioRossainzLopezmiBibliotecardquo

prefix=rdquofunrdquo gt

ltpgtltfunaccion01 gt

La uacuteltima liacutenea del ejemplo tiene dos etiquetas una etiqueta p HTML y otra accion01

perteneciente a la biblioteca miBiblioteca En cambio si la biblioteca se define mediante un

archivo tag entonces se identifica mediante su ruta relativa en el sistema de archivos

lt taglib tagdir=rdquoWEB-INFtagsrdquo prefix=rdquofunrdquo gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpgtltfunaccion01 gt

La directriz taglib debe colocarse antes de utilizar en la paacutegina JSP las acciones

personalizadas definidas por la misma Se puede utilizar maacutes de una directriz pero el prefijo

utilizado debe ser uacutenico para cada una de ellas

3223 ACTIVACION DEL LENGUAJE DE EXPRESION (LE)

La especificacioacuten JSP 20 define un lenguaje de expresioacuten como alternativa a elementos de

programacioacuten escritos con coacutedigo Java y especificaciones anteriores a la JSP 20 Para que

este lenguaje pueda ser interpretado tienen que cumplirse 2 requisitos

1 Que la propiedad isELIgnored de la directriz page valga false

lt page isELIgnored= ldquofalserdquo gt

2 Que el descriptor de despliegue webxml en la carpeta WEB-INF indique doacutende se

localiza el esquema XML para la especificacioacuten Servlet 24 que a su vez utiliza el

esquema XML para la especificacioacuten Java Server Page 20

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

Utilizando el lenguaje de expresioacuten se podriacutea modificar la paacutegina Cuentajsp de la seccioacuten

3212 de este documento como se muestra a continuacioacuten Esta nueva paacutegina

1 Especifica que utilizaraacute la biblioteca core de etiquetas estandar (de la que se hablaraacute maacutes

adelante)

2 La primera vez que sea accedida definiraacute la variable atrCuenta en el aacutembito de la

aplicacioacuten con un valor inicial nulo y la incrementaraacute en una unidad cuando sea accedida

sucesivas veces simplemente incrementaraacute esta variable en una unidad

3 Finalmente mostraraacute una paacutegina con un contenido anaacutelogo al siguiente Esta formado

por una cabecera y una segunda liacutenea compuesta por el valor del paraacutemetro parNombre

enviado con la peticioacuten un texto fijo el valor de la variable atrCuenta y otro texto fijo

dependiente del valor de esta variable

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

El coacutedigo completo es el siguiente

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

3224 VARIABLES Y EXPRESIONES

Para acceder a una simple variable se puede escribir algo como lo siguiente $nombre y

para acceder a una propiedad de un objeto podemos escribir algo como

$paramparNombre

$applicationScopeatrCuenta

$pageContextrequestrequestURI

La primera liacutenea del ejemplo anterior obtiene el valor de la propiedad parNombre del objeto

param la segunda el valor del atributo atrCuenta del objeto applicationScope y la tercera

el URL relativo de la paacutegina JSP solicitada

El lenguaje de expresioacuten es maacutes tolerante con respecto a las variables con valor null y ejecuta

muchas maacutes conversiones de forma automaacutetica sobre el tipo de los datos cuando la expresioacuten

a evaluar asiacute lo requiere Por ejemplo la etiqueta condicional siguiente incluye una expresioacuten

que compara el valor del atributo atrCuenta con aacutembito de aplicacioacuten con 10 (convirtiendo

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

impliacutecitamente el valor del atributo al tipo de la constante para poder realizar la comparacioacuten

El resultado seraacute un valor de tipo boolean

ltcif test=rdquo$applicationScopeatrCuenta gt 10rdquogt

ltcifgt

o bien

ltcif test=rdquo$atrCuenta gt 10rdquogt

ltcifgt

Para que una literal pueda incluir un caracter significativo para el lenguaje dicho caracter

debe ser especificado como una secuencia de escape (caracter) Por ejemplo la siguiente

expresioacuten da lugar al literal ldquovezrdquo o ldquovecesrdquo entre comillas dobles

$(atrCuenta gt 1) iquest ldquordquovecesrdquordquo ldquordquovezrdquordquo

Cualquier objeto o atributo de un objeto definido en algunos de los aacutembitos de una paacutegina

puede ser utilizado como una variable Por ejemplo $atrCuenta+1 es una expresioacuten que

realiza la suma de la variable atrCuenta con 1

Cuando se trate de una propiedad de un objeto para acceder a ella se utilizaraacute el operador

punto o bien la notacioacuten empleada para acceder a un elemento de una matriz Por ejemplo

$paramparNombre

$param[ldquoparNombrerdquo]

Una expresioacuten LE puede aparecer en cualquier lugar donde pueda aparecer un texto fijo Por

tanto para informar al contenedor JSP que se trata de una expresioacuten y no de un texto fijo se

utilizan los delimitadores $ al principio y al final

3225 OPERADORES

OPERADOR DESCRIPCIOacuteN Acceso a la propiedad de un objeto o a un elemento de un Map

[] Acceso al elemento de una matriz o de un objeto List

() Pareacutentesis para alterar la prioridad en la evaluacioacuten de una expresioacuten

If ternario condicion expresion1 expresioacuten 2

+ Suma

- Resta

Producto

oacute div Divisioacuten

oacute mod Moacutedulo o resto de una divisioacuten

== oacute eq Igualdad

= oacute ne Diferente

lt oacute lt Menor que

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt oacute gt Mayor que

lt= oacute le Menor o igual que

gt= oacute ge Mayor o igual que

ampamp oacute and Operacioacuten Loacutegica AND

|| oacute or Operacioacuten Loacutegica OR

oacute not Operacioacuten Loacutegica NOT

empty Verifica si el valor de una variable es null si un String esta vaciacuteo o si una matriz Map

o Collection no tienen elementos

func(args) Llamada a una funcioacuten donde func es el nombre de la funcioacuten y arg representa cero o

maacutes argumentos separados por comas

El ejemplo siguiente muestra una paacutegina JSP compuesta por elementos HTML expresiones

LE y objetos impliacutecitos

lthtmlgt

ltheadgtlttitlegtJSP 20lttitlegtltheadgt

ltbodygt

lth3gtLenguaje de expresioacuten (LE)lth3gt

ltpgtLa siguiente tabla ilustra algunas expresiones LE

ltbrgtltbrgtlttable border=1gt

lttrgt

ltthgtltbgtExpresioacutenltbgtltthgt

ltthgtltbgtValorltbgtltthgt

lttrgt

lttrgt

lttdgt$3 + 6lttdgt

lttdgt$3 + 6lttdgt

lttdgt

lttrgt

lttdgt$(7 gt 4) 7 4lttdgt

lttdgt$(7 gt 4) 7 4lttdgt

lttrgt

lttrgt

lttdgt$header[host]lttdgt

lttdgt$header[host]lttdgt

lttrgt

lttablegt

ltbodygt

lthtmlgt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

323 BIBLIOTECA ESTANDAR DE ETIQUETAS

La biblioteca estaacutendar de etiquetas JSP (JSTL ndash Java Server Page Estaacutendar Tag Library)

incluye una cantidad amplia de etiquetas para diferentes aacutereas de trabajo

Aacuterea baacutesica (su prefijo es c ndash core) y contiene

o Soporte de variables (remove y set)

o Control del flujo (choose when otherwise forEach forTokens if)

o Manejo de URL (import param redirect param y url param)

o Operaciones varias (match y out)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlcore

Aacuterea XML (su prefijo es x) y contiene

o Sentencias baacutesicas (out parse y set)

o Control del flujo (choosehellip whenhellip otherwise forEach e if)

o Transformacioacuten de Documentos (transformhellipparam)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlxml

Aacuterea Internacionalizacioacuten (su prefijo es fmt) Contiene

o Localidad (setLocale y requestEncoding)

o Mensajes (bundle message param y setBundle)

o Formateo de Fechas y nuacutemeros (formatNumber formateacuteate parseDate

parseNumber setTimeZone timeZone)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlfmt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Aacuterea SQL (su prefijo es sql) es el lenguaje estandar para interactuar con bases de datos

relacionales y contiene setDataSource Quero dateParam param transaction y

update dateParam param) El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlsql

Aacuterea Funciones (su prefijo es fn) y contiene

o Longitud de una coleccioacuten (length)

o Manipulacioacuten de String (toUpperCase toLowerCase substring

substringAfter substringBefore trim replace indexOf startsWith

endsWith contains containsIgnoreCase split join y escapeXml)

o El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlfunctions

3231 OPERACIONES CON ETIQUETAS BAacuteSICAS

En un ejemplo pasado teniacuteamos el siguiente coacutedigo

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

En este ejemplo se hace referencia al aacuterea baacutesica de JSTL con el prefijo c y se utiliza la

etiqueta cset para definir la variable atrCuenta Si la variable ya esta definida simplemente

se le asigna el valor especificado

La uacuteltima parte del ejemplo anterior podriacutea haberse escrito de esta otra forma

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcif test=rdquo$atrCuenta gt 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcifgt

$atrCuenta $str

La etiqueta cif permite la ejecucioacuten condicional de su cuerpo en funcioacuten del valor del

atributo de test

La etiqueta cchoose permite la ejecucioacuten del cuerpo de la primera etiqueta cwhen cuyo

atributo test sea evaluado a true Si ninguna de las condiciones se evaluacutea a true entonces se

evaluacutea el cuerpo de la etiqueta cotherwise si estaacute presente El siguiente coacutedigo muestra otra

manera de escribir el ejemplo anterior utilizando estas uacuteltimas etiquetas

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcchoosegt

ltcwhen test=rdquo$atrCuenta == 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcwhengt

ltcotherwisegt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcotherwisegt

ltcchoosegt

$atrCuenta $str

La etiqueta cforEach permite iterar sobre una coleccioacuten de objetos La coleccioacuten se

especifica por medio del atributo iacutetems y el elemento actual de la coleccioacuten estaacute disponible a

traveacutes de la variable establecida por el atributo var Por ejemplo el siguiente fragmento de

coacutedigo visualiza una tabla con las variables definidas a nivel de aacutembito de paacutegina

lttable border=rdquo1rdquogt

ltcforEach var=rdquoitemrdquo iacutetems=rdquo$pageScoperdquogt

lttrgt

lttdgt $item lttdgt

lttrgt

ltcforEachgt

lttablegt

La etiqueta ccatch atrapa una excepcioacuten que ocurra en el cuerpo de la misma Por ejemplo

el siguiente segmento de coacutedigo lanzaraacute una excepcioacuten si el paraacutemetro mes se escribe con

letras en vez de con nuacutemeros

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltbodygt

lthtmlgt

Un URL anaacutelogo al siguiente daraacute lugar a que la excepcioacuten sea lanzada cuando se ejecute la

expresioacuten $nMes 3 de la paacutegina anterior

httplocalhost8080JSP2exceppruebajspmes=marzo

La excepcioacuten indica que ha ocurrido un error al tratar de convertir ldquomarzordquo a un entero de

tipo Long Para cachar esta excepcioacuten y darle un tratamiento adecuado habraacute que modificar

la paacutegina JSP anterior como se indica a continuacioacuten

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltccatch var=rdquoerrorOcurridordquogt

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltccatchgt

ltcif test=rdquo$not empty errorOcurridordquogt

Error el paraacutemetro mes debe ser un nuacutemero ltbgt

ltbrgt Informacioacuten del error dada por el sistema

ltbrgt ltfont color=rdquoFF0000rdquogt $errorOcurrido ltfontgt

ltcifgt

ltbodygt

lthtmlgt

3232 ACCESO A BASES DE DATOS CON JSP

Las etiquetas que proporciona el aacuterea SQL permiten realizar

Conexioacuten con una base de datos

Realizacioacuten de consultas a la base de datos

Acceso al conjunto de resultados

Ejecucioacuten de actualizaciones y transacciones

Todas las etiquetas SQL actuacutean sobre una base de datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

32321 CONEXIOacuteN CON LA BASE DE DATOS

La conexioacuten con la base de datos puede realizarse con la etiqueta sqlsetDataSource Por

ejemplo si se esta utilizando el administrador de bases de datos MySql con el controlador

JDBC se puede realizar una conexioacuten con una base de datos digamos bd_tutorias de la

manera siguiente

ltsqlsetDataSource var=rdquobdrdquo

driver=rdquocommysqljdbcDriverrdquo

url=rdquojdbcmysqllocalhost3306bd_tutoriasrdquo

user=rdquoadminrdquo

password=rdquoadminadminrdquo gt

32322 CONSULTA A LA BASE DE DATOS

La etiqueta sqlQuero permite realizar una consulta a una base de datos Por ejemplo el

siguiente fragmento de coacutedigo realiza una consulta a la base de datos representada por bd y

obtiene un conjunto de resultados representado por cdr

ltsqlquery var=rdquocdrrdquo dataSource=rdquo$bdrdquogt

SELECT professor dia hora alumno

FROM profesores tutorias citas

WHERE profesoresid_profesor=tutoriasid_profesor

AND tutoriasid_tutoria=citasid_tutoria

ltsqlquerygt

32323 MODIFICACIONES SOBRE LA BASE DE DATOS

La etiqueta sqlupdate permite ejecutar una sentencia SQL INSERT UPDATE o DELETE

y cualquier otra sentencia SQL que no retorne ninguacuten valor Por ejemplo

ltsqlupdate var=rdquocontrdquo dataSource=rdquo$bdrdquo gt

UPDATE profesores

SET profesor=

WHERE profesor=

ltsqlparam value=rdquo$paramProfesorrdquo gt

ltsqlparam value=rdquo$paramIDrdquo gt

ltsqlupdategt

Una operacioacuten UPDATE puede utilizar el siacutembolo para indicar que el valor que tendriacutea que

evaluarse en esa posicioacuten seraacute suministrado por una etiqueta sqlparam como por ejemplo

httplocalhost8080JSP2sqlpruebajspProfesor=Mario+Rossainz+LopezampID=514

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

HttpServlet Como esta uacuteltima clase es la idoacutenea para servicios especiacuteficos http entonces el

tipo de servlet maacutes baacutesico puede ser de la forma siguiente Un objeto de una clase derivada

de HttpServlet que encapsula los meacutetodos init() para iniciar el servlet si procede doPost yo

DoGet para responder a las peticiones de los clientes y destroy() para realizar operaciones de

limpieza cuando se descarga el servlet

import javaio

import javaxservlet

import javaxservlethttp

public class MiServlet extends HttpServlet

public void init(ServletConfig config) throws ServletException

superinit(config)

Meacutetodo doPost para responder a una peticioacuten POST

public void doPost(HttpServletRequest request

HttpServletResponse response)

Throws ServletException IOException

Meacutetodo doGet para responder a una peticioacuten GET

public void doGet(HttpServletRequest request

HttpServletResponse response)

Throws ServletException IOException

public void destroy()

Liberar recursos

314 EJECUCIOacuteN DE UN SERVLET

Todo Servlet debe implementar la interfaz Sevlet ya que eacutesta es quien declara los meacutetodos

que definen el ciclo de vida del mismo init service y destroy

El meacutetodo init es invocado por el contenedor Web para iniciar la ejecucioacuten del servlet Eacuteste

meacutetodo se ejecuta una sola vez y tiene como misioacuten inicializar las variables y los recursos

necesarios para la ejecucioacuten del servlet Si la ejecucioacuten de este meacutetodo no se realiza con eacutexito

lanzaraacute la excepcioacuten ServletException

El meacutetodo service se llama cada vez que el servidor recibe una peticioacuten para el servlet Este

meacutetodo puede recibir varias llamadas simultaacuteneas Para cada una de ellas se crea un nuevo

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

hilo y examina el tipo de peticioacuten http (get post put delete trace options o head) con el

fin de llamar al meacutetodo adecuado para atenderla por ejemplo doGet doPost doPut etc El

tipo de peticioacuten por omisioacuten es GET

El meacutetodo service tiene dos paraacutemetros de tipos HttpServletRequest y

HttpServletResponse respectivamente que son pasados al meacutetodo invocado Si la

ejecucioacuten no se desarrolla con eacutexito se lanzaraacute una excepcioacuten del tipo ServletException o

IOException

El objeto de la clase HttpServletRequest encapsula los datos enviados por el cliente al

servidor El objeto de la clase HttpServletResponse encapsula los datos que el servidor

enviaraacute al cliente Este objeto proporciona dos formas para retornar los datos una mediante

un objeto PrintWriter devuelto por su meacutetodo getWriter y otra mediante un objeto

ServletOutputStream devuelto por su meacutetodo getOutputStream La primera forma

devuelve texto (cadenas de caracteres) y la segunda forma devuelve datos binarios (cadenas

de bytes)

El meacutetodo destroy es el uacuteltimo meacutetodo invocado justo antes de destruir el servlet

Normalmente se utiliza para liberar los recursos de maacutequina adquiridos por ejemplo borrar

archivos temporales

315 UN PRIMER SERVLET SENCILLO

Este primer servlet que se muestra a continuacioacuten implementa el caso maacutes sencillo posible

la aplicacioacuten ldquoHolaMundordquo que mostraraacute el texto ldquoHola Mundordquo en el navegador del cliente

En este caso independientemente del tipo de peticioacuten http GET o POST que se realice el

servlet responderaacute en ambos casos enviando la misma paacutegina Web

import javaio

import javaxservlet

import javaxservlethttp

public class HolaMundo extends HttpServlet

Manipular las posibles peticiones enviadas por el cliente

utilizando el atributo method=get o method=post

protected void procesarPeticion(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

responsesetContentType(texthtml)

PrintWriter out = responsegetWriter()

outprintln(lthtmlgt)

outprintln(ltheadgt)

outprintln(lttitlegtServlet HolaMundolttitlegt)

outprintln(ltheadgt)

outprintln(ltbodygt)

outprintln(ltfont size=7gt)

outprintln(iexcliexcliexclHola mundo)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

outprintln(ltfontgt)

outprintln(ltbodygt)

outprintln(lthtmlgt)

outclose()

Manipular la peticioacuten enviada por el cliente

utilizando el atributo method=get

protected void doGet(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

procesarPeticion(request response)

Manipular la peticioacuten enviada por el cliente

utilizando el atributo method=post

protected void doPost(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

procesarPeticion(request response)

En las primeras liacuteneas del coacutedigo anterior se colocan las sentencias import de los paquetes ya

citados El paquete javaio se requiere para las operaciones de entrada y salida de datos y

resultados a traveacutes de los objetos request y response La manera maacutes sencilla de definir un

servlet es heredar de la clase HttpServlet

Asiacute cuando este servlet recibe una peticioacuten del cliente el servidor lo carga para su ejecucioacuten

instante en el que se ejecuta el meacutetodo init() que lo inicia (en este caso el que se invoca es el

que se da por omisioacuten en la superclase de HolaMundo) Cuando init finaliza el servlet esta

en condiciones de atender a las peticiones de los clientes en el ejemplo para cada una de las

peticiones GET o POST se ejecuta el meacutetodo procesarPeticion que es invocado por doGet

o DoPost El servlet permaneceraacute cargado hasta que el servidor decida destruirlo ejecutando

el meacutetodo destroy si es que se implementoacute

Analizando el meacutetodo procesarPeticion se observa que el meacutetodo almacena en el objeto out

de la clase PrintWriter los datos que el servlet HolaMundo enviaraacute al cliente que realizoacute la

peticioacuten Este objeto forma parte del objeto response y es obtenido a traveacutes de su meacutetodo

getWriter Los datos se almacenan en out utilizando su meacutetodo println Los datos

almacenados como se puede ver se corresponden con una paacutegina HTML que seraacute enviada

al explorador del cliente

Ademaacutes de estos datos expliacutecitos tambieacuten se enviacutea otra informacioacuten de protocolo http como

son las cabeceras de respuesta generadas por el servidor Estas cabeceras de respuesta

incluyen la liacutenea Content-type texthtml

Esta liacutenea identifica el tipo de documento a enviar o a recibir en este caso se trata de un

documento HTML Cuando el navegador del cliente reciba esta informacioacuten sabraacute como

interpretar el tipo de documento que tiene que visualizar Para establecer este valor

procesarPeticion utiliza el meacutetodo setContentType del objeto response

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3151 PUESTA EN FUNCIONAMIENTO DEL SERVLET ldquoHolaMundordquo

Una vez escrito el servlet los pasos necesarios para ver el resultado que produce son

bull Compilarlo

bull Instalarlo en un servidor

bull Invocarlo para su ejecucioacuten desde un navegador Web

Como puede leerse no resulta tan sencillo desarrollar y ejecutar por vez primera un servlet a

diferencia de una aplicacioacuten JAVA normal que esteacute basada en el SDK estaacutendar Estos pasos

requieren proceder entonces de alguna de las dos formas siguientes

1 Suponiendo que se tiene instalado el J2SE SDK en particular la versioacuten 150 habraacute que

instalar el servidor Web de aplicaciones Tomcat 5 El servidor Tomcat soporta un

contenedor Web que permite ejecutar servlets y paacuteginas JSP (de las que se hablaraacuten en

la seccioacuten siguiente) En el apeacutendice B del presente documento se muestra la manera de

No obstante existen muchos tipos de servidores aparte del Tomcat que permiten el uso de

los servlets algunos de estos son

a JavaServer Web Development Kit (JSWDK) hoy llamado JWSDP (Java Web

Services Developer Pack o Paquete de desarrollo de servicios Web de Java)

b Allaire JRun (motor para JSP y Servlet que puede ser integrado en servidores de

Netscape Enterprise o Microsoft Personal Web Server)

c ServletExec de Nwe Atlanta (Motor para JSP y Servlet que puede ser integrado

en los servidores Web maacutes populares para Solaris Windows MacOs HP-UX y

Linux

d LiteWebServer (LWS) de Gefion Software (Es un pequentildeo servidor Web

gratuito derivado de Tomcat)

e Java Web Server de Sun (Servidor totalmente gratuito escrito en JAVA

2 Suponiendo que no se tiene instalado ninguacuten software para desarrollar aplicaciones

JAVA habraacute que instalar el Java 2 Enterprise Edition Software Development Kit o J2EE

SDK Este paquete proporciona la base para desarrollar y distribuir aplicaciones

multicapa distribuidas e incluye entre otras herramientas el J2SE y un servidor de

aplicaciones (J2EE Application Server) En el apeacutendice A se muestra la manera en que

se puede instalar y la forma en la que se puede lanzar el servidor de aplicaciones La

versioacuten que se esta suponiendo se trabajaraacute es la J2EE 14 SDK que incluye el J2SE

142_02 y ejemplos ademaacutes del J2EE 14 Application Server

Para ejecutar un servlet como el del HolaMundo del ejemplo anterior teniendo ya instalados

los paquetes J2SE 150 y Tomcat 5 siga los pasos siguientes

1 antildeada a la variable de entorno path de su sistema operativo la ruta de la carpeta bin del

J2SE que tiene instalado

2 Copie el archivo servlet-apijar que se encuentra en commonlib del tomcat que tiene

instalado a jrelibext del J2SE

3 Cambie al directorio de la aplicacioacuten es decir donde se encuentra el servlet

4 Compile el servlet en el ejemplo javac HolaMundojava

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

5 Antildeada el archivo class (HolaMundoclass) que resulta de la compilacioacuten a la carpeta

webappsROOTWEB-INFclasses del Tomcat

6 Edite el archivo confwebxml del Tomcat para definir el servlet invoquer que permite

ejecutar servlets anoacutenimos

7 Arranque el servidor Tomcat (este punto debe realizarse despueacutes del paso 5 para que el

servidor reconozca la aplicacioacuten que se acaba de instalar) Si el servidor ya estaba

arrancado cuando se realizoacute el punto 4 detengalo y vuelvalo a arrancar o abra el

explorador y escriba el URL httplocalhost8080managerhtml y recargue la

aplicacioacuten

8 Una vez arrancado el servidor verifique que funciona correctamente escribiendo en el

navegador httplocalhost8080 o http1270018080 8080 es el puerto utilizado para

acceder al servidor

9 Ejecute el servlet escribiendo en el navegador el URL

httpservidor[puerto]servletnombre_servlet que en el caso del ejemplo seriacutea

httplocalhost8080servletHolaMundo

En conclusioacuten para ejecutar un servlet habraacute que copiar el archivo class que lo define

en la carpeta ROOTWEB-INFclasses de la carpeta webapps del servidor a la que tienen

acceso los clientes Web y ejecutar httpservidor[puerto]servletnombre_servlet de

forma que el servlet HolaMundo se mostrariacutea en su ejecucioacuten como en la figura siguiente

Ahora bien lo maacutes interesante es invocar a los servlets desde paacuteginas Web Se puede solicitar

la ejecucioacuten de un servlet de igual manera que pedimos un recurso cualquiera basta con

definir el URL del servlet en el punto deseado en la paacutegina Web

El siguiente ejemplo muestra un servlet que ademaacutes de generar la paacutegina HTML donde se

manda a escribir ldquoHola Mundordquo devuelve la fecha y hora del servidor Con esto se trata de

dar a entender que por una parte un servlet no tiene porque generar soacutelo paacuteginas HTML sino

que ademaacutes un servlet es capaz de generar contenido dinaacutemico incluyendo cualquier proceso

escrito que pueda ejecutar JAVA (leer o escribir archivos ejecutar programas cargas

bibliotecas etc)

import javaio

import javaxservlet

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

import javaxservlethttp

import javautil

public class Saludo extends HttpServlet

Manipular la peticioacuten enviada por el cliente

utilizando el atributo method=get

protected void doGet(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

responsesetContentType(texthtml)

PrintWriter out = responsegetWriter()

outprintln(lthtmlgt)

outprintln(ltheadgt)

outprintln(lttitlegtServlet Saludolttitlegt)

outprintln(ltheadgt)

outprintln(ltbodygt)

outprintln(ltcentergt)

for (int tamantildeo = 1 tamantildeo lt= 7 ++tamantildeo)

outprintln(ltfont size=+tamantildeo+ color=bluegt)

outprintln(iexcliexcliexclHola mundo)

outprintln(ltbrgt)

outprintln(ltbrgt)

Calendar fechahora = new GregorianCalendar()

Random rnd = new Random()

int tamantildeo = rndnextInt(7)+1

outprintln(ltfont size=+tamantildeo+gt)

outprintln(ltfont color=greengt)

outprintln(Son las +

fechahoraget(CalendarHOUR_OF_DAY) + +

fechahoraget(CalendarMINUTE) + +

fechahoraget(CalendarSECOND) )

outprintln(ltbrgt)

outprintln(ltfont color=graygt)

outprintln(Del diacutea +

fechahoraget(CalendarDAY_OF_MONTH) + +

(fechahoraget(CalendarMONTH)+1) + +

fechahoraget(CalendarYEAR) )

outprintln(ltfontgt)

outprintln(ltcentergt)

outprintln(ltbodygt)

outprintln(lthtmlgt)

outclose()

Para ejecutar este servlet llamado Saludo podemos crear una carpeta dentro de webapps por

ejemplo saludoWEB-INFclasses y copiar dentro de classes Saludoclass

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Para ejecutar el servlet Saludo tendriacuteamos entonces que escribir

httplocalhost8080SaludoservletSaludo

Pero si queremos invocar a este servlet desde una paacutegina HTML se deberaacute utilizar este

mismo URL o bien el URL relativo a la carpeta del servidor donde copiemos el archivo html

que seraacute copiado en la carpeta Saludo

El coacutedigo HTML almacenado en saludohtml deberaacute incluir una de las dos liacuteneas siguientes

lta href=rdquohttplocalhost8080Saludoservletsaludordquogt ejecutar Saludo ltagt

lta href=rdquoservletSaludordquogt ejecutar Saludo ltagt

La segunda opcioacuten es la maacutes interesante porque no depende de la direccioacuten del servidor Para

ejecutar entonces el servlet a traveacutes de saludohtml basta con escribir el URL siguiente

httplocalhost8080Saludosaludohtml

316 EMPAQUETADO DE SERVLETS

Puede darse el caso en que diversos programadores en un entorno de produccioacuten dado

podriacutean estar desarrollando servlets para el mismo servidor El colocar todos estos servlets

en el directorio principal de estos programas podriacutea dar como resultado un directorio difiacutecil

de administrar ademaacutes de que se corre el riesgo de duplicar los nombres de los servlets si

dos desarrolladores distintos eligen el mismo nombre para el programa que desarrollan Los

paquetes son la solucioacuten loacutegica a este problema El uso de paquetes tiene como resultado

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

cambios en la forma en que se generan los servlets la forma en que se compilan y en la que

se invocan Para colocar los servlets en paquetes se requieren de dos pasos

1 Mover los archivos (class) a un subdirectorio que coincida con el nombre del paquete

pretendido

2 Insertar una instruccioacuten de paquete en el archivo de clase Para ello la primera liacutenea en

el coacutedigo fuente (java) del servlet deberaacute ser package nomPaquete

Por ejemplo el fragmento siguiente de coacutedigo Java presenta una variacioacuten del Servlet

HolaMundo que se encuentra en el paquete misServlets

package misServlets

import javaio

import javaxservlet

import javaxservlethttp

public class HolaMundo extends HttpServlet

Manipular las posibles peticiones enviadas por el cliente

utilizando el atributo method=get o method=post

protected void procesarPeticion(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

responsesetContentType(texthtml)

PrintWriter out = responsegetWriter()

outprintln(lthtmlgt)

El archivo class se encontraraacute dentro de una carpeta llamada misServlets que seraacute el paquete

creado o utilizado por la aplicacioacuten en este caso del HolaMundo dependiendo si exitiacutea o no

antes de compilar la aplicacioacuten A continuacioacuten deberemos copiar dentro de la carpeta

webappsROOTWEB-INFclasses del Tomcat la carpeta misServlets junto con el

HolaMundoclass que estaraacute dentro de ella y ejecutar el servlet en el explorador escribiendo

httplocalhost8080servletmisServletsHolaMundo

317 PROCESAMIENTO DE FORMULARIOS

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Hasta este punto los servlets que hemos estudiado soacutelo enviacutean informacioacuten al navegador del

cliente No obstante estos clientes Web pueden Mostar formularios que permitan solicitar

datos a los usuarios que seraacuten enviados al servidor para por ejemplo ser almacenados en

una base de datos para posteriores peticiones o para otros procesos o bien para dar al usuario

una respuesta ajustada a dicha peticioacuten

En el siguiente URL se invoca la ejecucioacuten de un servlet llamado Parametros aportando la

lista de pares (Nombre Mario)-(Edad 22) en formato GET

httplocalhost8080ParametrosservletParametrosNombre=MarioampEdad=22

Hay que observar la manera de colocar los datos tras el siacutembolo ldquordquo y de separarlos con el

siacutembolo ldquoamprdquo El coacutedigo del servlet es el siguiente

import javaio

import javaxservlet

import javaxservlethttp

public class Parametros extends HttpServlet

public void doGet(HttpServletRequest request HttpServletResponse

response)

throws IOException ServletException

responsesetContentType(texthtml)

PrintWriter out = responsegetWriter()

outprintln(lthtmlgt)

outprintln(ltbodygt)

String NombreRecibido = requestgetParameter(Nombre)

String EdadRecibida = requestgetParameter(Edad)

outprintln(lth1gt Hola + NombreRecibido + lth1gt)

outprintln(lth1gt Tienes + EdadRecibida + antildeos lth1gt)

outprintln(ltbodygt)

outprintln(lthtmlgt)

El objeto httpServletRequest en el coacutedigo anterior request contiene una serie de meacutetodos de

utilidad para recibir informacioacuten proveniente del usuario en concreto el meacutetodo

getParameter permite obtener el valor asociado a un nombre en la lista de pares (nombre

valor) que puede proporcionar un URL

Ademaacutes de poder introducir el URL anterior en el navegador proporcionando directamente

los datos enviados al servlet en dicha URL

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Tambieacuten podemos generar el URL mediante una paacutegina Web que podraacute utilizar el usuario

lthtmlgt

ltbodygt

lth1gt Cuestionario lth1gt

ltform action=httplocalhost8080ParametrosservletParametros

method=getgt

Nombre ltinput type=text name=Nombregt ltbrgt

Edad ltinput type=text name=Edadgt ltbrgtltbrgt

ltinput type=submit value=Enviar datosgt ltbrgt

ltformgt

ltbodygt

lthtmlgt

Los formularios en HTML permiten enviar datos al servidor Web En la liacutenea 5 de la paacutegina

Web mostrada se encuentra la etiqueta form que en el ejemplo contiene el atributo action

que indica la accioacuten que debe realizarse en el servidor en este caso ejecutar el servlet

Parametros y el atributo method que indica la manera en la que se enviacutean los datos (en este

caso la peticioacuten GET)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Peticioacuten HTTP GET Cuando el tipo de peticioacuten HTTP es GET los datos del formulario

son enviados al servidor a continuacioacuten del URL especificado por el atributo action de form

El tamantildeo de la cadena enviada estaacute limitado y al estar en ASCII es totalmente legible por

tanto no es un modo seguro

Es por ello que cuando se requiere del enviacuteo de datos seguros y ademaacutes el nuacutemero de datos

del formulario que son enviados al servidor son muchos resulta ser mejor el uso del meacutetodo

POST Veamos otro ejemplo

import javaio

import javaxservlet

import javaxservlethttp

import javautil

public class MostrarParametros extends HttpServlet

public void doGet(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

responsesetContentType(texthtml)

PrintWriter out= responsegetWriter()

String titulo=Lectura de todos los paraacutemetros de Peticioacuten

outprintln(ltdoctype html public -W3CDTD HTML 40 +

TransitionalENgt)

outprintln(lthtmlgt)

outprintln(ltheadgtlttitlegt+titulo+lttitlegtltheadgt)

outprintln(ltbody bgcolor=FDF5E6gtn+

lth1 align=centergt+titulo+lth1gtn+

lttable border=1 align=centergtn+

lttr bgcolor=FFAD00gtn+

ltthgtNombre del parampaacutemetroltthgtValor(es) del

parampaacutemetro)

Enumeration nombresParam=requestgetParameterNames()

while(nombresParamhasMoreElements())

String nombreParam= (String)nombresParamnextElement()

outprint(lttrgtlttdgt+nombreParam+nltTDgt)

String[]valoresParam=

requestgetParameterValues(nombreParam)

if (valoresParamlength==1)

String valorParam=valoresParam[0]

if (valorParamlength()==0)

outprintln(ltigt Sin valor ltigt)

else

outprintln(valorParam)

else

outprintln(ltulgt)

for (int i=0 iltvaloresParamlengthi++)

outprintln(ltligt+valoresParam[i])

outprintln(ltulgt)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

outprintln(lttablegtnltbodygtlthtmlgt)

public void doPost(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

doGet(requestresponse)

El servlet escrito utiliza un meacutetodo doPost que soacutelo ejecuta a Donet Esto es porque se quiere

que el servlet pueda manejar tanto las peticiones GET como las POST Por otro lado el

formulario es el siguiente

ltdoctype html public -W3CDTD HTML 40 TransitionalENgt

lthtmlgt

ltheadgt

lttitlegt Un Formulario de ejemplo que utiliza POST lttitlegt

ltheadgt

ltbody bgcolor=FDF5E6gt

lth1 align=centergt Un formulario de Ejemplo que utiliza POST

lth1gt

ltform action=httplocalhost8080MostrarParametros

servletMostrarParametros

method=postgt

Nuacutemero de elemento ltinput type=text name=elemNumgt ltbrgt

Cantidad ltinput type=text name=cantidadgt ltbrgt

Precio Unitario ltinput type=text name=precio value=$gt

ltbrgtlthrgt

Nombre de Pila ltinput type=text name=nombrePilagt ltbrgt

Apellido(s) ltinput type=text name=apellidogt ltbrgt

Iniciales ltinput type=text name=inicialesgt ltbrgt

Domicilio de envio lttextarea name=domicilio rows=3

cols=40gtlttextareagt ltbrgt

Tarjeta de creacutedito ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta value=VisagtVisa ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta value=Master Cardgt

Master Card ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta value=AmexgtAmerican

Expresss ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta

value=DiscovergtDiscover ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta

value=Java Smart CardgtTarjeta Inteligente de Java

ltbrgt

Nuacutemero de la tarjeta de creacutedito

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltinput type=password name=numTarjetagtltbrgt

Repita el nuacutemero de la tarjeta de creacutedito

ltinput type=password name=numTarjetagtltbrgtltbrgt

ltcentergt

ltinput type=submit value=Enviar pedidogt

ltcentergt

ltformgt

ltbodygt

lthtmlgt

El formulario HTML del listado anterior utiliza POST como deberiacutea ser en todos los campos

que tienen contrasentildea

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Si intenta ejecutar el servlet MostrarParametros directamente en el explorador con el URL

httplocalhost8080MostrarParametrosservletMostrarParametros se obtendraacute la paacutegina

Web sin resultados

Peticioacuten HTTP POST Cuando el tipo de peticioacuten HTTP es POST los datos son enviados

al servidor en el cuerpo de la peticioacuten Es el meacutetodo maacutes usual de enviar los datos de un

formulario Con este tipo de peticioacuten la informacioacuten del formulario se enviacutea despueacutes del URL

indicado por action en el cuerpo de la peticioacuten y el tamantildeo de la informacioacuten enviada no esta

limitado

Seguacuten lo expuesto escoger el meacutetodo para enviar la informacioacuten no es difiacutecil Si los datos

son pocos y no importa su confidencialidad o manipulacioacuten utilizamos GET Si son largos

privados o importantes utilizamos POST

318 ACCESO A BASES DE DATOS CON SERVLETS

Una aplicacioacuten Java que realiza accesos a bases de datos funciona seguacuten una arquitectura que

permite escribir los programas abstrayeacutendose de los detalles de los niveles inferiores (discos

controladores sistema operativo etc) como lo muestra la figura siguiente

JDBC (Java DataBase Connectivity ndash Conexioacuten con Bases de Datos desde Java) es una API

de Java que permite ejecutar instrucciones SQL para manipular y gestionar bases de datos

relacionales Para que una aplicacioacuten Java pueda hacer operaciones sobre una base de datos

previamente tiene que establecer una conexioacuten con la misma Esta conexioacuten se realiza a

traveacutes de un controlador (driver) seguacuten la figura de arriba La API-JDBC se proporciona en

dos paquetes javasql y javaxsql El primer paquete contiene las interfaces y clases Java

fundamentales de JDBC en tanto que el segundo paquete es una extensioacuten del primero e

APLICACION

SISTEMA OPERATIVO

CONTROLADOR

Oracle Access MySql

JVM

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

incluye las clases que interactuacutean con JNDI y otras que gestionan conjuntos de conexiones

con una misma base de datos Para maacutes detalles del uso de JDBC veacutease el apeacutendice A de

estas notas

El primer paso para crear una conexioacuten entre una aplicacioacuten Java y una base de datos es

registrar el controlador JDBC adecuado para esa base con el fin de que la JVM pueda

utilizarlo Existen distintos tipos de controladores JDBC por ejemplo

ldquocommysqljdbcDriverrdquo que es el controlador utilizado cuando el motor de base de datos

que se utiliza es MySql

En el supuesto caso de que la base de datos soacutelo permitiera el acceso a traveacutes de controladores

ODBC como lo hace ACCESS siempre podemos usar el controlador puente JDBC-ODBC

incluido como parte del JDK ldquosunjdbcodbcJdbcOdbcDriverrdquo Este tipo de controladores

es decir los basados en ODBC (Open DataBase Connectivity) son bastante utilizados en

entornos Windows pues este SO incluye ODBC El apeacutendice A describe al final como

administrar los oriacutegenes de datos ODBC en Windows

Asiacute pues la mayor ventaja de los servlets con respecto a la conexioacuten con bases de datos viacutea

JDBC es que su ciclo de vida les permite mantener conexiones abiertas con las mismas a lo

largo de toda una sesioacuten Esto permite recortar tiempo con respecto a otras tecnologiacuteas como

la CGI Ademaacutes JDBC es una tecnologiacutea independiente de las bases de datos

Como ejemplo vamos a implementar una simple aplicacioacuten Web basada en servlets que

muestre una especie de directorio de personas La aplicacioacuten podraacute consultar insertar

modificar borrar o listar la informacioacuten de cada una de las personas almacenadas en la base

de datos a la que se hace acceso (que estaraacute en formato access)

La estructura de la Base de Datos es una tabla con los siguientes campos

DNI Nombre Apellido Edad

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

53023767A Pedro Rubio 18

77459822P Luis Tejedor 47

123456MRL Mario Rossainz 35

La estructura de la aplicacioacuten se muestra en la figura siguiente

lthtmlgt

ltbodygt

lttable border=1gtlttrgtlttdgt

ltform action=httplocalhost8080directorioTelservletSvAccesoBD

method=getgt

DNI ltinput type=text name=DNIgt ltbrgt

Nombre ltinput type=text name=Nombregt ltbrgt

Apellido ltinput type=text name=Apellidogt ltbrgt

Edad ltinput type=text name=Edadgt ltbrgtltbrgt

ltinput type=submit value=Consultar name=BotonConsultargt

ltinput type=submit value=Insertar name=BotonInsertargt

ltinput type=submit value=Modificar name=BotonModificargt

ltinput type=submit value=Borrar name=BotonBorrargt

ltinput type=submit value=Listar name=BotonListargt ltbrgt

ltcentergt

ltinput type=submit value= |lt name=BotonPrimerogt

ltinput type=submit value= -- name=BotonMenosCincogt

ltinput type=submit value= - name=BotonAnteriorgt

ltinput type=submit value= + name=BotonSiguientegt

ltinput type=submit value= ++ name=BotonMasCincogt

ltinput type=submit value= gt| name=BotonUltimogt

ltcentergt

lttdgt

lttdgt

lttextarea name=AreaDeListado rows=10 cols=35gtlttextareagt

SvAccesoBDhtml

SvAccesoBD

ObBorrado ObListado ObConsulta

ObInsercion

ObModificacion

ObPosicionamiento

ObRegistro

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lttdgt

lttrgt

ltformgt

lttablegt

ltbodygt

lthtmlgt

SvAccesoBDhtml

import javaio

import javaxservlet

import javaxservlethttp

public class SvAccesoBD extends HttpServlet

private int PosicionBuscada = 1

private String AreaDeListado=

PrintWriter out

public void doGet(HttpServletRequest request HttpServletResponse response)

throws IOException ServletException

String DNI = requestgetParameter(DNI)

String Nombre = requestgetParameter(Nombre)

String Apellido = requestgetParameter(Apellido)

String Edad = requestgetParameter(Edad)

String BotonConsultar = requestgetParameter(BotonConsultar)

String BotonInsertar = requestgetParameter(BotonInsertar)

String BotonModificar = requestgetParameter(BotonModificar)

String BotonBorrar = requestgetParameter(BotonBorrar)

String BotonListar = requestgetParameter(BotonListar)

String BotonPrimero = requestgetParameter(BotonPrimero)

String BotonMenosCinco = requestgetParameter(BotonMenosCinco)

String BotonAnterior = requestgetParameter(BotonAnterior)

String BotonSiguiente = requestgetParameter(BotonSiguiente)

String BotonMasCinco = requestgetParameter(BotonMasCinco)

String BotonUltimo = requestgetParameter(BotonUltimo)

AreaDeListado = requestgetParameter(AreaDeListado)

responsesetContentType(texthtml)

out = responsegetWriter()

outprintln(lthtmlgt)

outprintln(ltbodygt)

if (BotonConsultar=null) ConsultarDatos(DNI)

if (BotonInsertar=null) InsertarDatos(DNINombreApellidoEdad)

if (BotonModificar=null) ModificarDatos(DNINombreApellidoEdad)

if (BotonBorrar=null) BorrarDatos(DNI)

if (BotonListar=null) ListarDatos(DNI)

if (BotonPrimero=null) Controles(1)

if (BotonMenosCinco=null) Controles(2)

if (BotonAnterior=null) Controles(3)

if (BotonSiguiente=null) Controles(4)

if (BotonMasCinco=null) Controles(5)

if (BotonUltimo=null) Controles(0)

outprintln(ltbodygt)

outprintln(lthtmlgt)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

private void ConsultarDatos(String DNI)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObRegistro InstanciaFila = InstanciaConsultaDameDatos()

GenerarRespuesta(InstanciaFilaDameDNI()InstanciaFilaDameNombre()

InstanciaFilaDameApellido()

StringvalueOf(InstanciaFilaDameEdad()))

else

GenerarRespuesta(DNI------------)

PosicionBuscada = 1

public void ListarDatos(String DNI)

ObListado InstanciaListado = new ObListado()

AreaDeListado = InstanciaListadoDameResultado()

ConsultarDatos(DNI)

PosicionBuscada = 1

public void BorrarDatos(String DNI)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObBorrado InstanciaBorrado = new ObBorrado(PosicionBuscada)

GenerarRespuesta()

else

GenerarRespuesta(----------------)

PosicionBuscada = 1

public void ModificarDatos(String DNI String Nombre String Apellido

String Edad)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObRegistro InstanciaFila = new ObRegistro(DNI Nombre Apellido

IntegerparseInt(Edad))

ObModificacion InstanciaModificacion = new ObModificacion(PosicionBuscada

InstanciaFila)

GenerarRespuesta(DNINombreApellidoEdad)

else

GenerarRespuesta(----------------)

PosicionBuscada = 1

public void InsertarDatos(String DNI String Nombre String Apellido

String Edad)

ObRegistro InstanciaFila = new ObRegistro(DNI Nombre Apellido

IntegerparseInt(Edad))

ObInserccion InstanciaInserccion = new ObInserccion(InstanciaFila)

GenerarRespuesta()

PosicionBuscada=1

public void Controles(String Identificador)

ObPosicionamiento InstanciaPosicionamiento =

new ObPosicionamiento(IdentificadorPosicionBuscada)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ObRegistro InstanciaFila = InstanciaPosicionamientoDameDatos()

GenerarRespuesta(InstanciaFilaDameDNI()InstanciaFilaDameNombre()

InstanciaFilaDameApellido()

StringvalueOf(InstanciaFilaDameEdad()))

PosicionBuscada = InstanciaPosicionamientoPosicion()

private void GenerarRespuesta(String DNI String Nombre String Apellido

String Edad)

outprintln(lttable border=1gt)

outprintln(lttrgt)

outprintln(lttdgt)

outprintln(ltform

action=httplocalhost8080directorioTelservletSvAccesoBD

method=getgt)

outprintln( DNI ltinput type=text name=DNI value=+DNI+gtltbrgt)

outprintln( Nombre ltinput type=text name=Nombre

value=+Nombre+gtltbrgt)

outprintln( Apellido ltinput type=text name=Apellido

value=+Apellido+gtltbrgt)

outprintln( Edad ltinput type=text name=Edad

value=+Edad+gtltbrgtltbrgt)

outprintln( ltinput type=submit value=Consultar

name=BotonConsultargt)

outprintln( ltinput type=submit value=Insertar

name=BotonInsertargt)

outprintln( ltinput type=submit value=Modificar

name=BotonModificargt)

outprintln( ltinput type=submit value=Borrar name=BotonBorrargt)

outprintln( ltinput type=submit value=Listar name=BotonListargt

ltbrgt)

outprintln( ltcentergt)

outprintln( ltinput type=submit value= |lt name=BotonPrimerogt)

outprintln( ltinput type=submit value= --

name=BotonMenosCincogt)

outprintln( ltinput type=submit value= - name=BotonAnteriorgt)

outprintln( ltinput type=submit value= +

name=BotonSiguientegt)

outprintln( ltinput type=submit value= ++

name=BotonMasCincogt)

outprintln( ltinput type=submit value= gt| name=BotonUltimogt)

outprintln( ltcentergt)

outprintln( lttdgt)

outprintln( lttdgt)

outprintln( lttextarea name=AreaDeListado rows=10

cols=35gt+AreaDeListado+lttextareagt)

outprintln( lttdgt)

outprintln( lttrgt)

outprintln( ltformgt)

outprintln( lttablegt)

SvAccesoBDjava

import javasql

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

public class ObBorrado

ObBorrado(int PosicionBuscada)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

Personasabsolute(PosicionBuscada)

PersonasdeleteRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

ObBorradojava

import javasql

import javaawtTextArea

public class ObListado

private String Resultado=

ObListado()

String DNI Nombre Apellido Linea

int Edad Posicion

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement()

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

while (Personasnext())

DNI = PersonasgetString(DNI)

Nombre = PersonasgetString(Nombre)

Apellido = PersonasgetString(Apellido)

Edad = PersonasgetInt(Edad)

Posicion = PersonasgetRow()

Linea = DNI+ +Nombre+ +Apellido+ +StringvalueOf(Edad)

Resultado=Resultado+StringvalueOf(Posicion)+ +Linea+n

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public String DameResultado()

return Resultado

ObListadojava

public class ObRegistro

private String DNI Nombre Apellido

private int Edad

ObRegistro (String DNI String Nombre String Apellido int Edad)

thisDNI = DNI

thisNombre = Nombre

thisApellido = Apellido

thisEdad = Edad

String DameDNI()

return DNI

String DameNombre()

return Nombre

String DameApellido()

return Apellido

int DameEdad()

return Edad

ObRegistrojava

import javasql

public class ObConsulta

private int Posicion = 0

private ObRegistro DatosPersona

ObConsulta(String DNIPedido)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement()

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

while (Personasnext())

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

String DNI = PersonasgetString(DNI)

if (DNIequalsIgnoreCase(DNIPedido))

Posicion = PersonasgetRow()

String Nombre = PersonasgetString(Nombre)

String Apellido = PersonasgetString(Apellido)

int Edad = PersonasgetInt(Edad)

DatosPersona = new ObRegistro(DNINombreApellidoEdad)

break

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public int PosicionEncontrada()

return Posicion

public ObRegistro DameDatos()

return DatosPersona

ObConsultajava

import javasql

public class ObInserccion

ObInserccion(ObRegistro Datos)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

PersonasmoveToInsertRow()

PersonasupdateString(DNI DatosDameDNI())

PersonasupdateString(NombreDatosDameNombre())

PersonasupdateString(Apellido DatosDameApellido())

PersonasupdateInt(EdadDatosDameEdad())

PersonasinsertRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

catch (SQLException e)

Systemoutprintln(e)

ObInsercionjava

import javasql

public class ObModificacion

ObModificacion(int PosicionBuscada ObRegistro Datos)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

Personasabsolute(PosicionBuscada)

PersonasupdateString(DNIDatosDameDNI())

PersonasupdateString(NombreDatosDameNombre())

PersonasupdateString(ApellidoDatosDameApellido())

PersonasupdateInt(EdadDatosDameEdad())

PersonasupdateRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

ObModificacionjava

import javasql

public class ObPosicionamiento

private ObRegistro DatosPersona

private int Posicion

ObPosicionamiento(String Accion int Posicion)

int IDAccionEdad

String DNINombreApellido

boolean PosicionCorrecta=false

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

FROM DatosPersonales)

Personasabsolute(Posicion)

IDAccion = IntegerparseInt(Accion)

switch (IDAccion)

case 0

PosicionCorrecta = Personaslast()

break

case 1

PosicionCorrecta = Personasfirst()

break

case 2

PosicionCorrecta = Personasrelative(-5)

break

case 3

PosicionCorrecta = Personasprevious()

break

case 4

PosicionCorrecta = Personasnext()

break

case 5

PosicionCorrecta = Personasrelative(+5)

break

if (PosicionCorrecta)

thisPosicion = PersonasgetRow()

DNI = PersonasgetString(DNI)

Nombre = PersonasgetString(Nombre)

Apellido = PersonasgetString(Apellido)

Edad = PersonasgetInt(Edad)

else

thisPosicion = Posicion

DNI = ----

Nombre = ----

Apellido = ----

Edad = 0

DatosPersona = new ObRegistro(DNINombreApellidoEdad)

Personasclose()

Conexionclose()

SentenciaSQLclose()

Systemoutprintln(StringvalueOf(Posicion)++StringvalueOf(thisPosicion))

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public int Posicion()

return Posicion

public ObRegistro DameDatos() return DatosPersona

ObPosicionamientojava

En este ejemplo se emplean servlets y paacuteginas Web Los clientes habitualmente trabajan en

una computadora remota y los programas se ejecutan en un servidor El mecanismo de

comunicaciones que soporta el protocolo http nos permite consultar en el servidor los datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

que ha seleccionado o escrito el usuario de esta manera se puede observar una disociacioacuten

entre la interfaz graacutefica de usuario (que se ejecuta en los equipos de los clientes) y el

programa que recoge los datos y ejecuta las acciones pertinentes (que se ejecuta en el

servidor)

Como puede observarse el coacutedigo SvAccessoBD es un servlet que lleva a cabo las siguientes

operaciones

1 Recoge los valores provenientes del usuario

2 Determina la naturaleza de la accioacuten a realizar

3 Realiza su cometido con la base de datos

4 Genera la respuesta que recibiraacute el usuario

32 JSP

JSP significa Java Server Pages que traducido quiere decir Paacuteginas de Servidor Java y es

por tanto una tecnologiacutea orientada a crear paacuteginas Web con programacioacuten en JAVA es decir

permite mezclar HTML estaacutendar y estaacutetico con un contenido dinaacutemico etiquetas especiales

(oacuterdenes) y trozos de coacutedigo JAVA (scriptlets o secuencias de oacuterdenes) o contenido dinaacutemico

generado por servlets Eacuteste contenido dinaacutemico se encuentra encerrado en etiquetas

especiales muchas de las cuales inician con lt y finalizan con gt El motor de las paacuteginas

JSP esta basado en los servlets de JAVA

En la tecnologiacutea JSP se crean paacuteginas parecidas a las paacuteginas que se crean en ASP (Active

Server Page de Microsoft) o PHP (Personal Home Page) que son dos tecnologiacuteas de paacuteginas

ejecutadas en el servidor Sin embargo JSP no se cintildee a un sistema operativo o servidor Web

en particular ademaacutes de que proporciona acceso a la tecnologiacutea de Servlets y a JAVA en la

parte dinaacutemica

El proceso para generar paacuteginas JSP accesibles en Web es mucho maacutes simple que en los

servlets Dando por hecho que se tiene un servidor Web que permite usar JSP el coacutedigo se

almacenaraacute en archivos con extensioacuten jsp que incluyen dentro de la estructuras de etiquetas

HTML las sentencias JAVA a ejecutar y tan soacutelo se colocaraacuten en cualquier lugar en donde

se pusiera una paacutegina Web normal sin compilacioacuten sin paquetes y sin configuracioacuten aunque

el servidor tendraacute que ser configurado para acceder a los archivos de clases Servlets y de

JSPs

Aunque lo que se escriba con frecuencia luciraacute como un archivo HTML estaacutendar detraacutes de

ello la paacutegina JSP se convierte automaacuteticamente en un servlet normal donde el HTML

estaacutetico tan soacutelo es enviado al flujo de salida asociado con el meacutetodo service del servlet Esta

traduccioacuten se realiza la primera vez que se solicita la paacutegina De acuerdo como este

configurado el servidor es posible ver el coacutedigo fuente de los servlets generados a partir de

sus paacuteginas JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Por ejemplo supongamos que se ha escrito el siguiente coacutedigo en el archivo Saludojsp

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtEjemplo JSPlttitlegtltheadgt

ltbody bgcolor=ffffccgt

ltcentergt

lth2gtHola mundolth2gt

ltjavautilDate hoy = new javautilDate()gt

La fecha de hoy es lt=hoygt

ltcentergt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional y un fragmento de un scriptlet de JAVA La etiqueta

lt identifica el comienzo del scriptlet y gt el final Una expresioacuten de la forma =variable

es sustituida por el valor de esa variable Para ejecutar esta paacutegina o cualquier otra paacutegina

JSP desde un navegador hay que instalarla en el servidor de aplicaciones de la misma manera

en como se hizo con los servlets Suponiendo entonces que se tiene instalado el Tomcat 5

siga los siguientes pasos

1 Antildeadir en el servidor la carpeta digamos JSP2 dentro de la carpeta webapps del Tomcat

y construir sobre ella la jerarquiacutea de clases ya conocida de los servlets

webappsrarrJSP2rarrWEB-INFrarrclasses

WEB-INFrarrlib

WEB-INFrarrtags

2 Editar en la carpeta WEB-INF el descriptor de despliegue webxml que se indica a

continuacioacuten Este archivo XML indica doacutende se localiza el esquema XML para la

especificacioacuten Servlet 24 que a suvez utiliza el esquema XML para la especificacioacuten

Java Server Page 20 que son las especificaciones que soporta en servidor Tomcat

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=

httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

3 Crear en JSP2 la carpeta saludo que contendraacute la aplicacioacuten y copiar en ella la paacutegina

Saludojsp

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

4 Arrancar el servidor Si el servidor ya estaba arrancado detenerlo y volverlo a arrancar o

bien abrir el explorador escribir el URL httplocalhost8080managerhtml e instalar

la aplicacioacuten

5 Una vez arrancado el servidor verificar si estaacute funcionando correctamente escribiendo

el URL siguiente en el explorador httplocalhost8080 El explorador debe mostrar la

paacutegina del Tomcat

6 Ejecutar la paacutegina JSP iniciando el explorador y escribiendo el URL siguiente

httplocalhost8080JSP2saludoSaludojsp donde la sintaxis geneacuterica es

httpservidor[puerto]MiCarpetapaginajsp

Cuando esta paacutegina (Saludojsp) es invocada por primera vez el motor JSP lleva a cabo una

fase de traduccioacuten de la misma en un servlet y el motor Servlet es el que ejecutaraacute eacuteste uacuteltimo

para generar el HTML dinaacutemico que seraacute enviado al explorador cliente seguacuten puede

deducirse de la figura siguiente La proacutexima vez que la paacutegina sea solicitada el motor JSP

ejecutaraacute el servlet que fue caragado la primera vez a no ser que la paacutegina haya cambiado

en cuyo caso seraacute compilada automaacuteticamente en un nuevo servlet y ejecutada

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Regresando al ejemplo el archivo java generado por el Tomcat a partir del archivo

Saludojsp se localiza en la carpeta workCatalinalocalhost de la instalacioacuten de Tomcat

321 ELEMENTOS PARA SECUENCIAS DE COMANDOS

Los elementos para secuencias de comandos permiten insertar coacutedigo en el servlet que seraacute

generado a partir de la paacutegina JSP Existen tres formas

1 Expresiones del tipo lt= expresioacuten gt que se evaluacutean e insertan en el resultado del

servlet

2 Los scriptlets del tipo lt codigo gt que se insertan en el meacutetodo _jspService del

servlet (ejecutado por service)

3 Las declaraciones del tipo lt Codigo gt que se insertan en el cuerpo de la clase del

servlet fuera de cualquier meacutetodo existente

NOTA Los comentarios en JSP se escriben lt-- Comentario JSP --gt en tanto que los

comentarios en HTML son de la forma lt--Comentario HTML --gt La diferencia

semaacutentica radica en que los comentarios HTML cuando se insertan en la respuesta enviada

por el servidor al cliente no se muestran cuando se visualiza el documento HTML pero si

Servidor Maacutequina Cliente

Explorador Web

Contenedor Web

Motor Servlet

Motor JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

los podemos ver cuando se visualiza el coacutedigo fuente en tanto que los comentarios JSP

aunque se inserten en la respuesta enviada por el servidor al cliente no son enviados al

explorador de forma que tampoco se muestran ni se ven cuando se visualiza el coacutedigo fuente

HTML desde el explorador

3211 EXPRESIONES

Se utiliza una expresioacuten JSP para insertar valores directamente en el resultado La sintaxis es

lt= expresioacuten gt Por ejemplo

lt= requestgetParameter(ldquoparNombre) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt lt= s gt

La fecha y hora actual es lt= new javautilDate() gt

La expresioacuten se evaluacutea se convierte a cadena y se inserta en la paacutegina Esta evaluacioacuten se

realiza durante la ejecucioacuten

32111 VARIABLES PREDEFINIDAS

Para simplificar estas expresiones se pueden utilizar cierta cantidad de variables

predefinidas Estos objetos impliacutecitos como tambieacuten se les llama estaacuten disponibles para su

uso durante la implementacioacuten de una paacutegina Web

bull pageContext Es un objeto de la clase PageContext que proporciona acceso a objetos

relacionados con los servlets

bull request Es un objeto de la clase HttpServletRequest que se puede obtener a traveacutes del

meacutetodo getRequest que encapsula los datos enviados por el cliente al servidor

bull response Es un objeto de la clase HttpServletResponse que puede obtenerse a traveacutes

del meacutetodo getResponse que encapsula los datos que el servidor enviaraacute al cliente

bull application Es un objeto de la clase ServletContext que se obtiene a traveacutes del meacutetodo

getServletContext que define un conjunto de meacutetodos que todo servlet utiliza para

comunicar con el contenedor de servlets

bull config Es un objeto de la clase ServletConfig que se obtiene a traveacutes del meacutetodo

getServletConfig y que se utiliza por el contenedor de servlets para pasar informacioacuten

al servlet durante la iniciacioacuten

bull session Es un objeto de la clase HttpSession que se obtiene a traveacutes del meacutetodo

getSession que proporciona una forma de identificar a un usuario que visita las paacuteginas

de un sitio Web

bull out Es un objeto de la clase JspWriter que se obtiene a traveacutes del meacutetodo getOut que

se utiliza para almacenar la respuesta que seraacute enviada al cliente que hizo la peticioacuten de

la paacutegina

bull page Es un objeto geneacuterico de la clase Object que se obtiene a traveacutes del meacutetodo

getPage y que representa al servlet obtenido a partir de la paacutegina JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

bull exception Es un objeto de la clase Exception que se obtiene a traveacutes del meacutetodo

getException que contendraacute informacioacuten a cerca de cualquier excepcioacuten que se lance

desde la paacutegina JSP

Un ejemplo del uso de uno de estos objetos impliacutecitos seriacutea el siguiente

El nombre de tu host es lt= requestgetRemoteHost() gt

El listado siguiente da un ejemplo de una paacutegina JSP que utiliza algunas variables

predefinidas como uso de expresiones JSP

ltDOCTYPE HTML PUBLIC -W3CDTD HTML 40 Transitional ENgt

lthtmlgt

ltheadgt

lttitlegt Expresiones JSP lttitlegt

ltheadgt

ltbodygt

lth2gt Expresiones JSP lth2gt

ltULgt

ltligt Fecha y hora en curso lt= new javautilDate() gt ltligt

ltligt Nombre de su host lt= requestgetRemoteHost() gt ltligt

ltligt Identificador de su sesioacuten lt= sessiongetId() gt ltligt

ltligt El paraacutemetro ltcodegt paramPrueba ltcodegt del formulario

lt= requestgetParameter(paramPrueba) gt ltligt

ltULgt

ltbodygt

lthtmlgt

Cuya salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3212 LOS SCRIPTLETS JSP

Si se desea hacer algo maacutes complejo que una simple expresioacuten los scriptlets permiten insertar

coacutedigo JAVA en el meacutetodo _jspService del servlet (que es ejecutado por service) La sintaxis

utilizada por los scriptlets es lt coacutedigo java gt Los escriptlets tienen acceso a las

mismas variables definidas de forma automaacutetica como expresiones A manera de ejemplo si

se desea que el resultado aparezca en la paacutegina generada deberiacutea de utilizarse la variable out

como en la siguiente instruccioacuten

lt String datosConsultados= requestgetQueryString()

outprintln(ldquoDatos GET adjuntos ldquo+datosConsultados)

gt

En este ejemplo podriacutea haberse obtenido el mismo resultado utilizando la siguiente expresioacuten

JSP

Datos GET adjuntos lt=requestgetQueryString() gt

En general los scriptlets pueden ejecutar varias tareas que no podriacutean realizarse con las

expresiones Tales tareas incluyen

bull La determinacioacuten de encabezados de respuesta

bull Actualizacioacuten de Bases de Datos

bull Ejecucioacuten de bucles condiciones y otras estructuras complejas

lt for (int i=1 ilt=6 i++)

gt

lth lt=i gtgt Hola Mundo lthlt=i gtgt

lt gt

Como un ejemplo concreto se muestra la siguiente paacutegina JSP llamada Cuentajsp en donde

se observa coacutemo se hace un seguimiento del nuacutemero de veces que un cliente accede a esta

paacutegina a traveacutes de distintas sesiones Para ello supondremos que dicha cuenta es el valor del

atributo atrCuenta del objeto impliacutecito application ya citado La primera vez que el cliente

accede a la paacutegina el valor de atrCuenta seraacute null debido a que auacuten no ha sido fijado este

atributo en este caso se fijaraacute con el valor 1 En los siguientes accesos se leeraacute el valor del

atributo atrCuenta se incrementaraacute en una unidad y se volveraacute a fijar Finalmente se enviacutea

la respuesta al cliente para que se muestre al usuario el valor del contador

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en el objeto impliacutecito application con el nombre

atrCuenta

--gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt

Integer cuenta = (Integer)applicationgetAttribute(atrCuenta)

String s = vez

if (cuenta == null)

cuenta = new Integer(1)

else

cuenta = new Integer(cuentaintValue() + 1)

s = veces

applicationsetAttribute(atrCuenta cuenta)

gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

Has visitado esta paacutegina lt= cuenta gt lt= s gt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional un fragmento de coacutedigo JAVA o scriptlet

expresiones y comentarioshellip

Aquiacute otro ejemplo de la ejecucioacuten de un coacutedigo demasiado complejo para una expresioacuten JSP

Este listado presenta una paacutegina JSP que utiliza el paraacutemetro de peticioacuten colorFondo para

establecer el color de fondo de la paacutegina

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgt

lttitlegt Prueba de Color lttitlegt

ltheadgt

lt

String colorFondo=requestgetParameter(colorFondo)

boolean tieneColorExplicito

if (colorFondo =null)

tieneColorExplicito=true

else

tieneColorExplicito=false

colorFondo=WHITE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt

ltbody bgcolor=lt= colorFondo gtgt

lth2 align=centergt Prueba de color lth2gt

lt

if (tieneColorExplicito)

outprintln(Ha indicado un color de fondo expliacutecito +

colorFondo +)

else

outprintln(Usareacute el color de fondo predeterminado WHITE +

Indique el atributo de peticioacuten

ltigtcolorFondoltigt+

para intentar un color estaacutendar un +

valor RRGGBB o para ver si el navegador Web +

permite el uso de nombres de color X11)

gt

ltbodygt

lthtmlgt

Cuyas posibles salidas son

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3213 DECLARACIONES JSP

Una declaracioacuten JSP permite definir meacutetodos o campos que seraacuten insertados en el cuerpo

principal de la clase del servlet (fuera del meacutetodo _jspService) Una declaracioacuten tiene la

sintaxis lt Coacutedigo Java gt Por ejemplo

lt int i=0 gt

lt

Public void jspinit()

coacutedigo de iniciacioacuten

gt

Una declaracioacuten no genera ninguacuten resultado y se usan junto con las expresiones JSP o los

scriptlets A continuacioacuten se muestra una paacutegina JSP que despliega la cantidad de veces que

se ha solicitado esta paacutegina desde que se arrancoacute el servidor haciendo uso de las

declaraciones JSP

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtDeclaraciones JSPlttitlegtltheadgt

ltbodygt

lth1gtDeclaraciones JSPlth1gt

lt-- Esto es un comentario en JSP --gt

lt private int recuentoAccesos=0 gt

lth2gt Accesos a la paacutegina desde el reinicio del servidor

lt= ++recuentoAccesos gt lth2gt

ltbodygt

lthtmlgt

La salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

322 EL LENGUAJE DE EXPRESION EN JSP 20

Anteriormente se ha visto la necesidad de utilizar fragmentos de coacutedigo java en el desarrollo

de paacuteginas JSP pero con la aparicioacuten de la especificacioacuten JSP 20 ya no hay necesidad de

utilizar fragmentos de coacutedigo Java para nada gracias al nuevo lenguaje de expresioacuten EL

(Expresioacuten Language) a la biblioteca de etiquetas estandar JSTL (JSP Standar Tag Library)

y a las nuevas formas para desarrollar etiquetas personalizadas

El lenguaje de expresioacuten JSP es maacutes un lenguaje de acceso a datos que un lenguaje de

programacioacuten Ya se ha visto que para pasar informacioacuten de un cliente a una paacutegina JSP se

utilizan paraacutemetros en la peticioacuten y atributos en la paacutegina El lenguaje de expresioacuten lo hace

posible sin tener que utilizar scriptlets o expresiones (lt= expresioacuten gt) Por ejemplo las

liacuteneas JSP 12 siguientes escritas utilizando coacutedigo Java

lt= requestgetParameter(ldquoparNombrerdquo) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt veces

bajo la especificacioacuten JSP 20 se pueden escribir de una forma maacutes sencilla como sigue

(ahora no se trata de coacutedigo JAVA)

$paramparNombre has visitado esta paacutegina

$atrCuenta veces

La sintaxis de JSP es sensible a mayuacutesculas y minuacutesculas pero un par de comillas simples es

equivalente a un par de comillas dobles

3221 VARIABLES PREDEFINIDAS (Objetos Impliacutecitos)

El lenguaje de expresioacuten JSP 20 soporta los objetos impliacutecitos siguientes

pageContext Objeto de javaxservletjspPageContext que proporciona acceso a los

datos de una peticioacuten

param Coleccioacuten (objeto de tipo javautilMap) de todos los valores de los paraacutemetros

enviados en una peticioacuten un String por paraacutemetro

paramValues Coleccioacuten de todos los valores de los paraacutemetros enviados en una

peticioacuten una matriz de tipo String por paraacutemetro

header Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten un

String por cabecera

headerValues Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten

una matriz de tipo String por cabecera

cookie Coleccioacuten de todos los valores de las cookies un objeto javaxservlethttpCookie

por cookie

initParam Coleccioacuten de todos los valores de los paraacutemetros de iniciacioacuten de la

aplicacioacuten un String por paraacutemetro

Tambieacuten hay objetos que permiten acceder a variables definidas en diferentes aacutembitos lo que

posibilita compartir informacioacuten

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

pageScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de paacutegina

requestScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

peticioacuten

sessionScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de sesioacuten

applicationScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

aplicacioacuten

3222 DIRECTRICES

Las directrices page incluye y taglib son mensajes para el motor JSP y son siempre incluidas

entre los siacutembolos lt y gt

32221 LA DIRECTRIZ PAGE

Define atributos que se aplican a toda la paacutegina JSP donde es incluida

lt page lista_de_atributos gt

Donde la lista_de_atributos puede contener algunos de los siguientes (aquellos que estaacuten

escritos en negrita son los tomados por omisioacuten)

language= ldquoscriptingLanguagerdquo

extends= rdquoclassNamerdquo

import= ldquoimportListrdquo

session= ldquotrue|falserdquo

buffer= ldquonone|sizeKb

autoflush= ldquotrue|falserdquo

isThreadSafe= rdquotrue|falserdquo

info= rdquoinfo_textrdquo

errorPage= ldquoerror_urlrdquo

isErrorPage= rdquotrue|falserdquo

contentType= rdquoctinfordquo

pageEncoding= rdquopeinfordquo

isELIgnored= ldquotrue|falserdquo

Tiacutepicamente se localiza al principio de la paacutegina JSP y puede haber cualquier nuacutemero de

ellas El lenguaje por omisioacuten es Java Ejemplos

lt page contentType=rdquotexthtmlrdquo language=rdquojavardquo gt

lt page import=rdquojavautil javalangrdquo gt

lt page buffer=rdquo5kbrdquo autoflush=rdquofalserdquo gt

32222 LA DIRECTRIZ INCLUDE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

La directriz include incluye un archivo (html jsp xml o de texto) en una paacutegina JSP Esto

permite dividir el contenido de la paacutegina en trozos maacutes manejables

lt incluye file=rdquoURL_relativordquo gt

El ejemplo siguiente muestra dos archivos el primero incluye al segundo para mostrar la

fecha y hora actuales

lt-- fichero mostrarFechaHorajsp --gt

lthtmlgt

ltheadgtlttitlegtIncluir un ficherolttitlegtltheadgt

ltbody bgcolor=whitegt

ltfont color=bluegt

La fecha y hora actuales son

lt include file=fechaHorajsp gt

ltfontgt

ltbodygt

lthtmlgt

lt-- fichero fechaHorajsp --gt

lt page import=javautil gt

lt= (new javautilDate())toLocaleString() gt

32223 LA DIRECTRIZ TAGLIB

La directriz taglib indica la biblioteca de acciones personalizadas que podremos utilizar en

la codificacioacuten de la paacutegina JSP Para distinguir esas acciones entre otras existentes se utiliza

un prefijo (prefix) Su sintaxis es

lt taglib (uri=rdquoURI_bibliotecardquo|tagdir=rdquoDir_biblioteca_tagrdquo)

prefix=rdquoprefijordquo gt

Cuando se trata de una biblioteca definida mediante una clase Java y un descriptor (archivo

tld) eacutesta se identifica mediante un URI (Uniform Resource Identifier- URL relativos) Por

ejemplo

lt taglib uri=rdquohttpMarioRossainzLopezmiBibliotecardquo

prefix=rdquofunrdquo gt

ltpgtltfunaccion01 gt

La uacuteltima liacutenea del ejemplo tiene dos etiquetas una etiqueta p HTML y otra accion01

perteneciente a la biblioteca miBiblioteca En cambio si la biblioteca se define mediante un

archivo tag entonces se identifica mediante su ruta relativa en el sistema de archivos

lt taglib tagdir=rdquoWEB-INFtagsrdquo prefix=rdquofunrdquo gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpgtltfunaccion01 gt

La directriz taglib debe colocarse antes de utilizar en la paacutegina JSP las acciones

personalizadas definidas por la misma Se puede utilizar maacutes de una directriz pero el prefijo

utilizado debe ser uacutenico para cada una de ellas

3223 ACTIVACION DEL LENGUAJE DE EXPRESION (LE)

La especificacioacuten JSP 20 define un lenguaje de expresioacuten como alternativa a elementos de

programacioacuten escritos con coacutedigo Java y especificaciones anteriores a la JSP 20 Para que

este lenguaje pueda ser interpretado tienen que cumplirse 2 requisitos

1 Que la propiedad isELIgnored de la directriz page valga false

lt page isELIgnored= ldquofalserdquo gt

2 Que el descriptor de despliegue webxml en la carpeta WEB-INF indique doacutende se

localiza el esquema XML para la especificacioacuten Servlet 24 que a su vez utiliza el

esquema XML para la especificacioacuten Java Server Page 20

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

Utilizando el lenguaje de expresioacuten se podriacutea modificar la paacutegina Cuentajsp de la seccioacuten

3212 de este documento como se muestra a continuacioacuten Esta nueva paacutegina

1 Especifica que utilizaraacute la biblioteca core de etiquetas estandar (de la que se hablaraacute maacutes

adelante)

2 La primera vez que sea accedida definiraacute la variable atrCuenta en el aacutembito de la

aplicacioacuten con un valor inicial nulo y la incrementaraacute en una unidad cuando sea accedida

sucesivas veces simplemente incrementaraacute esta variable en una unidad

3 Finalmente mostraraacute una paacutegina con un contenido anaacutelogo al siguiente Esta formado

por una cabecera y una segunda liacutenea compuesta por el valor del paraacutemetro parNombre

enviado con la peticioacuten un texto fijo el valor de la variable atrCuenta y otro texto fijo

dependiente del valor de esta variable

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

El coacutedigo completo es el siguiente

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

3224 VARIABLES Y EXPRESIONES

Para acceder a una simple variable se puede escribir algo como lo siguiente $nombre y

para acceder a una propiedad de un objeto podemos escribir algo como

$paramparNombre

$applicationScopeatrCuenta

$pageContextrequestrequestURI

La primera liacutenea del ejemplo anterior obtiene el valor de la propiedad parNombre del objeto

param la segunda el valor del atributo atrCuenta del objeto applicationScope y la tercera

el URL relativo de la paacutegina JSP solicitada

El lenguaje de expresioacuten es maacutes tolerante con respecto a las variables con valor null y ejecuta

muchas maacutes conversiones de forma automaacutetica sobre el tipo de los datos cuando la expresioacuten

a evaluar asiacute lo requiere Por ejemplo la etiqueta condicional siguiente incluye una expresioacuten

que compara el valor del atributo atrCuenta con aacutembito de aplicacioacuten con 10 (convirtiendo

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

impliacutecitamente el valor del atributo al tipo de la constante para poder realizar la comparacioacuten

El resultado seraacute un valor de tipo boolean

ltcif test=rdquo$applicationScopeatrCuenta gt 10rdquogt

ltcifgt

o bien

ltcif test=rdquo$atrCuenta gt 10rdquogt

ltcifgt

Para que una literal pueda incluir un caracter significativo para el lenguaje dicho caracter

debe ser especificado como una secuencia de escape (caracter) Por ejemplo la siguiente

expresioacuten da lugar al literal ldquovezrdquo o ldquovecesrdquo entre comillas dobles

$(atrCuenta gt 1) iquest ldquordquovecesrdquordquo ldquordquovezrdquordquo

Cualquier objeto o atributo de un objeto definido en algunos de los aacutembitos de una paacutegina

puede ser utilizado como una variable Por ejemplo $atrCuenta+1 es una expresioacuten que

realiza la suma de la variable atrCuenta con 1

Cuando se trate de una propiedad de un objeto para acceder a ella se utilizaraacute el operador

punto o bien la notacioacuten empleada para acceder a un elemento de una matriz Por ejemplo

$paramparNombre

$param[ldquoparNombrerdquo]

Una expresioacuten LE puede aparecer en cualquier lugar donde pueda aparecer un texto fijo Por

tanto para informar al contenedor JSP que se trata de una expresioacuten y no de un texto fijo se

utilizan los delimitadores $ al principio y al final

3225 OPERADORES

OPERADOR DESCRIPCIOacuteN Acceso a la propiedad de un objeto o a un elemento de un Map

[] Acceso al elemento de una matriz o de un objeto List

() Pareacutentesis para alterar la prioridad en la evaluacioacuten de una expresioacuten

If ternario condicion expresion1 expresioacuten 2

+ Suma

- Resta

Producto

oacute div Divisioacuten

oacute mod Moacutedulo o resto de una divisioacuten

== oacute eq Igualdad

= oacute ne Diferente

lt oacute lt Menor que

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt oacute gt Mayor que

lt= oacute le Menor o igual que

gt= oacute ge Mayor o igual que

ampamp oacute and Operacioacuten Loacutegica AND

|| oacute or Operacioacuten Loacutegica OR

oacute not Operacioacuten Loacutegica NOT

empty Verifica si el valor de una variable es null si un String esta vaciacuteo o si una matriz Map

o Collection no tienen elementos

func(args) Llamada a una funcioacuten donde func es el nombre de la funcioacuten y arg representa cero o

maacutes argumentos separados por comas

El ejemplo siguiente muestra una paacutegina JSP compuesta por elementos HTML expresiones

LE y objetos impliacutecitos

lthtmlgt

ltheadgtlttitlegtJSP 20lttitlegtltheadgt

ltbodygt

lth3gtLenguaje de expresioacuten (LE)lth3gt

ltpgtLa siguiente tabla ilustra algunas expresiones LE

ltbrgtltbrgtlttable border=1gt

lttrgt

ltthgtltbgtExpresioacutenltbgtltthgt

ltthgtltbgtValorltbgtltthgt

lttrgt

lttrgt

lttdgt$3 + 6lttdgt

lttdgt$3 + 6lttdgt

lttdgt

lttrgt

lttdgt$(7 gt 4) 7 4lttdgt

lttdgt$(7 gt 4) 7 4lttdgt

lttrgt

lttrgt

lttdgt$header[host]lttdgt

lttdgt$header[host]lttdgt

lttrgt

lttablegt

ltbodygt

lthtmlgt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

323 BIBLIOTECA ESTANDAR DE ETIQUETAS

La biblioteca estaacutendar de etiquetas JSP (JSTL ndash Java Server Page Estaacutendar Tag Library)

incluye una cantidad amplia de etiquetas para diferentes aacutereas de trabajo

Aacuterea baacutesica (su prefijo es c ndash core) y contiene

o Soporte de variables (remove y set)

o Control del flujo (choose when otherwise forEach forTokens if)

o Manejo de URL (import param redirect param y url param)

o Operaciones varias (match y out)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlcore

Aacuterea XML (su prefijo es x) y contiene

o Sentencias baacutesicas (out parse y set)

o Control del flujo (choosehellip whenhellip otherwise forEach e if)

o Transformacioacuten de Documentos (transformhellipparam)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlxml

Aacuterea Internacionalizacioacuten (su prefijo es fmt) Contiene

o Localidad (setLocale y requestEncoding)

o Mensajes (bundle message param y setBundle)

o Formateo de Fechas y nuacutemeros (formatNumber formateacuteate parseDate

parseNumber setTimeZone timeZone)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlfmt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Aacuterea SQL (su prefijo es sql) es el lenguaje estandar para interactuar con bases de datos

relacionales y contiene setDataSource Quero dateParam param transaction y

update dateParam param) El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlsql

Aacuterea Funciones (su prefijo es fn) y contiene

o Longitud de una coleccioacuten (length)

o Manipulacioacuten de String (toUpperCase toLowerCase substring

substringAfter substringBefore trim replace indexOf startsWith

endsWith contains containsIgnoreCase split join y escapeXml)

o El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlfunctions

3231 OPERACIONES CON ETIQUETAS BAacuteSICAS

En un ejemplo pasado teniacuteamos el siguiente coacutedigo

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

En este ejemplo se hace referencia al aacuterea baacutesica de JSTL con el prefijo c y se utiliza la

etiqueta cset para definir la variable atrCuenta Si la variable ya esta definida simplemente

se le asigna el valor especificado

La uacuteltima parte del ejemplo anterior podriacutea haberse escrito de esta otra forma

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcif test=rdquo$atrCuenta gt 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcifgt

$atrCuenta $str

La etiqueta cif permite la ejecucioacuten condicional de su cuerpo en funcioacuten del valor del

atributo de test

La etiqueta cchoose permite la ejecucioacuten del cuerpo de la primera etiqueta cwhen cuyo

atributo test sea evaluado a true Si ninguna de las condiciones se evaluacutea a true entonces se

evaluacutea el cuerpo de la etiqueta cotherwise si estaacute presente El siguiente coacutedigo muestra otra

manera de escribir el ejemplo anterior utilizando estas uacuteltimas etiquetas

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcchoosegt

ltcwhen test=rdquo$atrCuenta == 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcwhengt

ltcotherwisegt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcotherwisegt

ltcchoosegt

$atrCuenta $str

La etiqueta cforEach permite iterar sobre una coleccioacuten de objetos La coleccioacuten se

especifica por medio del atributo iacutetems y el elemento actual de la coleccioacuten estaacute disponible a

traveacutes de la variable establecida por el atributo var Por ejemplo el siguiente fragmento de

coacutedigo visualiza una tabla con las variables definidas a nivel de aacutembito de paacutegina

lttable border=rdquo1rdquogt

ltcforEach var=rdquoitemrdquo iacutetems=rdquo$pageScoperdquogt

lttrgt

lttdgt $item lttdgt

lttrgt

ltcforEachgt

lttablegt

La etiqueta ccatch atrapa una excepcioacuten que ocurra en el cuerpo de la misma Por ejemplo

el siguiente segmento de coacutedigo lanzaraacute una excepcioacuten si el paraacutemetro mes se escribe con

letras en vez de con nuacutemeros

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltbodygt

lthtmlgt

Un URL anaacutelogo al siguiente daraacute lugar a que la excepcioacuten sea lanzada cuando se ejecute la

expresioacuten $nMes 3 de la paacutegina anterior

httplocalhost8080JSP2exceppruebajspmes=marzo

La excepcioacuten indica que ha ocurrido un error al tratar de convertir ldquomarzordquo a un entero de

tipo Long Para cachar esta excepcioacuten y darle un tratamiento adecuado habraacute que modificar

la paacutegina JSP anterior como se indica a continuacioacuten

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltccatch var=rdquoerrorOcurridordquogt

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltccatchgt

ltcif test=rdquo$not empty errorOcurridordquogt

Error el paraacutemetro mes debe ser un nuacutemero ltbgt

ltbrgt Informacioacuten del error dada por el sistema

ltbrgt ltfont color=rdquoFF0000rdquogt $errorOcurrido ltfontgt

ltcifgt

ltbodygt

lthtmlgt

3232 ACCESO A BASES DE DATOS CON JSP

Las etiquetas que proporciona el aacuterea SQL permiten realizar

Conexioacuten con una base de datos

Realizacioacuten de consultas a la base de datos

Acceso al conjunto de resultados

Ejecucioacuten de actualizaciones y transacciones

Todas las etiquetas SQL actuacutean sobre una base de datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

32321 CONEXIOacuteN CON LA BASE DE DATOS

La conexioacuten con la base de datos puede realizarse con la etiqueta sqlsetDataSource Por

ejemplo si se esta utilizando el administrador de bases de datos MySql con el controlador

JDBC se puede realizar una conexioacuten con una base de datos digamos bd_tutorias de la

manera siguiente

ltsqlsetDataSource var=rdquobdrdquo

driver=rdquocommysqljdbcDriverrdquo

url=rdquojdbcmysqllocalhost3306bd_tutoriasrdquo

user=rdquoadminrdquo

password=rdquoadminadminrdquo gt

32322 CONSULTA A LA BASE DE DATOS

La etiqueta sqlQuero permite realizar una consulta a una base de datos Por ejemplo el

siguiente fragmento de coacutedigo realiza una consulta a la base de datos representada por bd y

obtiene un conjunto de resultados representado por cdr

ltsqlquery var=rdquocdrrdquo dataSource=rdquo$bdrdquogt

SELECT professor dia hora alumno

FROM profesores tutorias citas

WHERE profesoresid_profesor=tutoriasid_profesor

AND tutoriasid_tutoria=citasid_tutoria

ltsqlquerygt

32323 MODIFICACIONES SOBRE LA BASE DE DATOS

La etiqueta sqlupdate permite ejecutar una sentencia SQL INSERT UPDATE o DELETE

y cualquier otra sentencia SQL que no retorne ninguacuten valor Por ejemplo

ltsqlupdate var=rdquocontrdquo dataSource=rdquo$bdrdquo gt

UPDATE profesores

SET profesor=

WHERE profesor=

ltsqlparam value=rdquo$paramProfesorrdquo gt

ltsqlparam value=rdquo$paramIDrdquo gt

ltsqlupdategt

Una operacioacuten UPDATE puede utilizar el siacutembolo para indicar que el valor que tendriacutea que

evaluarse en esa posicioacuten seraacute suministrado por una etiqueta sqlparam como por ejemplo

httplocalhost8080JSP2sqlpruebajspProfesor=Mario+Rossainz+LopezampID=514

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

hilo y examina el tipo de peticioacuten http (get post put delete trace options o head) con el

fin de llamar al meacutetodo adecuado para atenderla por ejemplo doGet doPost doPut etc El

tipo de peticioacuten por omisioacuten es GET

El meacutetodo service tiene dos paraacutemetros de tipos HttpServletRequest y

HttpServletResponse respectivamente que son pasados al meacutetodo invocado Si la

ejecucioacuten no se desarrolla con eacutexito se lanzaraacute una excepcioacuten del tipo ServletException o

IOException

El objeto de la clase HttpServletRequest encapsula los datos enviados por el cliente al

servidor El objeto de la clase HttpServletResponse encapsula los datos que el servidor

enviaraacute al cliente Este objeto proporciona dos formas para retornar los datos una mediante

un objeto PrintWriter devuelto por su meacutetodo getWriter y otra mediante un objeto

ServletOutputStream devuelto por su meacutetodo getOutputStream La primera forma

devuelve texto (cadenas de caracteres) y la segunda forma devuelve datos binarios (cadenas

de bytes)

El meacutetodo destroy es el uacuteltimo meacutetodo invocado justo antes de destruir el servlet

Normalmente se utiliza para liberar los recursos de maacutequina adquiridos por ejemplo borrar

archivos temporales

315 UN PRIMER SERVLET SENCILLO

Este primer servlet que se muestra a continuacioacuten implementa el caso maacutes sencillo posible

la aplicacioacuten ldquoHolaMundordquo que mostraraacute el texto ldquoHola Mundordquo en el navegador del cliente

En este caso independientemente del tipo de peticioacuten http GET o POST que se realice el

servlet responderaacute en ambos casos enviando la misma paacutegina Web

import javaio

import javaxservlet

import javaxservlethttp

public class HolaMundo extends HttpServlet

Manipular las posibles peticiones enviadas por el cliente

utilizando el atributo method=get o method=post

protected void procesarPeticion(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

responsesetContentType(texthtml)

PrintWriter out = responsegetWriter()

outprintln(lthtmlgt)

outprintln(ltheadgt)

outprintln(lttitlegtServlet HolaMundolttitlegt)

outprintln(ltheadgt)

outprintln(ltbodygt)

outprintln(ltfont size=7gt)

outprintln(iexcliexcliexclHola mundo)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

outprintln(ltfontgt)

outprintln(ltbodygt)

outprintln(lthtmlgt)

outclose()

Manipular la peticioacuten enviada por el cliente

utilizando el atributo method=get

protected void doGet(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

procesarPeticion(request response)

Manipular la peticioacuten enviada por el cliente

utilizando el atributo method=post

protected void doPost(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

procesarPeticion(request response)

En las primeras liacuteneas del coacutedigo anterior se colocan las sentencias import de los paquetes ya

citados El paquete javaio se requiere para las operaciones de entrada y salida de datos y

resultados a traveacutes de los objetos request y response La manera maacutes sencilla de definir un

servlet es heredar de la clase HttpServlet

Asiacute cuando este servlet recibe una peticioacuten del cliente el servidor lo carga para su ejecucioacuten

instante en el que se ejecuta el meacutetodo init() que lo inicia (en este caso el que se invoca es el

que se da por omisioacuten en la superclase de HolaMundo) Cuando init finaliza el servlet esta

en condiciones de atender a las peticiones de los clientes en el ejemplo para cada una de las

peticiones GET o POST se ejecuta el meacutetodo procesarPeticion que es invocado por doGet

o DoPost El servlet permaneceraacute cargado hasta que el servidor decida destruirlo ejecutando

el meacutetodo destroy si es que se implementoacute

Analizando el meacutetodo procesarPeticion se observa que el meacutetodo almacena en el objeto out

de la clase PrintWriter los datos que el servlet HolaMundo enviaraacute al cliente que realizoacute la

peticioacuten Este objeto forma parte del objeto response y es obtenido a traveacutes de su meacutetodo

getWriter Los datos se almacenan en out utilizando su meacutetodo println Los datos

almacenados como se puede ver se corresponden con una paacutegina HTML que seraacute enviada

al explorador del cliente

Ademaacutes de estos datos expliacutecitos tambieacuten se enviacutea otra informacioacuten de protocolo http como

son las cabeceras de respuesta generadas por el servidor Estas cabeceras de respuesta

incluyen la liacutenea Content-type texthtml

Esta liacutenea identifica el tipo de documento a enviar o a recibir en este caso se trata de un

documento HTML Cuando el navegador del cliente reciba esta informacioacuten sabraacute como

interpretar el tipo de documento que tiene que visualizar Para establecer este valor

procesarPeticion utiliza el meacutetodo setContentType del objeto response

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3151 PUESTA EN FUNCIONAMIENTO DEL SERVLET ldquoHolaMundordquo

Una vez escrito el servlet los pasos necesarios para ver el resultado que produce son

bull Compilarlo

bull Instalarlo en un servidor

bull Invocarlo para su ejecucioacuten desde un navegador Web

Como puede leerse no resulta tan sencillo desarrollar y ejecutar por vez primera un servlet a

diferencia de una aplicacioacuten JAVA normal que esteacute basada en el SDK estaacutendar Estos pasos

requieren proceder entonces de alguna de las dos formas siguientes

1 Suponiendo que se tiene instalado el J2SE SDK en particular la versioacuten 150 habraacute que

instalar el servidor Web de aplicaciones Tomcat 5 El servidor Tomcat soporta un

contenedor Web que permite ejecutar servlets y paacuteginas JSP (de las que se hablaraacuten en

la seccioacuten siguiente) En el apeacutendice B del presente documento se muestra la manera de

No obstante existen muchos tipos de servidores aparte del Tomcat que permiten el uso de

los servlets algunos de estos son

a JavaServer Web Development Kit (JSWDK) hoy llamado JWSDP (Java Web

Services Developer Pack o Paquete de desarrollo de servicios Web de Java)

b Allaire JRun (motor para JSP y Servlet que puede ser integrado en servidores de

Netscape Enterprise o Microsoft Personal Web Server)

c ServletExec de Nwe Atlanta (Motor para JSP y Servlet que puede ser integrado

en los servidores Web maacutes populares para Solaris Windows MacOs HP-UX y

Linux

d LiteWebServer (LWS) de Gefion Software (Es un pequentildeo servidor Web

gratuito derivado de Tomcat)

e Java Web Server de Sun (Servidor totalmente gratuito escrito en JAVA

2 Suponiendo que no se tiene instalado ninguacuten software para desarrollar aplicaciones

JAVA habraacute que instalar el Java 2 Enterprise Edition Software Development Kit o J2EE

SDK Este paquete proporciona la base para desarrollar y distribuir aplicaciones

multicapa distribuidas e incluye entre otras herramientas el J2SE y un servidor de

aplicaciones (J2EE Application Server) En el apeacutendice A se muestra la manera en que

se puede instalar y la forma en la que se puede lanzar el servidor de aplicaciones La

versioacuten que se esta suponiendo se trabajaraacute es la J2EE 14 SDK que incluye el J2SE

142_02 y ejemplos ademaacutes del J2EE 14 Application Server

Para ejecutar un servlet como el del HolaMundo del ejemplo anterior teniendo ya instalados

los paquetes J2SE 150 y Tomcat 5 siga los pasos siguientes

1 antildeada a la variable de entorno path de su sistema operativo la ruta de la carpeta bin del

J2SE que tiene instalado

2 Copie el archivo servlet-apijar que se encuentra en commonlib del tomcat que tiene

instalado a jrelibext del J2SE

3 Cambie al directorio de la aplicacioacuten es decir donde se encuentra el servlet

4 Compile el servlet en el ejemplo javac HolaMundojava

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

5 Antildeada el archivo class (HolaMundoclass) que resulta de la compilacioacuten a la carpeta

webappsROOTWEB-INFclasses del Tomcat

6 Edite el archivo confwebxml del Tomcat para definir el servlet invoquer que permite

ejecutar servlets anoacutenimos

7 Arranque el servidor Tomcat (este punto debe realizarse despueacutes del paso 5 para que el

servidor reconozca la aplicacioacuten que se acaba de instalar) Si el servidor ya estaba

arrancado cuando se realizoacute el punto 4 detengalo y vuelvalo a arrancar o abra el

explorador y escriba el URL httplocalhost8080managerhtml y recargue la

aplicacioacuten

8 Una vez arrancado el servidor verifique que funciona correctamente escribiendo en el

navegador httplocalhost8080 o http1270018080 8080 es el puerto utilizado para

acceder al servidor

9 Ejecute el servlet escribiendo en el navegador el URL

httpservidor[puerto]servletnombre_servlet que en el caso del ejemplo seriacutea

httplocalhost8080servletHolaMundo

En conclusioacuten para ejecutar un servlet habraacute que copiar el archivo class que lo define

en la carpeta ROOTWEB-INFclasses de la carpeta webapps del servidor a la que tienen

acceso los clientes Web y ejecutar httpservidor[puerto]servletnombre_servlet de

forma que el servlet HolaMundo se mostrariacutea en su ejecucioacuten como en la figura siguiente

Ahora bien lo maacutes interesante es invocar a los servlets desde paacuteginas Web Se puede solicitar

la ejecucioacuten de un servlet de igual manera que pedimos un recurso cualquiera basta con

definir el URL del servlet en el punto deseado en la paacutegina Web

El siguiente ejemplo muestra un servlet que ademaacutes de generar la paacutegina HTML donde se

manda a escribir ldquoHola Mundordquo devuelve la fecha y hora del servidor Con esto se trata de

dar a entender que por una parte un servlet no tiene porque generar soacutelo paacuteginas HTML sino

que ademaacutes un servlet es capaz de generar contenido dinaacutemico incluyendo cualquier proceso

escrito que pueda ejecutar JAVA (leer o escribir archivos ejecutar programas cargas

bibliotecas etc)

import javaio

import javaxservlet

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

import javaxservlethttp

import javautil

public class Saludo extends HttpServlet

Manipular la peticioacuten enviada por el cliente

utilizando el atributo method=get

protected void doGet(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

responsesetContentType(texthtml)

PrintWriter out = responsegetWriter()

outprintln(lthtmlgt)

outprintln(ltheadgt)

outprintln(lttitlegtServlet Saludolttitlegt)

outprintln(ltheadgt)

outprintln(ltbodygt)

outprintln(ltcentergt)

for (int tamantildeo = 1 tamantildeo lt= 7 ++tamantildeo)

outprintln(ltfont size=+tamantildeo+ color=bluegt)

outprintln(iexcliexcliexclHola mundo)

outprintln(ltbrgt)

outprintln(ltbrgt)

Calendar fechahora = new GregorianCalendar()

Random rnd = new Random()

int tamantildeo = rndnextInt(7)+1

outprintln(ltfont size=+tamantildeo+gt)

outprintln(ltfont color=greengt)

outprintln(Son las +

fechahoraget(CalendarHOUR_OF_DAY) + +

fechahoraget(CalendarMINUTE) + +

fechahoraget(CalendarSECOND) )

outprintln(ltbrgt)

outprintln(ltfont color=graygt)

outprintln(Del diacutea +

fechahoraget(CalendarDAY_OF_MONTH) + +

(fechahoraget(CalendarMONTH)+1) + +

fechahoraget(CalendarYEAR) )

outprintln(ltfontgt)

outprintln(ltcentergt)

outprintln(ltbodygt)

outprintln(lthtmlgt)

outclose()

Para ejecutar este servlet llamado Saludo podemos crear una carpeta dentro de webapps por

ejemplo saludoWEB-INFclasses y copiar dentro de classes Saludoclass

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Para ejecutar el servlet Saludo tendriacuteamos entonces que escribir

httplocalhost8080SaludoservletSaludo

Pero si queremos invocar a este servlet desde una paacutegina HTML se deberaacute utilizar este

mismo URL o bien el URL relativo a la carpeta del servidor donde copiemos el archivo html

que seraacute copiado en la carpeta Saludo

El coacutedigo HTML almacenado en saludohtml deberaacute incluir una de las dos liacuteneas siguientes

lta href=rdquohttplocalhost8080Saludoservletsaludordquogt ejecutar Saludo ltagt

lta href=rdquoservletSaludordquogt ejecutar Saludo ltagt

La segunda opcioacuten es la maacutes interesante porque no depende de la direccioacuten del servidor Para

ejecutar entonces el servlet a traveacutes de saludohtml basta con escribir el URL siguiente

httplocalhost8080Saludosaludohtml

316 EMPAQUETADO DE SERVLETS

Puede darse el caso en que diversos programadores en un entorno de produccioacuten dado

podriacutean estar desarrollando servlets para el mismo servidor El colocar todos estos servlets

en el directorio principal de estos programas podriacutea dar como resultado un directorio difiacutecil

de administrar ademaacutes de que se corre el riesgo de duplicar los nombres de los servlets si

dos desarrolladores distintos eligen el mismo nombre para el programa que desarrollan Los

paquetes son la solucioacuten loacutegica a este problema El uso de paquetes tiene como resultado

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

cambios en la forma en que se generan los servlets la forma en que se compilan y en la que

se invocan Para colocar los servlets en paquetes se requieren de dos pasos

1 Mover los archivos (class) a un subdirectorio que coincida con el nombre del paquete

pretendido

2 Insertar una instruccioacuten de paquete en el archivo de clase Para ello la primera liacutenea en

el coacutedigo fuente (java) del servlet deberaacute ser package nomPaquete

Por ejemplo el fragmento siguiente de coacutedigo Java presenta una variacioacuten del Servlet

HolaMundo que se encuentra en el paquete misServlets

package misServlets

import javaio

import javaxservlet

import javaxservlethttp

public class HolaMundo extends HttpServlet

Manipular las posibles peticiones enviadas por el cliente

utilizando el atributo method=get o method=post

protected void procesarPeticion(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

responsesetContentType(texthtml)

PrintWriter out = responsegetWriter()

outprintln(lthtmlgt)

El archivo class se encontraraacute dentro de una carpeta llamada misServlets que seraacute el paquete

creado o utilizado por la aplicacioacuten en este caso del HolaMundo dependiendo si exitiacutea o no

antes de compilar la aplicacioacuten A continuacioacuten deberemos copiar dentro de la carpeta

webappsROOTWEB-INFclasses del Tomcat la carpeta misServlets junto con el

HolaMundoclass que estaraacute dentro de ella y ejecutar el servlet en el explorador escribiendo

httplocalhost8080servletmisServletsHolaMundo

317 PROCESAMIENTO DE FORMULARIOS

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Hasta este punto los servlets que hemos estudiado soacutelo enviacutean informacioacuten al navegador del

cliente No obstante estos clientes Web pueden Mostar formularios que permitan solicitar

datos a los usuarios que seraacuten enviados al servidor para por ejemplo ser almacenados en

una base de datos para posteriores peticiones o para otros procesos o bien para dar al usuario

una respuesta ajustada a dicha peticioacuten

En el siguiente URL se invoca la ejecucioacuten de un servlet llamado Parametros aportando la

lista de pares (Nombre Mario)-(Edad 22) en formato GET

httplocalhost8080ParametrosservletParametrosNombre=MarioampEdad=22

Hay que observar la manera de colocar los datos tras el siacutembolo ldquordquo y de separarlos con el

siacutembolo ldquoamprdquo El coacutedigo del servlet es el siguiente

import javaio

import javaxservlet

import javaxservlethttp

public class Parametros extends HttpServlet

public void doGet(HttpServletRequest request HttpServletResponse

response)

throws IOException ServletException

responsesetContentType(texthtml)

PrintWriter out = responsegetWriter()

outprintln(lthtmlgt)

outprintln(ltbodygt)

String NombreRecibido = requestgetParameter(Nombre)

String EdadRecibida = requestgetParameter(Edad)

outprintln(lth1gt Hola + NombreRecibido + lth1gt)

outprintln(lth1gt Tienes + EdadRecibida + antildeos lth1gt)

outprintln(ltbodygt)

outprintln(lthtmlgt)

El objeto httpServletRequest en el coacutedigo anterior request contiene una serie de meacutetodos de

utilidad para recibir informacioacuten proveniente del usuario en concreto el meacutetodo

getParameter permite obtener el valor asociado a un nombre en la lista de pares (nombre

valor) que puede proporcionar un URL

Ademaacutes de poder introducir el URL anterior en el navegador proporcionando directamente

los datos enviados al servlet en dicha URL

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Tambieacuten podemos generar el URL mediante una paacutegina Web que podraacute utilizar el usuario

lthtmlgt

ltbodygt

lth1gt Cuestionario lth1gt

ltform action=httplocalhost8080ParametrosservletParametros

method=getgt

Nombre ltinput type=text name=Nombregt ltbrgt

Edad ltinput type=text name=Edadgt ltbrgtltbrgt

ltinput type=submit value=Enviar datosgt ltbrgt

ltformgt

ltbodygt

lthtmlgt

Los formularios en HTML permiten enviar datos al servidor Web En la liacutenea 5 de la paacutegina

Web mostrada se encuentra la etiqueta form que en el ejemplo contiene el atributo action

que indica la accioacuten que debe realizarse en el servidor en este caso ejecutar el servlet

Parametros y el atributo method que indica la manera en la que se enviacutean los datos (en este

caso la peticioacuten GET)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Peticioacuten HTTP GET Cuando el tipo de peticioacuten HTTP es GET los datos del formulario

son enviados al servidor a continuacioacuten del URL especificado por el atributo action de form

El tamantildeo de la cadena enviada estaacute limitado y al estar en ASCII es totalmente legible por

tanto no es un modo seguro

Es por ello que cuando se requiere del enviacuteo de datos seguros y ademaacutes el nuacutemero de datos

del formulario que son enviados al servidor son muchos resulta ser mejor el uso del meacutetodo

POST Veamos otro ejemplo

import javaio

import javaxservlet

import javaxservlethttp

import javautil

public class MostrarParametros extends HttpServlet

public void doGet(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

responsesetContentType(texthtml)

PrintWriter out= responsegetWriter()

String titulo=Lectura de todos los paraacutemetros de Peticioacuten

outprintln(ltdoctype html public -W3CDTD HTML 40 +

TransitionalENgt)

outprintln(lthtmlgt)

outprintln(ltheadgtlttitlegt+titulo+lttitlegtltheadgt)

outprintln(ltbody bgcolor=FDF5E6gtn+

lth1 align=centergt+titulo+lth1gtn+

lttable border=1 align=centergtn+

lttr bgcolor=FFAD00gtn+

ltthgtNombre del parampaacutemetroltthgtValor(es) del

parampaacutemetro)

Enumeration nombresParam=requestgetParameterNames()

while(nombresParamhasMoreElements())

String nombreParam= (String)nombresParamnextElement()

outprint(lttrgtlttdgt+nombreParam+nltTDgt)

String[]valoresParam=

requestgetParameterValues(nombreParam)

if (valoresParamlength==1)

String valorParam=valoresParam[0]

if (valorParamlength()==0)

outprintln(ltigt Sin valor ltigt)

else

outprintln(valorParam)

else

outprintln(ltulgt)

for (int i=0 iltvaloresParamlengthi++)

outprintln(ltligt+valoresParam[i])

outprintln(ltulgt)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

outprintln(lttablegtnltbodygtlthtmlgt)

public void doPost(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

doGet(requestresponse)

El servlet escrito utiliza un meacutetodo doPost que soacutelo ejecuta a Donet Esto es porque se quiere

que el servlet pueda manejar tanto las peticiones GET como las POST Por otro lado el

formulario es el siguiente

ltdoctype html public -W3CDTD HTML 40 TransitionalENgt

lthtmlgt

ltheadgt

lttitlegt Un Formulario de ejemplo que utiliza POST lttitlegt

ltheadgt

ltbody bgcolor=FDF5E6gt

lth1 align=centergt Un formulario de Ejemplo que utiliza POST

lth1gt

ltform action=httplocalhost8080MostrarParametros

servletMostrarParametros

method=postgt

Nuacutemero de elemento ltinput type=text name=elemNumgt ltbrgt

Cantidad ltinput type=text name=cantidadgt ltbrgt

Precio Unitario ltinput type=text name=precio value=$gt

ltbrgtlthrgt

Nombre de Pila ltinput type=text name=nombrePilagt ltbrgt

Apellido(s) ltinput type=text name=apellidogt ltbrgt

Iniciales ltinput type=text name=inicialesgt ltbrgt

Domicilio de envio lttextarea name=domicilio rows=3

cols=40gtlttextareagt ltbrgt

Tarjeta de creacutedito ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta value=VisagtVisa ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta value=Master Cardgt

Master Card ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta value=AmexgtAmerican

Expresss ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta

value=DiscovergtDiscover ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta

value=Java Smart CardgtTarjeta Inteligente de Java

ltbrgt

Nuacutemero de la tarjeta de creacutedito

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltinput type=password name=numTarjetagtltbrgt

Repita el nuacutemero de la tarjeta de creacutedito

ltinput type=password name=numTarjetagtltbrgtltbrgt

ltcentergt

ltinput type=submit value=Enviar pedidogt

ltcentergt

ltformgt

ltbodygt

lthtmlgt

El formulario HTML del listado anterior utiliza POST como deberiacutea ser en todos los campos

que tienen contrasentildea

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Si intenta ejecutar el servlet MostrarParametros directamente en el explorador con el URL

httplocalhost8080MostrarParametrosservletMostrarParametros se obtendraacute la paacutegina

Web sin resultados

Peticioacuten HTTP POST Cuando el tipo de peticioacuten HTTP es POST los datos son enviados

al servidor en el cuerpo de la peticioacuten Es el meacutetodo maacutes usual de enviar los datos de un

formulario Con este tipo de peticioacuten la informacioacuten del formulario se enviacutea despueacutes del URL

indicado por action en el cuerpo de la peticioacuten y el tamantildeo de la informacioacuten enviada no esta

limitado

Seguacuten lo expuesto escoger el meacutetodo para enviar la informacioacuten no es difiacutecil Si los datos

son pocos y no importa su confidencialidad o manipulacioacuten utilizamos GET Si son largos

privados o importantes utilizamos POST

318 ACCESO A BASES DE DATOS CON SERVLETS

Una aplicacioacuten Java que realiza accesos a bases de datos funciona seguacuten una arquitectura que

permite escribir los programas abstrayeacutendose de los detalles de los niveles inferiores (discos

controladores sistema operativo etc) como lo muestra la figura siguiente

JDBC (Java DataBase Connectivity ndash Conexioacuten con Bases de Datos desde Java) es una API

de Java que permite ejecutar instrucciones SQL para manipular y gestionar bases de datos

relacionales Para que una aplicacioacuten Java pueda hacer operaciones sobre una base de datos

previamente tiene que establecer una conexioacuten con la misma Esta conexioacuten se realiza a

traveacutes de un controlador (driver) seguacuten la figura de arriba La API-JDBC se proporciona en

dos paquetes javasql y javaxsql El primer paquete contiene las interfaces y clases Java

fundamentales de JDBC en tanto que el segundo paquete es una extensioacuten del primero e

APLICACION

SISTEMA OPERATIVO

CONTROLADOR

Oracle Access MySql

JVM

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

incluye las clases que interactuacutean con JNDI y otras que gestionan conjuntos de conexiones

con una misma base de datos Para maacutes detalles del uso de JDBC veacutease el apeacutendice A de

estas notas

El primer paso para crear una conexioacuten entre una aplicacioacuten Java y una base de datos es

registrar el controlador JDBC adecuado para esa base con el fin de que la JVM pueda

utilizarlo Existen distintos tipos de controladores JDBC por ejemplo

ldquocommysqljdbcDriverrdquo que es el controlador utilizado cuando el motor de base de datos

que se utiliza es MySql

En el supuesto caso de que la base de datos soacutelo permitiera el acceso a traveacutes de controladores

ODBC como lo hace ACCESS siempre podemos usar el controlador puente JDBC-ODBC

incluido como parte del JDK ldquosunjdbcodbcJdbcOdbcDriverrdquo Este tipo de controladores

es decir los basados en ODBC (Open DataBase Connectivity) son bastante utilizados en

entornos Windows pues este SO incluye ODBC El apeacutendice A describe al final como

administrar los oriacutegenes de datos ODBC en Windows

Asiacute pues la mayor ventaja de los servlets con respecto a la conexioacuten con bases de datos viacutea

JDBC es que su ciclo de vida les permite mantener conexiones abiertas con las mismas a lo

largo de toda una sesioacuten Esto permite recortar tiempo con respecto a otras tecnologiacuteas como

la CGI Ademaacutes JDBC es una tecnologiacutea independiente de las bases de datos

Como ejemplo vamos a implementar una simple aplicacioacuten Web basada en servlets que

muestre una especie de directorio de personas La aplicacioacuten podraacute consultar insertar

modificar borrar o listar la informacioacuten de cada una de las personas almacenadas en la base

de datos a la que se hace acceso (que estaraacute en formato access)

La estructura de la Base de Datos es una tabla con los siguientes campos

DNI Nombre Apellido Edad

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

53023767A Pedro Rubio 18

77459822P Luis Tejedor 47

123456MRL Mario Rossainz 35

La estructura de la aplicacioacuten se muestra en la figura siguiente

lthtmlgt

ltbodygt

lttable border=1gtlttrgtlttdgt

ltform action=httplocalhost8080directorioTelservletSvAccesoBD

method=getgt

DNI ltinput type=text name=DNIgt ltbrgt

Nombre ltinput type=text name=Nombregt ltbrgt

Apellido ltinput type=text name=Apellidogt ltbrgt

Edad ltinput type=text name=Edadgt ltbrgtltbrgt

ltinput type=submit value=Consultar name=BotonConsultargt

ltinput type=submit value=Insertar name=BotonInsertargt

ltinput type=submit value=Modificar name=BotonModificargt

ltinput type=submit value=Borrar name=BotonBorrargt

ltinput type=submit value=Listar name=BotonListargt ltbrgt

ltcentergt

ltinput type=submit value= |lt name=BotonPrimerogt

ltinput type=submit value= -- name=BotonMenosCincogt

ltinput type=submit value= - name=BotonAnteriorgt

ltinput type=submit value= + name=BotonSiguientegt

ltinput type=submit value= ++ name=BotonMasCincogt

ltinput type=submit value= gt| name=BotonUltimogt

ltcentergt

lttdgt

lttdgt

lttextarea name=AreaDeListado rows=10 cols=35gtlttextareagt

SvAccesoBDhtml

SvAccesoBD

ObBorrado ObListado ObConsulta

ObInsercion

ObModificacion

ObPosicionamiento

ObRegistro

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lttdgt

lttrgt

ltformgt

lttablegt

ltbodygt

lthtmlgt

SvAccesoBDhtml

import javaio

import javaxservlet

import javaxservlethttp

public class SvAccesoBD extends HttpServlet

private int PosicionBuscada = 1

private String AreaDeListado=

PrintWriter out

public void doGet(HttpServletRequest request HttpServletResponse response)

throws IOException ServletException

String DNI = requestgetParameter(DNI)

String Nombre = requestgetParameter(Nombre)

String Apellido = requestgetParameter(Apellido)

String Edad = requestgetParameter(Edad)

String BotonConsultar = requestgetParameter(BotonConsultar)

String BotonInsertar = requestgetParameter(BotonInsertar)

String BotonModificar = requestgetParameter(BotonModificar)

String BotonBorrar = requestgetParameter(BotonBorrar)

String BotonListar = requestgetParameter(BotonListar)

String BotonPrimero = requestgetParameter(BotonPrimero)

String BotonMenosCinco = requestgetParameter(BotonMenosCinco)

String BotonAnterior = requestgetParameter(BotonAnterior)

String BotonSiguiente = requestgetParameter(BotonSiguiente)

String BotonMasCinco = requestgetParameter(BotonMasCinco)

String BotonUltimo = requestgetParameter(BotonUltimo)

AreaDeListado = requestgetParameter(AreaDeListado)

responsesetContentType(texthtml)

out = responsegetWriter()

outprintln(lthtmlgt)

outprintln(ltbodygt)

if (BotonConsultar=null) ConsultarDatos(DNI)

if (BotonInsertar=null) InsertarDatos(DNINombreApellidoEdad)

if (BotonModificar=null) ModificarDatos(DNINombreApellidoEdad)

if (BotonBorrar=null) BorrarDatos(DNI)

if (BotonListar=null) ListarDatos(DNI)

if (BotonPrimero=null) Controles(1)

if (BotonMenosCinco=null) Controles(2)

if (BotonAnterior=null) Controles(3)

if (BotonSiguiente=null) Controles(4)

if (BotonMasCinco=null) Controles(5)

if (BotonUltimo=null) Controles(0)

outprintln(ltbodygt)

outprintln(lthtmlgt)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

private void ConsultarDatos(String DNI)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObRegistro InstanciaFila = InstanciaConsultaDameDatos()

GenerarRespuesta(InstanciaFilaDameDNI()InstanciaFilaDameNombre()

InstanciaFilaDameApellido()

StringvalueOf(InstanciaFilaDameEdad()))

else

GenerarRespuesta(DNI------------)

PosicionBuscada = 1

public void ListarDatos(String DNI)

ObListado InstanciaListado = new ObListado()

AreaDeListado = InstanciaListadoDameResultado()

ConsultarDatos(DNI)

PosicionBuscada = 1

public void BorrarDatos(String DNI)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObBorrado InstanciaBorrado = new ObBorrado(PosicionBuscada)

GenerarRespuesta()

else

GenerarRespuesta(----------------)

PosicionBuscada = 1

public void ModificarDatos(String DNI String Nombre String Apellido

String Edad)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObRegistro InstanciaFila = new ObRegistro(DNI Nombre Apellido

IntegerparseInt(Edad))

ObModificacion InstanciaModificacion = new ObModificacion(PosicionBuscada

InstanciaFila)

GenerarRespuesta(DNINombreApellidoEdad)

else

GenerarRespuesta(----------------)

PosicionBuscada = 1

public void InsertarDatos(String DNI String Nombre String Apellido

String Edad)

ObRegistro InstanciaFila = new ObRegistro(DNI Nombre Apellido

IntegerparseInt(Edad))

ObInserccion InstanciaInserccion = new ObInserccion(InstanciaFila)

GenerarRespuesta()

PosicionBuscada=1

public void Controles(String Identificador)

ObPosicionamiento InstanciaPosicionamiento =

new ObPosicionamiento(IdentificadorPosicionBuscada)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ObRegistro InstanciaFila = InstanciaPosicionamientoDameDatos()

GenerarRespuesta(InstanciaFilaDameDNI()InstanciaFilaDameNombre()

InstanciaFilaDameApellido()

StringvalueOf(InstanciaFilaDameEdad()))

PosicionBuscada = InstanciaPosicionamientoPosicion()

private void GenerarRespuesta(String DNI String Nombre String Apellido

String Edad)

outprintln(lttable border=1gt)

outprintln(lttrgt)

outprintln(lttdgt)

outprintln(ltform

action=httplocalhost8080directorioTelservletSvAccesoBD

method=getgt)

outprintln( DNI ltinput type=text name=DNI value=+DNI+gtltbrgt)

outprintln( Nombre ltinput type=text name=Nombre

value=+Nombre+gtltbrgt)

outprintln( Apellido ltinput type=text name=Apellido

value=+Apellido+gtltbrgt)

outprintln( Edad ltinput type=text name=Edad

value=+Edad+gtltbrgtltbrgt)

outprintln( ltinput type=submit value=Consultar

name=BotonConsultargt)

outprintln( ltinput type=submit value=Insertar

name=BotonInsertargt)

outprintln( ltinput type=submit value=Modificar

name=BotonModificargt)

outprintln( ltinput type=submit value=Borrar name=BotonBorrargt)

outprintln( ltinput type=submit value=Listar name=BotonListargt

ltbrgt)

outprintln( ltcentergt)

outprintln( ltinput type=submit value= |lt name=BotonPrimerogt)

outprintln( ltinput type=submit value= --

name=BotonMenosCincogt)

outprintln( ltinput type=submit value= - name=BotonAnteriorgt)

outprintln( ltinput type=submit value= +

name=BotonSiguientegt)

outprintln( ltinput type=submit value= ++

name=BotonMasCincogt)

outprintln( ltinput type=submit value= gt| name=BotonUltimogt)

outprintln( ltcentergt)

outprintln( lttdgt)

outprintln( lttdgt)

outprintln( lttextarea name=AreaDeListado rows=10

cols=35gt+AreaDeListado+lttextareagt)

outprintln( lttdgt)

outprintln( lttrgt)

outprintln( ltformgt)

outprintln( lttablegt)

SvAccesoBDjava

import javasql

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

public class ObBorrado

ObBorrado(int PosicionBuscada)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

Personasabsolute(PosicionBuscada)

PersonasdeleteRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

ObBorradojava

import javasql

import javaawtTextArea

public class ObListado

private String Resultado=

ObListado()

String DNI Nombre Apellido Linea

int Edad Posicion

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement()

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

while (Personasnext())

DNI = PersonasgetString(DNI)

Nombre = PersonasgetString(Nombre)

Apellido = PersonasgetString(Apellido)

Edad = PersonasgetInt(Edad)

Posicion = PersonasgetRow()

Linea = DNI+ +Nombre+ +Apellido+ +StringvalueOf(Edad)

Resultado=Resultado+StringvalueOf(Posicion)+ +Linea+n

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public String DameResultado()

return Resultado

ObListadojava

public class ObRegistro

private String DNI Nombre Apellido

private int Edad

ObRegistro (String DNI String Nombre String Apellido int Edad)

thisDNI = DNI

thisNombre = Nombre

thisApellido = Apellido

thisEdad = Edad

String DameDNI()

return DNI

String DameNombre()

return Nombre

String DameApellido()

return Apellido

int DameEdad()

return Edad

ObRegistrojava

import javasql

public class ObConsulta

private int Posicion = 0

private ObRegistro DatosPersona

ObConsulta(String DNIPedido)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement()

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

while (Personasnext())

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

String DNI = PersonasgetString(DNI)

if (DNIequalsIgnoreCase(DNIPedido))

Posicion = PersonasgetRow()

String Nombre = PersonasgetString(Nombre)

String Apellido = PersonasgetString(Apellido)

int Edad = PersonasgetInt(Edad)

DatosPersona = new ObRegistro(DNINombreApellidoEdad)

break

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public int PosicionEncontrada()

return Posicion

public ObRegistro DameDatos()

return DatosPersona

ObConsultajava

import javasql

public class ObInserccion

ObInserccion(ObRegistro Datos)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

PersonasmoveToInsertRow()

PersonasupdateString(DNI DatosDameDNI())

PersonasupdateString(NombreDatosDameNombre())

PersonasupdateString(Apellido DatosDameApellido())

PersonasupdateInt(EdadDatosDameEdad())

PersonasinsertRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

catch (SQLException e)

Systemoutprintln(e)

ObInsercionjava

import javasql

public class ObModificacion

ObModificacion(int PosicionBuscada ObRegistro Datos)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

Personasabsolute(PosicionBuscada)

PersonasupdateString(DNIDatosDameDNI())

PersonasupdateString(NombreDatosDameNombre())

PersonasupdateString(ApellidoDatosDameApellido())

PersonasupdateInt(EdadDatosDameEdad())

PersonasupdateRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

ObModificacionjava

import javasql

public class ObPosicionamiento

private ObRegistro DatosPersona

private int Posicion

ObPosicionamiento(String Accion int Posicion)

int IDAccionEdad

String DNINombreApellido

boolean PosicionCorrecta=false

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

FROM DatosPersonales)

Personasabsolute(Posicion)

IDAccion = IntegerparseInt(Accion)

switch (IDAccion)

case 0

PosicionCorrecta = Personaslast()

break

case 1

PosicionCorrecta = Personasfirst()

break

case 2

PosicionCorrecta = Personasrelative(-5)

break

case 3

PosicionCorrecta = Personasprevious()

break

case 4

PosicionCorrecta = Personasnext()

break

case 5

PosicionCorrecta = Personasrelative(+5)

break

if (PosicionCorrecta)

thisPosicion = PersonasgetRow()

DNI = PersonasgetString(DNI)

Nombre = PersonasgetString(Nombre)

Apellido = PersonasgetString(Apellido)

Edad = PersonasgetInt(Edad)

else

thisPosicion = Posicion

DNI = ----

Nombre = ----

Apellido = ----

Edad = 0

DatosPersona = new ObRegistro(DNINombreApellidoEdad)

Personasclose()

Conexionclose()

SentenciaSQLclose()

Systemoutprintln(StringvalueOf(Posicion)++StringvalueOf(thisPosicion))

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public int Posicion()

return Posicion

public ObRegistro DameDatos() return DatosPersona

ObPosicionamientojava

En este ejemplo se emplean servlets y paacuteginas Web Los clientes habitualmente trabajan en

una computadora remota y los programas se ejecutan en un servidor El mecanismo de

comunicaciones que soporta el protocolo http nos permite consultar en el servidor los datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

que ha seleccionado o escrito el usuario de esta manera se puede observar una disociacioacuten

entre la interfaz graacutefica de usuario (que se ejecuta en los equipos de los clientes) y el

programa que recoge los datos y ejecuta las acciones pertinentes (que se ejecuta en el

servidor)

Como puede observarse el coacutedigo SvAccessoBD es un servlet que lleva a cabo las siguientes

operaciones

1 Recoge los valores provenientes del usuario

2 Determina la naturaleza de la accioacuten a realizar

3 Realiza su cometido con la base de datos

4 Genera la respuesta que recibiraacute el usuario

32 JSP

JSP significa Java Server Pages que traducido quiere decir Paacuteginas de Servidor Java y es

por tanto una tecnologiacutea orientada a crear paacuteginas Web con programacioacuten en JAVA es decir

permite mezclar HTML estaacutendar y estaacutetico con un contenido dinaacutemico etiquetas especiales

(oacuterdenes) y trozos de coacutedigo JAVA (scriptlets o secuencias de oacuterdenes) o contenido dinaacutemico

generado por servlets Eacuteste contenido dinaacutemico se encuentra encerrado en etiquetas

especiales muchas de las cuales inician con lt y finalizan con gt El motor de las paacuteginas

JSP esta basado en los servlets de JAVA

En la tecnologiacutea JSP se crean paacuteginas parecidas a las paacuteginas que se crean en ASP (Active

Server Page de Microsoft) o PHP (Personal Home Page) que son dos tecnologiacuteas de paacuteginas

ejecutadas en el servidor Sin embargo JSP no se cintildee a un sistema operativo o servidor Web

en particular ademaacutes de que proporciona acceso a la tecnologiacutea de Servlets y a JAVA en la

parte dinaacutemica

El proceso para generar paacuteginas JSP accesibles en Web es mucho maacutes simple que en los

servlets Dando por hecho que se tiene un servidor Web que permite usar JSP el coacutedigo se

almacenaraacute en archivos con extensioacuten jsp que incluyen dentro de la estructuras de etiquetas

HTML las sentencias JAVA a ejecutar y tan soacutelo se colocaraacuten en cualquier lugar en donde

se pusiera una paacutegina Web normal sin compilacioacuten sin paquetes y sin configuracioacuten aunque

el servidor tendraacute que ser configurado para acceder a los archivos de clases Servlets y de

JSPs

Aunque lo que se escriba con frecuencia luciraacute como un archivo HTML estaacutendar detraacutes de

ello la paacutegina JSP se convierte automaacuteticamente en un servlet normal donde el HTML

estaacutetico tan soacutelo es enviado al flujo de salida asociado con el meacutetodo service del servlet Esta

traduccioacuten se realiza la primera vez que se solicita la paacutegina De acuerdo como este

configurado el servidor es posible ver el coacutedigo fuente de los servlets generados a partir de

sus paacuteginas JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Por ejemplo supongamos que se ha escrito el siguiente coacutedigo en el archivo Saludojsp

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtEjemplo JSPlttitlegtltheadgt

ltbody bgcolor=ffffccgt

ltcentergt

lth2gtHola mundolth2gt

ltjavautilDate hoy = new javautilDate()gt

La fecha de hoy es lt=hoygt

ltcentergt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional y un fragmento de un scriptlet de JAVA La etiqueta

lt identifica el comienzo del scriptlet y gt el final Una expresioacuten de la forma =variable

es sustituida por el valor de esa variable Para ejecutar esta paacutegina o cualquier otra paacutegina

JSP desde un navegador hay que instalarla en el servidor de aplicaciones de la misma manera

en como se hizo con los servlets Suponiendo entonces que se tiene instalado el Tomcat 5

siga los siguientes pasos

1 Antildeadir en el servidor la carpeta digamos JSP2 dentro de la carpeta webapps del Tomcat

y construir sobre ella la jerarquiacutea de clases ya conocida de los servlets

webappsrarrJSP2rarrWEB-INFrarrclasses

WEB-INFrarrlib

WEB-INFrarrtags

2 Editar en la carpeta WEB-INF el descriptor de despliegue webxml que se indica a

continuacioacuten Este archivo XML indica doacutende se localiza el esquema XML para la

especificacioacuten Servlet 24 que a suvez utiliza el esquema XML para la especificacioacuten

Java Server Page 20 que son las especificaciones que soporta en servidor Tomcat

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=

httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

3 Crear en JSP2 la carpeta saludo que contendraacute la aplicacioacuten y copiar en ella la paacutegina

Saludojsp

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

4 Arrancar el servidor Si el servidor ya estaba arrancado detenerlo y volverlo a arrancar o

bien abrir el explorador escribir el URL httplocalhost8080managerhtml e instalar

la aplicacioacuten

5 Una vez arrancado el servidor verificar si estaacute funcionando correctamente escribiendo

el URL siguiente en el explorador httplocalhost8080 El explorador debe mostrar la

paacutegina del Tomcat

6 Ejecutar la paacutegina JSP iniciando el explorador y escribiendo el URL siguiente

httplocalhost8080JSP2saludoSaludojsp donde la sintaxis geneacuterica es

httpservidor[puerto]MiCarpetapaginajsp

Cuando esta paacutegina (Saludojsp) es invocada por primera vez el motor JSP lleva a cabo una

fase de traduccioacuten de la misma en un servlet y el motor Servlet es el que ejecutaraacute eacuteste uacuteltimo

para generar el HTML dinaacutemico que seraacute enviado al explorador cliente seguacuten puede

deducirse de la figura siguiente La proacutexima vez que la paacutegina sea solicitada el motor JSP

ejecutaraacute el servlet que fue caragado la primera vez a no ser que la paacutegina haya cambiado

en cuyo caso seraacute compilada automaacuteticamente en un nuevo servlet y ejecutada

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Regresando al ejemplo el archivo java generado por el Tomcat a partir del archivo

Saludojsp se localiza en la carpeta workCatalinalocalhost de la instalacioacuten de Tomcat

321 ELEMENTOS PARA SECUENCIAS DE COMANDOS

Los elementos para secuencias de comandos permiten insertar coacutedigo en el servlet que seraacute

generado a partir de la paacutegina JSP Existen tres formas

1 Expresiones del tipo lt= expresioacuten gt que se evaluacutean e insertan en el resultado del

servlet

2 Los scriptlets del tipo lt codigo gt que se insertan en el meacutetodo _jspService del

servlet (ejecutado por service)

3 Las declaraciones del tipo lt Codigo gt que se insertan en el cuerpo de la clase del

servlet fuera de cualquier meacutetodo existente

NOTA Los comentarios en JSP se escriben lt-- Comentario JSP --gt en tanto que los

comentarios en HTML son de la forma lt--Comentario HTML --gt La diferencia

semaacutentica radica en que los comentarios HTML cuando se insertan en la respuesta enviada

por el servidor al cliente no se muestran cuando se visualiza el documento HTML pero si

Servidor Maacutequina Cliente

Explorador Web

Contenedor Web

Motor Servlet

Motor JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

los podemos ver cuando se visualiza el coacutedigo fuente en tanto que los comentarios JSP

aunque se inserten en la respuesta enviada por el servidor al cliente no son enviados al

explorador de forma que tampoco se muestran ni se ven cuando se visualiza el coacutedigo fuente

HTML desde el explorador

3211 EXPRESIONES

Se utiliza una expresioacuten JSP para insertar valores directamente en el resultado La sintaxis es

lt= expresioacuten gt Por ejemplo

lt= requestgetParameter(ldquoparNombre) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt lt= s gt

La fecha y hora actual es lt= new javautilDate() gt

La expresioacuten se evaluacutea se convierte a cadena y se inserta en la paacutegina Esta evaluacioacuten se

realiza durante la ejecucioacuten

32111 VARIABLES PREDEFINIDAS

Para simplificar estas expresiones se pueden utilizar cierta cantidad de variables

predefinidas Estos objetos impliacutecitos como tambieacuten se les llama estaacuten disponibles para su

uso durante la implementacioacuten de una paacutegina Web

bull pageContext Es un objeto de la clase PageContext que proporciona acceso a objetos

relacionados con los servlets

bull request Es un objeto de la clase HttpServletRequest que se puede obtener a traveacutes del

meacutetodo getRequest que encapsula los datos enviados por el cliente al servidor

bull response Es un objeto de la clase HttpServletResponse que puede obtenerse a traveacutes

del meacutetodo getResponse que encapsula los datos que el servidor enviaraacute al cliente

bull application Es un objeto de la clase ServletContext que se obtiene a traveacutes del meacutetodo

getServletContext que define un conjunto de meacutetodos que todo servlet utiliza para

comunicar con el contenedor de servlets

bull config Es un objeto de la clase ServletConfig que se obtiene a traveacutes del meacutetodo

getServletConfig y que se utiliza por el contenedor de servlets para pasar informacioacuten

al servlet durante la iniciacioacuten

bull session Es un objeto de la clase HttpSession que se obtiene a traveacutes del meacutetodo

getSession que proporciona una forma de identificar a un usuario que visita las paacuteginas

de un sitio Web

bull out Es un objeto de la clase JspWriter que se obtiene a traveacutes del meacutetodo getOut que

se utiliza para almacenar la respuesta que seraacute enviada al cliente que hizo la peticioacuten de

la paacutegina

bull page Es un objeto geneacuterico de la clase Object que se obtiene a traveacutes del meacutetodo

getPage y que representa al servlet obtenido a partir de la paacutegina JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

bull exception Es un objeto de la clase Exception que se obtiene a traveacutes del meacutetodo

getException que contendraacute informacioacuten a cerca de cualquier excepcioacuten que se lance

desde la paacutegina JSP

Un ejemplo del uso de uno de estos objetos impliacutecitos seriacutea el siguiente

El nombre de tu host es lt= requestgetRemoteHost() gt

El listado siguiente da un ejemplo de una paacutegina JSP que utiliza algunas variables

predefinidas como uso de expresiones JSP

ltDOCTYPE HTML PUBLIC -W3CDTD HTML 40 Transitional ENgt

lthtmlgt

ltheadgt

lttitlegt Expresiones JSP lttitlegt

ltheadgt

ltbodygt

lth2gt Expresiones JSP lth2gt

ltULgt

ltligt Fecha y hora en curso lt= new javautilDate() gt ltligt

ltligt Nombre de su host lt= requestgetRemoteHost() gt ltligt

ltligt Identificador de su sesioacuten lt= sessiongetId() gt ltligt

ltligt El paraacutemetro ltcodegt paramPrueba ltcodegt del formulario

lt= requestgetParameter(paramPrueba) gt ltligt

ltULgt

ltbodygt

lthtmlgt

Cuya salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3212 LOS SCRIPTLETS JSP

Si se desea hacer algo maacutes complejo que una simple expresioacuten los scriptlets permiten insertar

coacutedigo JAVA en el meacutetodo _jspService del servlet (que es ejecutado por service) La sintaxis

utilizada por los scriptlets es lt coacutedigo java gt Los escriptlets tienen acceso a las

mismas variables definidas de forma automaacutetica como expresiones A manera de ejemplo si

se desea que el resultado aparezca en la paacutegina generada deberiacutea de utilizarse la variable out

como en la siguiente instruccioacuten

lt String datosConsultados= requestgetQueryString()

outprintln(ldquoDatos GET adjuntos ldquo+datosConsultados)

gt

En este ejemplo podriacutea haberse obtenido el mismo resultado utilizando la siguiente expresioacuten

JSP

Datos GET adjuntos lt=requestgetQueryString() gt

En general los scriptlets pueden ejecutar varias tareas que no podriacutean realizarse con las

expresiones Tales tareas incluyen

bull La determinacioacuten de encabezados de respuesta

bull Actualizacioacuten de Bases de Datos

bull Ejecucioacuten de bucles condiciones y otras estructuras complejas

lt for (int i=1 ilt=6 i++)

gt

lth lt=i gtgt Hola Mundo lthlt=i gtgt

lt gt

Como un ejemplo concreto se muestra la siguiente paacutegina JSP llamada Cuentajsp en donde

se observa coacutemo se hace un seguimiento del nuacutemero de veces que un cliente accede a esta

paacutegina a traveacutes de distintas sesiones Para ello supondremos que dicha cuenta es el valor del

atributo atrCuenta del objeto impliacutecito application ya citado La primera vez que el cliente

accede a la paacutegina el valor de atrCuenta seraacute null debido a que auacuten no ha sido fijado este

atributo en este caso se fijaraacute con el valor 1 En los siguientes accesos se leeraacute el valor del

atributo atrCuenta se incrementaraacute en una unidad y se volveraacute a fijar Finalmente se enviacutea

la respuesta al cliente para que se muestre al usuario el valor del contador

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en el objeto impliacutecito application con el nombre

atrCuenta

--gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt

Integer cuenta = (Integer)applicationgetAttribute(atrCuenta)

String s = vez

if (cuenta == null)

cuenta = new Integer(1)

else

cuenta = new Integer(cuentaintValue() + 1)

s = veces

applicationsetAttribute(atrCuenta cuenta)

gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

Has visitado esta paacutegina lt= cuenta gt lt= s gt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional un fragmento de coacutedigo JAVA o scriptlet

expresiones y comentarioshellip

Aquiacute otro ejemplo de la ejecucioacuten de un coacutedigo demasiado complejo para una expresioacuten JSP

Este listado presenta una paacutegina JSP que utiliza el paraacutemetro de peticioacuten colorFondo para

establecer el color de fondo de la paacutegina

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgt

lttitlegt Prueba de Color lttitlegt

ltheadgt

lt

String colorFondo=requestgetParameter(colorFondo)

boolean tieneColorExplicito

if (colorFondo =null)

tieneColorExplicito=true

else

tieneColorExplicito=false

colorFondo=WHITE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt

ltbody bgcolor=lt= colorFondo gtgt

lth2 align=centergt Prueba de color lth2gt

lt

if (tieneColorExplicito)

outprintln(Ha indicado un color de fondo expliacutecito +

colorFondo +)

else

outprintln(Usareacute el color de fondo predeterminado WHITE +

Indique el atributo de peticioacuten

ltigtcolorFondoltigt+

para intentar un color estaacutendar un +

valor RRGGBB o para ver si el navegador Web +

permite el uso de nombres de color X11)

gt

ltbodygt

lthtmlgt

Cuyas posibles salidas son

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3213 DECLARACIONES JSP

Una declaracioacuten JSP permite definir meacutetodos o campos que seraacuten insertados en el cuerpo

principal de la clase del servlet (fuera del meacutetodo _jspService) Una declaracioacuten tiene la

sintaxis lt Coacutedigo Java gt Por ejemplo

lt int i=0 gt

lt

Public void jspinit()

coacutedigo de iniciacioacuten

gt

Una declaracioacuten no genera ninguacuten resultado y se usan junto con las expresiones JSP o los

scriptlets A continuacioacuten se muestra una paacutegina JSP que despliega la cantidad de veces que

se ha solicitado esta paacutegina desde que se arrancoacute el servidor haciendo uso de las

declaraciones JSP

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtDeclaraciones JSPlttitlegtltheadgt

ltbodygt

lth1gtDeclaraciones JSPlth1gt

lt-- Esto es un comentario en JSP --gt

lt private int recuentoAccesos=0 gt

lth2gt Accesos a la paacutegina desde el reinicio del servidor

lt= ++recuentoAccesos gt lth2gt

ltbodygt

lthtmlgt

La salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

322 EL LENGUAJE DE EXPRESION EN JSP 20

Anteriormente se ha visto la necesidad de utilizar fragmentos de coacutedigo java en el desarrollo

de paacuteginas JSP pero con la aparicioacuten de la especificacioacuten JSP 20 ya no hay necesidad de

utilizar fragmentos de coacutedigo Java para nada gracias al nuevo lenguaje de expresioacuten EL

(Expresioacuten Language) a la biblioteca de etiquetas estandar JSTL (JSP Standar Tag Library)

y a las nuevas formas para desarrollar etiquetas personalizadas

El lenguaje de expresioacuten JSP es maacutes un lenguaje de acceso a datos que un lenguaje de

programacioacuten Ya se ha visto que para pasar informacioacuten de un cliente a una paacutegina JSP se

utilizan paraacutemetros en la peticioacuten y atributos en la paacutegina El lenguaje de expresioacuten lo hace

posible sin tener que utilizar scriptlets o expresiones (lt= expresioacuten gt) Por ejemplo las

liacuteneas JSP 12 siguientes escritas utilizando coacutedigo Java

lt= requestgetParameter(ldquoparNombrerdquo) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt veces

bajo la especificacioacuten JSP 20 se pueden escribir de una forma maacutes sencilla como sigue

(ahora no se trata de coacutedigo JAVA)

$paramparNombre has visitado esta paacutegina

$atrCuenta veces

La sintaxis de JSP es sensible a mayuacutesculas y minuacutesculas pero un par de comillas simples es

equivalente a un par de comillas dobles

3221 VARIABLES PREDEFINIDAS (Objetos Impliacutecitos)

El lenguaje de expresioacuten JSP 20 soporta los objetos impliacutecitos siguientes

pageContext Objeto de javaxservletjspPageContext que proporciona acceso a los

datos de una peticioacuten

param Coleccioacuten (objeto de tipo javautilMap) de todos los valores de los paraacutemetros

enviados en una peticioacuten un String por paraacutemetro

paramValues Coleccioacuten de todos los valores de los paraacutemetros enviados en una

peticioacuten una matriz de tipo String por paraacutemetro

header Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten un

String por cabecera

headerValues Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten

una matriz de tipo String por cabecera

cookie Coleccioacuten de todos los valores de las cookies un objeto javaxservlethttpCookie

por cookie

initParam Coleccioacuten de todos los valores de los paraacutemetros de iniciacioacuten de la

aplicacioacuten un String por paraacutemetro

Tambieacuten hay objetos que permiten acceder a variables definidas en diferentes aacutembitos lo que

posibilita compartir informacioacuten

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

pageScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de paacutegina

requestScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

peticioacuten

sessionScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de sesioacuten

applicationScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

aplicacioacuten

3222 DIRECTRICES

Las directrices page incluye y taglib son mensajes para el motor JSP y son siempre incluidas

entre los siacutembolos lt y gt

32221 LA DIRECTRIZ PAGE

Define atributos que se aplican a toda la paacutegina JSP donde es incluida

lt page lista_de_atributos gt

Donde la lista_de_atributos puede contener algunos de los siguientes (aquellos que estaacuten

escritos en negrita son los tomados por omisioacuten)

language= ldquoscriptingLanguagerdquo

extends= rdquoclassNamerdquo

import= ldquoimportListrdquo

session= ldquotrue|falserdquo

buffer= ldquonone|sizeKb

autoflush= ldquotrue|falserdquo

isThreadSafe= rdquotrue|falserdquo

info= rdquoinfo_textrdquo

errorPage= ldquoerror_urlrdquo

isErrorPage= rdquotrue|falserdquo

contentType= rdquoctinfordquo

pageEncoding= rdquopeinfordquo

isELIgnored= ldquotrue|falserdquo

Tiacutepicamente se localiza al principio de la paacutegina JSP y puede haber cualquier nuacutemero de

ellas El lenguaje por omisioacuten es Java Ejemplos

lt page contentType=rdquotexthtmlrdquo language=rdquojavardquo gt

lt page import=rdquojavautil javalangrdquo gt

lt page buffer=rdquo5kbrdquo autoflush=rdquofalserdquo gt

32222 LA DIRECTRIZ INCLUDE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

La directriz include incluye un archivo (html jsp xml o de texto) en una paacutegina JSP Esto

permite dividir el contenido de la paacutegina en trozos maacutes manejables

lt incluye file=rdquoURL_relativordquo gt

El ejemplo siguiente muestra dos archivos el primero incluye al segundo para mostrar la

fecha y hora actuales

lt-- fichero mostrarFechaHorajsp --gt

lthtmlgt

ltheadgtlttitlegtIncluir un ficherolttitlegtltheadgt

ltbody bgcolor=whitegt

ltfont color=bluegt

La fecha y hora actuales son

lt include file=fechaHorajsp gt

ltfontgt

ltbodygt

lthtmlgt

lt-- fichero fechaHorajsp --gt

lt page import=javautil gt

lt= (new javautilDate())toLocaleString() gt

32223 LA DIRECTRIZ TAGLIB

La directriz taglib indica la biblioteca de acciones personalizadas que podremos utilizar en

la codificacioacuten de la paacutegina JSP Para distinguir esas acciones entre otras existentes se utiliza

un prefijo (prefix) Su sintaxis es

lt taglib (uri=rdquoURI_bibliotecardquo|tagdir=rdquoDir_biblioteca_tagrdquo)

prefix=rdquoprefijordquo gt

Cuando se trata de una biblioteca definida mediante una clase Java y un descriptor (archivo

tld) eacutesta se identifica mediante un URI (Uniform Resource Identifier- URL relativos) Por

ejemplo

lt taglib uri=rdquohttpMarioRossainzLopezmiBibliotecardquo

prefix=rdquofunrdquo gt

ltpgtltfunaccion01 gt

La uacuteltima liacutenea del ejemplo tiene dos etiquetas una etiqueta p HTML y otra accion01

perteneciente a la biblioteca miBiblioteca En cambio si la biblioteca se define mediante un

archivo tag entonces se identifica mediante su ruta relativa en el sistema de archivos

lt taglib tagdir=rdquoWEB-INFtagsrdquo prefix=rdquofunrdquo gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpgtltfunaccion01 gt

La directriz taglib debe colocarse antes de utilizar en la paacutegina JSP las acciones

personalizadas definidas por la misma Se puede utilizar maacutes de una directriz pero el prefijo

utilizado debe ser uacutenico para cada una de ellas

3223 ACTIVACION DEL LENGUAJE DE EXPRESION (LE)

La especificacioacuten JSP 20 define un lenguaje de expresioacuten como alternativa a elementos de

programacioacuten escritos con coacutedigo Java y especificaciones anteriores a la JSP 20 Para que

este lenguaje pueda ser interpretado tienen que cumplirse 2 requisitos

1 Que la propiedad isELIgnored de la directriz page valga false

lt page isELIgnored= ldquofalserdquo gt

2 Que el descriptor de despliegue webxml en la carpeta WEB-INF indique doacutende se

localiza el esquema XML para la especificacioacuten Servlet 24 que a su vez utiliza el

esquema XML para la especificacioacuten Java Server Page 20

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

Utilizando el lenguaje de expresioacuten se podriacutea modificar la paacutegina Cuentajsp de la seccioacuten

3212 de este documento como se muestra a continuacioacuten Esta nueva paacutegina

1 Especifica que utilizaraacute la biblioteca core de etiquetas estandar (de la que se hablaraacute maacutes

adelante)

2 La primera vez que sea accedida definiraacute la variable atrCuenta en el aacutembito de la

aplicacioacuten con un valor inicial nulo y la incrementaraacute en una unidad cuando sea accedida

sucesivas veces simplemente incrementaraacute esta variable en una unidad

3 Finalmente mostraraacute una paacutegina con un contenido anaacutelogo al siguiente Esta formado

por una cabecera y una segunda liacutenea compuesta por el valor del paraacutemetro parNombre

enviado con la peticioacuten un texto fijo el valor de la variable atrCuenta y otro texto fijo

dependiente del valor de esta variable

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

El coacutedigo completo es el siguiente

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

3224 VARIABLES Y EXPRESIONES

Para acceder a una simple variable se puede escribir algo como lo siguiente $nombre y

para acceder a una propiedad de un objeto podemos escribir algo como

$paramparNombre

$applicationScopeatrCuenta

$pageContextrequestrequestURI

La primera liacutenea del ejemplo anterior obtiene el valor de la propiedad parNombre del objeto

param la segunda el valor del atributo atrCuenta del objeto applicationScope y la tercera

el URL relativo de la paacutegina JSP solicitada

El lenguaje de expresioacuten es maacutes tolerante con respecto a las variables con valor null y ejecuta

muchas maacutes conversiones de forma automaacutetica sobre el tipo de los datos cuando la expresioacuten

a evaluar asiacute lo requiere Por ejemplo la etiqueta condicional siguiente incluye una expresioacuten

que compara el valor del atributo atrCuenta con aacutembito de aplicacioacuten con 10 (convirtiendo

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

impliacutecitamente el valor del atributo al tipo de la constante para poder realizar la comparacioacuten

El resultado seraacute un valor de tipo boolean

ltcif test=rdquo$applicationScopeatrCuenta gt 10rdquogt

ltcifgt

o bien

ltcif test=rdquo$atrCuenta gt 10rdquogt

ltcifgt

Para que una literal pueda incluir un caracter significativo para el lenguaje dicho caracter

debe ser especificado como una secuencia de escape (caracter) Por ejemplo la siguiente

expresioacuten da lugar al literal ldquovezrdquo o ldquovecesrdquo entre comillas dobles

$(atrCuenta gt 1) iquest ldquordquovecesrdquordquo ldquordquovezrdquordquo

Cualquier objeto o atributo de un objeto definido en algunos de los aacutembitos de una paacutegina

puede ser utilizado como una variable Por ejemplo $atrCuenta+1 es una expresioacuten que

realiza la suma de la variable atrCuenta con 1

Cuando se trate de una propiedad de un objeto para acceder a ella se utilizaraacute el operador

punto o bien la notacioacuten empleada para acceder a un elemento de una matriz Por ejemplo

$paramparNombre

$param[ldquoparNombrerdquo]

Una expresioacuten LE puede aparecer en cualquier lugar donde pueda aparecer un texto fijo Por

tanto para informar al contenedor JSP que se trata de una expresioacuten y no de un texto fijo se

utilizan los delimitadores $ al principio y al final

3225 OPERADORES

OPERADOR DESCRIPCIOacuteN Acceso a la propiedad de un objeto o a un elemento de un Map

[] Acceso al elemento de una matriz o de un objeto List

() Pareacutentesis para alterar la prioridad en la evaluacioacuten de una expresioacuten

If ternario condicion expresion1 expresioacuten 2

+ Suma

- Resta

Producto

oacute div Divisioacuten

oacute mod Moacutedulo o resto de una divisioacuten

== oacute eq Igualdad

= oacute ne Diferente

lt oacute lt Menor que

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt oacute gt Mayor que

lt= oacute le Menor o igual que

gt= oacute ge Mayor o igual que

ampamp oacute and Operacioacuten Loacutegica AND

|| oacute or Operacioacuten Loacutegica OR

oacute not Operacioacuten Loacutegica NOT

empty Verifica si el valor de una variable es null si un String esta vaciacuteo o si una matriz Map

o Collection no tienen elementos

func(args) Llamada a una funcioacuten donde func es el nombre de la funcioacuten y arg representa cero o

maacutes argumentos separados por comas

El ejemplo siguiente muestra una paacutegina JSP compuesta por elementos HTML expresiones

LE y objetos impliacutecitos

lthtmlgt

ltheadgtlttitlegtJSP 20lttitlegtltheadgt

ltbodygt

lth3gtLenguaje de expresioacuten (LE)lth3gt

ltpgtLa siguiente tabla ilustra algunas expresiones LE

ltbrgtltbrgtlttable border=1gt

lttrgt

ltthgtltbgtExpresioacutenltbgtltthgt

ltthgtltbgtValorltbgtltthgt

lttrgt

lttrgt

lttdgt$3 + 6lttdgt

lttdgt$3 + 6lttdgt

lttdgt

lttrgt

lttdgt$(7 gt 4) 7 4lttdgt

lttdgt$(7 gt 4) 7 4lttdgt

lttrgt

lttrgt

lttdgt$header[host]lttdgt

lttdgt$header[host]lttdgt

lttrgt

lttablegt

ltbodygt

lthtmlgt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

323 BIBLIOTECA ESTANDAR DE ETIQUETAS

La biblioteca estaacutendar de etiquetas JSP (JSTL ndash Java Server Page Estaacutendar Tag Library)

incluye una cantidad amplia de etiquetas para diferentes aacutereas de trabajo

Aacuterea baacutesica (su prefijo es c ndash core) y contiene

o Soporte de variables (remove y set)

o Control del flujo (choose when otherwise forEach forTokens if)

o Manejo de URL (import param redirect param y url param)

o Operaciones varias (match y out)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlcore

Aacuterea XML (su prefijo es x) y contiene

o Sentencias baacutesicas (out parse y set)

o Control del flujo (choosehellip whenhellip otherwise forEach e if)

o Transformacioacuten de Documentos (transformhellipparam)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlxml

Aacuterea Internacionalizacioacuten (su prefijo es fmt) Contiene

o Localidad (setLocale y requestEncoding)

o Mensajes (bundle message param y setBundle)

o Formateo de Fechas y nuacutemeros (formatNumber formateacuteate parseDate

parseNumber setTimeZone timeZone)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlfmt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Aacuterea SQL (su prefijo es sql) es el lenguaje estandar para interactuar con bases de datos

relacionales y contiene setDataSource Quero dateParam param transaction y

update dateParam param) El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlsql

Aacuterea Funciones (su prefijo es fn) y contiene

o Longitud de una coleccioacuten (length)

o Manipulacioacuten de String (toUpperCase toLowerCase substring

substringAfter substringBefore trim replace indexOf startsWith

endsWith contains containsIgnoreCase split join y escapeXml)

o El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlfunctions

3231 OPERACIONES CON ETIQUETAS BAacuteSICAS

En un ejemplo pasado teniacuteamos el siguiente coacutedigo

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

En este ejemplo se hace referencia al aacuterea baacutesica de JSTL con el prefijo c y se utiliza la

etiqueta cset para definir la variable atrCuenta Si la variable ya esta definida simplemente

se le asigna el valor especificado

La uacuteltima parte del ejemplo anterior podriacutea haberse escrito de esta otra forma

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcif test=rdquo$atrCuenta gt 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcifgt

$atrCuenta $str

La etiqueta cif permite la ejecucioacuten condicional de su cuerpo en funcioacuten del valor del

atributo de test

La etiqueta cchoose permite la ejecucioacuten del cuerpo de la primera etiqueta cwhen cuyo

atributo test sea evaluado a true Si ninguna de las condiciones se evaluacutea a true entonces se

evaluacutea el cuerpo de la etiqueta cotherwise si estaacute presente El siguiente coacutedigo muestra otra

manera de escribir el ejemplo anterior utilizando estas uacuteltimas etiquetas

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcchoosegt

ltcwhen test=rdquo$atrCuenta == 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcwhengt

ltcotherwisegt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcotherwisegt

ltcchoosegt

$atrCuenta $str

La etiqueta cforEach permite iterar sobre una coleccioacuten de objetos La coleccioacuten se

especifica por medio del atributo iacutetems y el elemento actual de la coleccioacuten estaacute disponible a

traveacutes de la variable establecida por el atributo var Por ejemplo el siguiente fragmento de

coacutedigo visualiza una tabla con las variables definidas a nivel de aacutembito de paacutegina

lttable border=rdquo1rdquogt

ltcforEach var=rdquoitemrdquo iacutetems=rdquo$pageScoperdquogt

lttrgt

lttdgt $item lttdgt

lttrgt

ltcforEachgt

lttablegt

La etiqueta ccatch atrapa una excepcioacuten que ocurra en el cuerpo de la misma Por ejemplo

el siguiente segmento de coacutedigo lanzaraacute una excepcioacuten si el paraacutemetro mes se escribe con

letras en vez de con nuacutemeros

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltbodygt

lthtmlgt

Un URL anaacutelogo al siguiente daraacute lugar a que la excepcioacuten sea lanzada cuando se ejecute la

expresioacuten $nMes 3 de la paacutegina anterior

httplocalhost8080JSP2exceppruebajspmes=marzo

La excepcioacuten indica que ha ocurrido un error al tratar de convertir ldquomarzordquo a un entero de

tipo Long Para cachar esta excepcioacuten y darle un tratamiento adecuado habraacute que modificar

la paacutegina JSP anterior como se indica a continuacioacuten

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltccatch var=rdquoerrorOcurridordquogt

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltccatchgt

ltcif test=rdquo$not empty errorOcurridordquogt

Error el paraacutemetro mes debe ser un nuacutemero ltbgt

ltbrgt Informacioacuten del error dada por el sistema

ltbrgt ltfont color=rdquoFF0000rdquogt $errorOcurrido ltfontgt

ltcifgt

ltbodygt

lthtmlgt

3232 ACCESO A BASES DE DATOS CON JSP

Las etiquetas que proporciona el aacuterea SQL permiten realizar

Conexioacuten con una base de datos

Realizacioacuten de consultas a la base de datos

Acceso al conjunto de resultados

Ejecucioacuten de actualizaciones y transacciones

Todas las etiquetas SQL actuacutean sobre una base de datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

32321 CONEXIOacuteN CON LA BASE DE DATOS

La conexioacuten con la base de datos puede realizarse con la etiqueta sqlsetDataSource Por

ejemplo si se esta utilizando el administrador de bases de datos MySql con el controlador

JDBC se puede realizar una conexioacuten con una base de datos digamos bd_tutorias de la

manera siguiente

ltsqlsetDataSource var=rdquobdrdquo

driver=rdquocommysqljdbcDriverrdquo

url=rdquojdbcmysqllocalhost3306bd_tutoriasrdquo

user=rdquoadminrdquo

password=rdquoadminadminrdquo gt

32322 CONSULTA A LA BASE DE DATOS

La etiqueta sqlQuero permite realizar una consulta a una base de datos Por ejemplo el

siguiente fragmento de coacutedigo realiza una consulta a la base de datos representada por bd y

obtiene un conjunto de resultados representado por cdr

ltsqlquery var=rdquocdrrdquo dataSource=rdquo$bdrdquogt

SELECT professor dia hora alumno

FROM profesores tutorias citas

WHERE profesoresid_profesor=tutoriasid_profesor

AND tutoriasid_tutoria=citasid_tutoria

ltsqlquerygt

32323 MODIFICACIONES SOBRE LA BASE DE DATOS

La etiqueta sqlupdate permite ejecutar una sentencia SQL INSERT UPDATE o DELETE

y cualquier otra sentencia SQL que no retorne ninguacuten valor Por ejemplo

ltsqlupdate var=rdquocontrdquo dataSource=rdquo$bdrdquo gt

UPDATE profesores

SET profesor=

WHERE profesor=

ltsqlparam value=rdquo$paramProfesorrdquo gt

ltsqlparam value=rdquo$paramIDrdquo gt

ltsqlupdategt

Una operacioacuten UPDATE puede utilizar el siacutembolo para indicar que el valor que tendriacutea que

evaluarse en esa posicioacuten seraacute suministrado por una etiqueta sqlparam como por ejemplo

httplocalhost8080JSP2sqlpruebajspProfesor=Mario+Rossainz+LopezampID=514

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

outprintln(ltfontgt)

outprintln(ltbodygt)

outprintln(lthtmlgt)

outclose()

Manipular la peticioacuten enviada por el cliente

utilizando el atributo method=get

protected void doGet(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

procesarPeticion(request response)

Manipular la peticioacuten enviada por el cliente

utilizando el atributo method=post

protected void doPost(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

procesarPeticion(request response)

En las primeras liacuteneas del coacutedigo anterior se colocan las sentencias import de los paquetes ya

citados El paquete javaio se requiere para las operaciones de entrada y salida de datos y

resultados a traveacutes de los objetos request y response La manera maacutes sencilla de definir un

servlet es heredar de la clase HttpServlet

Asiacute cuando este servlet recibe una peticioacuten del cliente el servidor lo carga para su ejecucioacuten

instante en el que se ejecuta el meacutetodo init() que lo inicia (en este caso el que se invoca es el

que se da por omisioacuten en la superclase de HolaMundo) Cuando init finaliza el servlet esta

en condiciones de atender a las peticiones de los clientes en el ejemplo para cada una de las

peticiones GET o POST se ejecuta el meacutetodo procesarPeticion que es invocado por doGet

o DoPost El servlet permaneceraacute cargado hasta que el servidor decida destruirlo ejecutando

el meacutetodo destroy si es que se implementoacute

Analizando el meacutetodo procesarPeticion se observa que el meacutetodo almacena en el objeto out

de la clase PrintWriter los datos que el servlet HolaMundo enviaraacute al cliente que realizoacute la

peticioacuten Este objeto forma parte del objeto response y es obtenido a traveacutes de su meacutetodo

getWriter Los datos se almacenan en out utilizando su meacutetodo println Los datos

almacenados como se puede ver se corresponden con una paacutegina HTML que seraacute enviada

al explorador del cliente

Ademaacutes de estos datos expliacutecitos tambieacuten se enviacutea otra informacioacuten de protocolo http como

son las cabeceras de respuesta generadas por el servidor Estas cabeceras de respuesta

incluyen la liacutenea Content-type texthtml

Esta liacutenea identifica el tipo de documento a enviar o a recibir en este caso se trata de un

documento HTML Cuando el navegador del cliente reciba esta informacioacuten sabraacute como

interpretar el tipo de documento que tiene que visualizar Para establecer este valor

procesarPeticion utiliza el meacutetodo setContentType del objeto response

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3151 PUESTA EN FUNCIONAMIENTO DEL SERVLET ldquoHolaMundordquo

Una vez escrito el servlet los pasos necesarios para ver el resultado que produce son

bull Compilarlo

bull Instalarlo en un servidor

bull Invocarlo para su ejecucioacuten desde un navegador Web

Como puede leerse no resulta tan sencillo desarrollar y ejecutar por vez primera un servlet a

diferencia de una aplicacioacuten JAVA normal que esteacute basada en el SDK estaacutendar Estos pasos

requieren proceder entonces de alguna de las dos formas siguientes

1 Suponiendo que se tiene instalado el J2SE SDK en particular la versioacuten 150 habraacute que

instalar el servidor Web de aplicaciones Tomcat 5 El servidor Tomcat soporta un

contenedor Web que permite ejecutar servlets y paacuteginas JSP (de las que se hablaraacuten en

la seccioacuten siguiente) En el apeacutendice B del presente documento se muestra la manera de

No obstante existen muchos tipos de servidores aparte del Tomcat que permiten el uso de

los servlets algunos de estos son

a JavaServer Web Development Kit (JSWDK) hoy llamado JWSDP (Java Web

Services Developer Pack o Paquete de desarrollo de servicios Web de Java)

b Allaire JRun (motor para JSP y Servlet que puede ser integrado en servidores de

Netscape Enterprise o Microsoft Personal Web Server)

c ServletExec de Nwe Atlanta (Motor para JSP y Servlet que puede ser integrado

en los servidores Web maacutes populares para Solaris Windows MacOs HP-UX y

Linux

d LiteWebServer (LWS) de Gefion Software (Es un pequentildeo servidor Web

gratuito derivado de Tomcat)

e Java Web Server de Sun (Servidor totalmente gratuito escrito en JAVA

2 Suponiendo que no se tiene instalado ninguacuten software para desarrollar aplicaciones

JAVA habraacute que instalar el Java 2 Enterprise Edition Software Development Kit o J2EE

SDK Este paquete proporciona la base para desarrollar y distribuir aplicaciones

multicapa distribuidas e incluye entre otras herramientas el J2SE y un servidor de

aplicaciones (J2EE Application Server) En el apeacutendice A se muestra la manera en que

se puede instalar y la forma en la que se puede lanzar el servidor de aplicaciones La

versioacuten que se esta suponiendo se trabajaraacute es la J2EE 14 SDK que incluye el J2SE

142_02 y ejemplos ademaacutes del J2EE 14 Application Server

Para ejecutar un servlet como el del HolaMundo del ejemplo anterior teniendo ya instalados

los paquetes J2SE 150 y Tomcat 5 siga los pasos siguientes

1 antildeada a la variable de entorno path de su sistema operativo la ruta de la carpeta bin del

J2SE que tiene instalado

2 Copie el archivo servlet-apijar que se encuentra en commonlib del tomcat que tiene

instalado a jrelibext del J2SE

3 Cambie al directorio de la aplicacioacuten es decir donde se encuentra el servlet

4 Compile el servlet en el ejemplo javac HolaMundojava

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

5 Antildeada el archivo class (HolaMundoclass) que resulta de la compilacioacuten a la carpeta

webappsROOTWEB-INFclasses del Tomcat

6 Edite el archivo confwebxml del Tomcat para definir el servlet invoquer que permite

ejecutar servlets anoacutenimos

7 Arranque el servidor Tomcat (este punto debe realizarse despueacutes del paso 5 para que el

servidor reconozca la aplicacioacuten que se acaba de instalar) Si el servidor ya estaba

arrancado cuando se realizoacute el punto 4 detengalo y vuelvalo a arrancar o abra el

explorador y escriba el URL httplocalhost8080managerhtml y recargue la

aplicacioacuten

8 Una vez arrancado el servidor verifique que funciona correctamente escribiendo en el

navegador httplocalhost8080 o http1270018080 8080 es el puerto utilizado para

acceder al servidor

9 Ejecute el servlet escribiendo en el navegador el URL

httpservidor[puerto]servletnombre_servlet que en el caso del ejemplo seriacutea

httplocalhost8080servletHolaMundo

En conclusioacuten para ejecutar un servlet habraacute que copiar el archivo class que lo define

en la carpeta ROOTWEB-INFclasses de la carpeta webapps del servidor a la que tienen

acceso los clientes Web y ejecutar httpservidor[puerto]servletnombre_servlet de

forma que el servlet HolaMundo se mostrariacutea en su ejecucioacuten como en la figura siguiente

Ahora bien lo maacutes interesante es invocar a los servlets desde paacuteginas Web Se puede solicitar

la ejecucioacuten de un servlet de igual manera que pedimos un recurso cualquiera basta con

definir el URL del servlet en el punto deseado en la paacutegina Web

El siguiente ejemplo muestra un servlet que ademaacutes de generar la paacutegina HTML donde se

manda a escribir ldquoHola Mundordquo devuelve la fecha y hora del servidor Con esto se trata de

dar a entender que por una parte un servlet no tiene porque generar soacutelo paacuteginas HTML sino

que ademaacutes un servlet es capaz de generar contenido dinaacutemico incluyendo cualquier proceso

escrito que pueda ejecutar JAVA (leer o escribir archivos ejecutar programas cargas

bibliotecas etc)

import javaio

import javaxservlet

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

import javaxservlethttp

import javautil

public class Saludo extends HttpServlet

Manipular la peticioacuten enviada por el cliente

utilizando el atributo method=get

protected void doGet(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

responsesetContentType(texthtml)

PrintWriter out = responsegetWriter()

outprintln(lthtmlgt)

outprintln(ltheadgt)

outprintln(lttitlegtServlet Saludolttitlegt)

outprintln(ltheadgt)

outprintln(ltbodygt)

outprintln(ltcentergt)

for (int tamantildeo = 1 tamantildeo lt= 7 ++tamantildeo)

outprintln(ltfont size=+tamantildeo+ color=bluegt)

outprintln(iexcliexcliexclHola mundo)

outprintln(ltbrgt)

outprintln(ltbrgt)

Calendar fechahora = new GregorianCalendar()

Random rnd = new Random()

int tamantildeo = rndnextInt(7)+1

outprintln(ltfont size=+tamantildeo+gt)

outprintln(ltfont color=greengt)

outprintln(Son las +

fechahoraget(CalendarHOUR_OF_DAY) + +

fechahoraget(CalendarMINUTE) + +

fechahoraget(CalendarSECOND) )

outprintln(ltbrgt)

outprintln(ltfont color=graygt)

outprintln(Del diacutea +

fechahoraget(CalendarDAY_OF_MONTH) + +

(fechahoraget(CalendarMONTH)+1) + +

fechahoraget(CalendarYEAR) )

outprintln(ltfontgt)

outprintln(ltcentergt)

outprintln(ltbodygt)

outprintln(lthtmlgt)

outclose()

Para ejecutar este servlet llamado Saludo podemos crear una carpeta dentro de webapps por

ejemplo saludoWEB-INFclasses y copiar dentro de classes Saludoclass

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Para ejecutar el servlet Saludo tendriacuteamos entonces que escribir

httplocalhost8080SaludoservletSaludo

Pero si queremos invocar a este servlet desde una paacutegina HTML se deberaacute utilizar este

mismo URL o bien el URL relativo a la carpeta del servidor donde copiemos el archivo html

que seraacute copiado en la carpeta Saludo

El coacutedigo HTML almacenado en saludohtml deberaacute incluir una de las dos liacuteneas siguientes

lta href=rdquohttplocalhost8080Saludoservletsaludordquogt ejecutar Saludo ltagt

lta href=rdquoservletSaludordquogt ejecutar Saludo ltagt

La segunda opcioacuten es la maacutes interesante porque no depende de la direccioacuten del servidor Para

ejecutar entonces el servlet a traveacutes de saludohtml basta con escribir el URL siguiente

httplocalhost8080Saludosaludohtml

316 EMPAQUETADO DE SERVLETS

Puede darse el caso en que diversos programadores en un entorno de produccioacuten dado

podriacutean estar desarrollando servlets para el mismo servidor El colocar todos estos servlets

en el directorio principal de estos programas podriacutea dar como resultado un directorio difiacutecil

de administrar ademaacutes de que se corre el riesgo de duplicar los nombres de los servlets si

dos desarrolladores distintos eligen el mismo nombre para el programa que desarrollan Los

paquetes son la solucioacuten loacutegica a este problema El uso de paquetes tiene como resultado

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

cambios en la forma en que se generan los servlets la forma en que se compilan y en la que

se invocan Para colocar los servlets en paquetes se requieren de dos pasos

1 Mover los archivos (class) a un subdirectorio que coincida con el nombre del paquete

pretendido

2 Insertar una instruccioacuten de paquete en el archivo de clase Para ello la primera liacutenea en

el coacutedigo fuente (java) del servlet deberaacute ser package nomPaquete

Por ejemplo el fragmento siguiente de coacutedigo Java presenta una variacioacuten del Servlet

HolaMundo que se encuentra en el paquete misServlets

package misServlets

import javaio

import javaxservlet

import javaxservlethttp

public class HolaMundo extends HttpServlet

Manipular las posibles peticiones enviadas por el cliente

utilizando el atributo method=get o method=post

protected void procesarPeticion(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

responsesetContentType(texthtml)

PrintWriter out = responsegetWriter()

outprintln(lthtmlgt)

El archivo class se encontraraacute dentro de una carpeta llamada misServlets que seraacute el paquete

creado o utilizado por la aplicacioacuten en este caso del HolaMundo dependiendo si exitiacutea o no

antes de compilar la aplicacioacuten A continuacioacuten deberemos copiar dentro de la carpeta

webappsROOTWEB-INFclasses del Tomcat la carpeta misServlets junto con el

HolaMundoclass que estaraacute dentro de ella y ejecutar el servlet en el explorador escribiendo

httplocalhost8080servletmisServletsHolaMundo

317 PROCESAMIENTO DE FORMULARIOS

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Hasta este punto los servlets que hemos estudiado soacutelo enviacutean informacioacuten al navegador del

cliente No obstante estos clientes Web pueden Mostar formularios que permitan solicitar

datos a los usuarios que seraacuten enviados al servidor para por ejemplo ser almacenados en

una base de datos para posteriores peticiones o para otros procesos o bien para dar al usuario

una respuesta ajustada a dicha peticioacuten

En el siguiente URL se invoca la ejecucioacuten de un servlet llamado Parametros aportando la

lista de pares (Nombre Mario)-(Edad 22) en formato GET

httplocalhost8080ParametrosservletParametrosNombre=MarioampEdad=22

Hay que observar la manera de colocar los datos tras el siacutembolo ldquordquo y de separarlos con el

siacutembolo ldquoamprdquo El coacutedigo del servlet es el siguiente

import javaio

import javaxservlet

import javaxservlethttp

public class Parametros extends HttpServlet

public void doGet(HttpServletRequest request HttpServletResponse

response)

throws IOException ServletException

responsesetContentType(texthtml)

PrintWriter out = responsegetWriter()

outprintln(lthtmlgt)

outprintln(ltbodygt)

String NombreRecibido = requestgetParameter(Nombre)

String EdadRecibida = requestgetParameter(Edad)

outprintln(lth1gt Hola + NombreRecibido + lth1gt)

outprintln(lth1gt Tienes + EdadRecibida + antildeos lth1gt)

outprintln(ltbodygt)

outprintln(lthtmlgt)

El objeto httpServletRequest en el coacutedigo anterior request contiene una serie de meacutetodos de

utilidad para recibir informacioacuten proveniente del usuario en concreto el meacutetodo

getParameter permite obtener el valor asociado a un nombre en la lista de pares (nombre

valor) que puede proporcionar un URL

Ademaacutes de poder introducir el URL anterior en el navegador proporcionando directamente

los datos enviados al servlet en dicha URL

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Tambieacuten podemos generar el URL mediante una paacutegina Web que podraacute utilizar el usuario

lthtmlgt

ltbodygt

lth1gt Cuestionario lth1gt

ltform action=httplocalhost8080ParametrosservletParametros

method=getgt

Nombre ltinput type=text name=Nombregt ltbrgt

Edad ltinput type=text name=Edadgt ltbrgtltbrgt

ltinput type=submit value=Enviar datosgt ltbrgt

ltformgt

ltbodygt

lthtmlgt

Los formularios en HTML permiten enviar datos al servidor Web En la liacutenea 5 de la paacutegina

Web mostrada se encuentra la etiqueta form que en el ejemplo contiene el atributo action

que indica la accioacuten que debe realizarse en el servidor en este caso ejecutar el servlet

Parametros y el atributo method que indica la manera en la que se enviacutean los datos (en este

caso la peticioacuten GET)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Peticioacuten HTTP GET Cuando el tipo de peticioacuten HTTP es GET los datos del formulario

son enviados al servidor a continuacioacuten del URL especificado por el atributo action de form

El tamantildeo de la cadena enviada estaacute limitado y al estar en ASCII es totalmente legible por

tanto no es un modo seguro

Es por ello que cuando se requiere del enviacuteo de datos seguros y ademaacutes el nuacutemero de datos

del formulario que son enviados al servidor son muchos resulta ser mejor el uso del meacutetodo

POST Veamos otro ejemplo

import javaio

import javaxservlet

import javaxservlethttp

import javautil

public class MostrarParametros extends HttpServlet

public void doGet(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

responsesetContentType(texthtml)

PrintWriter out= responsegetWriter()

String titulo=Lectura de todos los paraacutemetros de Peticioacuten

outprintln(ltdoctype html public -W3CDTD HTML 40 +

TransitionalENgt)

outprintln(lthtmlgt)

outprintln(ltheadgtlttitlegt+titulo+lttitlegtltheadgt)

outprintln(ltbody bgcolor=FDF5E6gtn+

lth1 align=centergt+titulo+lth1gtn+

lttable border=1 align=centergtn+

lttr bgcolor=FFAD00gtn+

ltthgtNombre del parampaacutemetroltthgtValor(es) del

parampaacutemetro)

Enumeration nombresParam=requestgetParameterNames()

while(nombresParamhasMoreElements())

String nombreParam= (String)nombresParamnextElement()

outprint(lttrgtlttdgt+nombreParam+nltTDgt)

String[]valoresParam=

requestgetParameterValues(nombreParam)

if (valoresParamlength==1)

String valorParam=valoresParam[0]

if (valorParamlength()==0)

outprintln(ltigt Sin valor ltigt)

else

outprintln(valorParam)

else

outprintln(ltulgt)

for (int i=0 iltvaloresParamlengthi++)

outprintln(ltligt+valoresParam[i])

outprintln(ltulgt)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

outprintln(lttablegtnltbodygtlthtmlgt)

public void doPost(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

doGet(requestresponse)

El servlet escrito utiliza un meacutetodo doPost que soacutelo ejecuta a Donet Esto es porque se quiere

que el servlet pueda manejar tanto las peticiones GET como las POST Por otro lado el

formulario es el siguiente

ltdoctype html public -W3CDTD HTML 40 TransitionalENgt

lthtmlgt

ltheadgt

lttitlegt Un Formulario de ejemplo que utiliza POST lttitlegt

ltheadgt

ltbody bgcolor=FDF5E6gt

lth1 align=centergt Un formulario de Ejemplo que utiliza POST

lth1gt

ltform action=httplocalhost8080MostrarParametros

servletMostrarParametros

method=postgt

Nuacutemero de elemento ltinput type=text name=elemNumgt ltbrgt

Cantidad ltinput type=text name=cantidadgt ltbrgt

Precio Unitario ltinput type=text name=precio value=$gt

ltbrgtlthrgt

Nombre de Pila ltinput type=text name=nombrePilagt ltbrgt

Apellido(s) ltinput type=text name=apellidogt ltbrgt

Iniciales ltinput type=text name=inicialesgt ltbrgt

Domicilio de envio lttextarea name=domicilio rows=3

cols=40gtlttextareagt ltbrgt

Tarjeta de creacutedito ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta value=VisagtVisa ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta value=Master Cardgt

Master Card ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta value=AmexgtAmerican

Expresss ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta

value=DiscovergtDiscover ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta

value=Java Smart CardgtTarjeta Inteligente de Java

ltbrgt

Nuacutemero de la tarjeta de creacutedito

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltinput type=password name=numTarjetagtltbrgt

Repita el nuacutemero de la tarjeta de creacutedito

ltinput type=password name=numTarjetagtltbrgtltbrgt

ltcentergt

ltinput type=submit value=Enviar pedidogt

ltcentergt

ltformgt

ltbodygt

lthtmlgt

El formulario HTML del listado anterior utiliza POST como deberiacutea ser en todos los campos

que tienen contrasentildea

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Si intenta ejecutar el servlet MostrarParametros directamente en el explorador con el URL

httplocalhost8080MostrarParametrosservletMostrarParametros se obtendraacute la paacutegina

Web sin resultados

Peticioacuten HTTP POST Cuando el tipo de peticioacuten HTTP es POST los datos son enviados

al servidor en el cuerpo de la peticioacuten Es el meacutetodo maacutes usual de enviar los datos de un

formulario Con este tipo de peticioacuten la informacioacuten del formulario se enviacutea despueacutes del URL

indicado por action en el cuerpo de la peticioacuten y el tamantildeo de la informacioacuten enviada no esta

limitado

Seguacuten lo expuesto escoger el meacutetodo para enviar la informacioacuten no es difiacutecil Si los datos

son pocos y no importa su confidencialidad o manipulacioacuten utilizamos GET Si son largos

privados o importantes utilizamos POST

318 ACCESO A BASES DE DATOS CON SERVLETS

Una aplicacioacuten Java que realiza accesos a bases de datos funciona seguacuten una arquitectura que

permite escribir los programas abstrayeacutendose de los detalles de los niveles inferiores (discos

controladores sistema operativo etc) como lo muestra la figura siguiente

JDBC (Java DataBase Connectivity ndash Conexioacuten con Bases de Datos desde Java) es una API

de Java que permite ejecutar instrucciones SQL para manipular y gestionar bases de datos

relacionales Para que una aplicacioacuten Java pueda hacer operaciones sobre una base de datos

previamente tiene que establecer una conexioacuten con la misma Esta conexioacuten se realiza a

traveacutes de un controlador (driver) seguacuten la figura de arriba La API-JDBC se proporciona en

dos paquetes javasql y javaxsql El primer paquete contiene las interfaces y clases Java

fundamentales de JDBC en tanto que el segundo paquete es una extensioacuten del primero e

APLICACION

SISTEMA OPERATIVO

CONTROLADOR

Oracle Access MySql

JVM

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

incluye las clases que interactuacutean con JNDI y otras que gestionan conjuntos de conexiones

con una misma base de datos Para maacutes detalles del uso de JDBC veacutease el apeacutendice A de

estas notas

El primer paso para crear una conexioacuten entre una aplicacioacuten Java y una base de datos es

registrar el controlador JDBC adecuado para esa base con el fin de que la JVM pueda

utilizarlo Existen distintos tipos de controladores JDBC por ejemplo

ldquocommysqljdbcDriverrdquo que es el controlador utilizado cuando el motor de base de datos

que se utiliza es MySql

En el supuesto caso de que la base de datos soacutelo permitiera el acceso a traveacutes de controladores

ODBC como lo hace ACCESS siempre podemos usar el controlador puente JDBC-ODBC

incluido como parte del JDK ldquosunjdbcodbcJdbcOdbcDriverrdquo Este tipo de controladores

es decir los basados en ODBC (Open DataBase Connectivity) son bastante utilizados en

entornos Windows pues este SO incluye ODBC El apeacutendice A describe al final como

administrar los oriacutegenes de datos ODBC en Windows

Asiacute pues la mayor ventaja de los servlets con respecto a la conexioacuten con bases de datos viacutea

JDBC es que su ciclo de vida les permite mantener conexiones abiertas con las mismas a lo

largo de toda una sesioacuten Esto permite recortar tiempo con respecto a otras tecnologiacuteas como

la CGI Ademaacutes JDBC es una tecnologiacutea independiente de las bases de datos

Como ejemplo vamos a implementar una simple aplicacioacuten Web basada en servlets que

muestre una especie de directorio de personas La aplicacioacuten podraacute consultar insertar

modificar borrar o listar la informacioacuten de cada una de las personas almacenadas en la base

de datos a la que se hace acceso (que estaraacute en formato access)

La estructura de la Base de Datos es una tabla con los siguientes campos

DNI Nombre Apellido Edad

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

53023767A Pedro Rubio 18

77459822P Luis Tejedor 47

123456MRL Mario Rossainz 35

La estructura de la aplicacioacuten se muestra en la figura siguiente

lthtmlgt

ltbodygt

lttable border=1gtlttrgtlttdgt

ltform action=httplocalhost8080directorioTelservletSvAccesoBD

method=getgt

DNI ltinput type=text name=DNIgt ltbrgt

Nombre ltinput type=text name=Nombregt ltbrgt

Apellido ltinput type=text name=Apellidogt ltbrgt

Edad ltinput type=text name=Edadgt ltbrgtltbrgt

ltinput type=submit value=Consultar name=BotonConsultargt

ltinput type=submit value=Insertar name=BotonInsertargt

ltinput type=submit value=Modificar name=BotonModificargt

ltinput type=submit value=Borrar name=BotonBorrargt

ltinput type=submit value=Listar name=BotonListargt ltbrgt

ltcentergt

ltinput type=submit value= |lt name=BotonPrimerogt

ltinput type=submit value= -- name=BotonMenosCincogt

ltinput type=submit value= - name=BotonAnteriorgt

ltinput type=submit value= + name=BotonSiguientegt

ltinput type=submit value= ++ name=BotonMasCincogt

ltinput type=submit value= gt| name=BotonUltimogt

ltcentergt

lttdgt

lttdgt

lttextarea name=AreaDeListado rows=10 cols=35gtlttextareagt

SvAccesoBDhtml

SvAccesoBD

ObBorrado ObListado ObConsulta

ObInsercion

ObModificacion

ObPosicionamiento

ObRegistro

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lttdgt

lttrgt

ltformgt

lttablegt

ltbodygt

lthtmlgt

SvAccesoBDhtml

import javaio

import javaxservlet

import javaxservlethttp

public class SvAccesoBD extends HttpServlet

private int PosicionBuscada = 1

private String AreaDeListado=

PrintWriter out

public void doGet(HttpServletRequest request HttpServletResponse response)

throws IOException ServletException

String DNI = requestgetParameter(DNI)

String Nombre = requestgetParameter(Nombre)

String Apellido = requestgetParameter(Apellido)

String Edad = requestgetParameter(Edad)

String BotonConsultar = requestgetParameter(BotonConsultar)

String BotonInsertar = requestgetParameter(BotonInsertar)

String BotonModificar = requestgetParameter(BotonModificar)

String BotonBorrar = requestgetParameter(BotonBorrar)

String BotonListar = requestgetParameter(BotonListar)

String BotonPrimero = requestgetParameter(BotonPrimero)

String BotonMenosCinco = requestgetParameter(BotonMenosCinco)

String BotonAnterior = requestgetParameter(BotonAnterior)

String BotonSiguiente = requestgetParameter(BotonSiguiente)

String BotonMasCinco = requestgetParameter(BotonMasCinco)

String BotonUltimo = requestgetParameter(BotonUltimo)

AreaDeListado = requestgetParameter(AreaDeListado)

responsesetContentType(texthtml)

out = responsegetWriter()

outprintln(lthtmlgt)

outprintln(ltbodygt)

if (BotonConsultar=null) ConsultarDatos(DNI)

if (BotonInsertar=null) InsertarDatos(DNINombreApellidoEdad)

if (BotonModificar=null) ModificarDatos(DNINombreApellidoEdad)

if (BotonBorrar=null) BorrarDatos(DNI)

if (BotonListar=null) ListarDatos(DNI)

if (BotonPrimero=null) Controles(1)

if (BotonMenosCinco=null) Controles(2)

if (BotonAnterior=null) Controles(3)

if (BotonSiguiente=null) Controles(4)

if (BotonMasCinco=null) Controles(5)

if (BotonUltimo=null) Controles(0)

outprintln(ltbodygt)

outprintln(lthtmlgt)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

private void ConsultarDatos(String DNI)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObRegistro InstanciaFila = InstanciaConsultaDameDatos()

GenerarRespuesta(InstanciaFilaDameDNI()InstanciaFilaDameNombre()

InstanciaFilaDameApellido()

StringvalueOf(InstanciaFilaDameEdad()))

else

GenerarRespuesta(DNI------------)

PosicionBuscada = 1

public void ListarDatos(String DNI)

ObListado InstanciaListado = new ObListado()

AreaDeListado = InstanciaListadoDameResultado()

ConsultarDatos(DNI)

PosicionBuscada = 1

public void BorrarDatos(String DNI)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObBorrado InstanciaBorrado = new ObBorrado(PosicionBuscada)

GenerarRespuesta()

else

GenerarRespuesta(----------------)

PosicionBuscada = 1

public void ModificarDatos(String DNI String Nombre String Apellido

String Edad)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObRegistro InstanciaFila = new ObRegistro(DNI Nombre Apellido

IntegerparseInt(Edad))

ObModificacion InstanciaModificacion = new ObModificacion(PosicionBuscada

InstanciaFila)

GenerarRespuesta(DNINombreApellidoEdad)

else

GenerarRespuesta(----------------)

PosicionBuscada = 1

public void InsertarDatos(String DNI String Nombre String Apellido

String Edad)

ObRegistro InstanciaFila = new ObRegistro(DNI Nombre Apellido

IntegerparseInt(Edad))

ObInserccion InstanciaInserccion = new ObInserccion(InstanciaFila)

GenerarRespuesta()

PosicionBuscada=1

public void Controles(String Identificador)

ObPosicionamiento InstanciaPosicionamiento =

new ObPosicionamiento(IdentificadorPosicionBuscada)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ObRegistro InstanciaFila = InstanciaPosicionamientoDameDatos()

GenerarRespuesta(InstanciaFilaDameDNI()InstanciaFilaDameNombre()

InstanciaFilaDameApellido()

StringvalueOf(InstanciaFilaDameEdad()))

PosicionBuscada = InstanciaPosicionamientoPosicion()

private void GenerarRespuesta(String DNI String Nombre String Apellido

String Edad)

outprintln(lttable border=1gt)

outprintln(lttrgt)

outprintln(lttdgt)

outprintln(ltform

action=httplocalhost8080directorioTelservletSvAccesoBD

method=getgt)

outprintln( DNI ltinput type=text name=DNI value=+DNI+gtltbrgt)

outprintln( Nombre ltinput type=text name=Nombre

value=+Nombre+gtltbrgt)

outprintln( Apellido ltinput type=text name=Apellido

value=+Apellido+gtltbrgt)

outprintln( Edad ltinput type=text name=Edad

value=+Edad+gtltbrgtltbrgt)

outprintln( ltinput type=submit value=Consultar

name=BotonConsultargt)

outprintln( ltinput type=submit value=Insertar

name=BotonInsertargt)

outprintln( ltinput type=submit value=Modificar

name=BotonModificargt)

outprintln( ltinput type=submit value=Borrar name=BotonBorrargt)

outprintln( ltinput type=submit value=Listar name=BotonListargt

ltbrgt)

outprintln( ltcentergt)

outprintln( ltinput type=submit value= |lt name=BotonPrimerogt)

outprintln( ltinput type=submit value= --

name=BotonMenosCincogt)

outprintln( ltinput type=submit value= - name=BotonAnteriorgt)

outprintln( ltinput type=submit value= +

name=BotonSiguientegt)

outprintln( ltinput type=submit value= ++

name=BotonMasCincogt)

outprintln( ltinput type=submit value= gt| name=BotonUltimogt)

outprintln( ltcentergt)

outprintln( lttdgt)

outprintln( lttdgt)

outprintln( lttextarea name=AreaDeListado rows=10

cols=35gt+AreaDeListado+lttextareagt)

outprintln( lttdgt)

outprintln( lttrgt)

outprintln( ltformgt)

outprintln( lttablegt)

SvAccesoBDjava

import javasql

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

public class ObBorrado

ObBorrado(int PosicionBuscada)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

Personasabsolute(PosicionBuscada)

PersonasdeleteRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

ObBorradojava

import javasql

import javaawtTextArea

public class ObListado

private String Resultado=

ObListado()

String DNI Nombre Apellido Linea

int Edad Posicion

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement()

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

while (Personasnext())

DNI = PersonasgetString(DNI)

Nombre = PersonasgetString(Nombre)

Apellido = PersonasgetString(Apellido)

Edad = PersonasgetInt(Edad)

Posicion = PersonasgetRow()

Linea = DNI+ +Nombre+ +Apellido+ +StringvalueOf(Edad)

Resultado=Resultado+StringvalueOf(Posicion)+ +Linea+n

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public String DameResultado()

return Resultado

ObListadojava

public class ObRegistro

private String DNI Nombre Apellido

private int Edad

ObRegistro (String DNI String Nombre String Apellido int Edad)

thisDNI = DNI

thisNombre = Nombre

thisApellido = Apellido

thisEdad = Edad

String DameDNI()

return DNI

String DameNombre()

return Nombre

String DameApellido()

return Apellido

int DameEdad()

return Edad

ObRegistrojava

import javasql

public class ObConsulta

private int Posicion = 0

private ObRegistro DatosPersona

ObConsulta(String DNIPedido)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement()

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

while (Personasnext())

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

String DNI = PersonasgetString(DNI)

if (DNIequalsIgnoreCase(DNIPedido))

Posicion = PersonasgetRow()

String Nombre = PersonasgetString(Nombre)

String Apellido = PersonasgetString(Apellido)

int Edad = PersonasgetInt(Edad)

DatosPersona = new ObRegistro(DNINombreApellidoEdad)

break

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public int PosicionEncontrada()

return Posicion

public ObRegistro DameDatos()

return DatosPersona

ObConsultajava

import javasql

public class ObInserccion

ObInserccion(ObRegistro Datos)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

PersonasmoveToInsertRow()

PersonasupdateString(DNI DatosDameDNI())

PersonasupdateString(NombreDatosDameNombre())

PersonasupdateString(Apellido DatosDameApellido())

PersonasupdateInt(EdadDatosDameEdad())

PersonasinsertRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

catch (SQLException e)

Systemoutprintln(e)

ObInsercionjava

import javasql

public class ObModificacion

ObModificacion(int PosicionBuscada ObRegistro Datos)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

Personasabsolute(PosicionBuscada)

PersonasupdateString(DNIDatosDameDNI())

PersonasupdateString(NombreDatosDameNombre())

PersonasupdateString(ApellidoDatosDameApellido())

PersonasupdateInt(EdadDatosDameEdad())

PersonasupdateRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

ObModificacionjava

import javasql

public class ObPosicionamiento

private ObRegistro DatosPersona

private int Posicion

ObPosicionamiento(String Accion int Posicion)

int IDAccionEdad

String DNINombreApellido

boolean PosicionCorrecta=false

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

FROM DatosPersonales)

Personasabsolute(Posicion)

IDAccion = IntegerparseInt(Accion)

switch (IDAccion)

case 0

PosicionCorrecta = Personaslast()

break

case 1

PosicionCorrecta = Personasfirst()

break

case 2

PosicionCorrecta = Personasrelative(-5)

break

case 3

PosicionCorrecta = Personasprevious()

break

case 4

PosicionCorrecta = Personasnext()

break

case 5

PosicionCorrecta = Personasrelative(+5)

break

if (PosicionCorrecta)

thisPosicion = PersonasgetRow()

DNI = PersonasgetString(DNI)

Nombre = PersonasgetString(Nombre)

Apellido = PersonasgetString(Apellido)

Edad = PersonasgetInt(Edad)

else

thisPosicion = Posicion

DNI = ----

Nombre = ----

Apellido = ----

Edad = 0

DatosPersona = new ObRegistro(DNINombreApellidoEdad)

Personasclose()

Conexionclose()

SentenciaSQLclose()

Systemoutprintln(StringvalueOf(Posicion)++StringvalueOf(thisPosicion))

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public int Posicion()

return Posicion

public ObRegistro DameDatos() return DatosPersona

ObPosicionamientojava

En este ejemplo se emplean servlets y paacuteginas Web Los clientes habitualmente trabajan en

una computadora remota y los programas se ejecutan en un servidor El mecanismo de

comunicaciones que soporta el protocolo http nos permite consultar en el servidor los datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

que ha seleccionado o escrito el usuario de esta manera se puede observar una disociacioacuten

entre la interfaz graacutefica de usuario (que se ejecuta en los equipos de los clientes) y el

programa que recoge los datos y ejecuta las acciones pertinentes (que se ejecuta en el

servidor)

Como puede observarse el coacutedigo SvAccessoBD es un servlet que lleva a cabo las siguientes

operaciones

1 Recoge los valores provenientes del usuario

2 Determina la naturaleza de la accioacuten a realizar

3 Realiza su cometido con la base de datos

4 Genera la respuesta que recibiraacute el usuario

32 JSP

JSP significa Java Server Pages que traducido quiere decir Paacuteginas de Servidor Java y es

por tanto una tecnologiacutea orientada a crear paacuteginas Web con programacioacuten en JAVA es decir

permite mezclar HTML estaacutendar y estaacutetico con un contenido dinaacutemico etiquetas especiales

(oacuterdenes) y trozos de coacutedigo JAVA (scriptlets o secuencias de oacuterdenes) o contenido dinaacutemico

generado por servlets Eacuteste contenido dinaacutemico se encuentra encerrado en etiquetas

especiales muchas de las cuales inician con lt y finalizan con gt El motor de las paacuteginas

JSP esta basado en los servlets de JAVA

En la tecnologiacutea JSP se crean paacuteginas parecidas a las paacuteginas que se crean en ASP (Active

Server Page de Microsoft) o PHP (Personal Home Page) que son dos tecnologiacuteas de paacuteginas

ejecutadas en el servidor Sin embargo JSP no se cintildee a un sistema operativo o servidor Web

en particular ademaacutes de que proporciona acceso a la tecnologiacutea de Servlets y a JAVA en la

parte dinaacutemica

El proceso para generar paacuteginas JSP accesibles en Web es mucho maacutes simple que en los

servlets Dando por hecho que se tiene un servidor Web que permite usar JSP el coacutedigo se

almacenaraacute en archivos con extensioacuten jsp que incluyen dentro de la estructuras de etiquetas

HTML las sentencias JAVA a ejecutar y tan soacutelo se colocaraacuten en cualquier lugar en donde

se pusiera una paacutegina Web normal sin compilacioacuten sin paquetes y sin configuracioacuten aunque

el servidor tendraacute que ser configurado para acceder a los archivos de clases Servlets y de

JSPs

Aunque lo que se escriba con frecuencia luciraacute como un archivo HTML estaacutendar detraacutes de

ello la paacutegina JSP se convierte automaacuteticamente en un servlet normal donde el HTML

estaacutetico tan soacutelo es enviado al flujo de salida asociado con el meacutetodo service del servlet Esta

traduccioacuten se realiza la primera vez que se solicita la paacutegina De acuerdo como este

configurado el servidor es posible ver el coacutedigo fuente de los servlets generados a partir de

sus paacuteginas JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Por ejemplo supongamos que se ha escrito el siguiente coacutedigo en el archivo Saludojsp

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtEjemplo JSPlttitlegtltheadgt

ltbody bgcolor=ffffccgt

ltcentergt

lth2gtHola mundolth2gt

ltjavautilDate hoy = new javautilDate()gt

La fecha de hoy es lt=hoygt

ltcentergt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional y un fragmento de un scriptlet de JAVA La etiqueta

lt identifica el comienzo del scriptlet y gt el final Una expresioacuten de la forma =variable

es sustituida por el valor de esa variable Para ejecutar esta paacutegina o cualquier otra paacutegina

JSP desde un navegador hay que instalarla en el servidor de aplicaciones de la misma manera

en como se hizo con los servlets Suponiendo entonces que se tiene instalado el Tomcat 5

siga los siguientes pasos

1 Antildeadir en el servidor la carpeta digamos JSP2 dentro de la carpeta webapps del Tomcat

y construir sobre ella la jerarquiacutea de clases ya conocida de los servlets

webappsrarrJSP2rarrWEB-INFrarrclasses

WEB-INFrarrlib

WEB-INFrarrtags

2 Editar en la carpeta WEB-INF el descriptor de despliegue webxml que se indica a

continuacioacuten Este archivo XML indica doacutende se localiza el esquema XML para la

especificacioacuten Servlet 24 que a suvez utiliza el esquema XML para la especificacioacuten

Java Server Page 20 que son las especificaciones que soporta en servidor Tomcat

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=

httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

3 Crear en JSP2 la carpeta saludo que contendraacute la aplicacioacuten y copiar en ella la paacutegina

Saludojsp

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

4 Arrancar el servidor Si el servidor ya estaba arrancado detenerlo y volverlo a arrancar o

bien abrir el explorador escribir el URL httplocalhost8080managerhtml e instalar

la aplicacioacuten

5 Una vez arrancado el servidor verificar si estaacute funcionando correctamente escribiendo

el URL siguiente en el explorador httplocalhost8080 El explorador debe mostrar la

paacutegina del Tomcat

6 Ejecutar la paacutegina JSP iniciando el explorador y escribiendo el URL siguiente

httplocalhost8080JSP2saludoSaludojsp donde la sintaxis geneacuterica es

httpservidor[puerto]MiCarpetapaginajsp

Cuando esta paacutegina (Saludojsp) es invocada por primera vez el motor JSP lleva a cabo una

fase de traduccioacuten de la misma en un servlet y el motor Servlet es el que ejecutaraacute eacuteste uacuteltimo

para generar el HTML dinaacutemico que seraacute enviado al explorador cliente seguacuten puede

deducirse de la figura siguiente La proacutexima vez que la paacutegina sea solicitada el motor JSP

ejecutaraacute el servlet que fue caragado la primera vez a no ser que la paacutegina haya cambiado

en cuyo caso seraacute compilada automaacuteticamente en un nuevo servlet y ejecutada

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Regresando al ejemplo el archivo java generado por el Tomcat a partir del archivo

Saludojsp se localiza en la carpeta workCatalinalocalhost de la instalacioacuten de Tomcat

321 ELEMENTOS PARA SECUENCIAS DE COMANDOS

Los elementos para secuencias de comandos permiten insertar coacutedigo en el servlet que seraacute

generado a partir de la paacutegina JSP Existen tres formas

1 Expresiones del tipo lt= expresioacuten gt que se evaluacutean e insertan en el resultado del

servlet

2 Los scriptlets del tipo lt codigo gt que se insertan en el meacutetodo _jspService del

servlet (ejecutado por service)

3 Las declaraciones del tipo lt Codigo gt que se insertan en el cuerpo de la clase del

servlet fuera de cualquier meacutetodo existente

NOTA Los comentarios en JSP se escriben lt-- Comentario JSP --gt en tanto que los

comentarios en HTML son de la forma lt--Comentario HTML --gt La diferencia

semaacutentica radica en que los comentarios HTML cuando se insertan en la respuesta enviada

por el servidor al cliente no se muestran cuando se visualiza el documento HTML pero si

Servidor Maacutequina Cliente

Explorador Web

Contenedor Web

Motor Servlet

Motor JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

los podemos ver cuando se visualiza el coacutedigo fuente en tanto que los comentarios JSP

aunque se inserten en la respuesta enviada por el servidor al cliente no son enviados al

explorador de forma que tampoco se muestran ni se ven cuando se visualiza el coacutedigo fuente

HTML desde el explorador

3211 EXPRESIONES

Se utiliza una expresioacuten JSP para insertar valores directamente en el resultado La sintaxis es

lt= expresioacuten gt Por ejemplo

lt= requestgetParameter(ldquoparNombre) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt lt= s gt

La fecha y hora actual es lt= new javautilDate() gt

La expresioacuten se evaluacutea se convierte a cadena y se inserta en la paacutegina Esta evaluacioacuten se

realiza durante la ejecucioacuten

32111 VARIABLES PREDEFINIDAS

Para simplificar estas expresiones se pueden utilizar cierta cantidad de variables

predefinidas Estos objetos impliacutecitos como tambieacuten se les llama estaacuten disponibles para su

uso durante la implementacioacuten de una paacutegina Web

bull pageContext Es un objeto de la clase PageContext que proporciona acceso a objetos

relacionados con los servlets

bull request Es un objeto de la clase HttpServletRequest que se puede obtener a traveacutes del

meacutetodo getRequest que encapsula los datos enviados por el cliente al servidor

bull response Es un objeto de la clase HttpServletResponse que puede obtenerse a traveacutes

del meacutetodo getResponse que encapsula los datos que el servidor enviaraacute al cliente

bull application Es un objeto de la clase ServletContext que se obtiene a traveacutes del meacutetodo

getServletContext que define un conjunto de meacutetodos que todo servlet utiliza para

comunicar con el contenedor de servlets

bull config Es un objeto de la clase ServletConfig que se obtiene a traveacutes del meacutetodo

getServletConfig y que se utiliza por el contenedor de servlets para pasar informacioacuten

al servlet durante la iniciacioacuten

bull session Es un objeto de la clase HttpSession que se obtiene a traveacutes del meacutetodo

getSession que proporciona una forma de identificar a un usuario que visita las paacuteginas

de un sitio Web

bull out Es un objeto de la clase JspWriter que se obtiene a traveacutes del meacutetodo getOut que

se utiliza para almacenar la respuesta que seraacute enviada al cliente que hizo la peticioacuten de

la paacutegina

bull page Es un objeto geneacuterico de la clase Object que se obtiene a traveacutes del meacutetodo

getPage y que representa al servlet obtenido a partir de la paacutegina JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

bull exception Es un objeto de la clase Exception que se obtiene a traveacutes del meacutetodo

getException que contendraacute informacioacuten a cerca de cualquier excepcioacuten que se lance

desde la paacutegina JSP

Un ejemplo del uso de uno de estos objetos impliacutecitos seriacutea el siguiente

El nombre de tu host es lt= requestgetRemoteHost() gt

El listado siguiente da un ejemplo de una paacutegina JSP que utiliza algunas variables

predefinidas como uso de expresiones JSP

ltDOCTYPE HTML PUBLIC -W3CDTD HTML 40 Transitional ENgt

lthtmlgt

ltheadgt

lttitlegt Expresiones JSP lttitlegt

ltheadgt

ltbodygt

lth2gt Expresiones JSP lth2gt

ltULgt

ltligt Fecha y hora en curso lt= new javautilDate() gt ltligt

ltligt Nombre de su host lt= requestgetRemoteHost() gt ltligt

ltligt Identificador de su sesioacuten lt= sessiongetId() gt ltligt

ltligt El paraacutemetro ltcodegt paramPrueba ltcodegt del formulario

lt= requestgetParameter(paramPrueba) gt ltligt

ltULgt

ltbodygt

lthtmlgt

Cuya salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3212 LOS SCRIPTLETS JSP

Si se desea hacer algo maacutes complejo que una simple expresioacuten los scriptlets permiten insertar

coacutedigo JAVA en el meacutetodo _jspService del servlet (que es ejecutado por service) La sintaxis

utilizada por los scriptlets es lt coacutedigo java gt Los escriptlets tienen acceso a las

mismas variables definidas de forma automaacutetica como expresiones A manera de ejemplo si

se desea que el resultado aparezca en la paacutegina generada deberiacutea de utilizarse la variable out

como en la siguiente instruccioacuten

lt String datosConsultados= requestgetQueryString()

outprintln(ldquoDatos GET adjuntos ldquo+datosConsultados)

gt

En este ejemplo podriacutea haberse obtenido el mismo resultado utilizando la siguiente expresioacuten

JSP

Datos GET adjuntos lt=requestgetQueryString() gt

En general los scriptlets pueden ejecutar varias tareas que no podriacutean realizarse con las

expresiones Tales tareas incluyen

bull La determinacioacuten de encabezados de respuesta

bull Actualizacioacuten de Bases de Datos

bull Ejecucioacuten de bucles condiciones y otras estructuras complejas

lt for (int i=1 ilt=6 i++)

gt

lth lt=i gtgt Hola Mundo lthlt=i gtgt

lt gt

Como un ejemplo concreto se muestra la siguiente paacutegina JSP llamada Cuentajsp en donde

se observa coacutemo se hace un seguimiento del nuacutemero de veces que un cliente accede a esta

paacutegina a traveacutes de distintas sesiones Para ello supondremos que dicha cuenta es el valor del

atributo atrCuenta del objeto impliacutecito application ya citado La primera vez que el cliente

accede a la paacutegina el valor de atrCuenta seraacute null debido a que auacuten no ha sido fijado este

atributo en este caso se fijaraacute con el valor 1 En los siguientes accesos se leeraacute el valor del

atributo atrCuenta se incrementaraacute en una unidad y se volveraacute a fijar Finalmente se enviacutea

la respuesta al cliente para que se muestre al usuario el valor del contador

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en el objeto impliacutecito application con el nombre

atrCuenta

--gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt

Integer cuenta = (Integer)applicationgetAttribute(atrCuenta)

String s = vez

if (cuenta == null)

cuenta = new Integer(1)

else

cuenta = new Integer(cuentaintValue() + 1)

s = veces

applicationsetAttribute(atrCuenta cuenta)

gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

Has visitado esta paacutegina lt= cuenta gt lt= s gt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional un fragmento de coacutedigo JAVA o scriptlet

expresiones y comentarioshellip

Aquiacute otro ejemplo de la ejecucioacuten de un coacutedigo demasiado complejo para una expresioacuten JSP

Este listado presenta una paacutegina JSP que utiliza el paraacutemetro de peticioacuten colorFondo para

establecer el color de fondo de la paacutegina

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgt

lttitlegt Prueba de Color lttitlegt

ltheadgt

lt

String colorFondo=requestgetParameter(colorFondo)

boolean tieneColorExplicito

if (colorFondo =null)

tieneColorExplicito=true

else

tieneColorExplicito=false

colorFondo=WHITE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt

ltbody bgcolor=lt= colorFondo gtgt

lth2 align=centergt Prueba de color lth2gt

lt

if (tieneColorExplicito)

outprintln(Ha indicado un color de fondo expliacutecito +

colorFondo +)

else

outprintln(Usareacute el color de fondo predeterminado WHITE +

Indique el atributo de peticioacuten

ltigtcolorFondoltigt+

para intentar un color estaacutendar un +

valor RRGGBB o para ver si el navegador Web +

permite el uso de nombres de color X11)

gt

ltbodygt

lthtmlgt

Cuyas posibles salidas son

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3213 DECLARACIONES JSP

Una declaracioacuten JSP permite definir meacutetodos o campos que seraacuten insertados en el cuerpo

principal de la clase del servlet (fuera del meacutetodo _jspService) Una declaracioacuten tiene la

sintaxis lt Coacutedigo Java gt Por ejemplo

lt int i=0 gt

lt

Public void jspinit()

coacutedigo de iniciacioacuten

gt

Una declaracioacuten no genera ninguacuten resultado y se usan junto con las expresiones JSP o los

scriptlets A continuacioacuten se muestra una paacutegina JSP que despliega la cantidad de veces que

se ha solicitado esta paacutegina desde que se arrancoacute el servidor haciendo uso de las

declaraciones JSP

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtDeclaraciones JSPlttitlegtltheadgt

ltbodygt

lth1gtDeclaraciones JSPlth1gt

lt-- Esto es un comentario en JSP --gt

lt private int recuentoAccesos=0 gt

lth2gt Accesos a la paacutegina desde el reinicio del servidor

lt= ++recuentoAccesos gt lth2gt

ltbodygt

lthtmlgt

La salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

322 EL LENGUAJE DE EXPRESION EN JSP 20

Anteriormente se ha visto la necesidad de utilizar fragmentos de coacutedigo java en el desarrollo

de paacuteginas JSP pero con la aparicioacuten de la especificacioacuten JSP 20 ya no hay necesidad de

utilizar fragmentos de coacutedigo Java para nada gracias al nuevo lenguaje de expresioacuten EL

(Expresioacuten Language) a la biblioteca de etiquetas estandar JSTL (JSP Standar Tag Library)

y a las nuevas formas para desarrollar etiquetas personalizadas

El lenguaje de expresioacuten JSP es maacutes un lenguaje de acceso a datos que un lenguaje de

programacioacuten Ya se ha visto que para pasar informacioacuten de un cliente a una paacutegina JSP se

utilizan paraacutemetros en la peticioacuten y atributos en la paacutegina El lenguaje de expresioacuten lo hace

posible sin tener que utilizar scriptlets o expresiones (lt= expresioacuten gt) Por ejemplo las

liacuteneas JSP 12 siguientes escritas utilizando coacutedigo Java

lt= requestgetParameter(ldquoparNombrerdquo) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt veces

bajo la especificacioacuten JSP 20 se pueden escribir de una forma maacutes sencilla como sigue

(ahora no se trata de coacutedigo JAVA)

$paramparNombre has visitado esta paacutegina

$atrCuenta veces

La sintaxis de JSP es sensible a mayuacutesculas y minuacutesculas pero un par de comillas simples es

equivalente a un par de comillas dobles

3221 VARIABLES PREDEFINIDAS (Objetos Impliacutecitos)

El lenguaje de expresioacuten JSP 20 soporta los objetos impliacutecitos siguientes

pageContext Objeto de javaxservletjspPageContext que proporciona acceso a los

datos de una peticioacuten

param Coleccioacuten (objeto de tipo javautilMap) de todos los valores de los paraacutemetros

enviados en una peticioacuten un String por paraacutemetro

paramValues Coleccioacuten de todos los valores de los paraacutemetros enviados en una

peticioacuten una matriz de tipo String por paraacutemetro

header Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten un

String por cabecera

headerValues Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten

una matriz de tipo String por cabecera

cookie Coleccioacuten de todos los valores de las cookies un objeto javaxservlethttpCookie

por cookie

initParam Coleccioacuten de todos los valores de los paraacutemetros de iniciacioacuten de la

aplicacioacuten un String por paraacutemetro

Tambieacuten hay objetos que permiten acceder a variables definidas en diferentes aacutembitos lo que

posibilita compartir informacioacuten

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

pageScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de paacutegina

requestScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

peticioacuten

sessionScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de sesioacuten

applicationScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

aplicacioacuten

3222 DIRECTRICES

Las directrices page incluye y taglib son mensajes para el motor JSP y son siempre incluidas

entre los siacutembolos lt y gt

32221 LA DIRECTRIZ PAGE

Define atributos que se aplican a toda la paacutegina JSP donde es incluida

lt page lista_de_atributos gt

Donde la lista_de_atributos puede contener algunos de los siguientes (aquellos que estaacuten

escritos en negrita son los tomados por omisioacuten)

language= ldquoscriptingLanguagerdquo

extends= rdquoclassNamerdquo

import= ldquoimportListrdquo

session= ldquotrue|falserdquo

buffer= ldquonone|sizeKb

autoflush= ldquotrue|falserdquo

isThreadSafe= rdquotrue|falserdquo

info= rdquoinfo_textrdquo

errorPage= ldquoerror_urlrdquo

isErrorPage= rdquotrue|falserdquo

contentType= rdquoctinfordquo

pageEncoding= rdquopeinfordquo

isELIgnored= ldquotrue|falserdquo

Tiacutepicamente se localiza al principio de la paacutegina JSP y puede haber cualquier nuacutemero de

ellas El lenguaje por omisioacuten es Java Ejemplos

lt page contentType=rdquotexthtmlrdquo language=rdquojavardquo gt

lt page import=rdquojavautil javalangrdquo gt

lt page buffer=rdquo5kbrdquo autoflush=rdquofalserdquo gt

32222 LA DIRECTRIZ INCLUDE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

La directriz include incluye un archivo (html jsp xml o de texto) en una paacutegina JSP Esto

permite dividir el contenido de la paacutegina en trozos maacutes manejables

lt incluye file=rdquoURL_relativordquo gt

El ejemplo siguiente muestra dos archivos el primero incluye al segundo para mostrar la

fecha y hora actuales

lt-- fichero mostrarFechaHorajsp --gt

lthtmlgt

ltheadgtlttitlegtIncluir un ficherolttitlegtltheadgt

ltbody bgcolor=whitegt

ltfont color=bluegt

La fecha y hora actuales son

lt include file=fechaHorajsp gt

ltfontgt

ltbodygt

lthtmlgt

lt-- fichero fechaHorajsp --gt

lt page import=javautil gt

lt= (new javautilDate())toLocaleString() gt

32223 LA DIRECTRIZ TAGLIB

La directriz taglib indica la biblioteca de acciones personalizadas que podremos utilizar en

la codificacioacuten de la paacutegina JSP Para distinguir esas acciones entre otras existentes se utiliza

un prefijo (prefix) Su sintaxis es

lt taglib (uri=rdquoURI_bibliotecardquo|tagdir=rdquoDir_biblioteca_tagrdquo)

prefix=rdquoprefijordquo gt

Cuando se trata de una biblioteca definida mediante una clase Java y un descriptor (archivo

tld) eacutesta se identifica mediante un URI (Uniform Resource Identifier- URL relativos) Por

ejemplo

lt taglib uri=rdquohttpMarioRossainzLopezmiBibliotecardquo

prefix=rdquofunrdquo gt

ltpgtltfunaccion01 gt

La uacuteltima liacutenea del ejemplo tiene dos etiquetas una etiqueta p HTML y otra accion01

perteneciente a la biblioteca miBiblioteca En cambio si la biblioteca se define mediante un

archivo tag entonces se identifica mediante su ruta relativa en el sistema de archivos

lt taglib tagdir=rdquoWEB-INFtagsrdquo prefix=rdquofunrdquo gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpgtltfunaccion01 gt

La directriz taglib debe colocarse antes de utilizar en la paacutegina JSP las acciones

personalizadas definidas por la misma Se puede utilizar maacutes de una directriz pero el prefijo

utilizado debe ser uacutenico para cada una de ellas

3223 ACTIVACION DEL LENGUAJE DE EXPRESION (LE)

La especificacioacuten JSP 20 define un lenguaje de expresioacuten como alternativa a elementos de

programacioacuten escritos con coacutedigo Java y especificaciones anteriores a la JSP 20 Para que

este lenguaje pueda ser interpretado tienen que cumplirse 2 requisitos

1 Que la propiedad isELIgnored de la directriz page valga false

lt page isELIgnored= ldquofalserdquo gt

2 Que el descriptor de despliegue webxml en la carpeta WEB-INF indique doacutende se

localiza el esquema XML para la especificacioacuten Servlet 24 que a su vez utiliza el

esquema XML para la especificacioacuten Java Server Page 20

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

Utilizando el lenguaje de expresioacuten se podriacutea modificar la paacutegina Cuentajsp de la seccioacuten

3212 de este documento como se muestra a continuacioacuten Esta nueva paacutegina

1 Especifica que utilizaraacute la biblioteca core de etiquetas estandar (de la que se hablaraacute maacutes

adelante)

2 La primera vez que sea accedida definiraacute la variable atrCuenta en el aacutembito de la

aplicacioacuten con un valor inicial nulo y la incrementaraacute en una unidad cuando sea accedida

sucesivas veces simplemente incrementaraacute esta variable en una unidad

3 Finalmente mostraraacute una paacutegina con un contenido anaacutelogo al siguiente Esta formado

por una cabecera y una segunda liacutenea compuesta por el valor del paraacutemetro parNombre

enviado con la peticioacuten un texto fijo el valor de la variable atrCuenta y otro texto fijo

dependiente del valor de esta variable

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

El coacutedigo completo es el siguiente

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

3224 VARIABLES Y EXPRESIONES

Para acceder a una simple variable se puede escribir algo como lo siguiente $nombre y

para acceder a una propiedad de un objeto podemos escribir algo como

$paramparNombre

$applicationScopeatrCuenta

$pageContextrequestrequestURI

La primera liacutenea del ejemplo anterior obtiene el valor de la propiedad parNombre del objeto

param la segunda el valor del atributo atrCuenta del objeto applicationScope y la tercera

el URL relativo de la paacutegina JSP solicitada

El lenguaje de expresioacuten es maacutes tolerante con respecto a las variables con valor null y ejecuta

muchas maacutes conversiones de forma automaacutetica sobre el tipo de los datos cuando la expresioacuten

a evaluar asiacute lo requiere Por ejemplo la etiqueta condicional siguiente incluye una expresioacuten

que compara el valor del atributo atrCuenta con aacutembito de aplicacioacuten con 10 (convirtiendo

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

impliacutecitamente el valor del atributo al tipo de la constante para poder realizar la comparacioacuten

El resultado seraacute un valor de tipo boolean

ltcif test=rdquo$applicationScopeatrCuenta gt 10rdquogt

ltcifgt

o bien

ltcif test=rdquo$atrCuenta gt 10rdquogt

ltcifgt

Para que una literal pueda incluir un caracter significativo para el lenguaje dicho caracter

debe ser especificado como una secuencia de escape (caracter) Por ejemplo la siguiente

expresioacuten da lugar al literal ldquovezrdquo o ldquovecesrdquo entre comillas dobles

$(atrCuenta gt 1) iquest ldquordquovecesrdquordquo ldquordquovezrdquordquo

Cualquier objeto o atributo de un objeto definido en algunos de los aacutembitos de una paacutegina

puede ser utilizado como una variable Por ejemplo $atrCuenta+1 es una expresioacuten que

realiza la suma de la variable atrCuenta con 1

Cuando se trate de una propiedad de un objeto para acceder a ella se utilizaraacute el operador

punto o bien la notacioacuten empleada para acceder a un elemento de una matriz Por ejemplo

$paramparNombre

$param[ldquoparNombrerdquo]

Una expresioacuten LE puede aparecer en cualquier lugar donde pueda aparecer un texto fijo Por

tanto para informar al contenedor JSP que se trata de una expresioacuten y no de un texto fijo se

utilizan los delimitadores $ al principio y al final

3225 OPERADORES

OPERADOR DESCRIPCIOacuteN Acceso a la propiedad de un objeto o a un elemento de un Map

[] Acceso al elemento de una matriz o de un objeto List

() Pareacutentesis para alterar la prioridad en la evaluacioacuten de una expresioacuten

If ternario condicion expresion1 expresioacuten 2

+ Suma

- Resta

Producto

oacute div Divisioacuten

oacute mod Moacutedulo o resto de una divisioacuten

== oacute eq Igualdad

= oacute ne Diferente

lt oacute lt Menor que

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt oacute gt Mayor que

lt= oacute le Menor o igual que

gt= oacute ge Mayor o igual que

ampamp oacute and Operacioacuten Loacutegica AND

|| oacute or Operacioacuten Loacutegica OR

oacute not Operacioacuten Loacutegica NOT

empty Verifica si el valor de una variable es null si un String esta vaciacuteo o si una matriz Map

o Collection no tienen elementos

func(args) Llamada a una funcioacuten donde func es el nombre de la funcioacuten y arg representa cero o

maacutes argumentos separados por comas

El ejemplo siguiente muestra una paacutegina JSP compuesta por elementos HTML expresiones

LE y objetos impliacutecitos

lthtmlgt

ltheadgtlttitlegtJSP 20lttitlegtltheadgt

ltbodygt

lth3gtLenguaje de expresioacuten (LE)lth3gt

ltpgtLa siguiente tabla ilustra algunas expresiones LE

ltbrgtltbrgtlttable border=1gt

lttrgt

ltthgtltbgtExpresioacutenltbgtltthgt

ltthgtltbgtValorltbgtltthgt

lttrgt

lttrgt

lttdgt$3 + 6lttdgt

lttdgt$3 + 6lttdgt

lttdgt

lttrgt

lttdgt$(7 gt 4) 7 4lttdgt

lttdgt$(7 gt 4) 7 4lttdgt

lttrgt

lttrgt

lttdgt$header[host]lttdgt

lttdgt$header[host]lttdgt

lttrgt

lttablegt

ltbodygt

lthtmlgt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

323 BIBLIOTECA ESTANDAR DE ETIQUETAS

La biblioteca estaacutendar de etiquetas JSP (JSTL ndash Java Server Page Estaacutendar Tag Library)

incluye una cantidad amplia de etiquetas para diferentes aacutereas de trabajo

Aacuterea baacutesica (su prefijo es c ndash core) y contiene

o Soporte de variables (remove y set)

o Control del flujo (choose when otherwise forEach forTokens if)

o Manejo de URL (import param redirect param y url param)

o Operaciones varias (match y out)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlcore

Aacuterea XML (su prefijo es x) y contiene

o Sentencias baacutesicas (out parse y set)

o Control del flujo (choosehellip whenhellip otherwise forEach e if)

o Transformacioacuten de Documentos (transformhellipparam)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlxml

Aacuterea Internacionalizacioacuten (su prefijo es fmt) Contiene

o Localidad (setLocale y requestEncoding)

o Mensajes (bundle message param y setBundle)

o Formateo de Fechas y nuacutemeros (formatNumber formateacuteate parseDate

parseNumber setTimeZone timeZone)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlfmt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Aacuterea SQL (su prefijo es sql) es el lenguaje estandar para interactuar con bases de datos

relacionales y contiene setDataSource Quero dateParam param transaction y

update dateParam param) El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlsql

Aacuterea Funciones (su prefijo es fn) y contiene

o Longitud de una coleccioacuten (length)

o Manipulacioacuten de String (toUpperCase toLowerCase substring

substringAfter substringBefore trim replace indexOf startsWith

endsWith contains containsIgnoreCase split join y escapeXml)

o El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlfunctions

3231 OPERACIONES CON ETIQUETAS BAacuteSICAS

En un ejemplo pasado teniacuteamos el siguiente coacutedigo

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

En este ejemplo se hace referencia al aacuterea baacutesica de JSTL con el prefijo c y se utiliza la

etiqueta cset para definir la variable atrCuenta Si la variable ya esta definida simplemente

se le asigna el valor especificado

La uacuteltima parte del ejemplo anterior podriacutea haberse escrito de esta otra forma

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcif test=rdquo$atrCuenta gt 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcifgt

$atrCuenta $str

La etiqueta cif permite la ejecucioacuten condicional de su cuerpo en funcioacuten del valor del

atributo de test

La etiqueta cchoose permite la ejecucioacuten del cuerpo de la primera etiqueta cwhen cuyo

atributo test sea evaluado a true Si ninguna de las condiciones se evaluacutea a true entonces se

evaluacutea el cuerpo de la etiqueta cotherwise si estaacute presente El siguiente coacutedigo muestra otra

manera de escribir el ejemplo anterior utilizando estas uacuteltimas etiquetas

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcchoosegt

ltcwhen test=rdquo$atrCuenta == 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcwhengt

ltcotherwisegt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcotherwisegt

ltcchoosegt

$atrCuenta $str

La etiqueta cforEach permite iterar sobre una coleccioacuten de objetos La coleccioacuten se

especifica por medio del atributo iacutetems y el elemento actual de la coleccioacuten estaacute disponible a

traveacutes de la variable establecida por el atributo var Por ejemplo el siguiente fragmento de

coacutedigo visualiza una tabla con las variables definidas a nivel de aacutembito de paacutegina

lttable border=rdquo1rdquogt

ltcforEach var=rdquoitemrdquo iacutetems=rdquo$pageScoperdquogt

lttrgt

lttdgt $item lttdgt

lttrgt

ltcforEachgt

lttablegt

La etiqueta ccatch atrapa una excepcioacuten que ocurra en el cuerpo de la misma Por ejemplo

el siguiente segmento de coacutedigo lanzaraacute una excepcioacuten si el paraacutemetro mes se escribe con

letras en vez de con nuacutemeros

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltbodygt

lthtmlgt

Un URL anaacutelogo al siguiente daraacute lugar a que la excepcioacuten sea lanzada cuando se ejecute la

expresioacuten $nMes 3 de la paacutegina anterior

httplocalhost8080JSP2exceppruebajspmes=marzo

La excepcioacuten indica que ha ocurrido un error al tratar de convertir ldquomarzordquo a un entero de

tipo Long Para cachar esta excepcioacuten y darle un tratamiento adecuado habraacute que modificar

la paacutegina JSP anterior como se indica a continuacioacuten

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltccatch var=rdquoerrorOcurridordquogt

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltccatchgt

ltcif test=rdquo$not empty errorOcurridordquogt

Error el paraacutemetro mes debe ser un nuacutemero ltbgt

ltbrgt Informacioacuten del error dada por el sistema

ltbrgt ltfont color=rdquoFF0000rdquogt $errorOcurrido ltfontgt

ltcifgt

ltbodygt

lthtmlgt

3232 ACCESO A BASES DE DATOS CON JSP

Las etiquetas que proporciona el aacuterea SQL permiten realizar

Conexioacuten con una base de datos

Realizacioacuten de consultas a la base de datos

Acceso al conjunto de resultados

Ejecucioacuten de actualizaciones y transacciones

Todas las etiquetas SQL actuacutean sobre una base de datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

32321 CONEXIOacuteN CON LA BASE DE DATOS

La conexioacuten con la base de datos puede realizarse con la etiqueta sqlsetDataSource Por

ejemplo si se esta utilizando el administrador de bases de datos MySql con el controlador

JDBC se puede realizar una conexioacuten con una base de datos digamos bd_tutorias de la

manera siguiente

ltsqlsetDataSource var=rdquobdrdquo

driver=rdquocommysqljdbcDriverrdquo

url=rdquojdbcmysqllocalhost3306bd_tutoriasrdquo

user=rdquoadminrdquo

password=rdquoadminadminrdquo gt

32322 CONSULTA A LA BASE DE DATOS

La etiqueta sqlQuero permite realizar una consulta a una base de datos Por ejemplo el

siguiente fragmento de coacutedigo realiza una consulta a la base de datos representada por bd y

obtiene un conjunto de resultados representado por cdr

ltsqlquery var=rdquocdrrdquo dataSource=rdquo$bdrdquogt

SELECT professor dia hora alumno

FROM profesores tutorias citas

WHERE profesoresid_profesor=tutoriasid_profesor

AND tutoriasid_tutoria=citasid_tutoria

ltsqlquerygt

32323 MODIFICACIONES SOBRE LA BASE DE DATOS

La etiqueta sqlupdate permite ejecutar una sentencia SQL INSERT UPDATE o DELETE

y cualquier otra sentencia SQL que no retorne ninguacuten valor Por ejemplo

ltsqlupdate var=rdquocontrdquo dataSource=rdquo$bdrdquo gt

UPDATE profesores

SET profesor=

WHERE profesor=

ltsqlparam value=rdquo$paramProfesorrdquo gt

ltsqlparam value=rdquo$paramIDrdquo gt

ltsqlupdategt

Una operacioacuten UPDATE puede utilizar el siacutembolo para indicar que el valor que tendriacutea que

evaluarse en esa posicioacuten seraacute suministrado por una etiqueta sqlparam como por ejemplo

httplocalhost8080JSP2sqlpruebajspProfesor=Mario+Rossainz+LopezampID=514

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3151 PUESTA EN FUNCIONAMIENTO DEL SERVLET ldquoHolaMundordquo

Una vez escrito el servlet los pasos necesarios para ver el resultado que produce son

bull Compilarlo

bull Instalarlo en un servidor

bull Invocarlo para su ejecucioacuten desde un navegador Web

Como puede leerse no resulta tan sencillo desarrollar y ejecutar por vez primera un servlet a

diferencia de una aplicacioacuten JAVA normal que esteacute basada en el SDK estaacutendar Estos pasos

requieren proceder entonces de alguna de las dos formas siguientes

1 Suponiendo que se tiene instalado el J2SE SDK en particular la versioacuten 150 habraacute que

instalar el servidor Web de aplicaciones Tomcat 5 El servidor Tomcat soporta un

contenedor Web que permite ejecutar servlets y paacuteginas JSP (de las que se hablaraacuten en

la seccioacuten siguiente) En el apeacutendice B del presente documento se muestra la manera de

No obstante existen muchos tipos de servidores aparte del Tomcat que permiten el uso de

los servlets algunos de estos son

a JavaServer Web Development Kit (JSWDK) hoy llamado JWSDP (Java Web

Services Developer Pack o Paquete de desarrollo de servicios Web de Java)

b Allaire JRun (motor para JSP y Servlet que puede ser integrado en servidores de

Netscape Enterprise o Microsoft Personal Web Server)

c ServletExec de Nwe Atlanta (Motor para JSP y Servlet que puede ser integrado

en los servidores Web maacutes populares para Solaris Windows MacOs HP-UX y

Linux

d LiteWebServer (LWS) de Gefion Software (Es un pequentildeo servidor Web

gratuito derivado de Tomcat)

e Java Web Server de Sun (Servidor totalmente gratuito escrito en JAVA

2 Suponiendo que no se tiene instalado ninguacuten software para desarrollar aplicaciones

JAVA habraacute que instalar el Java 2 Enterprise Edition Software Development Kit o J2EE

SDK Este paquete proporciona la base para desarrollar y distribuir aplicaciones

multicapa distribuidas e incluye entre otras herramientas el J2SE y un servidor de

aplicaciones (J2EE Application Server) En el apeacutendice A se muestra la manera en que

se puede instalar y la forma en la que se puede lanzar el servidor de aplicaciones La

versioacuten que se esta suponiendo se trabajaraacute es la J2EE 14 SDK que incluye el J2SE

142_02 y ejemplos ademaacutes del J2EE 14 Application Server

Para ejecutar un servlet como el del HolaMundo del ejemplo anterior teniendo ya instalados

los paquetes J2SE 150 y Tomcat 5 siga los pasos siguientes

1 antildeada a la variable de entorno path de su sistema operativo la ruta de la carpeta bin del

J2SE que tiene instalado

2 Copie el archivo servlet-apijar que se encuentra en commonlib del tomcat que tiene

instalado a jrelibext del J2SE

3 Cambie al directorio de la aplicacioacuten es decir donde se encuentra el servlet

4 Compile el servlet en el ejemplo javac HolaMundojava

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

5 Antildeada el archivo class (HolaMundoclass) que resulta de la compilacioacuten a la carpeta

webappsROOTWEB-INFclasses del Tomcat

6 Edite el archivo confwebxml del Tomcat para definir el servlet invoquer que permite

ejecutar servlets anoacutenimos

7 Arranque el servidor Tomcat (este punto debe realizarse despueacutes del paso 5 para que el

servidor reconozca la aplicacioacuten que se acaba de instalar) Si el servidor ya estaba

arrancado cuando se realizoacute el punto 4 detengalo y vuelvalo a arrancar o abra el

explorador y escriba el URL httplocalhost8080managerhtml y recargue la

aplicacioacuten

8 Una vez arrancado el servidor verifique que funciona correctamente escribiendo en el

navegador httplocalhost8080 o http1270018080 8080 es el puerto utilizado para

acceder al servidor

9 Ejecute el servlet escribiendo en el navegador el URL

httpservidor[puerto]servletnombre_servlet que en el caso del ejemplo seriacutea

httplocalhost8080servletHolaMundo

En conclusioacuten para ejecutar un servlet habraacute que copiar el archivo class que lo define

en la carpeta ROOTWEB-INFclasses de la carpeta webapps del servidor a la que tienen

acceso los clientes Web y ejecutar httpservidor[puerto]servletnombre_servlet de

forma que el servlet HolaMundo se mostrariacutea en su ejecucioacuten como en la figura siguiente

Ahora bien lo maacutes interesante es invocar a los servlets desde paacuteginas Web Se puede solicitar

la ejecucioacuten de un servlet de igual manera que pedimos un recurso cualquiera basta con

definir el URL del servlet en el punto deseado en la paacutegina Web

El siguiente ejemplo muestra un servlet que ademaacutes de generar la paacutegina HTML donde se

manda a escribir ldquoHola Mundordquo devuelve la fecha y hora del servidor Con esto se trata de

dar a entender que por una parte un servlet no tiene porque generar soacutelo paacuteginas HTML sino

que ademaacutes un servlet es capaz de generar contenido dinaacutemico incluyendo cualquier proceso

escrito que pueda ejecutar JAVA (leer o escribir archivos ejecutar programas cargas

bibliotecas etc)

import javaio

import javaxservlet

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

import javaxservlethttp

import javautil

public class Saludo extends HttpServlet

Manipular la peticioacuten enviada por el cliente

utilizando el atributo method=get

protected void doGet(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

responsesetContentType(texthtml)

PrintWriter out = responsegetWriter()

outprintln(lthtmlgt)

outprintln(ltheadgt)

outprintln(lttitlegtServlet Saludolttitlegt)

outprintln(ltheadgt)

outprintln(ltbodygt)

outprintln(ltcentergt)

for (int tamantildeo = 1 tamantildeo lt= 7 ++tamantildeo)

outprintln(ltfont size=+tamantildeo+ color=bluegt)

outprintln(iexcliexcliexclHola mundo)

outprintln(ltbrgt)

outprintln(ltbrgt)

Calendar fechahora = new GregorianCalendar()

Random rnd = new Random()

int tamantildeo = rndnextInt(7)+1

outprintln(ltfont size=+tamantildeo+gt)

outprintln(ltfont color=greengt)

outprintln(Son las +

fechahoraget(CalendarHOUR_OF_DAY) + +

fechahoraget(CalendarMINUTE) + +

fechahoraget(CalendarSECOND) )

outprintln(ltbrgt)

outprintln(ltfont color=graygt)

outprintln(Del diacutea +

fechahoraget(CalendarDAY_OF_MONTH) + +

(fechahoraget(CalendarMONTH)+1) + +

fechahoraget(CalendarYEAR) )

outprintln(ltfontgt)

outprintln(ltcentergt)

outprintln(ltbodygt)

outprintln(lthtmlgt)

outclose()

Para ejecutar este servlet llamado Saludo podemos crear una carpeta dentro de webapps por

ejemplo saludoWEB-INFclasses y copiar dentro de classes Saludoclass

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Para ejecutar el servlet Saludo tendriacuteamos entonces que escribir

httplocalhost8080SaludoservletSaludo

Pero si queremos invocar a este servlet desde una paacutegina HTML se deberaacute utilizar este

mismo URL o bien el URL relativo a la carpeta del servidor donde copiemos el archivo html

que seraacute copiado en la carpeta Saludo

El coacutedigo HTML almacenado en saludohtml deberaacute incluir una de las dos liacuteneas siguientes

lta href=rdquohttplocalhost8080Saludoservletsaludordquogt ejecutar Saludo ltagt

lta href=rdquoservletSaludordquogt ejecutar Saludo ltagt

La segunda opcioacuten es la maacutes interesante porque no depende de la direccioacuten del servidor Para

ejecutar entonces el servlet a traveacutes de saludohtml basta con escribir el URL siguiente

httplocalhost8080Saludosaludohtml

316 EMPAQUETADO DE SERVLETS

Puede darse el caso en que diversos programadores en un entorno de produccioacuten dado

podriacutean estar desarrollando servlets para el mismo servidor El colocar todos estos servlets

en el directorio principal de estos programas podriacutea dar como resultado un directorio difiacutecil

de administrar ademaacutes de que se corre el riesgo de duplicar los nombres de los servlets si

dos desarrolladores distintos eligen el mismo nombre para el programa que desarrollan Los

paquetes son la solucioacuten loacutegica a este problema El uso de paquetes tiene como resultado

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

cambios en la forma en que se generan los servlets la forma en que se compilan y en la que

se invocan Para colocar los servlets en paquetes se requieren de dos pasos

1 Mover los archivos (class) a un subdirectorio que coincida con el nombre del paquete

pretendido

2 Insertar una instruccioacuten de paquete en el archivo de clase Para ello la primera liacutenea en

el coacutedigo fuente (java) del servlet deberaacute ser package nomPaquete

Por ejemplo el fragmento siguiente de coacutedigo Java presenta una variacioacuten del Servlet

HolaMundo que se encuentra en el paquete misServlets

package misServlets

import javaio

import javaxservlet

import javaxservlethttp

public class HolaMundo extends HttpServlet

Manipular las posibles peticiones enviadas por el cliente

utilizando el atributo method=get o method=post

protected void procesarPeticion(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

responsesetContentType(texthtml)

PrintWriter out = responsegetWriter()

outprintln(lthtmlgt)

El archivo class se encontraraacute dentro de una carpeta llamada misServlets que seraacute el paquete

creado o utilizado por la aplicacioacuten en este caso del HolaMundo dependiendo si exitiacutea o no

antes de compilar la aplicacioacuten A continuacioacuten deberemos copiar dentro de la carpeta

webappsROOTWEB-INFclasses del Tomcat la carpeta misServlets junto con el

HolaMundoclass que estaraacute dentro de ella y ejecutar el servlet en el explorador escribiendo

httplocalhost8080servletmisServletsHolaMundo

317 PROCESAMIENTO DE FORMULARIOS

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Hasta este punto los servlets que hemos estudiado soacutelo enviacutean informacioacuten al navegador del

cliente No obstante estos clientes Web pueden Mostar formularios que permitan solicitar

datos a los usuarios que seraacuten enviados al servidor para por ejemplo ser almacenados en

una base de datos para posteriores peticiones o para otros procesos o bien para dar al usuario

una respuesta ajustada a dicha peticioacuten

En el siguiente URL se invoca la ejecucioacuten de un servlet llamado Parametros aportando la

lista de pares (Nombre Mario)-(Edad 22) en formato GET

httplocalhost8080ParametrosservletParametrosNombre=MarioampEdad=22

Hay que observar la manera de colocar los datos tras el siacutembolo ldquordquo y de separarlos con el

siacutembolo ldquoamprdquo El coacutedigo del servlet es el siguiente

import javaio

import javaxservlet

import javaxservlethttp

public class Parametros extends HttpServlet

public void doGet(HttpServletRequest request HttpServletResponse

response)

throws IOException ServletException

responsesetContentType(texthtml)

PrintWriter out = responsegetWriter()

outprintln(lthtmlgt)

outprintln(ltbodygt)

String NombreRecibido = requestgetParameter(Nombre)

String EdadRecibida = requestgetParameter(Edad)

outprintln(lth1gt Hola + NombreRecibido + lth1gt)

outprintln(lth1gt Tienes + EdadRecibida + antildeos lth1gt)

outprintln(ltbodygt)

outprintln(lthtmlgt)

El objeto httpServletRequest en el coacutedigo anterior request contiene una serie de meacutetodos de

utilidad para recibir informacioacuten proveniente del usuario en concreto el meacutetodo

getParameter permite obtener el valor asociado a un nombre en la lista de pares (nombre

valor) que puede proporcionar un URL

Ademaacutes de poder introducir el URL anterior en el navegador proporcionando directamente

los datos enviados al servlet en dicha URL

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Tambieacuten podemos generar el URL mediante una paacutegina Web que podraacute utilizar el usuario

lthtmlgt

ltbodygt

lth1gt Cuestionario lth1gt

ltform action=httplocalhost8080ParametrosservletParametros

method=getgt

Nombre ltinput type=text name=Nombregt ltbrgt

Edad ltinput type=text name=Edadgt ltbrgtltbrgt

ltinput type=submit value=Enviar datosgt ltbrgt

ltformgt

ltbodygt

lthtmlgt

Los formularios en HTML permiten enviar datos al servidor Web En la liacutenea 5 de la paacutegina

Web mostrada se encuentra la etiqueta form que en el ejemplo contiene el atributo action

que indica la accioacuten que debe realizarse en el servidor en este caso ejecutar el servlet

Parametros y el atributo method que indica la manera en la que se enviacutean los datos (en este

caso la peticioacuten GET)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Peticioacuten HTTP GET Cuando el tipo de peticioacuten HTTP es GET los datos del formulario

son enviados al servidor a continuacioacuten del URL especificado por el atributo action de form

El tamantildeo de la cadena enviada estaacute limitado y al estar en ASCII es totalmente legible por

tanto no es un modo seguro

Es por ello que cuando se requiere del enviacuteo de datos seguros y ademaacutes el nuacutemero de datos

del formulario que son enviados al servidor son muchos resulta ser mejor el uso del meacutetodo

POST Veamos otro ejemplo

import javaio

import javaxservlet

import javaxservlethttp

import javautil

public class MostrarParametros extends HttpServlet

public void doGet(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

responsesetContentType(texthtml)

PrintWriter out= responsegetWriter()

String titulo=Lectura de todos los paraacutemetros de Peticioacuten

outprintln(ltdoctype html public -W3CDTD HTML 40 +

TransitionalENgt)

outprintln(lthtmlgt)

outprintln(ltheadgtlttitlegt+titulo+lttitlegtltheadgt)

outprintln(ltbody bgcolor=FDF5E6gtn+

lth1 align=centergt+titulo+lth1gtn+

lttable border=1 align=centergtn+

lttr bgcolor=FFAD00gtn+

ltthgtNombre del parampaacutemetroltthgtValor(es) del

parampaacutemetro)

Enumeration nombresParam=requestgetParameterNames()

while(nombresParamhasMoreElements())

String nombreParam= (String)nombresParamnextElement()

outprint(lttrgtlttdgt+nombreParam+nltTDgt)

String[]valoresParam=

requestgetParameterValues(nombreParam)

if (valoresParamlength==1)

String valorParam=valoresParam[0]

if (valorParamlength()==0)

outprintln(ltigt Sin valor ltigt)

else

outprintln(valorParam)

else

outprintln(ltulgt)

for (int i=0 iltvaloresParamlengthi++)

outprintln(ltligt+valoresParam[i])

outprintln(ltulgt)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

outprintln(lttablegtnltbodygtlthtmlgt)

public void doPost(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

doGet(requestresponse)

El servlet escrito utiliza un meacutetodo doPost que soacutelo ejecuta a Donet Esto es porque se quiere

que el servlet pueda manejar tanto las peticiones GET como las POST Por otro lado el

formulario es el siguiente

ltdoctype html public -W3CDTD HTML 40 TransitionalENgt

lthtmlgt

ltheadgt

lttitlegt Un Formulario de ejemplo que utiliza POST lttitlegt

ltheadgt

ltbody bgcolor=FDF5E6gt

lth1 align=centergt Un formulario de Ejemplo que utiliza POST

lth1gt

ltform action=httplocalhost8080MostrarParametros

servletMostrarParametros

method=postgt

Nuacutemero de elemento ltinput type=text name=elemNumgt ltbrgt

Cantidad ltinput type=text name=cantidadgt ltbrgt

Precio Unitario ltinput type=text name=precio value=$gt

ltbrgtlthrgt

Nombre de Pila ltinput type=text name=nombrePilagt ltbrgt

Apellido(s) ltinput type=text name=apellidogt ltbrgt

Iniciales ltinput type=text name=inicialesgt ltbrgt

Domicilio de envio lttextarea name=domicilio rows=3

cols=40gtlttextareagt ltbrgt

Tarjeta de creacutedito ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta value=VisagtVisa ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta value=Master Cardgt

Master Card ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta value=AmexgtAmerican

Expresss ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta

value=DiscovergtDiscover ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta

value=Java Smart CardgtTarjeta Inteligente de Java

ltbrgt

Nuacutemero de la tarjeta de creacutedito

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltinput type=password name=numTarjetagtltbrgt

Repita el nuacutemero de la tarjeta de creacutedito

ltinput type=password name=numTarjetagtltbrgtltbrgt

ltcentergt

ltinput type=submit value=Enviar pedidogt

ltcentergt

ltformgt

ltbodygt

lthtmlgt

El formulario HTML del listado anterior utiliza POST como deberiacutea ser en todos los campos

que tienen contrasentildea

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Si intenta ejecutar el servlet MostrarParametros directamente en el explorador con el URL

httplocalhost8080MostrarParametrosservletMostrarParametros se obtendraacute la paacutegina

Web sin resultados

Peticioacuten HTTP POST Cuando el tipo de peticioacuten HTTP es POST los datos son enviados

al servidor en el cuerpo de la peticioacuten Es el meacutetodo maacutes usual de enviar los datos de un

formulario Con este tipo de peticioacuten la informacioacuten del formulario se enviacutea despueacutes del URL

indicado por action en el cuerpo de la peticioacuten y el tamantildeo de la informacioacuten enviada no esta

limitado

Seguacuten lo expuesto escoger el meacutetodo para enviar la informacioacuten no es difiacutecil Si los datos

son pocos y no importa su confidencialidad o manipulacioacuten utilizamos GET Si son largos

privados o importantes utilizamos POST

318 ACCESO A BASES DE DATOS CON SERVLETS

Una aplicacioacuten Java que realiza accesos a bases de datos funciona seguacuten una arquitectura que

permite escribir los programas abstrayeacutendose de los detalles de los niveles inferiores (discos

controladores sistema operativo etc) como lo muestra la figura siguiente

JDBC (Java DataBase Connectivity ndash Conexioacuten con Bases de Datos desde Java) es una API

de Java que permite ejecutar instrucciones SQL para manipular y gestionar bases de datos

relacionales Para que una aplicacioacuten Java pueda hacer operaciones sobre una base de datos

previamente tiene que establecer una conexioacuten con la misma Esta conexioacuten se realiza a

traveacutes de un controlador (driver) seguacuten la figura de arriba La API-JDBC se proporciona en

dos paquetes javasql y javaxsql El primer paquete contiene las interfaces y clases Java

fundamentales de JDBC en tanto que el segundo paquete es una extensioacuten del primero e

APLICACION

SISTEMA OPERATIVO

CONTROLADOR

Oracle Access MySql

JVM

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

incluye las clases que interactuacutean con JNDI y otras que gestionan conjuntos de conexiones

con una misma base de datos Para maacutes detalles del uso de JDBC veacutease el apeacutendice A de

estas notas

El primer paso para crear una conexioacuten entre una aplicacioacuten Java y una base de datos es

registrar el controlador JDBC adecuado para esa base con el fin de que la JVM pueda

utilizarlo Existen distintos tipos de controladores JDBC por ejemplo

ldquocommysqljdbcDriverrdquo que es el controlador utilizado cuando el motor de base de datos

que se utiliza es MySql

En el supuesto caso de que la base de datos soacutelo permitiera el acceso a traveacutes de controladores

ODBC como lo hace ACCESS siempre podemos usar el controlador puente JDBC-ODBC

incluido como parte del JDK ldquosunjdbcodbcJdbcOdbcDriverrdquo Este tipo de controladores

es decir los basados en ODBC (Open DataBase Connectivity) son bastante utilizados en

entornos Windows pues este SO incluye ODBC El apeacutendice A describe al final como

administrar los oriacutegenes de datos ODBC en Windows

Asiacute pues la mayor ventaja de los servlets con respecto a la conexioacuten con bases de datos viacutea

JDBC es que su ciclo de vida les permite mantener conexiones abiertas con las mismas a lo

largo de toda una sesioacuten Esto permite recortar tiempo con respecto a otras tecnologiacuteas como

la CGI Ademaacutes JDBC es una tecnologiacutea independiente de las bases de datos

Como ejemplo vamos a implementar una simple aplicacioacuten Web basada en servlets que

muestre una especie de directorio de personas La aplicacioacuten podraacute consultar insertar

modificar borrar o listar la informacioacuten de cada una de las personas almacenadas en la base

de datos a la que se hace acceso (que estaraacute en formato access)

La estructura de la Base de Datos es una tabla con los siguientes campos

DNI Nombre Apellido Edad

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

53023767A Pedro Rubio 18

77459822P Luis Tejedor 47

123456MRL Mario Rossainz 35

La estructura de la aplicacioacuten se muestra en la figura siguiente

lthtmlgt

ltbodygt

lttable border=1gtlttrgtlttdgt

ltform action=httplocalhost8080directorioTelservletSvAccesoBD

method=getgt

DNI ltinput type=text name=DNIgt ltbrgt

Nombre ltinput type=text name=Nombregt ltbrgt

Apellido ltinput type=text name=Apellidogt ltbrgt

Edad ltinput type=text name=Edadgt ltbrgtltbrgt

ltinput type=submit value=Consultar name=BotonConsultargt

ltinput type=submit value=Insertar name=BotonInsertargt

ltinput type=submit value=Modificar name=BotonModificargt

ltinput type=submit value=Borrar name=BotonBorrargt

ltinput type=submit value=Listar name=BotonListargt ltbrgt

ltcentergt

ltinput type=submit value= |lt name=BotonPrimerogt

ltinput type=submit value= -- name=BotonMenosCincogt

ltinput type=submit value= - name=BotonAnteriorgt

ltinput type=submit value= + name=BotonSiguientegt

ltinput type=submit value= ++ name=BotonMasCincogt

ltinput type=submit value= gt| name=BotonUltimogt

ltcentergt

lttdgt

lttdgt

lttextarea name=AreaDeListado rows=10 cols=35gtlttextareagt

SvAccesoBDhtml

SvAccesoBD

ObBorrado ObListado ObConsulta

ObInsercion

ObModificacion

ObPosicionamiento

ObRegistro

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lttdgt

lttrgt

ltformgt

lttablegt

ltbodygt

lthtmlgt

SvAccesoBDhtml

import javaio

import javaxservlet

import javaxservlethttp

public class SvAccesoBD extends HttpServlet

private int PosicionBuscada = 1

private String AreaDeListado=

PrintWriter out

public void doGet(HttpServletRequest request HttpServletResponse response)

throws IOException ServletException

String DNI = requestgetParameter(DNI)

String Nombre = requestgetParameter(Nombre)

String Apellido = requestgetParameter(Apellido)

String Edad = requestgetParameter(Edad)

String BotonConsultar = requestgetParameter(BotonConsultar)

String BotonInsertar = requestgetParameter(BotonInsertar)

String BotonModificar = requestgetParameter(BotonModificar)

String BotonBorrar = requestgetParameter(BotonBorrar)

String BotonListar = requestgetParameter(BotonListar)

String BotonPrimero = requestgetParameter(BotonPrimero)

String BotonMenosCinco = requestgetParameter(BotonMenosCinco)

String BotonAnterior = requestgetParameter(BotonAnterior)

String BotonSiguiente = requestgetParameter(BotonSiguiente)

String BotonMasCinco = requestgetParameter(BotonMasCinco)

String BotonUltimo = requestgetParameter(BotonUltimo)

AreaDeListado = requestgetParameter(AreaDeListado)

responsesetContentType(texthtml)

out = responsegetWriter()

outprintln(lthtmlgt)

outprintln(ltbodygt)

if (BotonConsultar=null) ConsultarDatos(DNI)

if (BotonInsertar=null) InsertarDatos(DNINombreApellidoEdad)

if (BotonModificar=null) ModificarDatos(DNINombreApellidoEdad)

if (BotonBorrar=null) BorrarDatos(DNI)

if (BotonListar=null) ListarDatos(DNI)

if (BotonPrimero=null) Controles(1)

if (BotonMenosCinco=null) Controles(2)

if (BotonAnterior=null) Controles(3)

if (BotonSiguiente=null) Controles(4)

if (BotonMasCinco=null) Controles(5)

if (BotonUltimo=null) Controles(0)

outprintln(ltbodygt)

outprintln(lthtmlgt)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

private void ConsultarDatos(String DNI)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObRegistro InstanciaFila = InstanciaConsultaDameDatos()

GenerarRespuesta(InstanciaFilaDameDNI()InstanciaFilaDameNombre()

InstanciaFilaDameApellido()

StringvalueOf(InstanciaFilaDameEdad()))

else

GenerarRespuesta(DNI------------)

PosicionBuscada = 1

public void ListarDatos(String DNI)

ObListado InstanciaListado = new ObListado()

AreaDeListado = InstanciaListadoDameResultado()

ConsultarDatos(DNI)

PosicionBuscada = 1

public void BorrarDatos(String DNI)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObBorrado InstanciaBorrado = new ObBorrado(PosicionBuscada)

GenerarRespuesta()

else

GenerarRespuesta(----------------)

PosicionBuscada = 1

public void ModificarDatos(String DNI String Nombre String Apellido

String Edad)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObRegistro InstanciaFila = new ObRegistro(DNI Nombre Apellido

IntegerparseInt(Edad))

ObModificacion InstanciaModificacion = new ObModificacion(PosicionBuscada

InstanciaFila)

GenerarRespuesta(DNINombreApellidoEdad)

else

GenerarRespuesta(----------------)

PosicionBuscada = 1

public void InsertarDatos(String DNI String Nombre String Apellido

String Edad)

ObRegistro InstanciaFila = new ObRegistro(DNI Nombre Apellido

IntegerparseInt(Edad))

ObInserccion InstanciaInserccion = new ObInserccion(InstanciaFila)

GenerarRespuesta()

PosicionBuscada=1

public void Controles(String Identificador)

ObPosicionamiento InstanciaPosicionamiento =

new ObPosicionamiento(IdentificadorPosicionBuscada)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ObRegistro InstanciaFila = InstanciaPosicionamientoDameDatos()

GenerarRespuesta(InstanciaFilaDameDNI()InstanciaFilaDameNombre()

InstanciaFilaDameApellido()

StringvalueOf(InstanciaFilaDameEdad()))

PosicionBuscada = InstanciaPosicionamientoPosicion()

private void GenerarRespuesta(String DNI String Nombre String Apellido

String Edad)

outprintln(lttable border=1gt)

outprintln(lttrgt)

outprintln(lttdgt)

outprintln(ltform

action=httplocalhost8080directorioTelservletSvAccesoBD

method=getgt)

outprintln( DNI ltinput type=text name=DNI value=+DNI+gtltbrgt)

outprintln( Nombre ltinput type=text name=Nombre

value=+Nombre+gtltbrgt)

outprintln( Apellido ltinput type=text name=Apellido

value=+Apellido+gtltbrgt)

outprintln( Edad ltinput type=text name=Edad

value=+Edad+gtltbrgtltbrgt)

outprintln( ltinput type=submit value=Consultar

name=BotonConsultargt)

outprintln( ltinput type=submit value=Insertar

name=BotonInsertargt)

outprintln( ltinput type=submit value=Modificar

name=BotonModificargt)

outprintln( ltinput type=submit value=Borrar name=BotonBorrargt)

outprintln( ltinput type=submit value=Listar name=BotonListargt

ltbrgt)

outprintln( ltcentergt)

outprintln( ltinput type=submit value= |lt name=BotonPrimerogt)

outprintln( ltinput type=submit value= --

name=BotonMenosCincogt)

outprintln( ltinput type=submit value= - name=BotonAnteriorgt)

outprintln( ltinput type=submit value= +

name=BotonSiguientegt)

outprintln( ltinput type=submit value= ++

name=BotonMasCincogt)

outprintln( ltinput type=submit value= gt| name=BotonUltimogt)

outprintln( ltcentergt)

outprintln( lttdgt)

outprintln( lttdgt)

outprintln( lttextarea name=AreaDeListado rows=10

cols=35gt+AreaDeListado+lttextareagt)

outprintln( lttdgt)

outprintln( lttrgt)

outprintln( ltformgt)

outprintln( lttablegt)

SvAccesoBDjava

import javasql

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

public class ObBorrado

ObBorrado(int PosicionBuscada)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

Personasabsolute(PosicionBuscada)

PersonasdeleteRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

ObBorradojava

import javasql

import javaawtTextArea

public class ObListado

private String Resultado=

ObListado()

String DNI Nombre Apellido Linea

int Edad Posicion

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement()

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

while (Personasnext())

DNI = PersonasgetString(DNI)

Nombre = PersonasgetString(Nombre)

Apellido = PersonasgetString(Apellido)

Edad = PersonasgetInt(Edad)

Posicion = PersonasgetRow()

Linea = DNI+ +Nombre+ +Apellido+ +StringvalueOf(Edad)

Resultado=Resultado+StringvalueOf(Posicion)+ +Linea+n

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public String DameResultado()

return Resultado

ObListadojava

public class ObRegistro

private String DNI Nombre Apellido

private int Edad

ObRegistro (String DNI String Nombre String Apellido int Edad)

thisDNI = DNI

thisNombre = Nombre

thisApellido = Apellido

thisEdad = Edad

String DameDNI()

return DNI

String DameNombre()

return Nombre

String DameApellido()

return Apellido

int DameEdad()

return Edad

ObRegistrojava

import javasql

public class ObConsulta

private int Posicion = 0

private ObRegistro DatosPersona

ObConsulta(String DNIPedido)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement()

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

while (Personasnext())

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

String DNI = PersonasgetString(DNI)

if (DNIequalsIgnoreCase(DNIPedido))

Posicion = PersonasgetRow()

String Nombre = PersonasgetString(Nombre)

String Apellido = PersonasgetString(Apellido)

int Edad = PersonasgetInt(Edad)

DatosPersona = new ObRegistro(DNINombreApellidoEdad)

break

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public int PosicionEncontrada()

return Posicion

public ObRegistro DameDatos()

return DatosPersona

ObConsultajava

import javasql

public class ObInserccion

ObInserccion(ObRegistro Datos)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

PersonasmoveToInsertRow()

PersonasupdateString(DNI DatosDameDNI())

PersonasupdateString(NombreDatosDameNombre())

PersonasupdateString(Apellido DatosDameApellido())

PersonasupdateInt(EdadDatosDameEdad())

PersonasinsertRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

catch (SQLException e)

Systemoutprintln(e)

ObInsercionjava

import javasql

public class ObModificacion

ObModificacion(int PosicionBuscada ObRegistro Datos)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

Personasabsolute(PosicionBuscada)

PersonasupdateString(DNIDatosDameDNI())

PersonasupdateString(NombreDatosDameNombre())

PersonasupdateString(ApellidoDatosDameApellido())

PersonasupdateInt(EdadDatosDameEdad())

PersonasupdateRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

ObModificacionjava

import javasql

public class ObPosicionamiento

private ObRegistro DatosPersona

private int Posicion

ObPosicionamiento(String Accion int Posicion)

int IDAccionEdad

String DNINombreApellido

boolean PosicionCorrecta=false

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

FROM DatosPersonales)

Personasabsolute(Posicion)

IDAccion = IntegerparseInt(Accion)

switch (IDAccion)

case 0

PosicionCorrecta = Personaslast()

break

case 1

PosicionCorrecta = Personasfirst()

break

case 2

PosicionCorrecta = Personasrelative(-5)

break

case 3

PosicionCorrecta = Personasprevious()

break

case 4

PosicionCorrecta = Personasnext()

break

case 5

PosicionCorrecta = Personasrelative(+5)

break

if (PosicionCorrecta)

thisPosicion = PersonasgetRow()

DNI = PersonasgetString(DNI)

Nombre = PersonasgetString(Nombre)

Apellido = PersonasgetString(Apellido)

Edad = PersonasgetInt(Edad)

else

thisPosicion = Posicion

DNI = ----

Nombre = ----

Apellido = ----

Edad = 0

DatosPersona = new ObRegistro(DNINombreApellidoEdad)

Personasclose()

Conexionclose()

SentenciaSQLclose()

Systemoutprintln(StringvalueOf(Posicion)++StringvalueOf(thisPosicion))

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public int Posicion()

return Posicion

public ObRegistro DameDatos() return DatosPersona

ObPosicionamientojava

En este ejemplo se emplean servlets y paacuteginas Web Los clientes habitualmente trabajan en

una computadora remota y los programas se ejecutan en un servidor El mecanismo de

comunicaciones que soporta el protocolo http nos permite consultar en el servidor los datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

que ha seleccionado o escrito el usuario de esta manera se puede observar una disociacioacuten

entre la interfaz graacutefica de usuario (que se ejecuta en los equipos de los clientes) y el

programa que recoge los datos y ejecuta las acciones pertinentes (que se ejecuta en el

servidor)

Como puede observarse el coacutedigo SvAccessoBD es un servlet que lleva a cabo las siguientes

operaciones

1 Recoge los valores provenientes del usuario

2 Determina la naturaleza de la accioacuten a realizar

3 Realiza su cometido con la base de datos

4 Genera la respuesta que recibiraacute el usuario

32 JSP

JSP significa Java Server Pages que traducido quiere decir Paacuteginas de Servidor Java y es

por tanto una tecnologiacutea orientada a crear paacuteginas Web con programacioacuten en JAVA es decir

permite mezclar HTML estaacutendar y estaacutetico con un contenido dinaacutemico etiquetas especiales

(oacuterdenes) y trozos de coacutedigo JAVA (scriptlets o secuencias de oacuterdenes) o contenido dinaacutemico

generado por servlets Eacuteste contenido dinaacutemico se encuentra encerrado en etiquetas

especiales muchas de las cuales inician con lt y finalizan con gt El motor de las paacuteginas

JSP esta basado en los servlets de JAVA

En la tecnologiacutea JSP se crean paacuteginas parecidas a las paacuteginas que se crean en ASP (Active

Server Page de Microsoft) o PHP (Personal Home Page) que son dos tecnologiacuteas de paacuteginas

ejecutadas en el servidor Sin embargo JSP no se cintildee a un sistema operativo o servidor Web

en particular ademaacutes de que proporciona acceso a la tecnologiacutea de Servlets y a JAVA en la

parte dinaacutemica

El proceso para generar paacuteginas JSP accesibles en Web es mucho maacutes simple que en los

servlets Dando por hecho que se tiene un servidor Web que permite usar JSP el coacutedigo se

almacenaraacute en archivos con extensioacuten jsp que incluyen dentro de la estructuras de etiquetas

HTML las sentencias JAVA a ejecutar y tan soacutelo se colocaraacuten en cualquier lugar en donde

se pusiera una paacutegina Web normal sin compilacioacuten sin paquetes y sin configuracioacuten aunque

el servidor tendraacute que ser configurado para acceder a los archivos de clases Servlets y de

JSPs

Aunque lo que se escriba con frecuencia luciraacute como un archivo HTML estaacutendar detraacutes de

ello la paacutegina JSP se convierte automaacuteticamente en un servlet normal donde el HTML

estaacutetico tan soacutelo es enviado al flujo de salida asociado con el meacutetodo service del servlet Esta

traduccioacuten se realiza la primera vez que se solicita la paacutegina De acuerdo como este

configurado el servidor es posible ver el coacutedigo fuente de los servlets generados a partir de

sus paacuteginas JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Por ejemplo supongamos que se ha escrito el siguiente coacutedigo en el archivo Saludojsp

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtEjemplo JSPlttitlegtltheadgt

ltbody bgcolor=ffffccgt

ltcentergt

lth2gtHola mundolth2gt

ltjavautilDate hoy = new javautilDate()gt

La fecha de hoy es lt=hoygt

ltcentergt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional y un fragmento de un scriptlet de JAVA La etiqueta

lt identifica el comienzo del scriptlet y gt el final Una expresioacuten de la forma =variable

es sustituida por el valor de esa variable Para ejecutar esta paacutegina o cualquier otra paacutegina

JSP desde un navegador hay que instalarla en el servidor de aplicaciones de la misma manera

en como se hizo con los servlets Suponiendo entonces que se tiene instalado el Tomcat 5

siga los siguientes pasos

1 Antildeadir en el servidor la carpeta digamos JSP2 dentro de la carpeta webapps del Tomcat

y construir sobre ella la jerarquiacutea de clases ya conocida de los servlets

webappsrarrJSP2rarrWEB-INFrarrclasses

WEB-INFrarrlib

WEB-INFrarrtags

2 Editar en la carpeta WEB-INF el descriptor de despliegue webxml que se indica a

continuacioacuten Este archivo XML indica doacutende se localiza el esquema XML para la

especificacioacuten Servlet 24 que a suvez utiliza el esquema XML para la especificacioacuten

Java Server Page 20 que son las especificaciones que soporta en servidor Tomcat

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=

httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

3 Crear en JSP2 la carpeta saludo que contendraacute la aplicacioacuten y copiar en ella la paacutegina

Saludojsp

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

4 Arrancar el servidor Si el servidor ya estaba arrancado detenerlo y volverlo a arrancar o

bien abrir el explorador escribir el URL httplocalhost8080managerhtml e instalar

la aplicacioacuten

5 Una vez arrancado el servidor verificar si estaacute funcionando correctamente escribiendo

el URL siguiente en el explorador httplocalhost8080 El explorador debe mostrar la

paacutegina del Tomcat

6 Ejecutar la paacutegina JSP iniciando el explorador y escribiendo el URL siguiente

httplocalhost8080JSP2saludoSaludojsp donde la sintaxis geneacuterica es

httpservidor[puerto]MiCarpetapaginajsp

Cuando esta paacutegina (Saludojsp) es invocada por primera vez el motor JSP lleva a cabo una

fase de traduccioacuten de la misma en un servlet y el motor Servlet es el que ejecutaraacute eacuteste uacuteltimo

para generar el HTML dinaacutemico que seraacute enviado al explorador cliente seguacuten puede

deducirse de la figura siguiente La proacutexima vez que la paacutegina sea solicitada el motor JSP

ejecutaraacute el servlet que fue caragado la primera vez a no ser que la paacutegina haya cambiado

en cuyo caso seraacute compilada automaacuteticamente en un nuevo servlet y ejecutada

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Regresando al ejemplo el archivo java generado por el Tomcat a partir del archivo

Saludojsp se localiza en la carpeta workCatalinalocalhost de la instalacioacuten de Tomcat

321 ELEMENTOS PARA SECUENCIAS DE COMANDOS

Los elementos para secuencias de comandos permiten insertar coacutedigo en el servlet que seraacute

generado a partir de la paacutegina JSP Existen tres formas

1 Expresiones del tipo lt= expresioacuten gt que se evaluacutean e insertan en el resultado del

servlet

2 Los scriptlets del tipo lt codigo gt que se insertan en el meacutetodo _jspService del

servlet (ejecutado por service)

3 Las declaraciones del tipo lt Codigo gt que se insertan en el cuerpo de la clase del

servlet fuera de cualquier meacutetodo existente

NOTA Los comentarios en JSP se escriben lt-- Comentario JSP --gt en tanto que los

comentarios en HTML son de la forma lt--Comentario HTML --gt La diferencia

semaacutentica radica en que los comentarios HTML cuando se insertan en la respuesta enviada

por el servidor al cliente no se muestran cuando se visualiza el documento HTML pero si

Servidor Maacutequina Cliente

Explorador Web

Contenedor Web

Motor Servlet

Motor JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

los podemos ver cuando se visualiza el coacutedigo fuente en tanto que los comentarios JSP

aunque se inserten en la respuesta enviada por el servidor al cliente no son enviados al

explorador de forma que tampoco se muestran ni se ven cuando se visualiza el coacutedigo fuente

HTML desde el explorador

3211 EXPRESIONES

Se utiliza una expresioacuten JSP para insertar valores directamente en el resultado La sintaxis es

lt= expresioacuten gt Por ejemplo

lt= requestgetParameter(ldquoparNombre) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt lt= s gt

La fecha y hora actual es lt= new javautilDate() gt

La expresioacuten se evaluacutea se convierte a cadena y se inserta en la paacutegina Esta evaluacioacuten se

realiza durante la ejecucioacuten

32111 VARIABLES PREDEFINIDAS

Para simplificar estas expresiones se pueden utilizar cierta cantidad de variables

predefinidas Estos objetos impliacutecitos como tambieacuten se les llama estaacuten disponibles para su

uso durante la implementacioacuten de una paacutegina Web

bull pageContext Es un objeto de la clase PageContext que proporciona acceso a objetos

relacionados con los servlets

bull request Es un objeto de la clase HttpServletRequest que se puede obtener a traveacutes del

meacutetodo getRequest que encapsula los datos enviados por el cliente al servidor

bull response Es un objeto de la clase HttpServletResponse que puede obtenerse a traveacutes

del meacutetodo getResponse que encapsula los datos que el servidor enviaraacute al cliente

bull application Es un objeto de la clase ServletContext que se obtiene a traveacutes del meacutetodo

getServletContext que define un conjunto de meacutetodos que todo servlet utiliza para

comunicar con el contenedor de servlets

bull config Es un objeto de la clase ServletConfig que se obtiene a traveacutes del meacutetodo

getServletConfig y que se utiliza por el contenedor de servlets para pasar informacioacuten

al servlet durante la iniciacioacuten

bull session Es un objeto de la clase HttpSession que se obtiene a traveacutes del meacutetodo

getSession que proporciona una forma de identificar a un usuario que visita las paacuteginas

de un sitio Web

bull out Es un objeto de la clase JspWriter que se obtiene a traveacutes del meacutetodo getOut que

se utiliza para almacenar la respuesta que seraacute enviada al cliente que hizo la peticioacuten de

la paacutegina

bull page Es un objeto geneacuterico de la clase Object que se obtiene a traveacutes del meacutetodo

getPage y que representa al servlet obtenido a partir de la paacutegina JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

bull exception Es un objeto de la clase Exception que se obtiene a traveacutes del meacutetodo

getException que contendraacute informacioacuten a cerca de cualquier excepcioacuten que se lance

desde la paacutegina JSP

Un ejemplo del uso de uno de estos objetos impliacutecitos seriacutea el siguiente

El nombre de tu host es lt= requestgetRemoteHost() gt

El listado siguiente da un ejemplo de una paacutegina JSP que utiliza algunas variables

predefinidas como uso de expresiones JSP

ltDOCTYPE HTML PUBLIC -W3CDTD HTML 40 Transitional ENgt

lthtmlgt

ltheadgt

lttitlegt Expresiones JSP lttitlegt

ltheadgt

ltbodygt

lth2gt Expresiones JSP lth2gt

ltULgt

ltligt Fecha y hora en curso lt= new javautilDate() gt ltligt

ltligt Nombre de su host lt= requestgetRemoteHost() gt ltligt

ltligt Identificador de su sesioacuten lt= sessiongetId() gt ltligt

ltligt El paraacutemetro ltcodegt paramPrueba ltcodegt del formulario

lt= requestgetParameter(paramPrueba) gt ltligt

ltULgt

ltbodygt

lthtmlgt

Cuya salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3212 LOS SCRIPTLETS JSP

Si se desea hacer algo maacutes complejo que una simple expresioacuten los scriptlets permiten insertar

coacutedigo JAVA en el meacutetodo _jspService del servlet (que es ejecutado por service) La sintaxis

utilizada por los scriptlets es lt coacutedigo java gt Los escriptlets tienen acceso a las

mismas variables definidas de forma automaacutetica como expresiones A manera de ejemplo si

se desea que el resultado aparezca en la paacutegina generada deberiacutea de utilizarse la variable out

como en la siguiente instruccioacuten

lt String datosConsultados= requestgetQueryString()

outprintln(ldquoDatos GET adjuntos ldquo+datosConsultados)

gt

En este ejemplo podriacutea haberse obtenido el mismo resultado utilizando la siguiente expresioacuten

JSP

Datos GET adjuntos lt=requestgetQueryString() gt

En general los scriptlets pueden ejecutar varias tareas que no podriacutean realizarse con las

expresiones Tales tareas incluyen

bull La determinacioacuten de encabezados de respuesta

bull Actualizacioacuten de Bases de Datos

bull Ejecucioacuten de bucles condiciones y otras estructuras complejas

lt for (int i=1 ilt=6 i++)

gt

lth lt=i gtgt Hola Mundo lthlt=i gtgt

lt gt

Como un ejemplo concreto se muestra la siguiente paacutegina JSP llamada Cuentajsp en donde

se observa coacutemo se hace un seguimiento del nuacutemero de veces que un cliente accede a esta

paacutegina a traveacutes de distintas sesiones Para ello supondremos que dicha cuenta es el valor del

atributo atrCuenta del objeto impliacutecito application ya citado La primera vez que el cliente

accede a la paacutegina el valor de atrCuenta seraacute null debido a que auacuten no ha sido fijado este

atributo en este caso se fijaraacute con el valor 1 En los siguientes accesos se leeraacute el valor del

atributo atrCuenta se incrementaraacute en una unidad y se volveraacute a fijar Finalmente se enviacutea

la respuesta al cliente para que se muestre al usuario el valor del contador

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en el objeto impliacutecito application con el nombre

atrCuenta

--gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt

Integer cuenta = (Integer)applicationgetAttribute(atrCuenta)

String s = vez

if (cuenta == null)

cuenta = new Integer(1)

else

cuenta = new Integer(cuentaintValue() + 1)

s = veces

applicationsetAttribute(atrCuenta cuenta)

gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

Has visitado esta paacutegina lt= cuenta gt lt= s gt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional un fragmento de coacutedigo JAVA o scriptlet

expresiones y comentarioshellip

Aquiacute otro ejemplo de la ejecucioacuten de un coacutedigo demasiado complejo para una expresioacuten JSP

Este listado presenta una paacutegina JSP que utiliza el paraacutemetro de peticioacuten colorFondo para

establecer el color de fondo de la paacutegina

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgt

lttitlegt Prueba de Color lttitlegt

ltheadgt

lt

String colorFondo=requestgetParameter(colorFondo)

boolean tieneColorExplicito

if (colorFondo =null)

tieneColorExplicito=true

else

tieneColorExplicito=false

colorFondo=WHITE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt

ltbody bgcolor=lt= colorFondo gtgt

lth2 align=centergt Prueba de color lth2gt

lt

if (tieneColorExplicito)

outprintln(Ha indicado un color de fondo expliacutecito +

colorFondo +)

else

outprintln(Usareacute el color de fondo predeterminado WHITE +

Indique el atributo de peticioacuten

ltigtcolorFondoltigt+

para intentar un color estaacutendar un +

valor RRGGBB o para ver si el navegador Web +

permite el uso de nombres de color X11)

gt

ltbodygt

lthtmlgt

Cuyas posibles salidas son

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3213 DECLARACIONES JSP

Una declaracioacuten JSP permite definir meacutetodos o campos que seraacuten insertados en el cuerpo

principal de la clase del servlet (fuera del meacutetodo _jspService) Una declaracioacuten tiene la

sintaxis lt Coacutedigo Java gt Por ejemplo

lt int i=0 gt

lt

Public void jspinit()

coacutedigo de iniciacioacuten

gt

Una declaracioacuten no genera ninguacuten resultado y se usan junto con las expresiones JSP o los

scriptlets A continuacioacuten se muestra una paacutegina JSP que despliega la cantidad de veces que

se ha solicitado esta paacutegina desde que se arrancoacute el servidor haciendo uso de las

declaraciones JSP

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtDeclaraciones JSPlttitlegtltheadgt

ltbodygt

lth1gtDeclaraciones JSPlth1gt

lt-- Esto es un comentario en JSP --gt

lt private int recuentoAccesos=0 gt

lth2gt Accesos a la paacutegina desde el reinicio del servidor

lt= ++recuentoAccesos gt lth2gt

ltbodygt

lthtmlgt

La salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

322 EL LENGUAJE DE EXPRESION EN JSP 20

Anteriormente se ha visto la necesidad de utilizar fragmentos de coacutedigo java en el desarrollo

de paacuteginas JSP pero con la aparicioacuten de la especificacioacuten JSP 20 ya no hay necesidad de

utilizar fragmentos de coacutedigo Java para nada gracias al nuevo lenguaje de expresioacuten EL

(Expresioacuten Language) a la biblioteca de etiquetas estandar JSTL (JSP Standar Tag Library)

y a las nuevas formas para desarrollar etiquetas personalizadas

El lenguaje de expresioacuten JSP es maacutes un lenguaje de acceso a datos que un lenguaje de

programacioacuten Ya se ha visto que para pasar informacioacuten de un cliente a una paacutegina JSP se

utilizan paraacutemetros en la peticioacuten y atributos en la paacutegina El lenguaje de expresioacuten lo hace

posible sin tener que utilizar scriptlets o expresiones (lt= expresioacuten gt) Por ejemplo las

liacuteneas JSP 12 siguientes escritas utilizando coacutedigo Java

lt= requestgetParameter(ldquoparNombrerdquo) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt veces

bajo la especificacioacuten JSP 20 se pueden escribir de una forma maacutes sencilla como sigue

(ahora no se trata de coacutedigo JAVA)

$paramparNombre has visitado esta paacutegina

$atrCuenta veces

La sintaxis de JSP es sensible a mayuacutesculas y minuacutesculas pero un par de comillas simples es

equivalente a un par de comillas dobles

3221 VARIABLES PREDEFINIDAS (Objetos Impliacutecitos)

El lenguaje de expresioacuten JSP 20 soporta los objetos impliacutecitos siguientes

pageContext Objeto de javaxservletjspPageContext que proporciona acceso a los

datos de una peticioacuten

param Coleccioacuten (objeto de tipo javautilMap) de todos los valores de los paraacutemetros

enviados en una peticioacuten un String por paraacutemetro

paramValues Coleccioacuten de todos los valores de los paraacutemetros enviados en una

peticioacuten una matriz de tipo String por paraacutemetro

header Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten un

String por cabecera

headerValues Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten

una matriz de tipo String por cabecera

cookie Coleccioacuten de todos los valores de las cookies un objeto javaxservlethttpCookie

por cookie

initParam Coleccioacuten de todos los valores de los paraacutemetros de iniciacioacuten de la

aplicacioacuten un String por paraacutemetro

Tambieacuten hay objetos que permiten acceder a variables definidas en diferentes aacutembitos lo que

posibilita compartir informacioacuten

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

pageScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de paacutegina

requestScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

peticioacuten

sessionScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de sesioacuten

applicationScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

aplicacioacuten

3222 DIRECTRICES

Las directrices page incluye y taglib son mensajes para el motor JSP y son siempre incluidas

entre los siacutembolos lt y gt

32221 LA DIRECTRIZ PAGE

Define atributos que se aplican a toda la paacutegina JSP donde es incluida

lt page lista_de_atributos gt

Donde la lista_de_atributos puede contener algunos de los siguientes (aquellos que estaacuten

escritos en negrita son los tomados por omisioacuten)

language= ldquoscriptingLanguagerdquo

extends= rdquoclassNamerdquo

import= ldquoimportListrdquo

session= ldquotrue|falserdquo

buffer= ldquonone|sizeKb

autoflush= ldquotrue|falserdquo

isThreadSafe= rdquotrue|falserdquo

info= rdquoinfo_textrdquo

errorPage= ldquoerror_urlrdquo

isErrorPage= rdquotrue|falserdquo

contentType= rdquoctinfordquo

pageEncoding= rdquopeinfordquo

isELIgnored= ldquotrue|falserdquo

Tiacutepicamente se localiza al principio de la paacutegina JSP y puede haber cualquier nuacutemero de

ellas El lenguaje por omisioacuten es Java Ejemplos

lt page contentType=rdquotexthtmlrdquo language=rdquojavardquo gt

lt page import=rdquojavautil javalangrdquo gt

lt page buffer=rdquo5kbrdquo autoflush=rdquofalserdquo gt

32222 LA DIRECTRIZ INCLUDE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

La directriz include incluye un archivo (html jsp xml o de texto) en una paacutegina JSP Esto

permite dividir el contenido de la paacutegina en trozos maacutes manejables

lt incluye file=rdquoURL_relativordquo gt

El ejemplo siguiente muestra dos archivos el primero incluye al segundo para mostrar la

fecha y hora actuales

lt-- fichero mostrarFechaHorajsp --gt

lthtmlgt

ltheadgtlttitlegtIncluir un ficherolttitlegtltheadgt

ltbody bgcolor=whitegt

ltfont color=bluegt

La fecha y hora actuales son

lt include file=fechaHorajsp gt

ltfontgt

ltbodygt

lthtmlgt

lt-- fichero fechaHorajsp --gt

lt page import=javautil gt

lt= (new javautilDate())toLocaleString() gt

32223 LA DIRECTRIZ TAGLIB

La directriz taglib indica la biblioteca de acciones personalizadas que podremos utilizar en

la codificacioacuten de la paacutegina JSP Para distinguir esas acciones entre otras existentes se utiliza

un prefijo (prefix) Su sintaxis es

lt taglib (uri=rdquoURI_bibliotecardquo|tagdir=rdquoDir_biblioteca_tagrdquo)

prefix=rdquoprefijordquo gt

Cuando se trata de una biblioteca definida mediante una clase Java y un descriptor (archivo

tld) eacutesta se identifica mediante un URI (Uniform Resource Identifier- URL relativos) Por

ejemplo

lt taglib uri=rdquohttpMarioRossainzLopezmiBibliotecardquo

prefix=rdquofunrdquo gt

ltpgtltfunaccion01 gt

La uacuteltima liacutenea del ejemplo tiene dos etiquetas una etiqueta p HTML y otra accion01

perteneciente a la biblioteca miBiblioteca En cambio si la biblioteca se define mediante un

archivo tag entonces se identifica mediante su ruta relativa en el sistema de archivos

lt taglib tagdir=rdquoWEB-INFtagsrdquo prefix=rdquofunrdquo gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpgtltfunaccion01 gt

La directriz taglib debe colocarse antes de utilizar en la paacutegina JSP las acciones

personalizadas definidas por la misma Se puede utilizar maacutes de una directriz pero el prefijo

utilizado debe ser uacutenico para cada una de ellas

3223 ACTIVACION DEL LENGUAJE DE EXPRESION (LE)

La especificacioacuten JSP 20 define un lenguaje de expresioacuten como alternativa a elementos de

programacioacuten escritos con coacutedigo Java y especificaciones anteriores a la JSP 20 Para que

este lenguaje pueda ser interpretado tienen que cumplirse 2 requisitos

1 Que la propiedad isELIgnored de la directriz page valga false

lt page isELIgnored= ldquofalserdquo gt

2 Que el descriptor de despliegue webxml en la carpeta WEB-INF indique doacutende se

localiza el esquema XML para la especificacioacuten Servlet 24 que a su vez utiliza el

esquema XML para la especificacioacuten Java Server Page 20

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

Utilizando el lenguaje de expresioacuten se podriacutea modificar la paacutegina Cuentajsp de la seccioacuten

3212 de este documento como se muestra a continuacioacuten Esta nueva paacutegina

1 Especifica que utilizaraacute la biblioteca core de etiquetas estandar (de la que se hablaraacute maacutes

adelante)

2 La primera vez que sea accedida definiraacute la variable atrCuenta en el aacutembito de la

aplicacioacuten con un valor inicial nulo y la incrementaraacute en una unidad cuando sea accedida

sucesivas veces simplemente incrementaraacute esta variable en una unidad

3 Finalmente mostraraacute una paacutegina con un contenido anaacutelogo al siguiente Esta formado

por una cabecera y una segunda liacutenea compuesta por el valor del paraacutemetro parNombre

enviado con la peticioacuten un texto fijo el valor de la variable atrCuenta y otro texto fijo

dependiente del valor de esta variable

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

El coacutedigo completo es el siguiente

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

3224 VARIABLES Y EXPRESIONES

Para acceder a una simple variable se puede escribir algo como lo siguiente $nombre y

para acceder a una propiedad de un objeto podemos escribir algo como

$paramparNombre

$applicationScopeatrCuenta

$pageContextrequestrequestURI

La primera liacutenea del ejemplo anterior obtiene el valor de la propiedad parNombre del objeto

param la segunda el valor del atributo atrCuenta del objeto applicationScope y la tercera

el URL relativo de la paacutegina JSP solicitada

El lenguaje de expresioacuten es maacutes tolerante con respecto a las variables con valor null y ejecuta

muchas maacutes conversiones de forma automaacutetica sobre el tipo de los datos cuando la expresioacuten

a evaluar asiacute lo requiere Por ejemplo la etiqueta condicional siguiente incluye una expresioacuten

que compara el valor del atributo atrCuenta con aacutembito de aplicacioacuten con 10 (convirtiendo

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

impliacutecitamente el valor del atributo al tipo de la constante para poder realizar la comparacioacuten

El resultado seraacute un valor de tipo boolean

ltcif test=rdquo$applicationScopeatrCuenta gt 10rdquogt

ltcifgt

o bien

ltcif test=rdquo$atrCuenta gt 10rdquogt

ltcifgt

Para que una literal pueda incluir un caracter significativo para el lenguaje dicho caracter

debe ser especificado como una secuencia de escape (caracter) Por ejemplo la siguiente

expresioacuten da lugar al literal ldquovezrdquo o ldquovecesrdquo entre comillas dobles

$(atrCuenta gt 1) iquest ldquordquovecesrdquordquo ldquordquovezrdquordquo

Cualquier objeto o atributo de un objeto definido en algunos de los aacutembitos de una paacutegina

puede ser utilizado como una variable Por ejemplo $atrCuenta+1 es una expresioacuten que

realiza la suma de la variable atrCuenta con 1

Cuando se trate de una propiedad de un objeto para acceder a ella se utilizaraacute el operador

punto o bien la notacioacuten empleada para acceder a un elemento de una matriz Por ejemplo

$paramparNombre

$param[ldquoparNombrerdquo]

Una expresioacuten LE puede aparecer en cualquier lugar donde pueda aparecer un texto fijo Por

tanto para informar al contenedor JSP que se trata de una expresioacuten y no de un texto fijo se

utilizan los delimitadores $ al principio y al final

3225 OPERADORES

OPERADOR DESCRIPCIOacuteN Acceso a la propiedad de un objeto o a un elemento de un Map

[] Acceso al elemento de una matriz o de un objeto List

() Pareacutentesis para alterar la prioridad en la evaluacioacuten de una expresioacuten

If ternario condicion expresion1 expresioacuten 2

+ Suma

- Resta

Producto

oacute div Divisioacuten

oacute mod Moacutedulo o resto de una divisioacuten

== oacute eq Igualdad

= oacute ne Diferente

lt oacute lt Menor que

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt oacute gt Mayor que

lt= oacute le Menor o igual que

gt= oacute ge Mayor o igual que

ampamp oacute and Operacioacuten Loacutegica AND

|| oacute or Operacioacuten Loacutegica OR

oacute not Operacioacuten Loacutegica NOT

empty Verifica si el valor de una variable es null si un String esta vaciacuteo o si una matriz Map

o Collection no tienen elementos

func(args) Llamada a una funcioacuten donde func es el nombre de la funcioacuten y arg representa cero o

maacutes argumentos separados por comas

El ejemplo siguiente muestra una paacutegina JSP compuesta por elementos HTML expresiones

LE y objetos impliacutecitos

lthtmlgt

ltheadgtlttitlegtJSP 20lttitlegtltheadgt

ltbodygt

lth3gtLenguaje de expresioacuten (LE)lth3gt

ltpgtLa siguiente tabla ilustra algunas expresiones LE

ltbrgtltbrgtlttable border=1gt

lttrgt

ltthgtltbgtExpresioacutenltbgtltthgt

ltthgtltbgtValorltbgtltthgt

lttrgt

lttrgt

lttdgt$3 + 6lttdgt

lttdgt$3 + 6lttdgt

lttdgt

lttrgt

lttdgt$(7 gt 4) 7 4lttdgt

lttdgt$(7 gt 4) 7 4lttdgt

lttrgt

lttrgt

lttdgt$header[host]lttdgt

lttdgt$header[host]lttdgt

lttrgt

lttablegt

ltbodygt

lthtmlgt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

323 BIBLIOTECA ESTANDAR DE ETIQUETAS

La biblioteca estaacutendar de etiquetas JSP (JSTL ndash Java Server Page Estaacutendar Tag Library)

incluye una cantidad amplia de etiquetas para diferentes aacutereas de trabajo

Aacuterea baacutesica (su prefijo es c ndash core) y contiene

o Soporte de variables (remove y set)

o Control del flujo (choose when otherwise forEach forTokens if)

o Manejo de URL (import param redirect param y url param)

o Operaciones varias (match y out)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlcore

Aacuterea XML (su prefijo es x) y contiene

o Sentencias baacutesicas (out parse y set)

o Control del flujo (choosehellip whenhellip otherwise forEach e if)

o Transformacioacuten de Documentos (transformhellipparam)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlxml

Aacuterea Internacionalizacioacuten (su prefijo es fmt) Contiene

o Localidad (setLocale y requestEncoding)

o Mensajes (bundle message param y setBundle)

o Formateo de Fechas y nuacutemeros (formatNumber formateacuteate parseDate

parseNumber setTimeZone timeZone)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlfmt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Aacuterea SQL (su prefijo es sql) es el lenguaje estandar para interactuar con bases de datos

relacionales y contiene setDataSource Quero dateParam param transaction y

update dateParam param) El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlsql

Aacuterea Funciones (su prefijo es fn) y contiene

o Longitud de una coleccioacuten (length)

o Manipulacioacuten de String (toUpperCase toLowerCase substring

substringAfter substringBefore trim replace indexOf startsWith

endsWith contains containsIgnoreCase split join y escapeXml)

o El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlfunctions

3231 OPERACIONES CON ETIQUETAS BAacuteSICAS

En un ejemplo pasado teniacuteamos el siguiente coacutedigo

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

En este ejemplo se hace referencia al aacuterea baacutesica de JSTL con el prefijo c y se utiliza la

etiqueta cset para definir la variable atrCuenta Si la variable ya esta definida simplemente

se le asigna el valor especificado

La uacuteltima parte del ejemplo anterior podriacutea haberse escrito de esta otra forma

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcif test=rdquo$atrCuenta gt 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcifgt

$atrCuenta $str

La etiqueta cif permite la ejecucioacuten condicional de su cuerpo en funcioacuten del valor del

atributo de test

La etiqueta cchoose permite la ejecucioacuten del cuerpo de la primera etiqueta cwhen cuyo

atributo test sea evaluado a true Si ninguna de las condiciones se evaluacutea a true entonces se

evaluacutea el cuerpo de la etiqueta cotherwise si estaacute presente El siguiente coacutedigo muestra otra

manera de escribir el ejemplo anterior utilizando estas uacuteltimas etiquetas

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcchoosegt

ltcwhen test=rdquo$atrCuenta == 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcwhengt

ltcotherwisegt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcotherwisegt

ltcchoosegt

$atrCuenta $str

La etiqueta cforEach permite iterar sobre una coleccioacuten de objetos La coleccioacuten se

especifica por medio del atributo iacutetems y el elemento actual de la coleccioacuten estaacute disponible a

traveacutes de la variable establecida por el atributo var Por ejemplo el siguiente fragmento de

coacutedigo visualiza una tabla con las variables definidas a nivel de aacutembito de paacutegina

lttable border=rdquo1rdquogt

ltcforEach var=rdquoitemrdquo iacutetems=rdquo$pageScoperdquogt

lttrgt

lttdgt $item lttdgt

lttrgt

ltcforEachgt

lttablegt

La etiqueta ccatch atrapa una excepcioacuten que ocurra en el cuerpo de la misma Por ejemplo

el siguiente segmento de coacutedigo lanzaraacute una excepcioacuten si el paraacutemetro mes se escribe con

letras en vez de con nuacutemeros

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltbodygt

lthtmlgt

Un URL anaacutelogo al siguiente daraacute lugar a que la excepcioacuten sea lanzada cuando se ejecute la

expresioacuten $nMes 3 de la paacutegina anterior

httplocalhost8080JSP2exceppruebajspmes=marzo

La excepcioacuten indica que ha ocurrido un error al tratar de convertir ldquomarzordquo a un entero de

tipo Long Para cachar esta excepcioacuten y darle un tratamiento adecuado habraacute que modificar

la paacutegina JSP anterior como se indica a continuacioacuten

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltccatch var=rdquoerrorOcurridordquogt

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltccatchgt

ltcif test=rdquo$not empty errorOcurridordquogt

Error el paraacutemetro mes debe ser un nuacutemero ltbgt

ltbrgt Informacioacuten del error dada por el sistema

ltbrgt ltfont color=rdquoFF0000rdquogt $errorOcurrido ltfontgt

ltcifgt

ltbodygt

lthtmlgt

3232 ACCESO A BASES DE DATOS CON JSP

Las etiquetas que proporciona el aacuterea SQL permiten realizar

Conexioacuten con una base de datos

Realizacioacuten de consultas a la base de datos

Acceso al conjunto de resultados

Ejecucioacuten de actualizaciones y transacciones

Todas las etiquetas SQL actuacutean sobre una base de datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

32321 CONEXIOacuteN CON LA BASE DE DATOS

La conexioacuten con la base de datos puede realizarse con la etiqueta sqlsetDataSource Por

ejemplo si se esta utilizando el administrador de bases de datos MySql con el controlador

JDBC se puede realizar una conexioacuten con una base de datos digamos bd_tutorias de la

manera siguiente

ltsqlsetDataSource var=rdquobdrdquo

driver=rdquocommysqljdbcDriverrdquo

url=rdquojdbcmysqllocalhost3306bd_tutoriasrdquo

user=rdquoadminrdquo

password=rdquoadminadminrdquo gt

32322 CONSULTA A LA BASE DE DATOS

La etiqueta sqlQuero permite realizar una consulta a una base de datos Por ejemplo el

siguiente fragmento de coacutedigo realiza una consulta a la base de datos representada por bd y

obtiene un conjunto de resultados representado por cdr

ltsqlquery var=rdquocdrrdquo dataSource=rdquo$bdrdquogt

SELECT professor dia hora alumno

FROM profesores tutorias citas

WHERE profesoresid_profesor=tutoriasid_profesor

AND tutoriasid_tutoria=citasid_tutoria

ltsqlquerygt

32323 MODIFICACIONES SOBRE LA BASE DE DATOS

La etiqueta sqlupdate permite ejecutar una sentencia SQL INSERT UPDATE o DELETE

y cualquier otra sentencia SQL que no retorne ninguacuten valor Por ejemplo

ltsqlupdate var=rdquocontrdquo dataSource=rdquo$bdrdquo gt

UPDATE profesores

SET profesor=

WHERE profesor=

ltsqlparam value=rdquo$paramProfesorrdquo gt

ltsqlparam value=rdquo$paramIDrdquo gt

ltsqlupdategt

Una operacioacuten UPDATE puede utilizar el siacutembolo para indicar que el valor que tendriacutea que

evaluarse en esa posicioacuten seraacute suministrado por una etiqueta sqlparam como por ejemplo

httplocalhost8080JSP2sqlpruebajspProfesor=Mario+Rossainz+LopezampID=514

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

5 Antildeada el archivo class (HolaMundoclass) que resulta de la compilacioacuten a la carpeta

webappsROOTWEB-INFclasses del Tomcat

6 Edite el archivo confwebxml del Tomcat para definir el servlet invoquer que permite

ejecutar servlets anoacutenimos

7 Arranque el servidor Tomcat (este punto debe realizarse despueacutes del paso 5 para que el

servidor reconozca la aplicacioacuten que se acaba de instalar) Si el servidor ya estaba

arrancado cuando se realizoacute el punto 4 detengalo y vuelvalo a arrancar o abra el

explorador y escriba el URL httplocalhost8080managerhtml y recargue la

aplicacioacuten

8 Una vez arrancado el servidor verifique que funciona correctamente escribiendo en el

navegador httplocalhost8080 o http1270018080 8080 es el puerto utilizado para

acceder al servidor

9 Ejecute el servlet escribiendo en el navegador el URL

httpservidor[puerto]servletnombre_servlet que en el caso del ejemplo seriacutea

httplocalhost8080servletHolaMundo

En conclusioacuten para ejecutar un servlet habraacute que copiar el archivo class que lo define

en la carpeta ROOTWEB-INFclasses de la carpeta webapps del servidor a la que tienen

acceso los clientes Web y ejecutar httpservidor[puerto]servletnombre_servlet de

forma que el servlet HolaMundo se mostrariacutea en su ejecucioacuten como en la figura siguiente

Ahora bien lo maacutes interesante es invocar a los servlets desde paacuteginas Web Se puede solicitar

la ejecucioacuten de un servlet de igual manera que pedimos un recurso cualquiera basta con

definir el URL del servlet en el punto deseado en la paacutegina Web

El siguiente ejemplo muestra un servlet que ademaacutes de generar la paacutegina HTML donde se

manda a escribir ldquoHola Mundordquo devuelve la fecha y hora del servidor Con esto se trata de

dar a entender que por una parte un servlet no tiene porque generar soacutelo paacuteginas HTML sino

que ademaacutes un servlet es capaz de generar contenido dinaacutemico incluyendo cualquier proceso

escrito que pueda ejecutar JAVA (leer o escribir archivos ejecutar programas cargas

bibliotecas etc)

import javaio

import javaxservlet

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

import javaxservlethttp

import javautil

public class Saludo extends HttpServlet

Manipular la peticioacuten enviada por el cliente

utilizando el atributo method=get

protected void doGet(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

responsesetContentType(texthtml)

PrintWriter out = responsegetWriter()

outprintln(lthtmlgt)

outprintln(ltheadgt)

outprintln(lttitlegtServlet Saludolttitlegt)

outprintln(ltheadgt)

outprintln(ltbodygt)

outprintln(ltcentergt)

for (int tamantildeo = 1 tamantildeo lt= 7 ++tamantildeo)

outprintln(ltfont size=+tamantildeo+ color=bluegt)

outprintln(iexcliexcliexclHola mundo)

outprintln(ltbrgt)

outprintln(ltbrgt)

Calendar fechahora = new GregorianCalendar()

Random rnd = new Random()

int tamantildeo = rndnextInt(7)+1

outprintln(ltfont size=+tamantildeo+gt)

outprintln(ltfont color=greengt)

outprintln(Son las +

fechahoraget(CalendarHOUR_OF_DAY) + +

fechahoraget(CalendarMINUTE) + +

fechahoraget(CalendarSECOND) )

outprintln(ltbrgt)

outprintln(ltfont color=graygt)

outprintln(Del diacutea +

fechahoraget(CalendarDAY_OF_MONTH) + +

(fechahoraget(CalendarMONTH)+1) + +

fechahoraget(CalendarYEAR) )

outprintln(ltfontgt)

outprintln(ltcentergt)

outprintln(ltbodygt)

outprintln(lthtmlgt)

outclose()

Para ejecutar este servlet llamado Saludo podemos crear una carpeta dentro de webapps por

ejemplo saludoWEB-INFclasses y copiar dentro de classes Saludoclass

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Para ejecutar el servlet Saludo tendriacuteamos entonces que escribir

httplocalhost8080SaludoservletSaludo

Pero si queremos invocar a este servlet desde una paacutegina HTML se deberaacute utilizar este

mismo URL o bien el URL relativo a la carpeta del servidor donde copiemos el archivo html

que seraacute copiado en la carpeta Saludo

El coacutedigo HTML almacenado en saludohtml deberaacute incluir una de las dos liacuteneas siguientes

lta href=rdquohttplocalhost8080Saludoservletsaludordquogt ejecutar Saludo ltagt

lta href=rdquoservletSaludordquogt ejecutar Saludo ltagt

La segunda opcioacuten es la maacutes interesante porque no depende de la direccioacuten del servidor Para

ejecutar entonces el servlet a traveacutes de saludohtml basta con escribir el URL siguiente

httplocalhost8080Saludosaludohtml

316 EMPAQUETADO DE SERVLETS

Puede darse el caso en que diversos programadores en un entorno de produccioacuten dado

podriacutean estar desarrollando servlets para el mismo servidor El colocar todos estos servlets

en el directorio principal de estos programas podriacutea dar como resultado un directorio difiacutecil

de administrar ademaacutes de que se corre el riesgo de duplicar los nombres de los servlets si

dos desarrolladores distintos eligen el mismo nombre para el programa que desarrollan Los

paquetes son la solucioacuten loacutegica a este problema El uso de paquetes tiene como resultado

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

cambios en la forma en que se generan los servlets la forma en que se compilan y en la que

se invocan Para colocar los servlets en paquetes se requieren de dos pasos

1 Mover los archivos (class) a un subdirectorio que coincida con el nombre del paquete

pretendido

2 Insertar una instruccioacuten de paquete en el archivo de clase Para ello la primera liacutenea en

el coacutedigo fuente (java) del servlet deberaacute ser package nomPaquete

Por ejemplo el fragmento siguiente de coacutedigo Java presenta una variacioacuten del Servlet

HolaMundo que se encuentra en el paquete misServlets

package misServlets

import javaio

import javaxservlet

import javaxservlethttp

public class HolaMundo extends HttpServlet

Manipular las posibles peticiones enviadas por el cliente

utilizando el atributo method=get o method=post

protected void procesarPeticion(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

responsesetContentType(texthtml)

PrintWriter out = responsegetWriter()

outprintln(lthtmlgt)

El archivo class se encontraraacute dentro de una carpeta llamada misServlets que seraacute el paquete

creado o utilizado por la aplicacioacuten en este caso del HolaMundo dependiendo si exitiacutea o no

antes de compilar la aplicacioacuten A continuacioacuten deberemos copiar dentro de la carpeta

webappsROOTWEB-INFclasses del Tomcat la carpeta misServlets junto con el

HolaMundoclass que estaraacute dentro de ella y ejecutar el servlet en el explorador escribiendo

httplocalhost8080servletmisServletsHolaMundo

317 PROCESAMIENTO DE FORMULARIOS

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Hasta este punto los servlets que hemos estudiado soacutelo enviacutean informacioacuten al navegador del

cliente No obstante estos clientes Web pueden Mostar formularios que permitan solicitar

datos a los usuarios que seraacuten enviados al servidor para por ejemplo ser almacenados en

una base de datos para posteriores peticiones o para otros procesos o bien para dar al usuario

una respuesta ajustada a dicha peticioacuten

En el siguiente URL se invoca la ejecucioacuten de un servlet llamado Parametros aportando la

lista de pares (Nombre Mario)-(Edad 22) en formato GET

httplocalhost8080ParametrosservletParametrosNombre=MarioampEdad=22

Hay que observar la manera de colocar los datos tras el siacutembolo ldquordquo y de separarlos con el

siacutembolo ldquoamprdquo El coacutedigo del servlet es el siguiente

import javaio

import javaxservlet

import javaxservlethttp

public class Parametros extends HttpServlet

public void doGet(HttpServletRequest request HttpServletResponse

response)

throws IOException ServletException

responsesetContentType(texthtml)

PrintWriter out = responsegetWriter()

outprintln(lthtmlgt)

outprintln(ltbodygt)

String NombreRecibido = requestgetParameter(Nombre)

String EdadRecibida = requestgetParameter(Edad)

outprintln(lth1gt Hola + NombreRecibido + lth1gt)

outprintln(lth1gt Tienes + EdadRecibida + antildeos lth1gt)

outprintln(ltbodygt)

outprintln(lthtmlgt)

El objeto httpServletRequest en el coacutedigo anterior request contiene una serie de meacutetodos de

utilidad para recibir informacioacuten proveniente del usuario en concreto el meacutetodo

getParameter permite obtener el valor asociado a un nombre en la lista de pares (nombre

valor) que puede proporcionar un URL

Ademaacutes de poder introducir el URL anterior en el navegador proporcionando directamente

los datos enviados al servlet en dicha URL

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Tambieacuten podemos generar el URL mediante una paacutegina Web que podraacute utilizar el usuario

lthtmlgt

ltbodygt

lth1gt Cuestionario lth1gt

ltform action=httplocalhost8080ParametrosservletParametros

method=getgt

Nombre ltinput type=text name=Nombregt ltbrgt

Edad ltinput type=text name=Edadgt ltbrgtltbrgt

ltinput type=submit value=Enviar datosgt ltbrgt

ltformgt

ltbodygt

lthtmlgt

Los formularios en HTML permiten enviar datos al servidor Web En la liacutenea 5 de la paacutegina

Web mostrada se encuentra la etiqueta form que en el ejemplo contiene el atributo action

que indica la accioacuten que debe realizarse en el servidor en este caso ejecutar el servlet

Parametros y el atributo method que indica la manera en la que se enviacutean los datos (en este

caso la peticioacuten GET)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Peticioacuten HTTP GET Cuando el tipo de peticioacuten HTTP es GET los datos del formulario

son enviados al servidor a continuacioacuten del URL especificado por el atributo action de form

El tamantildeo de la cadena enviada estaacute limitado y al estar en ASCII es totalmente legible por

tanto no es un modo seguro

Es por ello que cuando se requiere del enviacuteo de datos seguros y ademaacutes el nuacutemero de datos

del formulario que son enviados al servidor son muchos resulta ser mejor el uso del meacutetodo

POST Veamos otro ejemplo

import javaio

import javaxservlet

import javaxservlethttp

import javautil

public class MostrarParametros extends HttpServlet

public void doGet(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

responsesetContentType(texthtml)

PrintWriter out= responsegetWriter()

String titulo=Lectura de todos los paraacutemetros de Peticioacuten

outprintln(ltdoctype html public -W3CDTD HTML 40 +

TransitionalENgt)

outprintln(lthtmlgt)

outprintln(ltheadgtlttitlegt+titulo+lttitlegtltheadgt)

outprintln(ltbody bgcolor=FDF5E6gtn+

lth1 align=centergt+titulo+lth1gtn+

lttable border=1 align=centergtn+

lttr bgcolor=FFAD00gtn+

ltthgtNombre del parampaacutemetroltthgtValor(es) del

parampaacutemetro)

Enumeration nombresParam=requestgetParameterNames()

while(nombresParamhasMoreElements())

String nombreParam= (String)nombresParamnextElement()

outprint(lttrgtlttdgt+nombreParam+nltTDgt)

String[]valoresParam=

requestgetParameterValues(nombreParam)

if (valoresParamlength==1)

String valorParam=valoresParam[0]

if (valorParamlength()==0)

outprintln(ltigt Sin valor ltigt)

else

outprintln(valorParam)

else

outprintln(ltulgt)

for (int i=0 iltvaloresParamlengthi++)

outprintln(ltligt+valoresParam[i])

outprintln(ltulgt)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

outprintln(lttablegtnltbodygtlthtmlgt)

public void doPost(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

doGet(requestresponse)

El servlet escrito utiliza un meacutetodo doPost que soacutelo ejecuta a Donet Esto es porque se quiere

que el servlet pueda manejar tanto las peticiones GET como las POST Por otro lado el

formulario es el siguiente

ltdoctype html public -W3CDTD HTML 40 TransitionalENgt

lthtmlgt

ltheadgt

lttitlegt Un Formulario de ejemplo que utiliza POST lttitlegt

ltheadgt

ltbody bgcolor=FDF5E6gt

lth1 align=centergt Un formulario de Ejemplo que utiliza POST

lth1gt

ltform action=httplocalhost8080MostrarParametros

servletMostrarParametros

method=postgt

Nuacutemero de elemento ltinput type=text name=elemNumgt ltbrgt

Cantidad ltinput type=text name=cantidadgt ltbrgt

Precio Unitario ltinput type=text name=precio value=$gt

ltbrgtlthrgt

Nombre de Pila ltinput type=text name=nombrePilagt ltbrgt

Apellido(s) ltinput type=text name=apellidogt ltbrgt

Iniciales ltinput type=text name=inicialesgt ltbrgt

Domicilio de envio lttextarea name=domicilio rows=3

cols=40gtlttextareagt ltbrgt

Tarjeta de creacutedito ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta value=VisagtVisa ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta value=Master Cardgt

Master Card ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta value=AmexgtAmerican

Expresss ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta

value=DiscovergtDiscover ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta

value=Java Smart CardgtTarjeta Inteligente de Java

ltbrgt

Nuacutemero de la tarjeta de creacutedito

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltinput type=password name=numTarjetagtltbrgt

Repita el nuacutemero de la tarjeta de creacutedito

ltinput type=password name=numTarjetagtltbrgtltbrgt

ltcentergt

ltinput type=submit value=Enviar pedidogt

ltcentergt

ltformgt

ltbodygt

lthtmlgt

El formulario HTML del listado anterior utiliza POST como deberiacutea ser en todos los campos

que tienen contrasentildea

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Si intenta ejecutar el servlet MostrarParametros directamente en el explorador con el URL

httplocalhost8080MostrarParametrosservletMostrarParametros se obtendraacute la paacutegina

Web sin resultados

Peticioacuten HTTP POST Cuando el tipo de peticioacuten HTTP es POST los datos son enviados

al servidor en el cuerpo de la peticioacuten Es el meacutetodo maacutes usual de enviar los datos de un

formulario Con este tipo de peticioacuten la informacioacuten del formulario se enviacutea despueacutes del URL

indicado por action en el cuerpo de la peticioacuten y el tamantildeo de la informacioacuten enviada no esta

limitado

Seguacuten lo expuesto escoger el meacutetodo para enviar la informacioacuten no es difiacutecil Si los datos

son pocos y no importa su confidencialidad o manipulacioacuten utilizamos GET Si son largos

privados o importantes utilizamos POST

318 ACCESO A BASES DE DATOS CON SERVLETS

Una aplicacioacuten Java que realiza accesos a bases de datos funciona seguacuten una arquitectura que

permite escribir los programas abstrayeacutendose de los detalles de los niveles inferiores (discos

controladores sistema operativo etc) como lo muestra la figura siguiente

JDBC (Java DataBase Connectivity ndash Conexioacuten con Bases de Datos desde Java) es una API

de Java que permite ejecutar instrucciones SQL para manipular y gestionar bases de datos

relacionales Para que una aplicacioacuten Java pueda hacer operaciones sobre una base de datos

previamente tiene que establecer una conexioacuten con la misma Esta conexioacuten se realiza a

traveacutes de un controlador (driver) seguacuten la figura de arriba La API-JDBC se proporciona en

dos paquetes javasql y javaxsql El primer paquete contiene las interfaces y clases Java

fundamentales de JDBC en tanto que el segundo paquete es una extensioacuten del primero e

APLICACION

SISTEMA OPERATIVO

CONTROLADOR

Oracle Access MySql

JVM

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

incluye las clases que interactuacutean con JNDI y otras que gestionan conjuntos de conexiones

con una misma base de datos Para maacutes detalles del uso de JDBC veacutease el apeacutendice A de

estas notas

El primer paso para crear una conexioacuten entre una aplicacioacuten Java y una base de datos es

registrar el controlador JDBC adecuado para esa base con el fin de que la JVM pueda

utilizarlo Existen distintos tipos de controladores JDBC por ejemplo

ldquocommysqljdbcDriverrdquo que es el controlador utilizado cuando el motor de base de datos

que se utiliza es MySql

En el supuesto caso de que la base de datos soacutelo permitiera el acceso a traveacutes de controladores

ODBC como lo hace ACCESS siempre podemos usar el controlador puente JDBC-ODBC

incluido como parte del JDK ldquosunjdbcodbcJdbcOdbcDriverrdquo Este tipo de controladores

es decir los basados en ODBC (Open DataBase Connectivity) son bastante utilizados en

entornos Windows pues este SO incluye ODBC El apeacutendice A describe al final como

administrar los oriacutegenes de datos ODBC en Windows

Asiacute pues la mayor ventaja de los servlets con respecto a la conexioacuten con bases de datos viacutea

JDBC es que su ciclo de vida les permite mantener conexiones abiertas con las mismas a lo

largo de toda una sesioacuten Esto permite recortar tiempo con respecto a otras tecnologiacuteas como

la CGI Ademaacutes JDBC es una tecnologiacutea independiente de las bases de datos

Como ejemplo vamos a implementar una simple aplicacioacuten Web basada en servlets que

muestre una especie de directorio de personas La aplicacioacuten podraacute consultar insertar

modificar borrar o listar la informacioacuten de cada una de las personas almacenadas en la base

de datos a la que se hace acceso (que estaraacute en formato access)

La estructura de la Base de Datos es una tabla con los siguientes campos

DNI Nombre Apellido Edad

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

53023767A Pedro Rubio 18

77459822P Luis Tejedor 47

123456MRL Mario Rossainz 35

La estructura de la aplicacioacuten se muestra en la figura siguiente

lthtmlgt

ltbodygt

lttable border=1gtlttrgtlttdgt

ltform action=httplocalhost8080directorioTelservletSvAccesoBD

method=getgt

DNI ltinput type=text name=DNIgt ltbrgt

Nombre ltinput type=text name=Nombregt ltbrgt

Apellido ltinput type=text name=Apellidogt ltbrgt

Edad ltinput type=text name=Edadgt ltbrgtltbrgt

ltinput type=submit value=Consultar name=BotonConsultargt

ltinput type=submit value=Insertar name=BotonInsertargt

ltinput type=submit value=Modificar name=BotonModificargt

ltinput type=submit value=Borrar name=BotonBorrargt

ltinput type=submit value=Listar name=BotonListargt ltbrgt

ltcentergt

ltinput type=submit value= |lt name=BotonPrimerogt

ltinput type=submit value= -- name=BotonMenosCincogt

ltinput type=submit value= - name=BotonAnteriorgt

ltinput type=submit value= + name=BotonSiguientegt

ltinput type=submit value= ++ name=BotonMasCincogt

ltinput type=submit value= gt| name=BotonUltimogt

ltcentergt

lttdgt

lttdgt

lttextarea name=AreaDeListado rows=10 cols=35gtlttextareagt

SvAccesoBDhtml

SvAccesoBD

ObBorrado ObListado ObConsulta

ObInsercion

ObModificacion

ObPosicionamiento

ObRegistro

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lttdgt

lttrgt

ltformgt

lttablegt

ltbodygt

lthtmlgt

SvAccesoBDhtml

import javaio

import javaxservlet

import javaxservlethttp

public class SvAccesoBD extends HttpServlet

private int PosicionBuscada = 1

private String AreaDeListado=

PrintWriter out

public void doGet(HttpServletRequest request HttpServletResponse response)

throws IOException ServletException

String DNI = requestgetParameter(DNI)

String Nombre = requestgetParameter(Nombre)

String Apellido = requestgetParameter(Apellido)

String Edad = requestgetParameter(Edad)

String BotonConsultar = requestgetParameter(BotonConsultar)

String BotonInsertar = requestgetParameter(BotonInsertar)

String BotonModificar = requestgetParameter(BotonModificar)

String BotonBorrar = requestgetParameter(BotonBorrar)

String BotonListar = requestgetParameter(BotonListar)

String BotonPrimero = requestgetParameter(BotonPrimero)

String BotonMenosCinco = requestgetParameter(BotonMenosCinco)

String BotonAnterior = requestgetParameter(BotonAnterior)

String BotonSiguiente = requestgetParameter(BotonSiguiente)

String BotonMasCinco = requestgetParameter(BotonMasCinco)

String BotonUltimo = requestgetParameter(BotonUltimo)

AreaDeListado = requestgetParameter(AreaDeListado)

responsesetContentType(texthtml)

out = responsegetWriter()

outprintln(lthtmlgt)

outprintln(ltbodygt)

if (BotonConsultar=null) ConsultarDatos(DNI)

if (BotonInsertar=null) InsertarDatos(DNINombreApellidoEdad)

if (BotonModificar=null) ModificarDatos(DNINombreApellidoEdad)

if (BotonBorrar=null) BorrarDatos(DNI)

if (BotonListar=null) ListarDatos(DNI)

if (BotonPrimero=null) Controles(1)

if (BotonMenosCinco=null) Controles(2)

if (BotonAnterior=null) Controles(3)

if (BotonSiguiente=null) Controles(4)

if (BotonMasCinco=null) Controles(5)

if (BotonUltimo=null) Controles(0)

outprintln(ltbodygt)

outprintln(lthtmlgt)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

private void ConsultarDatos(String DNI)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObRegistro InstanciaFila = InstanciaConsultaDameDatos()

GenerarRespuesta(InstanciaFilaDameDNI()InstanciaFilaDameNombre()

InstanciaFilaDameApellido()

StringvalueOf(InstanciaFilaDameEdad()))

else

GenerarRespuesta(DNI------------)

PosicionBuscada = 1

public void ListarDatos(String DNI)

ObListado InstanciaListado = new ObListado()

AreaDeListado = InstanciaListadoDameResultado()

ConsultarDatos(DNI)

PosicionBuscada = 1

public void BorrarDatos(String DNI)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObBorrado InstanciaBorrado = new ObBorrado(PosicionBuscada)

GenerarRespuesta()

else

GenerarRespuesta(----------------)

PosicionBuscada = 1

public void ModificarDatos(String DNI String Nombre String Apellido

String Edad)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObRegistro InstanciaFila = new ObRegistro(DNI Nombre Apellido

IntegerparseInt(Edad))

ObModificacion InstanciaModificacion = new ObModificacion(PosicionBuscada

InstanciaFila)

GenerarRespuesta(DNINombreApellidoEdad)

else

GenerarRespuesta(----------------)

PosicionBuscada = 1

public void InsertarDatos(String DNI String Nombre String Apellido

String Edad)

ObRegistro InstanciaFila = new ObRegistro(DNI Nombre Apellido

IntegerparseInt(Edad))

ObInserccion InstanciaInserccion = new ObInserccion(InstanciaFila)

GenerarRespuesta()

PosicionBuscada=1

public void Controles(String Identificador)

ObPosicionamiento InstanciaPosicionamiento =

new ObPosicionamiento(IdentificadorPosicionBuscada)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ObRegistro InstanciaFila = InstanciaPosicionamientoDameDatos()

GenerarRespuesta(InstanciaFilaDameDNI()InstanciaFilaDameNombre()

InstanciaFilaDameApellido()

StringvalueOf(InstanciaFilaDameEdad()))

PosicionBuscada = InstanciaPosicionamientoPosicion()

private void GenerarRespuesta(String DNI String Nombre String Apellido

String Edad)

outprintln(lttable border=1gt)

outprintln(lttrgt)

outprintln(lttdgt)

outprintln(ltform

action=httplocalhost8080directorioTelservletSvAccesoBD

method=getgt)

outprintln( DNI ltinput type=text name=DNI value=+DNI+gtltbrgt)

outprintln( Nombre ltinput type=text name=Nombre

value=+Nombre+gtltbrgt)

outprintln( Apellido ltinput type=text name=Apellido

value=+Apellido+gtltbrgt)

outprintln( Edad ltinput type=text name=Edad

value=+Edad+gtltbrgtltbrgt)

outprintln( ltinput type=submit value=Consultar

name=BotonConsultargt)

outprintln( ltinput type=submit value=Insertar

name=BotonInsertargt)

outprintln( ltinput type=submit value=Modificar

name=BotonModificargt)

outprintln( ltinput type=submit value=Borrar name=BotonBorrargt)

outprintln( ltinput type=submit value=Listar name=BotonListargt

ltbrgt)

outprintln( ltcentergt)

outprintln( ltinput type=submit value= |lt name=BotonPrimerogt)

outprintln( ltinput type=submit value= --

name=BotonMenosCincogt)

outprintln( ltinput type=submit value= - name=BotonAnteriorgt)

outprintln( ltinput type=submit value= +

name=BotonSiguientegt)

outprintln( ltinput type=submit value= ++

name=BotonMasCincogt)

outprintln( ltinput type=submit value= gt| name=BotonUltimogt)

outprintln( ltcentergt)

outprintln( lttdgt)

outprintln( lttdgt)

outprintln( lttextarea name=AreaDeListado rows=10

cols=35gt+AreaDeListado+lttextareagt)

outprintln( lttdgt)

outprintln( lttrgt)

outprintln( ltformgt)

outprintln( lttablegt)

SvAccesoBDjava

import javasql

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

public class ObBorrado

ObBorrado(int PosicionBuscada)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

Personasabsolute(PosicionBuscada)

PersonasdeleteRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

ObBorradojava

import javasql

import javaawtTextArea

public class ObListado

private String Resultado=

ObListado()

String DNI Nombre Apellido Linea

int Edad Posicion

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement()

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

while (Personasnext())

DNI = PersonasgetString(DNI)

Nombre = PersonasgetString(Nombre)

Apellido = PersonasgetString(Apellido)

Edad = PersonasgetInt(Edad)

Posicion = PersonasgetRow()

Linea = DNI+ +Nombre+ +Apellido+ +StringvalueOf(Edad)

Resultado=Resultado+StringvalueOf(Posicion)+ +Linea+n

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public String DameResultado()

return Resultado

ObListadojava

public class ObRegistro

private String DNI Nombre Apellido

private int Edad

ObRegistro (String DNI String Nombre String Apellido int Edad)

thisDNI = DNI

thisNombre = Nombre

thisApellido = Apellido

thisEdad = Edad

String DameDNI()

return DNI

String DameNombre()

return Nombre

String DameApellido()

return Apellido

int DameEdad()

return Edad

ObRegistrojava

import javasql

public class ObConsulta

private int Posicion = 0

private ObRegistro DatosPersona

ObConsulta(String DNIPedido)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement()

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

while (Personasnext())

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

String DNI = PersonasgetString(DNI)

if (DNIequalsIgnoreCase(DNIPedido))

Posicion = PersonasgetRow()

String Nombre = PersonasgetString(Nombre)

String Apellido = PersonasgetString(Apellido)

int Edad = PersonasgetInt(Edad)

DatosPersona = new ObRegistro(DNINombreApellidoEdad)

break

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public int PosicionEncontrada()

return Posicion

public ObRegistro DameDatos()

return DatosPersona

ObConsultajava

import javasql

public class ObInserccion

ObInserccion(ObRegistro Datos)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

PersonasmoveToInsertRow()

PersonasupdateString(DNI DatosDameDNI())

PersonasupdateString(NombreDatosDameNombre())

PersonasupdateString(Apellido DatosDameApellido())

PersonasupdateInt(EdadDatosDameEdad())

PersonasinsertRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

catch (SQLException e)

Systemoutprintln(e)

ObInsercionjava

import javasql

public class ObModificacion

ObModificacion(int PosicionBuscada ObRegistro Datos)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

Personasabsolute(PosicionBuscada)

PersonasupdateString(DNIDatosDameDNI())

PersonasupdateString(NombreDatosDameNombre())

PersonasupdateString(ApellidoDatosDameApellido())

PersonasupdateInt(EdadDatosDameEdad())

PersonasupdateRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

ObModificacionjava

import javasql

public class ObPosicionamiento

private ObRegistro DatosPersona

private int Posicion

ObPosicionamiento(String Accion int Posicion)

int IDAccionEdad

String DNINombreApellido

boolean PosicionCorrecta=false

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

FROM DatosPersonales)

Personasabsolute(Posicion)

IDAccion = IntegerparseInt(Accion)

switch (IDAccion)

case 0

PosicionCorrecta = Personaslast()

break

case 1

PosicionCorrecta = Personasfirst()

break

case 2

PosicionCorrecta = Personasrelative(-5)

break

case 3

PosicionCorrecta = Personasprevious()

break

case 4

PosicionCorrecta = Personasnext()

break

case 5

PosicionCorrecta = Personasrelative(+5)

break

if (PosicionCorrecta)

thisPosicion = PersonasgetRow()

DNI = PersonasgetString(DNI)

Nombre = PersonasgetString(Nombre)

Apellido = PersonasgetString(Apellido)

Edad = PersonasgetInt(Edad)

else

thisPosicion = Posicion

DNI = ----

Nombre = ----

Apellido = ----

Edad = 0

DatosPersona = new ObRegistro(DNINombreApellidoEdad)

Personasclose()

Conexionclose()

SentenciaSQLclose()

Systemoutprintln(StringvalueOf(Posicion)++StringvalueOf(thisPosicion))

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public int Posicion()

return Posicion

public ObRegistro DameDatos() return DatosPersona

ObPosicionamientojava

En este ejemplo se emplean servlets y paacuteginas Web Los clientes habitualmente trabajan en

una computadora remota y los programas se ejecutan en un servidor El mecanismo de

comunicaciones que soporta el protocolo http nos permite consultar en el servidor los datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

que ha seleccionado o escrito el usuario de esta manera se puede observar una disociacioacuten

entre la interfaz graacutefica de usuario (que se ejecuta en los equipos de los clientes) y el

programa que recoge los datos y ejecuta las acciones pertinentes (que se ejecuta en el

servidor)

Como puede observarse el coacutedigo SvAccessoBD es un servlet que lleva a cabo las siguientes

operaciones

1 Recoge los valores provenientes del usuario

2 Determina la naturaleza de la accioacuten a realizar

3 Realiza su cometido con la base de datos

4 Genera la respuesta que recibiraacute el usuario

32 JSP

JSP significa Java Server Pages que traducido quiere decir Paacuteginas de Servidor Java y es

por tanto una tecnologiacutea orientada a crear paacuteginas Web con programacioacuten en JAVA es decir

permite mezclar HTML estaacutendar y estaacutetico con un contenido dinaacutemico etiquetas especiales

(oacuterdenes) y trozos de coacutedigo JAVA (scriptlets o secuencias de oacuterdenes) o contenido dinaacutemico

generado por servlets Eacuteste contenido dinaacutemico se encuentra encerrado en etiquetas

especiales muchas de las cuales inician con lt y finalizan con gt El motor de las paacuteginas

JSP esta basado en los servlets de JAVA

En la tecnologiacutea JSP se crean paacuteginas parecidas a las paacuteginas que se crean en ASP (Active

Server Page de Microsoft) o PHP (Personal Home Page) que son dos tecnologiacuteas de paacuteginas

ejecutadas en el servidor Sin embargo JSP no se cintildee a un sistema operativo o servidor Web

en particular ademaacutes de que proporciona acceso a la tecnologiacutea de Servlets y a JAVA en la

parte dinaacutemica

El proceso para generar paacuteginas JSP accesibles en Web es mucho maacutes simple que en los

servlets Dando por hecho que se tiene un servidor Web que permite usar JSP el coacutedigo se

almacenaraacute en archivos con extensioacuten jsp que incluyen dentro de la estructuras de etiquetas

HTML las sentencias JAVA a ejecutar y tan soacutelo se colocaraacuten en cualquier lugar en donde

se pusiera una paacutegina Web normal sin compilacioacuten sin paquetes y sin configuracioacuten aunque

el servidor tendraacute que ser configurado para acceder a los archivos de clases Servlets y de

JSPs

Aunque lo que se escriba con frecuencia luciraacute como un archivo HTML estaacutendar detraacutes de

ello la paacutegina JSP se convierte automaacuteticamente en un servlet normal donde el HTML

estaacutetico tan soacutelo es enviado al flujo de salida asociado con el meacutetodo service del servlet Esta

traduccioacuten se realiza la primera vez que se solicita la paacutegina De acuerdo como este

configurado el servidor es posible ver el coacutedigo fuente de los servlets generados a partir de

sus paacuteginas JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Por ejemplo supongamos que se ha escrito el siguiente coacutedigo en el archivo Saludojsp

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtEjemplo JSPlttitlegtltheadgt

ltbody bgcolor=ffffccgt

ltcentergt

lth2gtHola mundolth2gt

ltjavautilDate hoy = new javautilDate()gt

La fecha de hoy es lt=hoygt

ltcentergt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional y un fragmento de un scriptlet de JAVA La etiqueta

lt identifica el comienzo del scriptlet y gt el final Una expresioacuten de la forma =variable

es sustituida por el valor de esa variable Para ejecutar esta paacutegina o cualquier otra paacutegina

JSP desde un navegador hay que instalarla en el servidor de aplicaciones de la misma manera

en como se hizo con los servlets Suponiendo entonces que se tiene instalado el Tomcat 5

siga los siguientes pasos

1 Antildeadir en el servidor la carpeta digamos JSP2 dentro de la carpeta webapps del Tomcat

y construir sobre ella la jerarquiacutea de clases ya conocida de los servlets

webappsrarrJSP2rarrWEB-INFrarrclasses

WEB-INFrarrlib

WEB-INFrarrtags

2 Editar en la carpeta WEB-INF el descriptor de despliegue webxml que se indica a

continuacioacuten Este archivo XML indica doacutende se localiza el esquema XML para la

especificacioacuten Servlet 24 que a suvez utiliza el esquema XML para la especificacioacuten

Java Server Page 20 que son las especificaciones que soporta en servidor Tomcat

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=

httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

3 Crear en JSP2 la carpeta saludo que contendraacute la aplicacioacuten y copiar en ella la paacutegina

Saludojsp

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

4 Arrancar el servidor Si el servidor ya estaba arrancado detenerlo y volverlo a arrancar o

bien abrir el explorador escribir el URL httplocalhost8080managerhtml e instalar

la aplicacioacuten

5 Una vez arrancado el servidor verificar si estaacute funcionando correctamente escribiendo

el URL siguiente en el explorador httplocalhost8080 El explorador debe mostrar la

paacutegina del Tomcat

6 Ejecutar la paacutegina JSP iniciando el explorador y escribiendo el URL siguiente

httplocalhost8080JSP2saludoSaludojsp donde la sintaxis geneacuterica es

httpservidor[puerto]MiCarpetapaginajsp

Cuando esta paacutegina (Saludojsp) es invocada por primera vez el motor JSP lleva a cabo una

fase de traduccioacuten de la misma en un servlet y el motor Servlet es el que ejecutaraacute eacuteste uacuteltimo

para generar el HTML dinaacutemico que seraacute enviado al explorador cliente seguacuten puede

deducirse de la figura siguiente La proacutexima vez que la paacutegina sea solicitada el motor JSP

ejecutaraacute el servlet que fue caragado la primera vez a no ser que la paacutegina haya cambiado

en cuyo caso seraacute compilada automaacuteticamente en un nuevo servlet y ejecutada

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Regresando al ejemplo el archivo java generado por el Tomcat a partir del archivo

Saludojsp se localiza en la carpeta workCatalinalocalhost de la instalacioacuten de Tomcat

321 ELEMENTOS PARA SECUENCIAS DE COMANDOS

Los elementos para secuencias de comandos permiten insertar coacutedigo en el servlet que seraacute

generado a partir de la paacutegina JSP Existen tres formas

1 Expresiones del tipo lt= expresioacuten gt que se evaluacutean e insertan en el resultado del

servlet

2 Los scriptlets del tipo lt codigo gt que se insertan en el meacutetodo _jspService del

servlet (ejecutado por service)

3 Las declaraciones del tipo lt Codigo gt que se insertan en el cuerpo de la clase del

servlet fuera de cualquier meacutetodo existente

NOTA Los comentarios en JSP se escriben lt-- Comentario JSP --gt en tanto que los

comentarios en HTML son de la forma lt--Comentario HTML --gt La diferencia

semaacutentica radica en que los comentarios HTML cuando se insertan en la respuesta enviada

por el servidor al cliente no se muestran cuando se visualiza el documento HTML pero si

Servidor Maacutequina Cliente

Explorador Web

Contenedor Web

Motor Servlet

Motor JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

los podemos ver cuando se visualiza el coacutedigo fuente en tanto que los comentarios JSP

aunque se inserten en la respuesta enviada por el servidor al cliente no son enviados al

explorador de forma que tampoco se muestran ni se ven cuando se visualiza el coacutedigo fuente

HTML desde el explorador

3211 EXPRESIONES

Se utiliza una expresioacuten JSP para insertar valores directamente en el resultado La sintaxis es

lt= expresioacuten gt Por ejemplo

lt= requestgetParameter(ldquoparNombre) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt lt= s gt

La fecha y hora actual es lt= new javautilDate() gt

La expresioacuten se evaluacutea se convierte a cadena y se inserta en la paacutegina Esta evaluacioacuten se

realiza durante la ejecucioacuten

32111 VARIABLES PREDEFINIDAS

Para simplificar estas expresiones se pueden utilizar cierta cantidad de variables

predefinidas Estos objetos impliacutecitos como tambieacuten se les llama estaacuten disponibles para su

uso durante la implementacioacuten de una paacutegina Web

bull pageContext Es un objeto de la clase PageContext que proporciona acceso a objetos

relacionados con los servlets

bull request Es un objeto de la clase HttpServletRequest que se puede obtener a traveacutes del

meacutetodo getRequest que encapsula los datos enviados por el cliente al servidor

bull response Es un objeto de la clase HttpServletResponse que puede obtenerse a traveacutes

del meacutetodo getResponse que encapsula los datos que el servidor enviaraacute al cliente

bull application Es un objeto de la clase ServletContext que se obtiene a traveacutes del meacutetodo

getServletContext que define un conjunto de meacutetodos que todo servlet utiliza para

comunicar con el contenedor de servlets

bull config Es un objeto de la clase ServletConfig que se obtiene a traveacutes del meacutetodo

getServletConfig y que se utiliza por el contenedor de servlets para pasar informacioacuten

al servlet durante la iniciacioacuten

bull session Es un objeto de la clase HttpSession que se obtiene a traveacutes del meacutetodo

getSession que proporciona una forma de identificar a un usuario que visita las paacuteginas

de un sitio Web

bull out Es un objeto de la clase JspWriter que se obtiene a traveacutes del meacutetodo getOut que

se utiliza para almacenar la respuesta que seraacute enviada al cliente que hizo la peticioacuten de

la paacutegina

bull page Es un objeto geneacuterico de la clase Object que se obtiene a traveacutes del meacutetodo

getPage y que representa al servlet obtenido a partir de la paacutegina JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

bull exception Es un objeto de la clase Exception que se obtiene a traveacutes del meacutetodo

getException que contendraacute informacioacuten a cerca de cualquier excepcioacuten que se lance

desde la paacutegina JSP

Un ejemplo del uso de uno de estos objetos impliacutecitos seriacutea el siguiente

El nombre de tu host es lt= requestgetRemoteHost() gt

El listado siguiente da un ejemplo de una paacutegina JSP que utiliza algunas variables

predefinidas como uso de expresiones JSP

ltDOCTYPE HTML PUBLIC -W3CDTD HTML 40 Transitional ENgt

lthtmlgt

ltheadgt

lttitlegt Expresiones JSP lttitlegt

ltheadgt

ltbodygt

lth2gt Expresiones JSP lth2gt

ltULgt

ltligt Fecha y hora en curso lt= new javautilDate() gt ltligt

ltligt Nombre de su host lt= requestgetRemoteHost() gt ltligt

ltligt Identificador de su sesioacuten lt= sessiongetId() gt ltligt

ltligt El paraacutemetro ltcodegt paramPrueba ltcodegt del formulario

lt= requestgetParameter(paramPrueba) gt ltligt

ltULgt

ltbodygt

lthtmlgt

Cuya salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3212 LOS SCRIPTLETS JSP

Si se desea hacer algo maacutes complejo que una simple expresioacuten los scriptlets permiten insertar

coacutedigo JAVA en el meacutetodo _jspService del servlet (que es ejecutado por service) La sintaxis

utilizada por los scriptlets es lt coacutedigo java gt Los escriptlets tienen acceso a las

mismas variables definidas de forma automaacutetica como expresiones A manera de ejemplo si

se desea que el resultado aparezca en la paacutegina generada deberiacutea de utilizarse la variable out

como en la siguiente instruccioacuten

lt String datosConsultados= requestgetQueryString()

outprintln(ldquoDatos GET adjuntos ldquo+datosConsultados)

gt

En este ejemplo podriacutea haberse obtenido el mismo resultado utilizando la siguiente expresioacuten

JSP

Datos GET adjuntos lt=requestgetQueryString() gt

En general los scriptlets pueden ejecutar varias tareas que no podriacutean realizarse con las

expresiones Tales tareas incluyen

bull La determinacioacuten de encabezados de respuesta

bull Actualizacioacuten de Bases de Datos

bull Ejecucioacuten de bucles condiciones y otras estructuras complejas

lt for (int i=1 ilt=6 i++)

gt

lth lt=i gtgt Hola Mundo lthlt=i gtgt

lt gt

Como un ejemplo concreto se muestra la siguiente paacutegina JSP llamada Cuentajsp en donde

se observa coacutemo se hace un seguimiento del nuacutemero de veces que un cliente accede a esta

paacutegina a traveacutes de distintas sesiones Para ello supondremos que dicha cuenta es el valor del

atributo atrCuenta del objeto impliacutecito application ya citado La primera vez que el cliente

accede a la paacutegina el valor de atrCuenta seraacute null debido a que auacuten no ha sido fijado este

atributo en este caso se fijaraacute con el valor 1 En los siguientes accesos se leeraacute el valor del

atributo atrCuenta se incrementaraacute en una unidad y se volveraacute a fijar Finalmente se enviacutea

la respuesta al cliente para que se muestre al usuario el valor del contador

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en el objeto impliacutecito application con el nombre

atrCuenta

--gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt

Integer cuenta = (Integer)applicationgetAttribute(atrCuenta)

String s = vez

if (cuenta == null)

cuenta = new Integer(1)

else

cuenta = new Integer(cuentaintValue() + 1)

s = veces

applicationsetAttribute(atrCuenta cuenta)

gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

Has visitado esta paacutegina lt= cuenta gt lt= s gt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional un fragmento de coacutedigo JAVA o scriptlet

expresiones y comentarioshellip

Aquiacute otro ejemplo de la ejecucioacuten de un coacutedigo demasiado complejo para una expresioacuten JSP

Este listado presenta una paacutegina JSP que utiliza el paraacutemetro de peticioacuten colorFondo para

establecer el color de fondo de la paacutegina

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgt

lttitlegt Prueba de Color lttitlegt

ltheadgt

lt

String colorFondo=requestgetParameter(colorFondo)

boolean tieneColorExplicito

if (colorFondo =null)

tieneColorExplicito=true

else

tieneColorExplicito=false

colorFondo=WHITE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt

ltbody bgcolor=lt= colorFondo gtgt

lth2 align=centergt Prueba de color lth2gt

lt

if (tieneColorExplicito)

outprintln(Ha indicado un color de fondo expliacutecito +

colorFondo +)

else

outprintln(Usareacute el color de fondo predeterminado WHITE +

Indique el atributo de peticioacuten

ltigtcolorFondoltigt+

para intentar un color estaacutendar un +

valor RRGGBB o para ver si el navegador Web +

permite el uso de nombres de color X11)

gt

ltbodygt

lthtmlgt

Cuyas posibles salidas son

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3213 DECLARACIONES JSP

Una declaracioacuten JSP permite definir meacutetodos o campos que seraacuten insertados en el cuerpo

principal de la clase del servlet (fuera del meacutetodo _jspService) Una declaracioacuten tiene la

sintaxis lt Coacutedigo Java gt Por ejemplo

lt int i=0 gt

lt

Public void jspinit()

coacutedigo de iniciacioacuten

gt

Una declaracioacuten no genera ninguacuten resultado y se usan junto con las expresiones JSP o los

scriptlets A continuacioacuten se muestra una paacutegina JSP que despliega la cantidad de veces que

se ha solicitado esta paacutegina desde que se arrancoacute el servidor haciendo uso de las

declaraciones JSP

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtDeclaraciones JSPlttitlegtltheadgt

ltbodygt

lth1gtDeclaraciones JSPlth1gt

lt-- Esto es un comentario en JSP --gt

lt private int recuentoAccesos=0 gt

lth2gt Accesos a la paacutegina desde el reinicio del servidor

lt= ++recuentoAccesos gt lth2gt

ltbodygt

lthtmlgt

La salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

322 EL LENGUAJE DE EXPRESION EN JSP 20

Anteriormente se ha visto la necesidad de utilizar fragmentos de coacutedigo java en el desarrollo

de paacuteginas JSP pero con la aparicioacuten de la especificacioacuten JSP 20 ya no hay necesidad de

utilizar fragmentos de coacutedigo Java para nada gracias al nuevo lenguaje de expresioacuten EL

(Expresioacuten Language) a la biblioteca de etiquetas estandar JSTL (JSP Standar Tag Library)

y a las nuevas formas para desarrollar etiquetas personalizadas

El lenguaje de expresioacuten JSP es maacutes un lenguaje de acceso a datos que un lenguaje de

programacioacuten Ya se ha visto que para pasar informacioacuten de un cliente a una paacutegina JSP se

utilizan paraacutemetros en la peticioacuten y atributos en la paacutegina El lenguaje de expresioacuten lo hace

posible sin tener que utilizar scriptlets o expresiones (lt= expresioacuten gt) Por ejemplo las

liacuteneas JSP 12 siguientes escritas utilizando coacutedigo Java

lt= requestgetParameter(ldquoparNombrerdquo) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt veces

bajo la especificacioacuten JSP 20 se pueden escribir de una forma maacutes sencilla como sigue

(ahora no se trata de coacutedigo JAVA)

$paramparNombre has visitado esta paacutegina

$atrCuenta veces

La sintaxis de JSP es sensible a mayuacutesculas y minuacutesculas pero un par de comillas simples es

equivalente a un par de comillas dobles

3221 VARIABLES PREDEFINIDAS (Objetos Impliacutecitos)

El lenguaje de expresioacuten JSP 20 soporta los objetos impliacutecitos siguientes

pageContext Objeto de javaxservletjspPageContext que proporciona acceso a los

datos de una peticioacuten

param Coleccioacuten (objeto de tipo javautilMap) de todos los valores de los paraacutemetros

enviados en una peticioacuten un String por paraacutemetro

paramValues Coleccioacuten de todos los valores de los paraacutemetros enviados en una

peticioacuten una matriz de tipo String por paraacutemetro

header Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten un

String por cabecera

headerValues Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten

una matriz de tipo String por cabecera

cookie Coleccioacuten de todos los valores de las cookies un objeto javaxservlethttpCookie

por cookie

initParam Coleccioacuten de todos los valores de los paraacutemetros de iniciacioacuten de la

aplicacioacuten un String por paraacutemetro

Tambieacuten hay objetos que permiten acceder a variables definidas en diferentes aacutembitos lo que

posibilita compartir informacioacuten

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

pageScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de paacutegina

requestScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

peticioacuten

sessionScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de sesioacuten

applicationScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

aplicacioacuten

3222 DIRECTRICES

Las directrices page incluye y taglib son mensajes para el motor JSP y son siempre incluidas

entre los siacutembolos lt y gt

32221 LA DIRECTRIZ PAGE

Define atributos que se aplican a toda la paacutegina JSP donde es incluida

lt page lista_de_atributos gt

Donde la lista_de_atributos puede contener algunos de los siguientes (aquellos que estaacuten

escritos en negrita son los tomados por omisioacuten)

language= ldquoscriptingLanguagerdquo

extends= rdquoclassNamerdquo

import= ldquoimportListrdquo

session= ldquotrue|falserdquo

buffer= ldquonone|sizeKb

autoflush= ldquotrue|falserdquo

isThreadSafe= rdquotrue|falserdquo

info= rdquoinfo_textrdquo

errorPage= ldquoerror_urlrdquo

isErrorPage= rdquotrue|falserdquo

contentType= rdquoctinfordquo

pageEncoding= rdquopeinfordquo

isELIgnored= ldquotrue|falserdquo

Tiacutepicamente se localiza al principio de la paacutegina JSP y puede haber cualquier nuacutemero de

ellas El lenguaje por omisioacuten es Java Ejemplos

lt page contentType=rdquotexthtmlrdquo language=rdquojavardquo gt

lt page import=rdquojavautil javalangrdquo gt

lt page buffer=rdquo5kbrdquo autoflush=rdquofalserdquo gt

32222 LA DIRECTRIZ INCLUDE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

La directriz include incluye un archivo (html jsp xml o de texto) en una paacutegina JSP Esto

permite dividir el contenido de la paacutegina en trozos maacutes manejables

lt incluye file=rdquoURL_relativordquo gt

El ejemplo siguiente muestra dos archivos el primero incluye al segundo para mostrar la

fecha y hora actuales

lt-- fichero mostrarFechaHorajsp --gt

lthtmlgt

ltheadgtlttitlegtIncluir un ficherolttitlegtltheadgt

ltbody bgcolor=whitegt

ltfont color=bluegt

La fecha y hora actuales son

lt include file=fechaHorajsp gt

ltfontgt

ltbodygt

lthtmlgt

lt-- fichero fechaHorajsp --gt

lt page import=javautil gt

lt= (new javautilDate())toLocaleString() gt

32223 LA DIRECTRIZ TAGLIB

La directriz taglib indica la biblioteca de acciones personalizadas que podremos utilizar en

la codificacioacuten de la paacutegina JSP Para distinguir esas acciones entre otras existentes se utiliza

un prefijo (prefix) Su sintaxis es

lt taglib (uri=rdquoURI_bibliotecardquo|tagdir=rdquoDir_biblioteca_tagrdquo)

prefix=rdquoprefijordquo gt

Cuando se trata de una biblioteca definida mediante una clase Java y un descriptor (archivo

tld) eacutesta se identifica mediante un URI (Uniform Resource Identifier- URL relativos) Por

ejemplo

lt taglib uri=rdquohttpMarioRossainzLopezmiBibliotecardquo

prefix=rdquofunrdquo gt

ltpgtltfunaccion01 gt

La uacuteltima liacutenea del ejemplo tiene dos etiquetas una etiqueta p HTML y otra accion01

perteneciente a la biblioteca miBiblioteca En cambio si la biblioteca se define mediante un

archivo tag entonces se identifica mediante su ruta relativa en el sistema de archivos

lt taglib tagdir=rdquoWEB-INFtagsrdquo prefix=rdquofunrdquo gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpgtltfunaccion01 gt

La directriz taglib debe colocarse antes de utilizar en la paacutegina JSP las acciones

personalizadas definidas por la misma Se puede utilizar maacutes de una directriz pero el prefijo

utilizado debe ser uacutenico para cada una de ellas

3223 ACTIVACION DEL LENGUAJE DE EXPRESION (LE)

La especificacioacuten JSP 20 define un lenguaje de expresioacuten como alternativa a elementos de

programacioacuten escritos con coacutedigo Java y especificaciones anteriores a la JSP 20 Para que

este lenguaje pueda ser interpretado tienen que cumplirse 2 requisitos

1 Que la propiedad isELIgnored de la directriz page valga false

lt page isELIgnored= ldquofalserdquo gt

2 Que el descriptor de despliegue webxml en la carpeta WEB-INF indique doacutende se

localiza el esquema XML para la especificacioacuten Servlet 24 que a su vez utiliza el

esquema XML para la especificacioacuten Java Server Page 20

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

Utilizando el lenguaje de expresioacuten se podriacutea modificar la paacutegina Cuentajsp de la seccioacuten

3212 de este documento como se muestra a continuacioacuten Esta nueva paacutegina

1 Especifica que utilizaraacute la biblioteca core de etiquetas estandar (de la que se hablaraacute maacutes

adelante)

2 La primera vez que sea accedida definiraacute la variable atrCuenta en el aacutembito de la

aplicacioacuten con un valor inicial nulo y la incrementaraacute en una unidad cuando sea accedida

sucesivas veces simplemente incrementaraacute esta variable en una unidad

3 Finalmente mostraraacute una paacutegina con un contenido anaacutelogo al siguiente Esta formado

por una cabecera y una segunda liacutenea compuesta por el valor del paraacutemetro parNombre

enviado con la peticioacuten un texto fijo el valor de la variable atrCuenta y otro texto fijo

dependiente del valor de esta variable

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

El coacutedigo completo es el siguiente

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

3224 VARIABLES Y EXPRESIONES

Para acceder a una simple variable se puede escribir algo como lo siguiente $nombre y

para acceder a una propiedad de un objeto podemos escribir algo como

$paramparNombre

$applicationScopeatrCuenta

$pageContextrequestrequestURI

La primera liacutenea del ejemplo anterior obtiene el valor de la propiedad parNombre del objeto

param la segunda el valor del atributo atrCuenta del objeto applicationScope y la tercera

el URL relativo de la paacutegina JSP solicitada

El lenguaje de expresioacuten es maacutes tolerante con respecto a las variables con valor null y ejecuta

muchas maacutes conversiones de forma automaacutetica sobre el tipo de los datos cuando la expresioacuten

a evaluar asiacute lo requiere Por ejemplo la etiqueta condicional siguiente incluye una expresioacuten

que compara el valor del atributo atrCuenta con aacutembito de aplicacioacuten con 10 (convirtiendo

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

impliacutecitamente el valor del atributo al tipo de la constante para poder realizar la comparacioacuten

El resultado seraacute un valor de tipo boolean

ltcif test=rdquo$applicationScopeatrCuenta gt 10rdquogt

ltcifgt

o bien

ltcif test=rdquo$atrCuenta gt 10rdquogt

ltcifgt

Para que una literal pueda incluir un caracter significativo para el lenguaje dicho caracter

debe ser especificado como una secuencia de escape (caracter) Por ejemplo la siguiente

expresioacuten da lugar al literal ldquovezrdquo o ldquovecesrdquo entre comillas dobles

$(atrCuenta gt 1) iquest ldquordquovecesrdquordquo ldquordquovezrdquordquo

Cualquier objeto o atributo de un objeto definido en algunos de los aacutembitos de una paacutegina

puede ser utilizado como una variable Por ejemplo $atrCuenta+1 es una expresioacuten que

realiza la suma de la variable atrCuenta con 1

Cuando se trate de una propiedad de un objeto para acceder a ella se utilizaraacute el operador

punto o bien la notacioacuten empleada para acceder a un elemento de una matriz Por ejemplo

$paramparNombre

$param[ldquoparNombrerdquo]

Una expresioacuten LE puede aparecer en cualquier lugar donde pueda aparecer un texto fijo Por

tanto para informar al contenedor JSP que se trata de una expresioacuten y no de un texto fijo se

utilizan los delimitadores $ al principio y al final

3225 OPERADORES

OPERADOR DESCRIPCIOacuteN Acceso a la propiedad de un objeto o a un elemento de un Map

[] Acceso al elemento de una matriz o de un objeto List

() Pareacutentesis para alterar la prioridad en la evaluacioacuten de una expresioacuten

If ternario condicion expresion1 expresioacuten 2

+ Suma

- Resta

Producto

oacute div Divisioacuten

oacute mod Moacutedulo o resto de una divisioacuten

== oacute eq Igualdad

= oacute ne Diferente

lt oacute lt Menor que

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt oacute gt Mayor que

lt= oacute le Menor o igual que

gt= oacute ge Mayor o igual que

ampamp oacute and Operacioacuten Loacutegica AND

|| oacute or Operacioacuten Loacutegica OR

oacute not Operacioacuten Loacutegica NOT

empty Verifica si el valor de una variable es null si un String esta vaciacuteo o si una matriz Map

o Collection no tienen elementos

func(args) Llamada a una funcioacuten donde func es el nombre de la funcioacuten y arg representa cero o

maacutes argumentos separados por comas

El ejemplo siguiente muestra una paacutegina JSP compuesta por elementos HTML expresiones

LE y objetos impliacutecitos

lthtmlgt

ltheadgtlttitlegtJSP 20lttitlegtltheadgt

ltbodygt

lth3gtLenguaje de expresioacuten (LE)lth3gt

ltpgtLa siguiente tabla ilustra algunas expresiones LE

ltbrgtltbrgtlttable border=1gt

lttrgt

ltthgtltbgtExpresioacutenltbgtltthgt

ltthgtltbgtValorltbgtltthgt

lttrgt

lttrgt

lttdgt$3 + 6lttdgt

lttdgt$3 + 6lttdgt

lttdgt

lttrgt

lttdgt$(7 gt 4) 7 4lttdgt

lttdgt$(7 gt 4) 7 4lttdgt

lttrgt

lttrgt

lttdgt$header[host]lttdgt

lttdgt$header[host]lttdgt

lttrgt

lttablegt

ltbodygt

lthtmlgt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

323 BIBLIOTECA ESTANDAR DE ETIQUETAS

La biblioteca estaacutendar de etiquetas JSP (JSTL ndash Java Server Page Estaacutendar Tag Library)

incluye una cantidad amplia de etiquetas para diferentes aacutereas de trabajo

Aacuterea baacutesica (su prefijo es c ndash core) y contiene

o Soporte de variables (remove y set)

o Control del flujo (choose when otherwise forEach forTokens if)

o Manejo de URL (import param redirect param y url param)

o Operaciones varias (match y out)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlcore

Aacuterea XML (su prefijo es x) y contiene

o Sentencias baacutesicas (out parse y set)

o Control del flujo (choosehellip whenhellip otherwise forEach e if)

o Transformacioacuten de Documentos (transformhellipparam)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlxml

Aacuterea Internacionalizacioacuten (su prefijo es fmt) Contiene

o Localidad (setLocale y requestEncoding)

o Mensajes (bundle message param y setBundle)

o Formateo de Fechas y nuacutemeros (formatNumber formateacuteate parseDate

parseNumber setTimeZone timeZone)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlfmt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Aacuterea SQL (su prefijo es sql) es el lenguaje estandar para interactuar con bases de datos

relacionales y contiene setDataSource Quero dateParam param transaction y

update dateParam param) El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlsql

Aacuterea Funciones (su prefijo es fn) y contiene

o Longitud de una coleccioacuten (length)

o Manipulacioacuten de String (toUpperCase toLowerCase substring

substringAfter substringBefore trim replace indexOf startsWith

endsWith contains containsIgnoreCase split join y escapeXml)

o El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlfunctions

3231 OPERACIONES CON ETIQUETAS BAacuteSICAS

En un ejemplo pasado teniacuteamos el siguiente coacutedigo

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

En este ejemplo se hace referencia al aacuterea baacutesica de JSTL con el prefijo c y se utiliza la

etiqueta cset para definir la variable atrCuenta Si la variable ya esta definida simplemente

se le asigna el valor especificado

La uacuteltima parte del ejemplo anterior podriacutea haberse escrito de esta otra forma

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcif test=rdquo$atrCuenta gt 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcifgt

$atrCuenta $str

La etiqueta cif permite la ejecucioacuten condicional de su cuerpo en funcioacuten del valor del

atributo de test

La etiqueta cchoose permite la ejecucioacuten del cuerpo de la primera etiqueta cwhen cuyo

atributo test sea evaluado a true Si ninguna de las condiciones se evaluacutea a true entonces se

evaluacutea el cuerpo de la etiqueta cotherwise si estaacute presente El siguiente coacutedigo muestra otra

manera de escribir el ejemplo anterior utilizando estas uacuteltimas etiquetas

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcchoosegt

ltcwhen test=rdquo$atrCuenta == 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcwhengt

ltcotherwisegt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcotherwisegt

ltcchoosegt

$atrCuenta $str

La etiqueta cforEach permite iterar sobre una coleccioacuten de objetos La coleccioacuten se

especifica por medio del atributo iacutetems y el elemento actual de la coleccioacuten estaacute disponible a

traveacutes de la variable establecida por el atributo var Por ejemplo el siguiente fragmento de

coacutedigo visualiza una tabla con las variables definidas a nivel de aacutembito de paacutegina

lttable border=rdquo1rdquogt

ltcforEach var=rdquoitemrdquo iacutetems=rdquo$pageScoperdquogt

lttrgt

lttdgt $item lttdgt

lttrgt

ltcforEachgt

lttablegt

La etiqueta ccatch atrapa una excepcioacuten que ocurra en el cuerpo de la misma Por ejemplo

el siguiente segmento de coacutedigo lanzaraacute una excepcioacuten si el paraacutemetro mes se escribe con

letras en vez de con nuacutemeros

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltbodygt

lthtmlgt

Un URL anaacutelogo al siguiente daraacute lugar a que la excepcioacuten sea lanzada cuando se ejecute la

expresioacuten $nMes 3 de la paacutegina anterior

httplocalhost8080JSP2exceppruebajspmes=marzo

La excepcioacuten indica que ha ocurrido un error al tratar de convertir ldquomarzordquo a un entero de

tipo Long Para cachar esta excepcioacuten y darle un tratamiento adecuado habraacute que modificar

la paacutegina JSP anterior como se indica a continuacioacuten

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltccatch var=rdquoerrorOcurridordquogt

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltccatchgt

ltcif test=rdquo$not empty errorOcurridordquogt

Error el paraacutemetro mes debe ser un nuacutemero ltbgt

ltbrgt Informacioacuten del error dada por el sistema

ltbrgt ltfont color=rdquoFF0000rdquogt $errorOcurrido ltfontgt

ltcifgt

ltbodygt

lthtmlgt

3232 ACCESO A BASES DE DATOS CON JSP

Las etiquetas que proporciona el aacuterea SQL permiten realizar

Conexioacuten con una base de datos

Realizacioacuten de consultas a la base de datos

Acceso al conjunto de resultados

Ejecucioacuten de actualizaciones y transacciones

Todas las etiquetas SQL actuacutean sobre una base de datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

32321 CONEXIOacuteN CON LA BASE DE DATOS

La conexioacuten con la base de datos puede realizarse con la etiqueta sqlsetDataSource Por

ejemplo si se esta utilizando el administrador de bases de datos MySql con el controlador

JDBC se puede realizar una conexioacuten con una base de datos digamos bd_tutorias de la

manera siguiente

ltsqlsetDataSource var=rdquobdrdquo

driver=rdquocommysqljdbcDriverrdquo

url=rdquojdbcmysqllocalhost3306bd_tutoriasrdquo

user=rdquoadminrdquo

password=rdquoadminadminrdquo gt

32322 CONSULTA A LA BASE DE DATOS

La etiqueta sqlQuero permite realizar una consulta a una base de datos Por ejemplo el

siguiente fragmento de coacutedigo realiza una consulta a la base de datos representada por bd y

obtiene un conjunto de resultados representado por cdr

ltsqlquery var=rdquocdrrdquo dataSource=rdquo$bdrdquogt

SELECT professor dia hora alumno

FROM profesores tutorias citas

WHERE profesoresid_profesor=tutoriasid_profesor

AND tutoriasid_tutoria=citasid_tutoria

ltsqlquerygt

32323 MODIFICACIONES SOBRE LA BASE DE DATOS

La etiqueta sqlupdate permite ejecutar una sentencia SQL INSERT UPDATE o DELETE

y cualquier otra sentencia SQL que no retorne ninguacuten valor Por ejemplo

ltsqlupdate var=rdquocontrdquo dataSource=rdquo$bdrdquo gt

UPDATE profesores

SET profesor=

WHERE profesor=

ltsqlparam value=rdquo$paramProfesorrdquo gt

ltsqlparam value=rdquo$paramIDrdquo gt

ltsqlupdategt

Una operacioacuten UPDATE puede utilizar el siacutembolo para indicar que el valor que tendriacutea que

evaluarse en esa posicioacuten seraacute suministrado por una etiqueta sqlparam como por ejemplo

httplocalhost8080JSP2sqlpruebajspProfesor=Mario+Rossainz+LopezampID=514

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

import javaxservlethttp

import javautil

public class Saludo extends HttpServlet

Manipular la peticioacuten enviada por el cliente

utilizando el atributo method=get

protected void doGet(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

responsesetContentType(texthtml)

PrintWriter out = responsegetWriter()

outprintln(lthtmlgt)

outprintln(ltheadgt)

outprintln(lttitlegtServlet Saludolttitlegt)

outprintln(ltheadgt)

outprintln(ltbodygt)

outprintln(ltcentergt)

for (int tamantildeo = 1 tamantildeo lt= 7 ++tamantildeo)

outprintln(ltfont size=+tamantildeo+ color=bluegt)

outprintln(iexcliexcliexclHola mundo)

outprintln(ltbrgt)

outprintln(ltbrgt)

Calendar fechahora = new GregorianCalendar()

Random rnd = new Random()

int tamantildeo = rndnextInt(7)+1

outprintln(ltfont size=+tamantildeo+gt)

outprintln(ltfont color=greengt)

outprintln(Son las +

fechahoraget(CalendarHOUR_OF_DAY) + +

fechahoraget(CalendarMINUTE) + +

fechahoraget(CalendarSECOND) )

outprintln(ltbrgt)

outprintln(ltfont color=graygt)

outprintln(Del diacutea +

fechahoraget(CalendarDAY_OF_MONTH) + +

(fechahoraget(CalendarMONTH)+1) + +

fechahoraget(CalendarYEAR) )

outprintln(ltfontgt)

outprintln(ltcentergt)

outprintln(ltbodygt)

outprintln(lthtmlgt)

outclose()

Para ejecutar este servlet llamado Saludo podemos crear una carpeta dentro de webapps por

ejemplo saludoWEB-INFclasses y copiar dentro de classes Saludoclass

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Para ejecutar el servlet Saludo tendriacuteamos entonces que escribir

httplocalhost8080SaludoservletSaludo

Pero si queremos invocar a este servlet desde una paacutegina HTML se deberaacute utilizar este

mismo URL o bien el URL relativo a la carpeta del servidor donde copiemos el archivo html

que seraacute copiado en la carpeta Saludo

El coacutedigo HTML almacenado en saludohtml deberaacute incluir una de las dos liacuteneas siguientes

lta href=rdquohttplocalhost8080Saludoservletsaludordquogt ejecutar Saludo ltagt

lta href=rdquoservletSaludordquogt ejecutar Saludo ltagt

La segunda opcioacuten es la maacutes interesante porque no depende de la direccioacuten del servidor Para

ejecutar entonces el servlet a traveacutes de saludohtml basta con escribir el URL siguiente

httplocalhost8080Saludosaludohtml

316 EMPAQUETADO DE SERVLETS

Puede darse el caso en que diversos programadores en un entorno de produccioacuten dado

podriacutean estar desarrollando servlets para el mismo servidor El colocar todos estos servlets

en el directorio principal de estos programas podriacutea dar como resultado un directorio difiacutecil

de administrar ademaacutes de que se corre el riesgo de duplicar los nombres de los servlets si

dos desarrolladores distintos eligen el mismo nombre para el programa que desarrollan Los

paquetes son la solucioacuten loacutegica a este problema El uso de paquetes tiene como resultado

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

cambios en la forma en que se generan los servlets la forma en que se compilan y en la que

se invocan Para colocar los servlets en paquetes se requieren de dos pasos

1 Mover los archivos (class) a un subdirectorio que coincida con el nombre del paquete

pretendido

2 Insertar una instruccioacuten de paquete en el archivo de clase Para ello la primera liacutenea en

el coacutedigo fuente (java) del servlet deberaacute ser package nomPaquete

Por ejemplo el fragmento siguiente de coacutedigo Java presenta una variacioacuten del Servlet

HolaMundo que se encuentra en el paquete misServlets

package misServlets

import javaio

import javaxservlet

import javaxservlethttp

public class HolaMundo extends HttpServlet

Manipular las posibles peticiones enviadas por el cliente

utilizando el atributo method=get o method=post

protected void procesarPeticion(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

responsesetContentType(texthtml)

PrintWriter out = responsegetWriter()

outprintln(lthtmlgt)

El archivo class se encontraraacute dentro de una carpeta llamada misServlets que seraacute el paquete

creado o utilizado por la aplicacioacuten en este caso del HolaMundo dependiendo si exitiacutea o no

antes de compilar la aplicacioacuten A continuacioacuten deberemos copiar dentro de la carpeta

webappsROOTWEB-INFclasses del Tomcat la carpeta misServlets junto con el

HolaMundoclass que estaraacute dentro de ella y ejecutar el servlet en el explorador escribiendo

httplocalhost8080servletmisServletsHolaMundo

317 PROCESAMIENTO DE FORMULARIOS

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Hasta este punto los servlets que hemos estudiado soacutelo enviacutean informacioacuten al navegador del

cliente No obstante estos clientes Web pueden Mostar formularios que permitan solicitar

datos a los usuarios que seraacuten enviados al servidor para por ejemplo ser almacenados en

una base de datos para posteriores peticiones o para otros procesos o bien para dar al usuario

una respuesta ajustada a dicha peticioacuten

En el siguiente URL se invoca la ejecucioacuten de un servlet llamado Parametros aportando la

lista de pares (Nombre Mario)-(Edad 22) en formato GET

httplocalhost8080ParametrosservletParametrosNombre=MarioampEdad=22

Hay que observar la manera de colocar los datos tras el siacutembolo ldquordquo y de separarlos con el

siacutembolo ldquoamprdquo El coacutedigo del servlet es el siguiente

import javaio

import javaxservlet

import javaxservlethttp

public class Parametros extends HttpServlet

public void doGet(HttpServletRequest request HttpServletResponse

response)

throws IOException ServletException

responsesetContentType(texthtml)

PrintWriter out = responsegetWriter()

outprintln(lthtmlgt)

outprintln(ltbodygt)

String NombreRecibido = requestgetParameter(Nombre)

String EdadRecibida = requestgetParameter(Edad)

outprintln(lth1gt Hola + NombreRecibido + lth1gt)

outprintln(lth1gt Tienes + EdadRecibida + antildeos lth1gt)

outprintln(ltbodygt)

outprintln(lthtmlgt)

El objeto httpServletRequest en el coacutedigo anterior request contiene una serie de meacutetodos de

utilidad para recibir informacioacuten proveniente del usuario en concreto el meacutetodo

getParameter permite obtener el valor asociado a un nombre en la lista de pares (nombre

valor) que puede proporcionar un URL

Ademaacutes de poder introducir el URL anterior en el navegador proporcionando directamente

los datos enviados al servlet en dicha URL

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Tambieacuten podemos generar el URL mediante una paacutegina Web que podraacute utilizar el usuario

lthtmlgt

ltbodygt

lth1gt Cuestionario lth1gt

ltform action=httplocalhost8080ParametrosservletParametros

method=getgt

Nombre ltinput type=text name=Nombregt ltbrgt

Edad ltinput type=text name=Edadgt ltbrgtltbrgt

ltinput type=submit value=Enviar datosgt ltbrgt

ltformgt

ltbodygt

lthtmlgt

Los formularios en HTML permiten enviar datos al servidor Web En la liacutenea 5 de la paacutegina

Web mostrada se encuentra la etiqueta form que en el ejemplo contiene el atributo action

que indica la accioacuten que debe realizarse en el servidor en este caso ejecutar el servlet

Parametros y el atributo method que indica la manera en la que se enviacutean los datos (en este

caso la peticioacuten GET)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Peticioacuten HTTP GET Cuando el tipo de peticioacuten HTTP es GET los datos del formulario

son enviados al servidor a continuacioacuten del URL especificado por el atributo action de form

El tamantildeo de la cadena enviada estaacute limitado y al estar en ASCII es totalmente legible por

tanto no es un modo seguro

Es por ello que cuando se requiere del enviacuteo de datos seguros y ademaacutes el nuacutemero de datos

del formulario que son enviados al servidor son muchos resulta ser mejor el uso del meacutetodo

POST Veamos otro ejemplo

import javaio

import javaxservlet

import javaxservlethttp

import javautil

public class MostrarParametros extends HttpServlet

public void doGet(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

responsesetContentType(texthtml)

PrintWriter out= responsegetWriter()

String titulo=Lectura de todos los paraacutemetros de Peticioacuten

outprintln(ltdoctype html public -W3CDTD HTML 40 +

TransitionalENgt)

outprintln(lthtmlgt)

outprintln(ltheadgtlttitlegt+titulo+lttitlegtltheadgt)

outprintln(ltbody bgcolor=FDF5E6gtn+

lth1 align=centergt+titulo+lth1gtn+

lttable border=1 align=centergtn+

lttr bgcolor=FFAD00gtn+

ltthgtNombre del parampaacutemetroltthgtValor(es) del

parampaacutemetro)

Enumeration nombresParam=requestgetParameterNames()

while(nombresParamhasMoreElements())

String nombreParam= (String)nombresParamnextElement()

outprint(lttrgtlttdgt+nombreParam+nltTDgt)

String[]valoresParam=

requestgetParameterValues(nombreParam)

if (valoresParamlength==1)

String valorParam=valoresParam[0]

if (valorParamlength()==0)

outprintln(ltigt Sin valor ltigt)

else

outprintln(valorParam)

else

outprintln(ltulgt)

for (int i=0 iltvaloresParamlengthi++)

outprintln(ltligt+valoresParam[i])

outprintln(ltulgt)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

outprintln(lttablegtnltbodygtlthtmlgt)

public void doPost(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

doGet(requestresponse)

El servlet escrito utiliza un meacutetodo doPost que soacutelo ejecuta a Donet Esto es porque se quiere

que el servlet pueda manejar tanto las peticiones GET como las POST Por otro lado el

formulario es el siguiente

ltdoctype html public -W3CDTD HTML 40 TransitionalENgt

lthtmlgt

ltheadgt

lttitlegt Un Formulario de ejemplo que utiliza POST lttitlegt

ltheadgt

ltbody bgcolor=FDF5E6gt

lth1 align=centergt Un formulario de Ejemplo que utiliza POST

lth1gt

ltform action=httplocalhost8080MostrarParametros

servletMostrarParametros

method=postgt

Nuacutemero de elemento ltinput type=text name=elemNumgt ltbrgt

Cantidad ltinput type=text name=cantidadgt ltbrgt

Precio Unitario ltinput type=text name=precio value=$gt

ltbrgtlthrgt

Nombre de Pila ltinput type=text name=nombrePilagt ltbrgt

Apellido(s) ltinput type=text name=apellidogt ltbrgt

Iniciales ltinput type=text name=inicialesgt ltbrgt

Domicilio de envio lttextarea name=domicilio rows=3

cols=40gtlttextareagt ltbrgt

Tarjeta de creacutedito ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta value=VisagtVisa ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta value=Master Cardgt

Master Card ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta value=AmexgtAmerican

Expresss ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta

value=DiscovergtDiscover ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta

value=Java Smart CardgtTarjeta Inteligente de Java

ltbrgt

Nuacutemero de la tarjeta de creacutedito

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltinput type=password name=numTarjetagtltbrgt

Repita el nuacutemero de la tarjeta de creacutedito

ltinput type=password name=numTarjetagtltbrgtltbrgt

ltcentergt

ltinput type=submit value=Enviar pedidogt

ltcentergt

ltformgt

ltbodygt

lthtmlgt

El formulario HTML del listado anterior utiliza POST como deberiacutea ser en todos los campos

que tienen contrasentildea

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Si intenta ejecutar el servlet MostrarParametros directamente en el explorador con el URL

httplocalhost8080MostrarParametrosservletMostrarParametros se obtendraacute la paacutegina

Web sin resultados

Peticioacuten HTTP POST Cuando el tipo de peticioacuten HTTP es POST los datos son enviados

al servidor en el cuerpo de la peticioacuten Es el meacutetodo maacutes usual de enviar los datos de un

formulario Con este tipo de peticioacuten la informacioacuten del formulario se enviacutea despueacutes del URL

indicado por action en el cuerpo de la peticioacuten y el tamantildeo de la informacioacuten enviada no esta

limitado

Seguacuten lo expuesto escoger el meacutetodo para enviar la informacioacuten no es difiacutecil Si los datos

son pocos y no importa su confidencialidad o manipulacioacuten utilizamos GET Si son largos

privados o importantes utilizamos POST

318 ACCESO A BASES DE DATOS CON SERVLETS

Una aplicacioacuten Java que realiza accesos a bases de datos funciona seguacuten una arquitectura que

permite escribir los programas abstrayeacutendose de los detalles de los niveles inferiores (discos

controladores sistema operativo etc) como lo muestra la figura siguiente

JDBC (Java DataBase Connectivity ndash Conexioacuten con Bases de Datos desde Java) es una API

de Java que permite ejecutar instrucciones SQL para manipular y gestionar bases de datos

relacionales Para que una aplicacioacuten Java pueda hacer operaciones sobre una base de datos

previamente tiene que establecer una conexioacuten con la misma Esta conexioacuten se realiza a

traveacutes de un controlador (driver) seguacuten la figura de arriba La API-JDBC se proporciona en

dos paquetes javasql y javaxsql El primer paquete contiene las interfaces y clases Java

fundamentales de JDBC en tanto que el segundo paquete es una extensioacuten del primero e

APLICACION

SISTEMA OPERATIVO

CONTROLADOR

Oracle Access MySql

JVM

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

incluye las clases que interactuacutean con JNDI y otras que gestionan conjuntos de conexiones

con una misma base de datos Para maacutes detalles del uso de JDBC veacutease el apeacutendice A de

estas notas

El primer paso para crear una conexioacuten entre una aplicacioacuten Java y una base de datos es

registrar el controlador JDBC adecuado para esa base con el fin de que la JVM pueda

utilizarlo Existen distintos tipos de controladores JDBC por ejemplo

ldquocommysqljdbcDriverrdquo que es el controlador utilizado cuando el motor de base de datos

que se utiliza es MySql

En el supuesto caso de que la base de datos soacutelo permitiera el acceso a traveacutes de controladores

ODBC como lo hace ACCESS siempre podemos usar el controlador puente JDBC-ODBC

incluido como parte del JDK ldquosunjdbcodbcJdbcOdbcDriverrdquo Este tipo de controladores

es decir los basados en ODBC (Open DataBase Connectivity) son bastante utilizados en

entornos Windows pues este SO incluye ODBC El apeacutendice A describe al final como

administrar los oriacutegenes de datos ODBC en Windows

Asiacute pues la mayor ventaja de los servlets con respecto a la conexioacuten con bases de datos viacutea

JDBC es que su ciclo de vida les permite mantener conexiones abiertas con las mismas a lo

largo de toda una sesioacuten Esto permite recortar tiempo con respecto a otras tecnologiacuteas como

la CGI Ademaacutes JDBC es una tecnologiacutea independiente de las bases de datos

Como ejemplo vamos a implementar una simple aplicacioacuten Web basada en servlets que

muestre una especie de directorio de personas La aplicacioacuten podraacute consultar insertar

modificar borrar o listar la informacioacuten de cada una de las personas almacenadas en la base

de datos a la que se hace acceso (que estaraacute en formato access)

La estructura de la Base de Datos es una tabla con los siguientes campos

DNI Nombre Apellido Edad

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

53023767A Pedro Rubio 18

77459822P Luis Tejedor 47

123456MRL Mario Rossainz 35

La estructura de la aplicacioacuten se muestra en la figura siguiente

lthtmlgt

ltbodygt

lttable border=1gtlttrgtlttdgt

ltform action=httplocalhost8080directorioTelservletSvAccesoBD

method=getgt

DNI ltinput type=text name=DNIgt ltbrgt

Nombre ltinput type=text name=Nombregt ltbrgt

Apellido ltinput type=text name=Apellidogt ltbrgt

Edad ltinput type=text name=Edadgt ltbrgtltbrgt

ltinput type=submit value=Consultar name=BotonConsultargt

ltinput type=submit value=Insertar name=BotonInsertargt

ltinput type=submit value=Modificar name=BotonModificargt

ltinput type=submit value=Borrar name=BotonBorrargt

ltinput type=submit value=Listar name=BotonListargt ltbrgt

ltcentergt

ltinput type=submit value= |lt name=BotonPrimerogt

ltinput type=submit value= -- name=BotonMenosCincogt

ltinput type=submit value= - name=BotonAnteriorgt

ltinput type=submit value= + name=BotonSiguientegt

ltinput type=submit value= ++ name=BotonMasCincogt

ltinput type=submit value= gt| name=BotonUltimogt

ltcentergt

lttdgt

lttdgt

lttextarea name=AreaDeListado rows=10 cols=35gtlttextareagt

SvAccesoBDhtml

SvAccesoBD

ObBorrado ObListado ObConsulta

ObInsercion

ObModificacion

ObPosicionamiento

ObRegistro

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lttdgt

lttrgt

ltformgt

lttablegt

ltbodygt

lthtmlgt

SvAccesoBDhtml

import javaio

import javaxservlet

import javaxservlethttp

public class SvAccesoBD extends HttpServlet

private int PosicionBuscada = 1

private String AreaDeListado=

PrintWriter out

public void doGet(HttpServletRequest request HttpServletResponse response)

throws IOException ServletException

String DNI = requestgetParameter(DNI)

String Nombre = requestgetParameter(Nombre)

String Apellido = requestgetParameter(Apellido)

String Edad = requestgetParameter(Edad)

String BotonConsultar = requestgetParameter(BotonConsultar)

String BotonInsertar = requestgetParameter(BotonInsertar)

String BotonModificar = requestgetParameter(BotonModificar)

String BotonBorrar = requestgetParameter(BotonBorrar)

String BotonListar = requestgetParameter(BotonListar)

String BotonPrimero = requestgetParameter(BotonPrimero)

String BotonMenosCinco = requestgetParameter(BotonMenosCinco)

String BotonAnterior = requestgetParameter(BotonAnterior)

String BotonSiguiente = requestgetParameter(BotonSiguiente)

String BotonMasCinco = requestgetParameter(BotonMasCinco)

String BotonUltimo = requestgetParameter(BotonUltimo)

AreaDeListado = requestgetParameter(AreaDeListado)

responsesetContentType(texthtml)

out = responsegetWriter()

outprintln(lthtmlgt)

outprintln(ltbodygt)

if (BotonConsultar=null) ConsultarDatos(DNI)

if (BotonInsertar=null) InsertarDatos(DNINombreApellidoEdad)

if (BotonModificar=null) ModificarDatos(DNINombreApellidoEdad)

if (BotonBorrar=null) BorrarDatos(DNI)

if (BotonListar=null) ListarDatos(DNI)

if (BotonPrimero=null) Controles(1)

if (BotonMenosCinco=null) Controles(2)

if (BotonAnterior=null) Controles(3)

if (BotonSiguiente=null) Controles(4)

if (BotonMasCinco=null) Controles(5)

if (BotonUltimo=null) Controles(0)

outprintln(ltbodygt)

outprintln(lthtmlgt)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

private void ConsultarDatos(String DNI)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObRegistro InstanciaFila = InstanciaConsultaDameDatos()

GenerarRespuesta(InstanciaFilaDameDNI()InstanciaFilaDameNombre()

InstanciaFilaDameApellido()

StringvalueOf(InstanciaFilaDameEdad()))

else

GenerarRespuesta(DNI------------)

PosicionBuscada = 1

public void ListarDatos(String DNI)

ObListado InstanciaListado = new ObListado()

AreaDeListado = InstanciaListadoDameResultado()

ConsultarDatos(DNI)

PosicionBuscada = 1

public void BorrarDatos(String DNI)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObBorrado InstanciaBorrado = new ObBorrado(PosicionBuscada)

GenerarRespuesta()

else

GenerarRespuesta(----------------)

PosicionBuscada = 1

public void ModificarDatos(String DNI String Nombre String Apellido

String Edad)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObRegistro InstanciaFila = new ObRegistro(DNI Nombre Apellido

IntegerparseInt(Edad))

ObModificacion InstanciaModificacion = new ObModificacion(PosicionBuscada

InstanciaFila)

GenerarRespuesta(DNINombreApellidoEdad)

else

GenerarRespuesta(----------------)

PosicionBuscada = 1

public void InsertarDatos(String DNI String Nombre String Apellido

String Edad)

ObRegistro InstanciaFila = new ObRegistro(DNI Nombre Apellido

IntegerparseInt(Edad))

ObInserccion InstanciaInserccion = new ObInserccion(InstanciaFila)

GenerarRespuesta()

PosicionBuscada=1

public void Controles(String Identificador)

ObPosicionamiento InstanciaPosicionamiento =

new ObPosicionamiento(IdentificadorPosicionBuscada)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ObRegistro InstanciaFila = InstanciaPosicionamientoDameDatos()

GenerarRespuesta(InstanciaFilaDameDNI()InstanciaFilaDameNombre()

InstanciaFilaDameApellido()

StringvalueOf(InstanciaFilaDameEdad()))

PosicionBuscada = InstanciaPosicionamientoPosicion()

private void GenerarRespuesta(String DNI String Nombre String Apellido

String Edad)

outprintln(lttable border=1gt)

outprintln(lttrgt)

outprintln(lttdgt)

outprintln(ltform

action=httplocalhost8080directorioTelservletSvAccesoBD

method=getgt)

outprintln( DNI ltinput type=text name=DNI value=+DNI+gtltbrgt)

outprintln( Nombre ltinput type=text name=Nombre

value=+Nombre+gtltbrgt)

outprintln( Apellido ltinput type=text name=Apellido

value=+Apellido+gtltbrgt)

outprintln( Edad ltinput type=text name=Edad

value=+Edad+gtltbrgtltbrgt)

outprintln( ltinput type=submit value=Consultar

name=BotonConsultargt)

outprintln( ltinput type=submit value=Insertar

name=BotonInsertargt)

outprintln( ltinput type=submit value=Modificar

name=BotonModificargt)

outprintln( ltinput type=submit value=Borrar name=BotonBorrargt)

outprintln( ltinput type=submit value=Listar name=BotonListargt

ltbrgt)

outprintln( ltcentergt)

outprintln( ltinput type=submit value= |lt name=BotonPrimerogt)

outprintln( ltinput type=submit value= --

name=BotonMenosCincogt)

outprintln( ltinput type=submit value= - name=BotonAnteriorgt)

outprintln( ltinput type=submit value= +

name=BotonSiguientegt)

outprintln( ltinput type=submit value= ++

name=BotonMasCincogt)

outprintln( ltinput type=submit value= gt| name=BotonUltimogt)

outprintln( ltcentergt)

outprintln( lttdgt)

outprintln( lttdgt)

outprintln( lttextarea name=AreaDeListado rows=10

cols=35gt+AreaDeListado+lttextareagt)

outprintln( lttdgt)

outprintln( lttrgt)

outprintln( ltformgt)

outprintln( lttablegt)

SvAccesoBDjava

import javasql

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

public class ObBorrado

ObBorrado(int PosicionBuscada)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

Personasabsolute(PosicionBuscada)

PersonasdeleteRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

ObBorradojava

import javasql

import javaawtTextArea

public class ObListado

private String Resultado=

ObListado()

String DNI Nombre Apellido Linea

int Edad Posicion

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement()

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

while (Personasnext())

DNI = PersonasgetString(DNI)

Nombre = PersonasgetString(Nombre)

Apellido = PersonasgetString(Apellido)

Edad = PersonasgetInt(Edad)

Posicion = PersonasgetRow()

Linea = DNI+ +Nombre+ +Apellido+ +StringvalueOf(Edad)

Resultado=Resultado+StringvalueOf(Posicion)+ +Linea+n

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public String DameResultado()

return Resultado

ObListadojava

public class ObRegistro

private String DNI Nombre Apellido

private int Edad

ObRegistro (String DNI String Nombre String Apellido int Edad)

thisDNI = DNI

thisNombre = Nombre

thisApellido = Apellido

thisEdad = Edad

String DameDNI()

return DNI

String DameNombre()

return Nombre

String DameApellido()

return Apellido

int DameEdad()

return Edad

ObRegistrojava

import javasql

public class ObConsulta

private int Posicion = 0

private ObRegistro DatosPersona

ObConsulta(String DNIPedido)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement()

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

while (Personasnext())

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

String DNI = PersonasgetString(DNI)

if (DNIequalsIgnoreCase(DNIPedido))

Posicion = PersonasgetRow()

String Nombre = PersonasgetString(Nombre)

String Apellido = PersonasgetString(Apellido)

int Edad = PersonasgetInt(Edad)

DatosPersona = new ObRegistro(DNINombreApellidoEdad)

break

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public int PosicionEncontrada()

return Posicion

public ObRegistro DameDatos()

return DatosPersona

ObConsultajava

import javasql

public class ObInserccion

ObInserccion(ObRegistro Datos)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

PersonasmoveToInsertRow()

PersonasupdateString(DNI DatosDameDNI())

PersonasupdateString(NombreDatosDameNombre())

PersonasupdateString(Apellido DatosDameApellido())

PersonasupdateInt(EdadDatosDameEdad())

PersonasinsertRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

catch (SQLException e)

Systemoutprintln(e)

ObInsercionjava

import javasql

public class ObModificacion

ObModificacion(int PosicionBuscada ObRegistro Datos)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

Personasabsolute(PosicionBuscada)

PersonasupdateString(DNIDatosDameDNI())

PersonasupdateString(NombreDatosDameNombre())

PersonasupdateString(ApellidoDatosDameApellido())

PersonasupdateInt(EdadDatosDameEdad())

PersonasupdateRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

ObModificacionjava

import javasql

public class ObPosicionamiento

private ObRegistro DatosPersona

private int Posicion

ObPosicionamiento(String Accion int Posicion)

int IDAccionEdad

String DNINombreApellido

boolean PosicionCorrecta=false

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

FROM DatosPersonales)

Personasabsolute(Posicion)

IDAccion = IntegerparseInt(Accion)

switch (IDAccion)

case 0

PosicionCorrecta = Personaslast()

break

case 1

PosicionCorrecta = Personasfirst()

break

case 2

PosicionCorrecta = Personasrelative(-5)

break

case 3

PosicionCorrecta = Personasprevious()

break

case 4

PosicionCorrecta = Personasnext()

break

case 5

PosicionCorrecta = Personasrelative(+5)

break

if (PosicionCorrecta)

thisPosicion = PersonasgetRow()

DNI = PersonasgetString(DNI)

Nombre = PersonasgetString(Nombre)

Apellido = PersonasgetString(Apellido)

Edad = PersonasgetInt(Edad)

else

thisPosicion = Posicion

DNI = ----

Nombre = ----

Apellido = ----

Edad = 0

DatosPersona = new ObRegistro(DNINombreApellidoEdad)

Personasclose()

Conexionclose()

SentenciaSQLclose()

Systemoutprintln(StringvalueOf(Posicion)++StringvalueOf(thisPosicion))

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public int Posicion()

return Posicion

public ObRegistro DameDatos() return DatosPersona

ObPosicionamientojava

En este ejemplo se emplean servlets y paacuteginas Web Los clientes habitualmente trabajan en

una computadora remota y los programas se ejecutan en un servidor El mecanismo de

comunicaciones que soporta el protocolo http nos permite consultar en el servidor los datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

que ha seleccionado o escrito el usuario de esta manera se puede observar una disociacioacuten

entre la interfaz graacutefica de usuario (que se ejecuta en los equipos de los clientes) y el

programa que recoge los datos y ejecuta las acciones pertinentes (que se ejecuta en el

servidor)

Como puede observarse el coacutedigo SvAccessoBD es un servlet que lleva a cabo las siguientes

operaciones

1 Recoge los valores provenientes del usuario

2 Determina la naturaleza de la accioacuten a realizar

3 Realiza su cometido con la base de datos

4 Genera la respuesta que recibiraacute el usuario

32 JSP

JSP significa Java Server Pages que traducido quiere decir Paacuteginas de Servidor Java y es

por tanto una tecnologiacutea orientada a crear paacuteginas Web con programacioacuten en JAVA es decir

permite mezclar HTML estaacutendar y estaacutetico con un contenido dinaacutemico etiquetas especiales

(oacuterdenes) y trozos de coacutedigo JAVA (scriptlets o secuencias de oacuterdenes) o contenido dinaacutemico

generado por servlets Eacuteste contenido dinaacutemico se encuentra encerrado en etiquetas

especiales muchas de las cuales inician con lt y finalizan con gt El motor de las paacuteginas

JSP esta basado en los servlets de JAVA

En la tecnologiacutea JSP se crean paacuteginas parecidas a las paacuteginas que se crean en ASP (Active

Server Page de Microsoft) o PHP (Personal Home Page) que son dos tecnologiacuteas de paacuteginas

ejecutadas en el servidor Sin embargo JSP no se cintildee a un sistema operativo o servidor Web

en particular ademaacutes de que proporciona acceso a la tecnologiacutea de Servlets y a JAVA en la

parte dinaacutemica

El proceso para generar paacuteginas JSP accesibles en Web es mucho maacutes simple que en los

servlets Dando por hecho que se tiene un servidor Web que permite usar JSP el coacutedigo se

almacenaraacute en archivos con extensioacuten jsp que incluyen dentro de la estructuras de etiquetas

HTML las sentencias JAVA a ejecutar y tan soacutelo se colocaraacuten en cualquier lugar en donde

se pusiera una paacutegina Web normal sin compilacioacuten sin paquetes y sin configuracioacuten aunque

el servidor tendraacute que ser configurado para acceder a los archivos de clases Servlets y de

JSPs

Aunque lo que se escriba con frecuencia luciraacute como un archivo HTML estaacutendar detraacutes de

ello la paacutegina JSP se convierte automaacuteticamente en un servlet normal donde el HTML

estaacutetico tan soacutelo es enviado al flujo de salida asociado con el meacutetodo service del servlet Esta

traduccioacuten se realiza la primera vez que se solicita la paacutegina De acuerdo como este

configurado el servidor es posible ver el coacutedigo fuente de los servlets generados a partir de

sus paacuteginas JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Por ejemplo supongamos que se ha escrito el siguiente coacutedigo en el archivo Saludojsp

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtEjemplo JSPlttitlegtltheadgt

ltbody bgcolor=ffffccgt

ltcentergt

lth2gtHola mundolth2gt

ltjavautilDate hoy = new javautilDate()gt

La fecha de hoy es lt=hoygt

ltcentergt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional y un fragmento de un scriptlet de JAVA La etiqueta

lt identifica el comienzo del scriptlet y gt el final Una expresioacuten de la forma =variable

es sustituida por el valor de esa variable Para ejecutar esta paacutegina o cualquier otra paacutegina

JSP desde un navegador hay que instalarla en el servidor de aplicaciones de la misma manera

en como se hizo con los servlets Suponiendo entonces que se tiene instalado el Tomcat 5

siga los siguientes pasos

1 Antildeadir en el servidor la carpeta digamos JSP2 dentro de la carpeta webapps del Tomcat

y construir sobre ella la jerarquiacutea de clases ya conocida de los servlets

webappsrarrJSP2rarrWEB-INFrarrclasses

WEB-INFrarrlib

WEB-INFrarrtags

2 Editar en la carpeta WEB-INF el descriptor de despliegue webxml que se indica a

continuacioacuten Este archivo XML indica doacutende se localiza el esquema XML para la

especificacioacuten Servlet 24 que a suvez utiliza el esquema XML para la especificacioacuten

Java Server Page 20 que son las especificaciones que soporta en servidor Tomcat

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=

httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

3 Crear en JSP2 la carpeta saludo que contendraacute la aplicacioacuten y copiar en ella la paacutegina

Saludojsp

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

4 Arrancar el servidor Si el servidor ya estaba arrancado detenerlo y volverlo a arrancar o

bien abrir el explorador escribir el URL httplocalhost8080managerhtml e instalar

la aplicacioacuten

5 Una vez arrancado el servidor verificar si estaacute funcionando correctamente escribiendo

el URL siguiente en el explorador httplocalhost8080 El explorador debe mostrar la

paacutegina del Tomcat

6 Ejecutar la paacutegina JSP iniciando el explorador y escribiendo el URL siguiente

httplocalhost8080JSP2saludoSaludojsp donde la sintaxis geneacuterica es

httpservidor[puerto]MiCarpetapaginajsp

Cuando esta paacutegina (Saludojsp) es invocada por primera vez el motor JSP lleva a cabo una

fase de traduccioacuten de la misma en un servlet y el motor Servlet es el que ejecutaraacute eacuteste uacuteltimo

para generar el HTML dinaacutemico que seraacute enviado al explorador cliente seguacuten puede

deducirse de la figura siguiente La proacutexima vez que la paacutegina sea solicitada el motor JSP

ejecutaraacute el servlet que fue caragado la primera vez a no ser que la paacutegina haya cambiado

en cuyo caso seraacute compilada automaacuteticamente en un nuevo servlet y ejecutada

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Regresando al ejemplo el archivo java generado por el Tomcat a partir del archivo

Saludojsp se localiza en la carpeta workCatalinalocalhost de la instalacioacuten de Tomcat

321 ELEMENTOS PARA SECUENCIAS DE COMANDOS

Los elementos para secuencias de comandos permiten insertar coacutedigo en el servlet que seraacute

generado a partir de la paacutegina JSP Existen tres formas

1 Expresiones del tipo lt= expresioacuten gt que se evaluacutean e insertan en el resultado del

servlet

2 Los scriptlets del tipo lt codigo gt que se insertan en el meacutetodo _jspService del

servlet (ejecutado por service)

3 Las declaraciones del tipo lt Codigo gt que se insertan en el cuerpo de la clase del

servlet fuera de cualquier meacutetodo existente

NOTA Los comentarios en JSP se escriben lt-- Comentario JSP --gt en tanto que los

comentarios en HTML son de la forma lt--Comentario HTML --gt La diferencia

semaacutentica radica en que los comentarios HTML cuando se insertan en la respuesta enviada

por el servidor al cliente no se muestran cuando se visualiza el documento HTML pero si

Servidor Maacutequina Cliente

Explorador Web

Contenedor Web

Motor Servlet

Motor JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

los podemos ver cuando se visualiza el coacutedigo fuente en tanto que los comentarios JSP

aunque se inserten en la respuesta enviada por el servidor al cliente no son enviados al

explorador de forma que tampoco se muestran ni se ven cuando se visualiza el coacutedigo fuente

HTML desde el explorador

3211 EXPRESIONES

Se utiliza una expresioacuten JSP para insertar valores directamente en el resultado La sintaxis es

lt= expresioacuten gt Por ejemplo

lt= requestgetParameter(ldquoparNombre) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt lt= s gt

La fecha y hora actual es lt= new javautilDate() gt

La expresioacuten se evaluacutea se convierte a cadena y se inserta en la paacutegina Esta evaluacioacuten se

realiza durante la ejecucioacuten

32111 VARIABLES PREDEFINIDAS

Para simplificar estas expresiones se pueden utilizar cierta cantidad de variables

predefinidas Estos objetos impliacutecitos como tambieacuten se les llama estaacuten disponibles para su

uso durante la implementacioacuten de una paacutegina Web

bull pageContext Es un objeto de la clase PageContext que proporciona acceso a objetos

relacionados con los servlets

bull request Es un objeto de la clase HttpServletRequest que se puede obtener a traveacutes del

meacutetodo getRequest que encapsula los datos enviados por el cliente al servidor

bull response Es un objeto de la clase HttpServletResponse que puede obtenerse a traveacutes

del meacutetodo getResponse que encapsula los datos que el servidor enviaraacute al cliente

bull application Es un objeto de la clase ServletContext que se obtiene a traveacutes del meacutetodo

getServletContext que define un conjunto de meacutetodos que todo servlet utiliza para

comunicar con el contenedor de servlets

bull config Es un objeto de la clase ServletConfig que se obtiene a traveacutes del meacutetodo

getServletConfig y que se utiliza por el contenedor de servlets para pasar informacioacuten

al servlet durante la iniciacioacuten

bull session Es un objeto de la clase HttpSession que se obtiene a traveacutes del meacutetodo

getSession que proporciona una forma de identificar a un usuario que visita las paacuteginas

de un sitio Web

bull out Es un objeto de la clase JspWriter que se obtiene a traveacutes del meacutetodo getOut que

se utiliza para almacenar la respuesta que seraacute enviada al cliente que hizo la peticioacuten de

la paacutegina

bull page Es un objeto geneacuterico de la clase Object que se obtiene a traveacutes del meacutetodo

getPage y que representa al servlet obtenido a partir de la paacutegina JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

bull exception Es un objeto de la clase Exception que se obtiene a traveacutes del meacutetodo

getException que contendraacute informacioacuten a cerca de cualquier excepcioacuten que se lance

desde la paacutegina JSP

Un ejemplo del uso de uno de estos objetos impliacutecitos seriacutea el siguiente

El nombre de tu host es lt= requestgetRemoteHost() gt

El listado siguiente da un ejemplo de una paacutegina JSP que utiliza algunas variables

predefinidas como uso de expresiones JSP

ltDOCTYPE HTML PUBLIC -W3CDTD HTML 40 Transitional ENgt

lthtmlgt

ltheadgt

lttitlegt Expresiones JSP lttitlegt

ltheadgt

ltbodygt

lth2gt Expresiones JSP lth2gt

ltULgt

ltligt Fecha y hora en curso lt= new javautilDate() gt ltligt

ltligt Nombre de su host lt= requestgetRemoteHost() gt ltligt

ltligt Identificador de su sesioacuten lt= sessiongetId() gt ltligt

ltligt El paraacutemetro ltcodegt paramPrueba ltcodegt del formulario

lt= requestgetParameter(paramPrueba) gt ltligt

ltULgt

ltbodygt

lthtmlgt

Cuya salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3212 LOS SCRIPTLETS JSP

Si se desea hacer algo maacutes complejo que una simple expresioacuten los scriptlets permiten insertar

coacutedigo JAVA en el meacutetodo _jspService del servlet (que es ejecutado por service) La sintaxis

utilizada por los scriptlets es lt coacutedigo java gt Los escriptlets tienen acceso a las

mismas variables definidas de forma automaacutetica como expresiones A manera de ejemplo si

se desea que el resultado aparezca en la paacutegina generada deberiacutea de utilizarse la variable out

como en la siguiente instruccioacuten

lt String datosConsultados= requestgetQueryString()

outprintln(ldquoDatos GET adjuntos ldquo+datosConsultados)

gt

En este ejemplo podriacutea haberse obtenido el mismo resultado utilizando la siguiente expresioacuten

JSP

Datos GET adjuntos lt=requestgetQueryString() gt

En general los scriptlets pueden ejecutar varias tareas que no podriacutean realizarse con las

expresiones Tales tareas incluyen

bull La determinacioacuten de encabezados de respuesta

bull Actualizacioacuten de Bases de Datos

bull Ejecucioacuten de bucles condiciones y otras estructuras complejas

lt for (int i=1 ilt=6 i++)

gt

lth lt=i gtgt Hola Mundo lthlt=i gtgt

lt gt

Como un ejemplo concreto se muestra la siguiente paacutegina JSP llamada Cuentajsp en donde

se observa coacutemo se hace un seguimiento del nuacutemero de veces que un cliente accede a esta

paacutegina a traveacutes de distintas sesiones Para ello supondremos que dicha cuenta es el valor del

atributo atrCuenta del objeto impliacutecito application ya citado La primera vez que el cliente

accede a la paacutegina el valor de atrCuenta seraacute null debido a que auacuten no ha sido fijado este

atributo en este caso se fijaraacute con el valor 1 En los siguientes accesos se leeraacute el valor del

atributo atrCuenta se incrementaraacute en una unidad y se volveraacute a fijar Finalmente se enviacutea

la respuesta al cliente para que se muestre al usuario el valor del contador

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en el objeto impliacutecito application con el nombre

atrCuenta

--gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt

Integer cuenta = (Integer)applicationgetAttribute(atrCuenta)

String s = vez

if (cuenta == null)

cuenta = new Integer(1)

else

cuenta = new Integer(cuentaintValue() + 1)

s = veces

applicationsetAttribute(atrCuenta cuenta)

gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

Has visitado esta paacutegina lt= cuenta gt lt= s gt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional un fragmento de coacutedigo JAVA o scriptlet

expresiones y comentarioshellip

Aquiacute otro ejemplo de la ejecucioacuten de un coacutedigo demasiado complejo para una expresioacuten JSP

Este listado presenta una paacutegina JSP que utiliza el paraacutemetro de peticioacuten colorFondo para

establecer el color de fondo de la paacutegina

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgt

lttitlegt Prueba de Color lttitlegt

ltheadgt

lt

String colorFondo=requestgetParameter(colorFondo)

boolean tieneColorExplicito

if (colorFondo =null)

tieneColorExplicito=true

else

tieneColorExplicito=false

colorFondo=WHITE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt

ltbody bgcolor=lt= colorFondo gtgt

lth2 align=centergt Prueba de color lth2gt

lt

if (tieneColorExplicito)

outprintln(Ha indicado un color de fondo expliacutecito +

colorFondo +)

else

outprintln(Usareacute el color de fondo predeterminado WHITE +

Indique el atributo de peticioacuten

ltigtcolorFondoltigt+

para intentar un color estaacutendar un +

valor RRGGBB o para ver si el navegador Web +

permite el uso de nombres de color X11)

gt

ltbodygt

lthtmlgt

Cuyas posibles salidas son

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3213 DECLARACIONES JSP

Una declaracioacuten JSP permite definir meacutetodos o campos que seraacuten insertados en el cuerpo

principal de la clase del servlet (fuera del meacutetodo _jspService) Una declaracioacuten tiene la

sintaxis lt Coacutedigo Java gt Por ejemplo

lt int i=0 gt

lt

Public void jspinit()

coacutedigo de iniciacioacuten

gt

Una declaracioacuten no genera ninguacuten resultado y se usan junto con las expresiones JSP o los

scriptlets A continuacioacuten se muestra una paacutegina JSP que despliega la cantidad de veces que

se ha solicitado esta paacutegina desde que se arrancoacute el servidor haciendo uso de las

declaraciones JSP

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtDeclaraciones JSPlttitlegtltheadgt

ltbodygt

lth1gtDeclaraciones JSPlth1gt

lt-- Esto es un comentario en JSP --gt

lt private int recuentoAccesos=0 gt

lth2gt Accesos a la paacutegina desde el reinicio del servidor

lt= ++recuentoAccesos gt lth2gt

ltbodygt

lthtmlgt

La salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

322 EL LENGUAJE DE EXPRESION EN JSP 20

Anteriormente se ha visto la necesidad de utilizar fragmentos de coacutedigo java en el desarrollo

de paacuteginas JSP pero con la aparicioacuten de la especificacioacuten JSP 20 ya no hay necesidad de

utilizar fragmentos de coacutedigo Java para nada gracias al nuevo lenguaje de expresioacuten EL

(Expresioacuten Language) a la biblioteca de etiquetas estandar JSTL (JSP Standar Tag Library)

y a las nuevas formas para desarrollar etiquetas personalizadas

El lenguaje de expresioacuten JSP es maacutes un lenguaje de acceso a datos que un lenguaje de

programacioacuten Ya se ha visto que para pasar informacioacuten de un cliente a una paacutegina JSP se

utilizan paraacutemetros en la peticioacuten y atributos en la paacutegina El lenguaje de expresioacuten lo hace

posible sin tener que utilizar scriptlets o expresiones (lt= expresioacuten gt) Por ejemplo las

liacuteneas JSP 12 siguientes escritas utilizando coacutedigo Java

lt= requestgetParameter(ldquoparNombrerdquo) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt veces

bajo la especificacioacuten JSP 20 se pueden escribir de una forma maacutes sencilla como sigue

(ahora no se trata de coacutedigo JAVA)

$paramparNombre has visitado esta paacutegina

$atrCuenta veces

La sintaxis de JSP es sensible a mayuacutesculas y minuacutesculas pero un par de comillas simples es

equivalente a un par de comillas dobles

3221 VARIABLES PREDEFINIDAS (Objetos Impliacutecitos)

El lenguaje de expresioacuten JSP 20 soporta los objetos impliacutecitos siguientes

pageContext Objeto de javaxservletjspPageContext que proporciona acceso a los

datos de una peticioacuten

param Coleccioacuten (objeto de tipo javautilMap) de todos los valores de los paraacutemetros

enviados en una peticioacuten un String por paraacutemetro

paramValues Coleccioacuten de todos los valores de los paraacutemetros enviados en una

peticioacuten una matriz de tipo String por paraacutemetro

header Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten un

String por cabecera

headerValues Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten

una matriz de tipo String por cabecera

cookie Coleccioacuten de todos los valores de las cookies un objeto javaxservlethttpCookie

por cookie

initParam Coleccioacuten de todos los valores de los paraacutemetros de iniciacioacuten de la

aplicacioacuten un String por paraacutemetro

Tambieacuten hay objetos que permiten acceder a variables definidas en diferentes aacutembitos lo que

posibilita compartir informacioacuten

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

pageScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de paacutegina

requestScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

peticioacuten

sessionScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de sesioacuten

applicationScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

aplicacioacuten

3222 DIRECTRICES

Las directrices page incluye y taglib son mensajes para el motor JSP y son siempre incluidas

entre los siacutembolos lt y gt

32221 LA DIRECTRIZ PAGE

Define atributos que se aplican a toda la paacutegina JSP donde es incluida

lt page lista_de_atributos gt

Donde la lista_de_atributos puede contener algunos de los siguientes (aquellos que estaacuten

escritos en negrita son los tomados por omisioacuten)

language= ldquoscriptingLanguagerdquo

extends= rdquoclassNamerdquo

import= ldquoimportListrdquo

session= ldquotrue|falserdquo

buffer= ldquonone|sizeKb

autoflush= ldquotrue|falserdquo

isThreadSafe= rdquotrue|falserdquo

info= rdquoinfo_textrdquo

errorPage= ldquoerror_urlrdquo

isErrorPage= rdquotrue|falserdquo

contentType= rdquoctinfordquo

pageEncoding= rdquopeinfordquo

isELIgnored= ldquotrue|falserdquo

Tiacutepicamente se localiza al principio de la paacutegina JSP y puede haber cualquier nuacutemero de

ellas El lenguaje por omisioacuten es Java Ejemplos

lt page contentType=rdquotexthtmlrdquo language=rdquojavardquo gt

lt page import=rdquojavautil javalangrdquo gt

lt page buffer=rdquo5kbrdquo autoflush=rdquofalserdquo gt

32222 LA DIRECTRIZ INCLUDE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

La directriz include incluye un archivo (html jsp xml o de texto) en una paacutegina JSP Esto

permite dividir el contenido de la paacutegina en trozos maacutes manejables

lt incluye file=rdquoURL_relativordquo gt

El ejemplo siguiente muestra dos archivos el primero incluye al segundo para mostrar la

fecha y hora actuales

lt-- fichero mostrarFechaHorajsp --gt

lthtmlgt

ltheadgtlttitlegtIncluir un ficherolttitlegtltheadgt

ltbody bgcolor=whitegt

ltfont color=bluegt

La fecha y hora actuales son

lt include file=fechaHorajsp gt

ltfontgt

ltbodygt

lthtmlgt

lt-- fichero fechaHorajsp --gt

lt page import=javautil gt

lt= (new javautilDate())toLocaleString() gt

32223 LA DIRECTRIZ TAGLIB

La directriz taglib indica la biblioteca de acciones personalizadas que podremos utilizar en

la codificacioacuten de la paacutegina JSP Para distinguir esas acciones entre otras existentes se utiliza

un prefijo (prefix) Su sintaxis es

lt taglib (uri=rdquoURI_bibliotecardquo|tagdir=rdquoDir_biblioteca_tagrdquo)

prefix=rdquoprefijordquo gt

Cuando se trata de una biblioteca definida mediante una clase Java y un descriptor (archivo

tld) eacutesta se identifica mediante un URI (Uniform Resource Identifier- URL relativos) Por

ejemplo

lt taglib uri=rdquohttpMarioRossainzLopezmiBibliotecardquo

prefix=rdquofunrdquo gt

ltpgtltfunaccion01 gt

La uacuteltima liacutenea del ejemplo tiene dos etiquetas una etiqueta p HTML y otra accion01

perteneciente a la biblioteca miBiblioteca En cambio si la biblioteca se define mediante un

archivo tag entonces se identifica mediante su ruta relativa en el sistema de archivos

lt taglib tagdir=rdquoWEB-INFtagsrdquo prefix=rdquofunrdquo gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpgtltfunaccion01 gt

La directriz taglib debe colocarse antes de utilizar en la paacutegina JSP las acciones

personalizadas definidas por la misma Se puede utilizar maacutes de una directriz pero el prefijo

utilizado debe ser uacutenico para cada una de ellas

3223 ACTIVACION DEL LENGUAJE DE EXPRESION (LE)

La especificacioacuten JSP 20 define un lenguaje de expresioacuten como alternativa a elementos de

programacioacuten escritos con coacutedigo Java y especificaciones anteriores a la JSP 20 Para que

este lenguaje pueda ser interpretado tienen que cumplirse 2 requisitos

1 Que la propiedad isELIgnored de la directriz page valga false

lt page isELIgnored= ldquofalserdquo gt

2 Que el descriptor de despliegue webxml en la carpeta WEB-INF indique doacutende se

localiza el esquema XML para la especificacioacuten Servlet 24 que a su vez utiliza el

esquema XML para la especificacioacuten Java Server Page 20

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

Utilizando el lenguaje de expresioacuten se podriacutea modificar la paacutegina Cuentajsp de la seccioacuten

3212 de este documento como se muestra a continuacioacuten Esta nueva paacutegina

1 Especifica que utilizaraacute la biblioteca core de etiquetas estandar (de la que se hablaraacute maacutes

adelante)

2 La primera vez que sea accedida definiraacute la variable atrCuenta en el aacutembito de la

aplicacioacuten con un valor inicial nulo y la incrementaraacute en una unidad cuando sea accedida

sucesivas veces simplemente incrementaraacute esta variable en una unidad

3 Finalmente mostraraacute una paacutegina con un contenido anaacutelogo al siguiente Esta formado

por una cabecera y una segunda liacutenea compuesta por el valor del paraacutemetro parNombre

enviado con la peticioacuten un texto fijo el valor de la variable atrCuenta y otro texto fijo

dependiente del valor de esta variable

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

El coacutedigo completo es el siguiente

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

3224 VARIABLES Y EXPRESIONES

Para acceder a una simple variable se puede escribir algo como lo siguiente $nombre y

para acceder a una propiedad de un objeto podemos escribir algo como

$paramparNombre

$applicationScopeatrCuenta

$pageContextrequestrequestURI

La primera liacutenea del ejemplo anterior obtiene el valor de la propiedad parNombre del objeto

param la segunda el valor del atributo atrCuenta del objeto applicationScope y la tercera

el URL relativo de la paacutegina JSP solicitada

El lenguaje de expresioacuten es maacutes tolerante con respecto a las variables con valor null y ejecuta

muchas maacutes conversiones de forma automaacutetica sobre el tipo de los datos cuando la expresioacuten

a evaluar asiacute lo requiere Por ejemplo la etiqueta condicional siguiente incluye una expresioacuten

que compara el valor del atributo atrCuenta con aacutembito de aplicacioacuten con 10 (convirtiendo

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

impliacutecitamente el valor del atributo al tipo de la constante para poder realizar la comparacioacuten

El resultado seraacute un valor de tipo boolean

ltcif test=rdquo$applicationScopeatrCuenta gt 10rdquogt

ltcifgt

o bien

ltcif test=rdquo$atrCuenta gt 10rdquogt

ltcifgt

Para que una literal pueda incluir un caracter significativo para el lenguaje dicho caracter

debe ser especificado como una secuencia de escape (caracter) Por ejemplo la siguiente

expresioacuten da lugar al literal ldquovezrdquo o ldquovecesrdquo entre comillas dobles

$(atrCuenta gt 1) iquest ldquordquovecesrdquordquo ldquordquovezrdquordquo

Cualquier objeto o atributo de un objeto definido en algunos de los aacutembitos de una paacutegina

puede ser utilizado como una variable Por ejemplo $atrCuenta+1 es una expresioacuten que

realiza la suma de la variable atrCuenta con 1

Cuando se trate de una propiedad de un objeto para acceder a ella se utilizaraacute el operador

punto o bien la notacioacuten empleada para acceder a un elemento de una matriz Por ejemplo

$paramparNombre

$param[ldquoparNombrerdquo]

Una expresioacuten LE puede aparecer en cualquier lugar donde pueda aparecer un texto fijo Por

tanto para informar al contenedor JSP que se trata de una expresioacuten y no de un texto fijo se

utilizan los delimitadores $ al principio y al final

3225 OPERADORES

OPERADOR DESCRIPCIOacuteN Acceso a la propiedad de un objeto o a un elemento de un Map

[] Acceso al elemento de una matriz o de un objeto List

() Pareacutentesis para alterar la prioridad en la evaluacioacuten de una expresioacuten

If ternario condicion expresion1 expresioacuten 2

+ Suma

- Resta

Producto

oacute div Divisioacuten

oacute mod Moacutedulo o resto de una divisioacuten

== oacute eq Igualdad

= oacute ne Diferente

lt oacute lt Menor que

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt oacute gt Mayor que

lt= oacute le Menor o igual que

gt= oacute ge Mayor o igual que

ampamp oacute and Operacioacuten Loacutegica AND

|| oacute or Operacioacuten Loacutegica OR

oacute not Operacioacuten Loacutegica NOT

empty Verifica si el valor de una variable es null si un String esta vaciacuteo o si una matriz Map

o Collection no tienen elementos

func(args) Llamada a una funcioacuten donde func es el nombre de la funcioacuten y arg representa cero o

maacutes argumentos separados por comas

El ejemplo siguiente muestra una paacutegina JSP compuesta por elementos HTML expresiones

LE y objetos impliacutecitos

lthtmlgt

ltheadgtlttitlegtJSP 20lttitlegtltheadgt

ltbodygt

lth3gtLenguaje de expresioacuten (LE)lth3gt

ltpgtLa siguiente tabla ilustra algunas expresiones LE

ltbrgtltbrgtlttable border=1gt

lttrgt

ltthgtltbgtExpresioacutenltbgtltthgt

ltthgtltbgtValorltbgtltthgt

lttrgt

lttrgt

lttdgt$3 + 6lttdgt

lttdgt$3 + 6lttdgt

lttdgt

lttrgt

lttdgt$(7 gt 4) 7 4lttdgt

lttdgt$(7 gt 4) 7 4lttdgt

lttrgt

lttrgt

lttdgt$header[host]lttdgt

lttdgt$header[host]lttdgt

lttrgt

lttablegt

ltbodygt

lthtmlgt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

323 BIBLIOTECA ESTANDAR DE ETIQUETAS

La biblioteca estaacutendar de etiquetas JSP (JSTL ndash Java Server Page Estaacutendar Tag Library)

incluye una cantidad amplia de etiquetas para diferentes aacutereas de trabajo

Aacuterea baacutesica (su prefijo es c ndash core) y contiene

o Soporte de variables (remove y set)

o Control del flujo (choose when otherwise forEach forTokens if)

o Manejo de URL (import param redirect param y url param)

o Operaciones varias (match y out)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlcore

Aacuterea XML (su prefijo es x) y contiene

o Sentencias baacutesicas (out parse y set)

o Control del flujo (choosehellip whenhellip otherwise forEach e if)

o Transformacioacuten de Documentos (transformhellipparam)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlxml

Aacuterea Internacionalizacioacuten (su prefijo es fmt) Contiene

o Localidad (setLocale y requestEncoding)

o Mensajes (bundle message param y setBundle)

o Formateo de Fechas y nuacutemeros (formatNumber formateacuteate parseDate

parseNumber setTimeZone timeZone)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlfmt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Aacuterea SQL (su prefijo es sql) es el lenguaje estandar para interactuar con bases de datos

relacionales y contiene setDataSource Quero dateParam param transaction y

update dateParam param) El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlsql

Aacuterea Funciones (su prefijo es fn) y contiene

o Longitud de una coleccioacuten (length)

o Manipulacioacuten de String (toUpperCase toLowerCase substring

substringAfter substringBefore trim replace indexOf startsWith

endsWith contains containsIgnoreCase split join y escapeXml)

o El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlfunctions

3231 OPERACIONES CON ETIQUETAS BAacuteSICAS

En un ejemplo pasado teniacuteamos el siguiente coacutedigo

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

En este ejemplo se hace referencia al aacuterea baacutesica de JSTL con el prefijo c y se utiliza la

etiqueta cset para definir la variable atrCuenta Si la variable ya esta definida simplemente

se le asigna el valor especificado

La uacuteltima parte del ejemplo anterior podriacutea haberse escrito de esta otra forma

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcif test=rdquo$atrCuenta gt 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcifgt

$atrCuenta $str

La etiqueta cif permite la ejecucioacuten condicional de su cuerpo en funcioacuten del valor del

atributo de test

La etiqueta cchoose permite la ejecucioacuten del cuerpo de la primera etiqueta cwhen cuyo

atributo test sea evaluado a true Si ninguna de las condiciones se evaluacutea a true entonces se

evaluacutea el cuerpo de la etiqueta cotherwise si estaacute presente El siguiente coacutedigo muestra otra

manera de escribir el ejemplo anterior utilizando estas uacuteltimas etiquetas

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcchoosegt

ltcwhen test=rdquo$atrCuenta == 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcwhengt

ltcotherwisegt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcotherwisegt

ltcchoosegt

$atrCuenta $str

La etiqueta cforEach permite iterar sobre una coleccioacuten de objetos La coleccioacuten se

especifica por medio del atributo iacutetems y el elemento actual de la coleccioacuten estaacute disponible a

traveacutes de la variable establecida por el atributo var Por ejemplo el siguiente fragmento de

coacutedigo visualiza una tabla con las variables definidas a nivel de aacutembito de paacutegina

lttable border=rdquo1rdquogt

ltcforEach var=rdquoitemrdquo iacutetems=rdquo$pageScoperdquogt

lttrgt

lttdgt $item lttdgt

lttrgt

ltcforEachgt

lttablegt

La etiqueta ccatch atrapa una excepcioacuten que ocurra en el cuerpo de la misma Por ejemplo

el siguiente segmento de coacutedigo lanzaraacute una excepcioacuten si el paraacutemetro mes se escribe con

letras en vez de con nuacutemeros

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltbodygt

lthtmlgt

Un URL anaacutelogo al siguiente daraacute lugar a que la excepcioacuten sea lanzada cuando se ejecute la

expresioacuten $nMes 3 de la paacutegina anterior

httplocalhost8080JSP2exceppruebajspmes=marzo

La excepcioacuten indica que ha ocurrido un error al tratar de convertir ldquomarzordquo a un entero de

tipo Long Para cachar esta excepcioacuten y darle un tratamiento adecuado habraacute que modificar

la paacutegina JSP anterior como se indica a continuacioacuten

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltccatch var=rdquoerrorOcurridordquogt

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltccatchgt

ltcif test=rdquo$not empty errorOcurridordquogt

Error el paraacutemetro mes debe ser un nuacutemero ltbgt

ltbrgt Informacioacuten del error dada por el sistema

ltbrgt ltfont color=rdquoFF0000rdquogt $errorOcurrido ltfontgt

ltcifgt

ltbodygt

lthtmlgt

3232 ACCESO A BASES DE DATOS CON JSP

Las etiquetas que proporciona el aacuterea SQL permiten realizar

Conexioacuten con una base de datos

Realizacioacuten de consultas a la base de datos

Acceso al conjunto de resultados

Ejecucioacuten de actualizaciones y transacciones

Todas las etiquetas SQL actuacutean sobre una base de datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

32321 CONEXIOacuteN CON LA BASE DE DATOS

La conexioacuten con la base de datos puede realizarse con la etiqueta sqlsetDataSource Por

ejemplo si se esta utilizando el administrador de bases de datos MySql con el controlador

JDBC se puede realizar una conexioacuten con una base de datos digamos bd_tutorias de la

manera siguiente

ltsqlsetDataSource var=rdquobdrdquo

driver=rdquocommysqljdbcDriverrdquo

url=rdquojdbcmysqllocalhost3306bd_tutoriasrdquo

user=rdquoadminrdquo

password=rdquoadminadminrdquo gt

32322 CONSULTA A LA BASE DE DATOS

La etiqueta sqlQuero permite realizar una consulta a una base de datos Por ejemplo el

siguiente fragmento de coacutedigo realiza una consulta a la base de datos representada por bd y

obtiene un conjunto de resultados representado por cdr

ltsqlquery var=rdquocdrrdquo dataSource=rdquo$bdrdquogt

SELECT professor dia hora alumno

FROM profesores tutorias citas

WHERE profesoresid_profesor=tutoriasid_profesor

AND tutoriasid_tutoria=citasid_tutoria

ltsqlquerygt

32323 MODIFICACIONES SOBRE LA BASE DE DATOS

La etiqueta sqlupdate permite ejecutar una sentencia SQL INSERT UPDATE o DELETE

y cualquier otra sentencia SQL que no retorne ninguacuten valor Por ejemplo

ltsqlupdate var=rdquocontrdquo dataSource=rdquo$bdrdquo gt

UPDATE profesores

SET profesor=

WHERE profesor=

ltsqlparam value=rdquo$paramProfesorrdquo gt

ltsqlparam value=rdquo$paramIDrdquo gt

ltsqlupdategt

Una operacioacuten UPDATE puede utilizar el siacutembolo para indicar que el valor que tendriacutea que

evaluarse en esa posicioacuten seraacute suministrado por una etiqueta sqlparam como por ejemplo

httplocalhost8080JSP2sqlpruebajspProfesor=Mario+Rossainz+LopezampID=514

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Para ejecutar el servlet Saludo tendriacuteamos entonces que escribir

httplocalhost8080SaludoservletSaludo

Pero si queremos invocar a este servlet desde una paacutegina HTML se deberaacute utilizar este

mismo URL o bien el URL relativo a la carpeta del servidor donde copiemos el archivo html

que seraacute copiado en la carpeta Saludo

El coacutedigo HTML almacenado en saludohtml deberaacute incluir una de las dos liacuteneas siguientes

lta href=rdquohttplocalhost8080Saludoservletsaludordquogt ejecutar Saludo ltagt

lta href=rdquoservletSaludordquogt ejecutar Saludo ltagt

La segunda opcioacuten es la maacutes interesante porque no depende de la direccioacuten del servidor Para

ejecutar entonces el servlet a traveacutes de saludohtml basta con escribir el URL siguiente

httplocalhost8080Saludosaludohtml

316 EMPAQUETADO DE SERVLETS

Puede darse el caso en que diversos programadores en un entorno de produccioacuten dado

podriacutean estar desarrollando servlets para el mismo servidor El colocar todos estos servlets

en el directorio principal de estos programas podriacutea dar como resultado un directorio difiacutecil

de administrar ademaacutes de que se corre el riesgo de duplicar los nombres de los servlets si

dos desarrolladores distintos eligen el mismo nombre para el programa que desarrollan Los

paquetes son la solucioacuten loacutegica a este problema El uso de paquetes tiene como resultado

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

cambios en la forma en que se generan los servlets la forma en que se compilan y en la que

se invocan Para colocar los servlets en paquetes se requieren de dos pasos

1 Mover los archivos (class) a un subdirectorio que coincida con el nombre del paquete

pretendido

2 Insertar una instruccioacuten de paquete en el archivo de clase Para ello la primera liacutenea en

el coacutedigo fuente (java) del servlet deberaacute ser package nomPaquete

Por ejemplo el fragmento siguiente de coacutedigo Java presenta una variacioacuten del Servlet

HolaMundo que se encuentra en el paquete misServlets

package misServlets

import javaio

import javaxservlet

import javaxservlethttp

public class HolaMundo extends HttpServlet

Manipular las posibles peticiones enviadas por el cliente

utilizando el atributo method=get o method=post

protected void procesarPeticion(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

responsesetContentType(texthtml)

PrintWriter out = responsegetWriter()

outprintln(lthtmlgt)

El archivo class se encontraraacute dentro de una carpeta llamada misServlets que seraacute el paquete

creado o utilizado por la aplicacioacuten en este caso del HolaMundo dependiendo si exitiacutea o no

antes de compilar la aplicacioacuten A continuacioacuten deberemos copiar dentro de la carpeta

webappsROOTWEB-INFclasses del Tomcat la carpeta misServlets junto con el

HolaMundoclass que estaraacute dentro de ella y ejecutar el servlet en el explorador escribiendo

httplocalhost8080servletmisServletsHolaMundo

317 PROCESAMIENTO DE FORMULARIOS

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Hasta este punto los servlets que hemos estudiado soacutelo enviacutean informacioacuten al navegador del

cliente No obstante estos clientes Web pueden Mostar formularios que permitan solicitar

datos a los usuarios que seraacuten enviados al servidor para por ejemplo ser almacenados en

una base de datos para posteriores peticiones o para otros procesos o bien para dar al usuario

una respuesta ajustada a dicha peticioacuten

En el siguiente URL se invoca la ejecucioacuten de un servlet llamado Parametros aportando la

lista de pares (Nombre Mario)-(Edad 22) en formato GET

httplocalhost8080ParametrosservletParametrosNombre=MarioampEdad=22

Hay que observar la manera de colocar los datos tras el siacutembolo ldquordquo y de separarlos con el

siacutembolo ldquoamprdquo El coacutedigo del servlet es el siguiente

import javaio

import javaxservlet

import javaxservlethttp

public class Parametros extends HttpServlet

public void doGet(HttpServletRequest request HttpServletResponse

response)

throws IOException ServletException

responsesetContentType(texthtml)

PrintWriter out = responsegetWriter()

outprintln(lthtmlgt)

outprintln(ltbodygt)

String NombreRecibido = requestgetParameter(Nombre)

String EdadRecibida = requestgetParameter(Edad)

outprintln(lth1gt Hola + NombreRecibido + lth1gt)

outprintln(lth1gt Tienes + EdadRecibida + antildeos lth1gt)

outprintln(ltbodygt)

outprintln(lthtmlgt)

El objeto httpServletRequest en el coacutedigo anterior request contiene una serie de meacutetodos de

utilidad para recibir informacioacuten proveniente del usuario en concreto el meacutetodo

getParameter permite obtener el valor asociado a un nombre en la lista de pares (nombre

valor) que puede proporcionar un URL

Ademaacutes de poder introducir el URL anterior en el navegador proporcionando directamente

los datos enviados al servlet en dicha URL

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Tambieacuten podemos generar el URL mediante una paacutegina Web que podraacute utilizar el usuario

lthtmlgt

ltbodygt

lth1gt Cuestionario lth1gt

ltform action=httplocalhost8080ParametrosservletParametros

method=getgt

Nombre ltinput type=text name=Nombregt ltbrgt

Edad ltinput type=text name=Edadgt ltbrgtltbrgt

ltinput type=submit value=Enviar datosgt ltbrgt

ltformgt

ltbodygt

lthtmlgt

Los formularios en HTML permiten enviar datos al servidor Web En la liacutenea 5 de la paacutegina

Web mostrada se encuentra la etiqueta form que en el ejemplo contiene el atributo action

que indica la accioacuten que debe realizarse en el servidor en este caso ejecutar el servlet

Parametros y el atributo method que indica la manera en la que se enviacutean los datos (en este

caso la peticioacuten GET)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Peticioacuten HTTP GET Cuando el tipo de peticioacuten HTTP es GET los datos del formulario

son enviados al servidor a continuacioacuten del URL especificado por el atributo action de form

El tamantildeo de la cadena enviada estaacute limitado y al estar en ASCII es totalmente legible por

tanto no es un modo seguro

Es por ello que cuando se requiere del enviacuteo de datos seguros y ademaacutes el nuacutemero de datos

del formulario que son enviados al servidor son muchos resulta ser mejor el uso del meacutetodo

POST Veamos otro ejemplo

import javaio

import javaxservlet

import javaxservlethttp

import javautil

public class MostrarParametros extends HttpServlet

public void doGet(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

responsesetContentType(texthtml)

PrintWriter out= responsegetWriter()

String titulo=Lectura de todos los paraacutemetros de Peticioacuten

outprintln(ltdoctype html public -W3CDTD HTML 40 +

TransitionalENgt)

outprintln(lthtmlgt)

outprintln(ltheadgtlttitlegt+titulo+lttitlegtltheadgt)

outprintln(ltbody bgcolor=FDF5E6gtn+

lth1 align=centergt+titulo+lth1gtn+

lttable border=1 align=centergtn+

lttr bgcolor=FFAD00gtn+

ltthgtNombre del parampaacutemetroltthgtValor(es) del

parampaacutemetro)

Enumeration nombresParam=requestgetParameterNames()

while(nombresParamhasMoreElements())

String nombreParam= (String)nombresParamnextElement()

outprint(lttrgtlttdgt+nombreParam+nltTDgt)

String[]valoresParam=

requestgetParameterValues(nombreParam)

if (valoresParamlength==1)

String valorParam=valoresParam[0]

if (valorParamlength()==0)

outprintln(ltigt Sin valor ltigt)

else

outprintln(valorParam)

else

outprintln(ltulgt)

for (int i=0 iltvaloresParamlengthi++)

outprintln(ltligt+valoresParam[i])

outprintln(ltulgt)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

outprintln(lttablegtnltbodygtlthtmlgt)

public void doPost(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

doGet(requestresponse)

El servlet escrito utiliza un meacutetodo doPost que soacutelo ejecuta a Donet Esto es porque se quiere

que el servlet pueda manejar tanto las peticiones GET como las POST Por otro lado el

formulario es el siguiente

ltdoctype html public -W3CDTD HTML 40 TransitionalENgt

lthtmlgt

ltheadgt

lttitlegt Un Formulario de ejemplo que utiliza POST lttitlegt

ltheadgt

ltbody bgcolor=FDF5E6gt

lth1 align=centergt Un formulario de Ejemplo que utiliza POST

lth1gt

ltform action=httplocalhost8080MostrarParametros

servletMostrarParametros

method=postgt

Nuacutemero de elemento ltinput type=text name=elemNumgt ltbrgt

Cantidad ltinput type=text name=cantidadgt ltbrgt

Precio Unitario ltinput type=text name=precio value=$gt

ltbrgtlthrgt

Nombre de Pila ltinput type=text name=nombrePilagt ltbrgt

Apellido(s) ltinput type=text name=apellidogt ltbrgt

Iniciales ltinput type=text name=inicialesgt ltbrgt

Domicilio de envio lttextarea name=domicilio rows=3

cols=40gtlttextareagt ltbrgt

Tarjeta de creacutedito ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta value=VisagtVisa ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta value=Master Cardgt

Master Card ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta value=AmexgtAmerican

Expresss ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta

value=DiscovergtDiscover ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta

value=Java Smart CardgtTarjeta Inteligente de Java

ltbrgt

Nuacutemero de la tarjeta de creacutedito

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltinput type=password name=numTarjetagtltbrgt

Repita el nuacutemero de la tarjeta de creacutedito

ltinput type=password name=numTarjetagtltbrgtltbrgt

ltcentergt

ltinput type=submit value=Enviar pedidogt

ltcentergt

ltformgt

ltbodygt

lthtmlgt

El formulario HTML del listado anterior utiliza POST como deberiacutea ser en todos los campos

que tienen contrasentildea

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Si intenta ejecutar el servlet MostrarParametros directamente en el explorador con el URL

httplocalhost8080MostrarParametrosservletMostrarParametros se obtendraacute la paacutegina

Web sin resultados

Peticioacuten HTTP POST Cuando el tipo de peticioacuten HTTP es POST los datos son enviados

al servidor en el cuerpo de la peticioacuten Es el meacutetodo maacutes usual de enviar los datos de un

formulario Con este tipo de peticioacuten la informacioacuten del formulario se enviacutea despueacutes del URL

indicado por action en el cuerpo de la peticioacuten y el tamantildeo de la informacioacuten enviada no esta

limitado

Seguacuten lo expuesto escoger el meacutetodo para enviar la informacioacuten no es difiacutecil Si los datos

son pocos y no importa su confidencialidad o manipulacioacuten utilizamos GET Si son largos

privados o importantes utilizamos POST

318 ACCESO A BASES DE DATOS CON SERVLETS

Una aplicacioacuten Java que realiza accesos a bases de datos funciona seguacuten una arquitectura que

permite escribir los programas abstrayeacutendose de los detalles de los niveles inferiores (discos

controladores sistema operativo etc) como lo muestra la figura siguiente

JDBC (Java DataBase Connectivity ndash Conexioacuten con Bases de Datos desde Java) es una API

de Java que permite ejecutar instrucciones SQL para manipular y gestionar bases de datos

relacionales Para que una aplicacioacuten Java pueda hacer operaciones sobre una base de datos

previamente tiene que establecer una conexioacuten con la misma Esta conexioacuten se realiza a

traveacutes de un controlador (driver) seguacuten la figura de arriba La API-JDBC se proporciona en

dos paquetes javasql y javaxsql El primer paquete contiene las interfaces y clases Java

fundamentales de JDBC en tanto que el segundo paquete es una extensioacuten del primero e

APLICACION

SISTEMA OPERATIVO

CONTROLADOR

Oracle Access MySql

JVM

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

incluye las clases que interactuacutean con JNDI y otras que gestionan conjuntos de conexiones

con una misma base de datos Para maacutes detalles del uso de JDBC veacutease el apeacutendice A de

estas notas

El primer paso para crear una conexioacuten entre una aplicacioacuten Java y una base de datos es

registrar el controlador JDBC adecuado para esa base con el fin de que la JVM pueda

utilizarlo Existen distintos tipos de controladores JDBC por ejemplo

ldquocommysqljdbcDriverrdquo que es el controlador utilizado cuando el motor de base de datos

que se utiliza es MySql

En el supuesto caso de que la base de datos soacutelo permitiera el acceso a traveacutes de controladores

ODBC como lo hace ACCESS siempre podemos usar el controlador puente JDBC-ODBC

incluido como parte del JDK ldquosunjdbcodbcJdbcOdbcDriverrdquo Este tipo de controladores

es decir los basados en ODBC (Open DataBase Connectivity) son bastante utilizados en

entornos Windows pues este SO incluye ODBC El apeacutendice A describe al final como

administrar los oriacutegenes de datos ODBC en Windows

Asiacute pues la mayor ventaja de los servlets con respecto a la conexioacuten con bases de datos viacutea

JDBC es que su ciclo de vida les permite mantener conexiones abiertas con las mismas a lo

largo de toda una sesioacuten Esto permite recortar tiempo con respecto a otras tecnologiacuteas como

la CGI Ademaacutes JDBC es una tecnologiacutea independiente de las bases de datos

Como ejemplo vamos a implementar una simple aplicacioacuten Web basada en servlets que

muestre una especie de directorio de personas La aplicacioacuten podraacute consultar insertar

modificar borrar o listar la informacioacuten de cada una de las personas almacenadas en la base

de datos a la que se hace acceso (que estaraacute en formato access)

La estructura de la Base de Datos es una tabla con los siguientes campos

DNI Nombre Apellido Edad

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

53023767A Pedro Rubio 18

77459822P Luis Tejedor 47

123456MRL Mario Rossainz 35

La estructura de la aplicacioacuten se muestra en la figura siguiente

lthtmlgt

ltbodygt

lttable border=1gtlttrgtlttdgt

ltform action=httplocalhost8080directorioTelservletSvAccesoBD

method=getgt

DNI ltinput type=text name=DNIgt ltbrgt

Nombre ltinput type=text name=Nombregt ltbrgt

Apellido ltinput type=text name=Apellidogt ltbrgt

Edad ltinput type=text name=Edadgt ltbrgtltbrgt

ltinput type=submit value=Consultar name=BotonConsultargt

ltinput type=submit value=Insertar name=BotonInsertargt

ltinput type=submit value=Modificar name=BotonModificargt

ltinput type=submit value=Borrar name=BotonBorrargt

ltinput type=submit value=Listar name=BotonListargt ltbrgt

ltcentergt

ltinput type=submit value= |lt name=BotonPrimerogt

ltinput type=submit value= -- name=BotonMenosCincogt

ltinput type=submit value= - name=BotonAnteriorgt

ltinput type=submit value= + name=BotonSiguientegt

ltinput type=submit value= ++ name=BotonMasCincogt

ltinput type=submit value= gt| name=BotonUltimogt

ltcentergt

lttdgt

lttdgt

lttextarea name=AreaDeListado rows=10 cols=35gtlttextareagt

SvAccesoBDhtml

SvAccesoBD

ObBorrado ObListado ObConsulta

ObInsercion

ObModificacion

ObPosicionamiento

ObRegistro

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lttdgt

lttrgt

ltformgt

lttablegt

ltbodygt

lthtmlgt

SvAccesoBDhtml

import javaio

import javaxservlet

import javaxservlethttp

public class SvAccesoBD extends HttpServlet

private int PosicionBuscada = 1

private String AreaDeListado=

PrintWriter out

public void doGet(HttpServletRequest request HttpServletResponse response)

throws IOException ServletException

String DNI = requestgetParameter(DNI)

String Nombre = requestgetParameter(Nombre)

String Apellido = requestgetParameter(Apellido)

String Edad = requestgetParameter(Edad)

String BotonConsultar = requestgetParameter(BotonConsultar)

String BotonInsertar = requestgetParameter(BotonInsertar)

String BotonModificar = requestgetParameter(BotonModificar)

String BotonBorrar = requestgetParameter(BotonBorrar)

String BotonListar = requestgetParameter(BotonListar)

String BotonPrimero = requestgetParameter(BotonPrimero)

String BotonMenosCinco = requestgetParameter(BotonMenosCinco)

String BotonAnterior = requestgetParameter(BotonAnterior)

String BotonSiguiente = requestgetParameter(BotonSiguiente)

String BotonMasCinco = requestgetParameter(BotonMasCinco)

String BotonUltimo = requestgetParameter(BotonUltimo)

AreaDeListado = requestgetParameter(AreaDeListado)

responsesetContentType(texthtml)

out = responsegetWriter()

outprintln(lthtmlgt)

outprintln(ltbodygt)

if (BotonConsultar=null) ConsultarDatos(DNI)

if (BotonInsertar=null) InsertarDatos(DNINombreApellidoEdad)

if (BotonModificar=null) ModificarDatos(DNINombreApellidoEdad)

if (BotonBorrar=null) BorrarDatos(DNI)

if (BotonListar=null) ListarDatos(DNI)

if (BotonPrimero=null) Controles(1)

if (BotonMenosCinco=null) Controles(2)

if (BotonAnterior=null) Controles(3)

if (BotonSiguiente=null) Controles(4)

if (BotonMasCinco=null) Controles(5)

if (BotonUltimo=null) Controles(0)

outprintln(ltbodygt)

outprintln(lthtmlgt)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

private void ConsultarDatos(String DNI)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObRegistro InstanciaFila = InstanciaConsultaDameDatos()

GenerarRespuesta(InstanciaFilaDameDNI()InstanciaFilaDameNombre()

InstanciaFilaDameApellido()

StringvalueOf(InstanciaFilaDameEdad()))

else

GenerarRespuesta(DNI------------)

PosicionBuscada = 1

public void ListarDatos(String DNI)

ObListado InstanciaListado = new ObListado()

AreaDeListado = InstanciaListadoDameResultado()

ConsultarDatos(DNI)

PosicionBuscada = 1

public void BorrarDatos(String DNI)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObBorrado InstanciaBorrado = new ObBorrado(PosicionBuscada)

GenerarRespuesta()

else

GenerarRespuesta(----------------)

PosicionBuscada = 1

public void ModificarDatos(String DNI String Nombre String Apellido

String Edad)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObRegistro InstanciaFila = new ObRegistro(DNI Nombre Apellido

IntegerparseInt(Edad))

ObModificacion InstanciaModificacion = new ObModificacion(PosicionBuscada

InstanciaFila)

GenerarRespuesta(DNINombreApellidoEdad)

else

GenerarRespuesta(----------------)

PosicionBuscada = 1

public void InsertarDatos(String DNI String Nombre String Apellido

String Edad)

ObRegistro InstanciaFila = new ObRegistro(DNI Nombre Apellido

IntegerparseInt(Edad))

ObInserccion InstanciaInserccion = new ObInserccion(InstanciaFila)

GenerarRespuesta()

PosicionBuscada=1

public void Controles(String Identificador)

ObPosicionamiento InstanciaPosicionamiento =

new ObPosicionamiento(IdentificadorPosicionBuscada)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ObRegistro InstanciaFila = InstanciaPosicionamientoDameDatos()

GenerarRespuesta(InstanciaFilaDameDNI()InstanciaFilaDameNombre()

InstanciaFilaDameApellido()

StringvalueOf(InstanciaFilaDameEdad()))

PosicionBuscada = InstanciaPosicionamientoPosicion()

private void GenerarRespuesta(String DNI String Nombre String Apellido

String Edad)

outprintln(lttable border=1gt)

outprintln(lttrgt)

outprintln(lttdgt)

outprintln(ltform

action=httplocalhost8080directorioTelservletSvAccesoBD

method=getgt)

outprintln( DNI ltinput type=text name=DNI value=+DNI+gtltbrgt)

outprintln( Nombre ltinput type=text name=Nombre

value=+Nombre+gtltbrgt)

outprintln( Apellido ltinput type=text name=Apellido

value=+Apellido+gtltbrgt)

outprintln( Edad ltinput type=text name=Edad

value=+Edad+gtltbrgtltbrgt)

outprintln( ltinput type=submit value=Consultar

name=BotonConsultargt)

outprintln( ltinput type=submit value=Insertar

name=BotonInsertargt)

outprintln( ltinput type=submit value=Modificar

name=BotonModificargt)

outprintln( ltinput type=submit value=Borrar name=BotonBorrargt)

outprintln( ltinput type=submit value=Listar name=BotonListargt

ltbrgt)

outprintln( ltcentergt)

outprintln( ltinput type=submit value= |lt name=BotonPrimerogt)

outprintln( ltinput type=submit value= --

name=BotonMenosCincogt)

outprintln( ltinput type=submit value= - name=BotonAnteriorgt)

outprintln( ltinput type=submit value= +

name=BotonSiguientegt)

outprintln( ltinput type=submit value= ++

name=BotonMasCincogt)

outprintln( ltinput type=submit value= gt| name=BotonUltimogt)

outprintln( ltcentergt)

outprintln( lttdgt)

outprintln( lttdgt)

outprintln( lttextarea name=AreaDeListado rows=10

cols=35gt+AreaDeListado+lttextareagt)

outprintln( lttdgt)

outprintln( lttrgt)

outprintln( ltformgt)

outprintln( lttablegt)

SvAccesoBDjava

import javasql

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

public class ObBorrado

ObBorrado(int PosicionBuscada)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

Personasabsolute(PosicionBuscada)

PersonasdeleteRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

ObBorradojava

import javasql

import javaawtTextArea

public class ObListado

private String Resultado=

ObListado()

String DNI Nombre Apellido Linea

int Edad Posicion

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement()

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

while (Personasnext())

DNI = PersonasgetString(DNI)

Nombre = PersonasgetString(Nombre)

Apellido = PersonasgetString(Apellido)

Edad = PersonasgetInt(Edad)

Posicion = PersonasgetRow()

Linea = DNI+ +Nombre+ +Apellido+ +StringvalueOf(Edad)

Resultado=Resultado+StringvalueOf(Posicion)+ +Linea+n

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public String DameResultado()

return Resultado

ObListadojava

public class ObRegistro

private String DNI Nombre Apellido

private int Edad

ObRegistro (String DNI String Nombre String Apellido int Edad)

thisDNI = DNI

thisNombre = Nombre

thisApellido = Apellido

thisEdad = Edad

String DameDNI()

return DNI

String DameNombre()

return Nombre

String DameApellido()

return Apellido

int DameEdad()

return Edad

ObRegistrojava

import javasql

public class ObConsulta

private int Posicion = 0

private ObRegistro DatosPersona

ObConsulta(String DNIPedido)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement()

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

while (Personasnext())

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

String DNI = PersonasgetString(DNI)

if (DNIequalsIgnoreCase(DNIPedido))

Posicion = PersonasgetRow()

String Nombre = PersonasgetString(Nombre)

String Apellido = PersonasgetString(Apellido)

int Edad = PersonasgetInt(Edad)

DatosPersona = new ObRegistro(DNINombreApellidoEdad)

break

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public int PosicionEncontrada()

return Posicion

public ObRegistro DameDatos()

return DatosPersona

ObConsultajava

import javasql

public class ObInserccion

ObInserccion(ObRegistro Datos)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

PersonasmoveToInsertRow()

PersonasupdateString(DNI DatosDameDNI())

PersonasupdateString(NombreDatosDameNombre())

PersonasupdateString(Apellido DatosDameApellido())

PersonasupdateInt(EdadDatosDameEdad())

PersonasinsertRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

catch (SQLException e)

Systemoutprintln(e)

ObInsercionjava

import javasql

public class ObModificacion

ObModificacion(int PosicionBuscada ObRegistro Datos)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

Personasabsolute(PosicionBuscada)

PersonasupdateString(DNIDatosDameDNI())

PersonasupdateString(NombreDatosDameNombre())

PersonasupdateString(ApellidoDatosDameApellido())

PersonasupdateInt(EdadDatosDameEdad())

PersonasupdateRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

ObModificacionjava

import javasql

public class ObPosicionamiento

private ObRegistro DatosPersona

private int Posicion

ObPosicionamiento(String Accion int Posicion)

int IDAccionEdad

String DNINombreApellido

boolean PosicionCorrecta=false

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

FROM DatosPersonales)

Personasabsolute(Posicion)

IDAccion = IntegerparseInt(Accion)

switch (IDAccion)

case 0

PosicionCorrecta = Personaslast()

break

case 1

PosicionCorrecta = Personasfirst()

break

case 2

PosicionCorrecta = Personasrelative(-5)

break

case 3

PosicionCorrecta = Personasprevious()

break

case 4

PosicionCorrecta = Personasnext()

break

case 5

PosicionCorrecta = Personasrelative(+5)

break

if (PosicionCorrecta)

thisPosicion = PersonasgetRow()

DNI = PersonasgetString(DNI)

Nombre = PersonasgetString(Nombre)

Apellido = PersonasgetString(Apellido)

Edad = PersonasgetInt(Edad)

else

thisPosicion = Posicion

DNI = ----

Nombre = ----

Apellido = ----

Edad = 0

DatosPersona = new ObRegistro(DNINombreApellidoEdad)

Personasclose()

Conexionclose()

SentenciaSQLclose()

Systemoutprintln(StringvalueOf(Posicion)++StringvalueOf(thisPosicion))

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public int Posicion()

return Posicion

public ObRegistro DameDatos() return DatosPersona

ObPosicionamientojava

En este ejemplo se emplean servlets y paacuteginas Web Los clientes habitualmente trabajan en

una computadora remota y los programas se ejecutan en un servidor El mecanismo de

comunicaciones que soporta el protocolo http nos permite consultar en el servidor los datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

que ha seleccionado o escrito el usuario de esta manera se puede observar una disociacioacuten

entre la interfaz graacutefica de usuario (que se ejecuta en los equipos de los clientes) y el

programa que recoge los datos y ejecuta las acciones pertinentes (que se ejecuta en el

servidor)

Como puede observarse el coacutedigo SvAccessoBD es un servlet que lleva a cabo las siguientes

operaciones

1 Recoge los valores provenientes del usuario

2 Determina la naturaleza de la accioacuten a realizar

3 Realiza su cometido con la base de datos

4 Genera la respuesta que recibiraacute el usuario

32 JSP

JSP significa Java Server Pages que traducido quiere decir Paacuteginas de Servidor Java y es

por tanto una tecnologiacutea orientada a crear paacuteginas Web con programacioacuten en JAVA es decir

permite mezclar HTML estaacutendar y estaacutetico con un contenido dinaacutemico etiquetas especiales

(oacuterdenes) y trozos de coacutedigo JAVA (scriptlets o secuencias de oacuterdenes) o contenido dinaacutemico

generado por servlets Eacuteste contenido dinaacutemico se encuentra encerrado en etiquetas

especiales muchas de las cuales inician con lt y finalizan con gt El motor de las paacuteginas

JSP esta basado en los servlets de JAVA

En la tecnologiacutea JSP se crean paacuteginas parecidas a las paacuteginas que se crean en ASP (Active

Server Page de Microsoft) o PHP (Personal Home Page) que son dos tecnologiacuteas de paacuteginas

ejecutadas en el servidor Sin embargo JSP no se cintildee a un sistema operativo o servidor Web

en particular ademaacutes de que proporciona acceso a la tecnologiacutea de Servlets y a JAVA en la

parte dinaacutemica

El proceso para generar paacuteginas JSP accesibles en Web es mucho maacutes simple que en los

servlets Dando por hecho que se tiene un servidor Web que permite usar JSP el coacutedigo se

almacenaraacute en archivos con extensioacuten jsp que incluyen dentro de la estructuras de etiquetas

HTML las sentencias JAVA a ejecutar y tan soacutelo se colocaraacuten en cualquier lugar en donde

se pusiera una paacutegina Web normal sin compilacioacuten sin paquetes y sin configuracioacuten aunque

el servidor tendraacute que ser configurado para acceder a los archivos de clases Servlets y de

JSPs

Aunque lo que se escriba con frecuencia luciraacute como un archivo HTML estaacutendar detraacutes de

ello la paacutegina JSP se convierte automaacuteticamente en un servlet normal donde el HTML

estaacutetico tan soacutelo es enviado al flujo de salida asociado con el meacutetodo service del servlet Esta

traduccioacuten se realiza la primera vez que se solicita la paacutegina De acuerdo como este

configurado el servidor es posible ver el coacutedigo fuente de los servlets generados a partir de

sus paacuteginas JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Por ejemplo supongamos que se ha escrito el siguiente coacutedigo en el archivo Saludojsp

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtEjemplo JSPlttitlegtltheadgt

ltbody bgcolor=ffffccgt

ltcentergt

lth2gtHola mundolth2gt

ltjavautilDate hoy = new javautilDate()gt

La fecha de hoy es lt=hoygt

ltcentergt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional y un fragmento de un scriptlet de JAVA La etiqueta

lt identifica el comienzo del scriptlet y gt el final Una expresioacuten de la forma =variable

es sustituida por el valor de esa variable Para ejecutar esta paacutegina o cualquier otra paacutegina

JSP desde un navegador hay que instalarla en el servidor de aplicaciones de la misma manera

en como se hizo con los servlets Suponiendo entonces que se tiene instalado el Tomcat 5

siga los siguientes pasos

1 Antildeadir en el servidor la carpeta digamos JSP2 dentro de la carpeta webapps del Tomcat

y construir sobre ella la jerarquiacutea de clases ya conocida de los servlets

webappsrarrJSP2rarrWEB-INFrarrclasses

WEB-INFrarrlib

WEB-INFrarrtags

2 Editar en la carpeta WEB-INF el descriptor de despliegue webxml que se indica a

continuacioacuten Este archivo XML indica doacutende se localiza el esquema XML para la

especificacioacuten Servlet 24 que a suvez utiliza el esquema XML para la especificacioacuten

Java Server Page 20 que son las especificaciones que soporta en servidor Tomcat

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=

httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

3 Crear en JSP2 la carpeta saludo que contendraacute la aplicacioacuten y copiar en ella la paacutegina

Saludojsp

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

4 Arrancar el servidor Si el servidor ya estaba arrancado detenerlo y volverlo a arrancar o

bien abrir el explorador escribir el URL httplocalhost8080managerhtml e instalar

la aplicacioacuten

5 Una vez arrancado el servidor verificar si estaacute funcionando correctamente escribiendo

el URL siguiente en el explorador httplocalhost8080 El explorador debe mostrar la

paacutegina del Tomcat

6 Ejecutar la paacutegina JSP iniciando el explorador y escribiendo el URL siguiente

httplocalhost8080JSP2saludoSaludojsp donde la sintaxis geneacuterica es

httpservidor[puerto]MiCarpetapaginajsp

Cuando esta paacutegina (Saludojsp) es invocada por primera vez el motor JSP lleva a cabo una

fase de traduccioacuten de la misma en un servlet y el motor Servlet es el que ejecutaraacute eacuteste uacuteltimo

para generar el HTML dinaacutemico que seraacute enviado al explorador cliente seguacuten puede

deducirse de la figura siguiente La proacutexima vez que la paacutegina sea solicitada el motor JSP

ejecutaraacute el servlet que fue caragado la primera vez a no ser que la paacutegina haya cambiado

en cuyo caso seraacute compilada automaacuteticamente en un nuevo servlet y ejecutada

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Regresando al ejemplo el archivo java generado por el Tomcat a partir del archivo

Saludojsp se localiza en la carpeta workCatalinalocalhost de la instalacioacuten de Tomcat

321 ELEMENTOS PARA SECUENCIAS DE COMANDOS

Los elementos para secuencias de comandos permiten insertar coacutedigo en el servlet que seraacute

generado a partir de la paacutegina JSP Existen tres formas

1 Expresiones del tipo lt= expresioacuten gt que se evaluacutean e insertan en el resultado del

servlet

2 Los scriptlets del tipo lt codigo gt que se insertan en el meacutetodo _jspService del

servlet (ejecutado por service)

3 Las declaraciones del tipo lt Codigo gt que se insertan en el cuerpo de la clase del

servlet fuera de cualquier meacutetodo existente

NOTA Los comentarios en JSP se escriben lt-- Comentario JSP --gt en tanto que los

comentarios en HTML son de la forma lt--Comentario HTML --gt La diferencia

semaacutentica radica en que los comentarios HTML cuando se insertan en la respuesta enviada

por el servidor al cliente no se muestran cuando se visualiza el documento HTML pero si

Servidor Maacutequina Cliente

Explorador Web

Contenedor Web

Motor Servlet

Motor JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

los podemos ver cuando se visualiza el coacutedigo fuente en tanto que los comentarios JSP

aunque se inserten en la respuesta enviada por el servidor al cliente no son enviados al

explorador de forma que tampoco se muestran ni se ven cuando se visualiza el coacutedigo fuente

HTML desde el explorador

3211 EXPRESIONES

Se utiliza una expresioacuten JSP para insertar valores directamente en el resultado La sintaxis es

lt= expresioacuten gt Por ejemplo

lt= requestgetParameter(ldquoparNombre) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt lt= s gt

La fecha y hora actual es lt= new javautilDate() gt

La expresioacuten se evaluacutea se convierte a cadena y se inserta en la paacutegina Esta evaluacioacuten se

realiza durante la ejecucioacuten

32111 VARIABLES PREDEFINIDAS

Para simplificar estas expresiones se pueden utilizar cierta cantidad de variables

predefinidas Estos objetos impliacutecitos como tambieacuten se les llama estaacuten disponibles para su

uso durante la implementacioacuten de una paacutegina Web

bull pageContext Es un objeto de la clase PageContext que proporciona acceso a objetos

relacionados con los servlets

bull request Es un objeto de la clase HttpServletRequest que se puede obtener a traveacutes del

meacutetodo getRequest que encapsula los datos enviados por el cliente al servidor

bull response Es un objeto de la clase HttpServletResponse que puede obtenerse a traveacutes

del meacutetodo getResponse que encapsula los datos que el servidor enviaraacute al cliente

bull application Es un objeto de la clase ServletContext que se obtiene a traveacutes del meacutetodo

getServletContext que define un conjunto de meacutetodos que todo servlet utiliza para

comunicar con el contenedor de servlets

bull config Es un objeto de la clase ServletConfig que se obtiene a traveacutes del meacutetodo

getServletConfig y que se utiliza por el contenedor de servlets para pasar informacioacuten

al servlet durante la iniciacioacuten

bull session Es un objeto de la clase HttpSession que se obtiene a traveacutes del meacutetodo

getSession que proporciona una forma de identificar a un usuario que visita las paacuteginas

de un sitio Web

bull out Es un objeto de la clase JspWriter que se obtiene a traveacutes del meacutetodo getOut que

se utiliza para almacenar la respuesta que seraacute enviada al cliente que hizo la peticioacuten de

la paacutegina

bull page Es un objeto geneacuterico de la clase Object que se obtiene a traveacutes del meacutetodo

getPage y que representa al servlet obtenido a partir de la paacutegina JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

bull exception Es un objeto de la clase Exception que se obtiene a traveacutes del meacutetodo

getException que contendraacute informacioacuten a cerca de cualquier excepcioacuten que se lance

desde la paacutegina JSP

Un ejemplo del uso de uno de estos objetos impliacutecitos seriacutea el siguiente

El nombre de tu host es lt= requestgetRemoteHost() gt

El listado siguiente da un ejemplo de una paacutegina JSP que utiliza algunas variables

predefinidas como uso de expresiones JSP

ltDOCTYPE HTML PUBLIC -W3CDTD HTML 40 Transitional ENgt

lthtmlgt

ltheadgt

lttitlegt Expresiones JSP lttitlegt

ltheadgt

ltbodygt

lth2gt Expresiones JSP lth2gt

ltULgt

ltligt Fecha y hora en curso lt= new javautilDate() gt ltligt

ltligt Nombre de su host lt= requestgetRemoteHost() gt ltligt

ltligt Identificador de su sesioacuten lt= sessiongetId() gt ltligt

ltligt El paraacutemetro ltcodegt paramPrueba ltcodegt del formulario

lt= requestgetParameter(paramPrueba) gt ltligt

ltULgt

ltbodygt

lthtmlgt

Cuya salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3212 LOS SCRIPTLETS JSP

Si se desea hacer algo maacutes complejo que una simple expresioacuten los scriptlets permiten insertar

coacutedigo JAVA en el meacutetodo _jspService del servlet (que es ejecutado por service) La sintaxis

utilizada por los scriptlets es lt coacutedigo java gt Los escriptlets tienen acceso a las

mismas variables definidas de forma automaacutetica como expresiones A manera de ejemplo si

se desea que el resultado aparezca en la paacutegina generada deberiacutea de utilizarse la variable out

como en la siguiente instruccioacuten

lt String datosConsultados= requestgetQueryString()

outprintln(ldquoDatos GET adjuntos ldquo+datosConsultados)

gt

En este ejemplo podriacutea haberse obtenido el mismo resultado utilizando la siguiente expresioacuten

JSP

Datos GET adjuntos lt=requestgetQueryString() gt

En general los scriptlets pueden ejecutar varias tareas que no podriacutean realizarse con las

expresiones Tales tareas incluyen

bull La determinacioacuten de encabezados de respuesta

bull Actualizacioacuten de Bases de Datos

bull Ejecucioacuten de bucles condiciones y otras estructuras complejas

lt for (int i=1 ilt=6 i++)

gt

lth lt=i gtgt Hola Mundo lthlt=i gtgt

lt gt

Como un ejemplo concreto se muestra la siguiente paacutegina JSP llamada Cuentajsp en donde

se observa coacutemo se hace un seguimiento del nuacutemero de veces que un cliente accede a esta

paacutegina a traveacutes de distintas sesiones Para ello supondremos que dicha cuenta es el valor del

atributo atrCuenta del objeto impliacutecito application ya citado La primera vez que el cliente

accede a la paacutegina el valor de atrCuenta seraacute null debido a que auacuten no ha sido fijado este

atributo en este caso se fijaraacute con el valor 1 En los siguientes accesos se leeraacute el valor del

atributo atrCuenta se incrementaraacute en una unidad y se volveraacute a fijar Finalmente se enviacutea

la respuesta al cliente para que se muestre al usuario el valor del contador

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en el objeto impliacutecito application con el nombre

atrCuenta

--gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt

Integer cuenta = (Integer)applicationgetAttribute(atrCuenta)

String s = vez

if (cuenta == null)

cuenta = new Integer(1)

else

cuenta = new Integer(cuentaintValue() + 1)

s = veces

applicationsetAttribute(atrCuenta cuenta)

gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

Has visitado esta paacutegina lt= cuenta gt lt= s gt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional un fragmento de coacutedigo JAVA o scriptlet

expresiones y comentarioshellip

Aquiacute otro ejemplo de la ejecucioacuten de un coacutedigo demasiado complejo para una expresioacuten JSP

Este listado presenta una paacutegina JSP que utiliza el paraacutemetro de peticioacuten colorFondo para

establecer el color de fondo de la paacutegina

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgt

lttitlegt Prueba de Color lttitlegt

ltheadgt

lt

String colorFondo=requestgetParameter(colorFondo)

boolean tieneColorExplicito

if (colorFondo =null)

tieneColorExplicito=true

else

tieneColorExplicito=false

colorFondo=WHITE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt

ltbody bgcolor=lt= colorFondo gtgt

lth2 align=centergt Prueba de color lth2gt

lt

if (tieneColorExplicito)

outprintln(Ha indicado un color de fondo expliacutecito +

colorFondo +)

else

outprintln(Usareacute el color de fondo predeterminado WHITE +

Indique el atributo de peticioacuten

ltigtcolorFondoltigt+

para intentar un color estaacutendar un +

valor RRGGBB o para ver si el navegador Web +

permite el uso de nombres de color X11)

gt

ltbodygt

lthtmlgt

Cuyas posibles salidas son

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3213 DECLARACIONES JSP

Una declaracioacuten JSP permite definir meacutetodos o campos que seraacuten insertados en el cuerpo

principal de la clase del servlet (fuera del meacutetodo _jspService) Una declaracioacuten tiene la

sintaxis lt Coacutedigo Java gt Por ejemplo

lt int i=0 gt

lt

Public void jspinit()

coacutedigo de iniciacioacuten

gt

Una declaracioacuten no genera ninguacuten resultado y se usan junto con las expresiones JSP o los

scriptlets A continuacioacuten se muestra una paacutegina JSP que despliega la cantidad de veces que

se ha solicitado esta paacutegina desde que se arrancoacute el servidor haciendo uso de las

declaraciones JSP

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtDeclaraciones JSPlttitlegtltheadgt

ltbodygt

lth1gtDeclaraciones JSPlth1gt

lt-- Esto es un comentario en JSP --gt

lt private int recuentoAccesos=0 gt

lth2gt Accesos a la paacutegina desde el reinicio del servidor

lt= ++recuentoAccesos gt lth2gt

ltbodygt

lthtmlgt

La salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

322 EL LENGUAJE DE EXPRESION EN JSP 20

Anteriormente se ha visto la necesidad de utilizar fragmentos de coacutedigo java en el desarrollo

de paacuteginas JSP pero con la aparicioacuten de la especificacioacuten JSP 20 ya no hay necesidad de

utilizar fragmentos de coacutedigo Java para nada gracias al nuevo lenguaje de expresioacuten EL

(Expresioacuten Language) a la biblioteca de etiquetas estandar JSTL (JSP Standar Tag Library)

y a las nuevas formas para desarrollar etiquetas personalizadas

El lenguaje de expresioacuten JSP es maacutes un lenguaje de acceso a datos que un lenguaje de

programacioacuten Ya se ha visto que para pasar informacioacuten de un cliente a una paacutegina JSP se

utilizan paraacutemetros en la peticioacuten y atributos en la paacutegina El lenguaje de expresioacuten lo hace

posible sin tener que utilizar scriptlets o expresiones (lt= expresioacuten gt) Por ejemplo las

liacuteneas JSP 12 siguientes escritas utilizando coacutedigo Java

lt= requestgetParameter(ldquoparNombrerdquo) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt veces

bajo la especificacioacuten JSP 20 se pueden escribir de una forma maacutes sencilla como sigue

(ahora no se trata de coacutedigo JAVA)

$paramparNombre has visitado esta paacutegina

$atrCuenta veces

La sintaxis de JSP es sensible a mayuacutesculas y minuacutesculas pero un par de comillas simples es

equivalente a un par de comillas dobles

3221 VARIABLES PREDEFINIDAS (Objetos Impliacutecitos)

El lenguaje de expresioacuten JSP 20 soporta los objetos impliacutecitos siguientes

pageContext Objeto de javaxservletjspPageContext que proporciona acceso a los

datos de una peticioacuten

param Coleccioacuten (objeto de tipo javautilMap) de todos los valores de los paraacutemetros

enviados en una peticioacuten un String por paraacutemetro

paramValues Coleccioacuten de todos los valores de los paraacutemetros enviados en una

peticioacuten una matriz de tipo String por paraacutemetro

header Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten un

String por cabecera

headerValues Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten

una matriz de tipo String por cabecera

cookie Coleccioacuten de todos los valores de las cookies un objeto javaxservlethttpCookie

por cookie

initParam Coleccioacuten de todos los valores de los paraacutemetros de iniciacioacuten de la

aplicacioacuten un String por paraacutemetro

Tambieacuten hay objetos que permiten acceder a variables definidas en diferentes aacutembitos lo que

posibilita compartir informacioacuten

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

pageScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de paacutegina

requestScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

peticioacuten

sessionScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de sesioacuten

applicationScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

aplicacioacuten

3222 DIRECTRICES

Las directrices page incluye y taglib son mensajes para el motor JSP y son siempre incluidas

entre los siacutembolos lt y gt

32221 LA DIRECTRIZ PAGE

Define atributos que se aplican a toda la paacutegina JSP donde es incluida

lt page lista_de_atributos gt

Donde la lista_de_atributos puede contener algunos de los siguientes (aquellos que estaacuten

escritos en negrita son los tomados por omisioacuten)

language= ldquoscriptingLanguagerdquo

extends= rdquoclassNamerdquo

import= ldquoimportListrdquo

session= ldquotrue|falserdquo

buffer= ldquonone|sizeKb

autoflush= ldquotrue|falserdquo

isThreadSafe= rdquotrue|falserdquo

info= rdquoinfo_textrdquo

errorPage= ldquoerror_urlrdquo

isErrorPage= rdquotrue|falserdquo

contentType= rdquoctinfordquo

pageEncoding= rdquopeinfordquo

isELIgnored= ldquotrue|falserdquo

Tiacutepicamente se localiza al principio de la paacutegina JSP y puede haber cualquier nuacutemero de

ellas El lenguaje por omisioacuten es Java Ejemplos

lt page contentType=rdquotexthtmlrdquo language=rdquojavardquo gt

lt page import=rdquojavautil javalangrdquo gt

lt page buffer=rdquo5kbrdquo autoflush=rdquofalserdquo gt

32222 LA DIRECTRIZ INCLUDE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

La directriz include incluye un archivo (html jsp xml o de texto) en una paacutegina JSP Esto

permite dividir el contenido de la paacutegina en trozos maacutes manejables

lt incluye file=rdquoURL_relativordquo gt

El ejemplo siguiente muestra dos archivos el primero incluye al segundo para mostrar la

fecha y hora actuales

lt-- fichero mostrarFechaHorajsp --gt

lthtmlgt

ltheadgtlttitlegtIncluir un ficherolttitlegtltheadgt

ltbody bgcolor=whitegt

ltfont color=bluegt

La fecha y hora actuales son

lt include file=fechaHorajsp gt

ltfontgt

ltbodygt

lthtmlgt

lt-- fichero fechaHorajsp --gt

lt page import=javautil gt

lt= (new javautilDate())toLocaleString() gt

32223 LA DIRECTRIZ TAGLIB

La directriz taglib indica la biblioteca de acciones personalizadas que podremos utilizar en

la codificacioacuten de la paacutegina JSP Para distinguir esas acciones entre otras existentes se utiliza

un prefijo (prefix) Su sintaxis es

lt taglib (uri=rdquoURI_bibliotecardquo|tagdir=rdquoDir_biblioteca_tagrdquo)

prefix=rdquoprefijordquo gt

Cuando se trata de una biblioteca definida mediante una clase Java y un descriptor (archivo

tld) eacutesta se identifica mediante un URI (Uniform Resource Identifier- URL relativos) Por

ejemplo

lt taglib uri=rdquohttpMarioRossainzLopezmiBibliotecardquo

prefix=rdquofunrdquo gt

ltpgtltfunaccion01 gt

La uacuteltima liacutenea del ejemplo tiene dos etiquetas una etiqueta p HTML y otra accion01

perteneciente a la biblioteca miBiblioteca En cambio si la biblioteca se define mediante un

archivo tag entonces se identifica mediante su ruta relativa en el sistema de archivos

lt taglib tagdir=rdquoWEB-INFtagsrdquo prefix=rdquofunrdquo gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpgtltfunaccion01 gt

La directriz taglib debe colocarse antes de utilizar en la paacutegina JSP las acciones

personalizadas definidas por la misma Se puede utilizar maacutes de una directriz pero el prefijo

utilizado debe ser uacutenico para cada una de ellas

3223 ACTIVACION DEL LENGUAJE DE EXPRESION (LE)

La especificacioacuten JSP 20 define un lenguaje de expresioacuten como alternativa a elementos de

programacioacuten escritos con coacutedigo Java y especificaciones anteriores a la JSP 20 Para que

este lenguaje pueda ser interpretado tienen que cumplirse 2 requisitos

1 Que la propiedad isELIgnored de la directriz page valga false

lt page isELIgnored= ldquofalserdquo gt

2 Que el descriptor de despliegue webxml en la carpeta WEB-INF indique doacutende se

localiza el esquema XML para la especificacioacuten Servlet 24 que a su vez utiliza el

esquema XML para la especificacioacuten Java Server Page 20

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

Utilizando el lenguaje de expresioacuten se podriacutea modificar la paacutegina Cuentajsp de la seccioacuten

3212 de este documento como se muestra a continuacioacuten Esta nueva paacutegina

1 Especifica que utilizaraacute la biblioteca core de etiquetas estandar (de la que se hablaraacute maacutes

adelante)

2 La primera vez que sea accedida definiraacute la variable atrCuenta en el aacutembito de la

aplicacioacuten con un valor inicial nulo y la incrementaraacute en una unidad cuando sea accedida

sucesivas veces simplemente incrementaraacute esta variable en una unidad

3 Finalmente mostraraacute una paacutegina con un contenido anaacutelogo al siguiente Esta formado

por una cabecera y una segunda liacutenea compuesta por el valor del paraacutemetro parNombre

enviado con la peticioacuten un texto fijo el valor de la variable atrCuenta y otro texto fijo

dependiente del valor de esta variable

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

El coacutedigo completo es el siguiente

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

3224 VARIABLES Y EXPRESIONES

Para acceder a una simple variable se puede escribir algo como lo siguiente $nombre y

para acceder a una propiedad de un objeto podemos escribir algo como

$paramparNombre

$applicationScopeatrCuenta

$pageContextrequestrequestURI

La primera liacutenea del ejemplo anterior obtiene el valor de la propiedad parNombre del objeto

param la segunda el valor del atributo atrCuenta del objeto applicationScope y la tercera

el URL relativo de la paacutegina JSP solicitada

El lenguaje de expresioacuten es maacutes tolerante con respecto a las variables con valor null y ejecuta

muchas maacutes conversiones de forma automaacutetica sobre el tipo de los datos cuando la expresioacuten

a evaluar asiacute lo requiere Por ejemplo la etiqueta condicional siguiente incluye una expresioacuten

que compara el valor del atributo atrCuenta con aacutembito de aplicacioacuten con 10 (convirtiendo

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

impliacutecitamente el valor del atributo al tipo de la constante para poder realizar la comparacioacuten

El resultado seraacute un valor de tipo boolean

ltcif test=rdquo$applicationScopeatrCuenta gt 10rdquogt

ltcifgt

o bien

ltcif test=rdquo$atrCuenta gt 10rdquogt

ltcifgt

Para que una literal pueda incluir un caracter significativo para el lenguaje dicho caracter

debe ser especificado como una secuencia de escape (caracter) Por ejemplo la siguiente

expresioacuten da lugar al literal ldquovezrdquo o ldquovecesrdquo entre comillas dobles

$(atrCuenta gt 1) iquest ldquordquovecesrdquordquo ldquordquovezrdquordquo

Cualquier objeto o atributo de un objeto definido en algunos de los aacutembitos de una paacutegina

puede ser utilizado como una variable Por ejemplo $atrCuenta+1 es una expresioacuten que

realiza la suma de la variable atrCuenta con 1

Cuando se trate de una propiedad de un objeto para acceder a ella se utilizaraacute el operador

punto o bien la notacioacuten empleada para acceder a un elemento de una matriz Por ejemplo

$paramparNombre

$param[ldquoparNombrerdquo]

Una expresioacuten LE puede aparecer en cualquier lugar donde pueda aparecer un texto fijo Por

tanto para informar al contenedor JSP que se trata de una expresioacuten y no de un texto fijo se

utilizan los delimitadores $ al principio y al final

3225 OPERADORES

OPERADOR DESCRIPCIOacuteN Acceso a la propiedad de un objeto o a un elemento de un Map

[] Acceso al elemento de una matriz o de un objeto List

() Pareacutentesis para alterar la prioridad en la evaluacioacuten de una expresioacuten

If ternario condicion expresion1 expresioacuten 2

+ Suma

- Resta

Producto

oacute div Divisioacuten

oacute mod Moacutedulo o resto de una divisioacuten

== oacute eq Igualdad

= oacute ne Diferente

lt oacute lt Menor que

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt oacute gt Mayor que

lt= oacute le Menor o igual que

gt= oacute ge Mayor o igual que

ampamp oacute and Operacioacuten Loacutegica AND

|| oacute or Operacioacuten Loacutegica OR

oacute not Operacioacuten Loacutegica NOT

empty Verifica si el valor de una variable es null si un String esta vaciacuteo o si una matriz Map

o Collection no tienen elementos

func(args) Llamada a una funcioacuten donde func es el nombre de la funcioacuten y arg representa cero o

maacutes argumentos separados por comas

El ejemplo siguiente muestra una paacutegina JSP compuesta por elementos HTML expresiones

LE y objetos impliacutecitos

lthtmlgt

ltheadgtlttitlegtJSP 20lttitlegtltheadgt

ltbodygt

lth3gtLenguaje de expresioacuten (LE)lth3gt

ltpgtLa siguiente tabla ilustra algunas expresiones LE

ltbrgtltbrgtlttable border=1gt

lttrgt

ltthgtltbgtExpresioacutenltbgtltthgt

ltthgtltbgtValorltbgtltthgt

lttrgt

lttrgt

lttdgt$3 + 6lttdgt

lttdgt$3 + 6lttdgt

lttdgt

lttrgt

lttdgt$(7 gt 4) 7 4lttdgt

lttdgt$(7 gt 4) 7 4lttdgt

lttrgt

lttrgt

lttdgt$header[host]lttdgt

lttdgt$header[host]lttdgt

lttrgt

lttablegt

ltbodygt

lthtmlgt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

323 BIBLIOTECA ESTANDAR DE ETIQUETAS

La biblioteca estaacutendar de etiquetas JSP (JSTL ndash Java Server Page Estaacutendar Tag Library)

incluye una cantidad amplia de etiquetas para diferentes aacutereas de trabajo

Aacuterea baacutesica (su prefijo es c ndash core) y contiene

o Soporte de variables (remove y set)

o Control del flujo (choose when otherwise forEach forTokens if)

o Manejo de URL (import param redirect param y url param)

o Operaciones varias (match y out)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlcore

Aacuterea XML (su prefijo es x) y contiene

o Sentencias baacutesicas (out parse y set)

o Control del flujo (choosehellip whenhellip otherwise forEach e if)

o Transformacioacuten de Documentos (transformhellipparam)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlxml

Aacuterea Internacionalizacioacuten (su prefijo es fmt) Contiene

o Localidad (setLocale y requestEncoding)

o Mensajes (bundle message param y setBundle)

o Formateo de Fechas y nuacutemeros (formatNumber formateacuteate parseDate

parseNumber setTimeZone timeZone)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlfmt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Aacuterea SQL (su prefijo es sql) es el lenguaje estandar para interactuar con bases de datos

relacionales y contiene setDataSource Quero dateParam param transaction y

update dateParam param) El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlsql

Aacuterea Funciones (su prefijo es fn) y contiene

o Longitud de una coleccioacuten (length)

o Manipulacioacuten de String (toUpperCase toLowerCase substring

substringAfter substringBefore trim replace indexOf startsWith

endsWith contains containsIgnoreCase split join y escapeXml)

o El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlfunctions

3231 OPERACIONES CON ETIQUETAS BAacuteSICAS

En un ejemplo pasado teniacuteamos el siguiente coacutedigo

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

En este ejemplo se hace referencia al aacuterea baacutesica de JSTL con el prefijo c y se utiliza la

etiqueta cset para definir la variable atrCuenta Si la variable ya esta definida simplemente

se le asigna el valor especificado

La uacuteltima parte del ejemplo anterior podriacutea haberse escrito de esta otra forma

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcif test=rdquo$atrCuenta gt 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcifgt

$atrCuenta $str

La etiqueta cif permite la ejecucioacuten condicional de su cuerpo en funcioacuten del valor del

atributo de test

La etiqueta cchoose permite la ejecucioacuten del cuerpo de la primera etiqueta cwhen cuyo

atributo test sea evaluado a true Si ninguna de las condiciones se evaluacutea a true entonces se

evaluacutea el cuerpo de la etiqueta cotherwise si estaacute presente El siguiente coacutedigo muestra otra

manera de escribir el ejemplo anterior utilizando estas uacuteltimas etiquetas

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcchoosegt

ltcwhen test=rdquo$atrCuenta == 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcwhengt

ltcotherwisegt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcotherwisegt

ltcchoosegt

$atrCuenta $str

La etiqueta cforEach permite iterar sobre una coleccioacuten de objetos La coleccioacuten se

especifica por medio del atributo iacutetems y el elemento actual de la coleccioacuten estaacute disponible a

traveacutes de la variable establecida por el atributo var Por ejemplo el siguiente fragmento de

coacutedigo visualiza una tabla con las variables definidas a nivel de aacutembito de paacutegina

lttable border=rdquo1rdquogt

ltcforEach var=rdquoitemrdquo iacutetems=rdquo$pageScoperdquogt

lttrgt

lttdgt $item lttdgt

lttrgt

ltcforEachgt

lttablegt

La etiqueta ccatch atrapa una excepcioacuten que ocurra en el cuerpo de la misma Por ejemplo

el siguiente segmento de coacutedigo lanzaraacute una excepcioacuten si el paraacutemetro mes se escribe con

letras en vez de con nuacutemeros

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltbodygt

lthtmlgt

Un URL anaacutelogo al siguiente daraacute lugar a que la excepcioacuten sea lanzada cuando se ejecute la

expresioacuten $nMes 3 de la paacutegina anterior

httplocalhost8080JSP2exceppruebajspmes=marzo

La excepcioacuten indica que ha ocurrido un error al tratar de convertir ldquomarzordquo a un entero de

tipo Long Para cachar esta excepcioacuten y darle un tratamiento adecuado habraacute que modificar

la paacutegina JSP anterior como se indica a continuacioacuten

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltccatch var=rdquoerrorOcurridordquogt

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltccatchgt

ltcif test=rdquo$not empty errorOcurridordquogt

Error el paraacutemetro mes debe ser un nuacutemero ltbgt

ltbrgt Informacioacuten del error dada por el sistema

ltbrgt ltfont color=rdquoFF0000rdquogt $errorOcurrido ltfontgt

ltcifgt

ltbodygt

lthtmlgt

3232 ACCESO A BASES DE DATOS CON JSP

Las etiquetas que proporciona el aacuterea SQL permiten realizar

Conexioacuten con una base de datos

Realizacioacuten de consultas a la base de datos

Acceso al conjunto de resultados

Ejecucioacuten de actualizaciones y transacciones

Todas las etiquetas SQL actuacutean sobre una base de datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

32321 CONEXIOacuteN CON LA BASE DE DATOS

La conexioacuten con la base de datos puede realizarse con la etiqueta sqlsetDataSource Por

ejemplo si se esta utilizando el administrador de bases de datos MySql con el controlador

JDBC se puede realizar una conexioacuten con una base de datos digamos bd_tutorias de la

manera siguiente

ltsqlsetDataSource var=rdquobdrdquo

driver=rdquocommysqljdbcDriverrdquo

url=rdquojdbcmysqllocalhost3306bd_tutoriasrdquo

user=rdquoadminrdquo

password=rdquoadminadminrdquo gt

32322 CONSULTA A LA BASE DE DATOS

La etiqueta sqlQuero permite realizar una consulta a una base de datos Por ejemplo el

siguiente fragmento de coacutedigo realiza una consulta a la base de datos representada por bd y

obtiene un conjunto de resultados representado por cdr

ltsqlquery var=rdquocdrrdquo dataSource=rdquo$bdrdquogt

SELECT professor dia hora alumno

FROM profesores tutorias citas

WHERE profesoresid_profesor=tutoriasid_profesor

AND tutoriasid_tutoria=citasid_tutoria

ltsqlquerygt

32323 MODIFICACIONES SOBRE LA BASE DE DATOS

La etiqueta sqlupdate permite ejecutar una sentencia SQL INSERT UPDATE o DELETE

y cualquier otra sentencia SQL que no retorne ninguacuten valor Por ejemplo

ltsqlupdate var=rdquocontrdquo dataSource=rdquo$bdrdquo gt

UPDATE profesores

SET profesor=

WHERE profesor=

ltsqlparam value=rdquo$paramProfesorrdquo gt

ltsqlparam value=rdquo$paramIDrdquo gt

ltsqlupdategt

Una operacioacuten UPDATE puede utilizar el siacutembolo para indicar que el valor que tendriacutea que

evaluarse en esa posicioacuten seraacute suministrado por una etiqueta sqlparam como por ejemplo

httplocalhost8080JSP2sqlpruebajspProfesor=Mario+Rossainz+LopezampID=514

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

cambios en la forma en que se generan los servlets la forma en que se compilan y en la que

se invocan Para colocar los servlets en paquetes se requieren de dos pasos

1 Mover los archivos (class) a un subdirectorio que coincida con el nombre del paquete

pretendido

2 Insertar una instruccioacuten de paquete en el archivo de clase Para ello la primera liacutenea en

el coacutedigo fuente (java) del servlet deberaacute ser package nomPaquete

Por ejemplo el fragmento siguiente de coacutedigo Java presenta una variacioacuten del Servlet

HolaMundo que se encuentra en el paquete misServlets

package misServlets

import javaio

import javaxservlet

import javaxservlethttp

public class HolaMundo extends HttpServlet

Manipular las posibles peticiones enviadas por el cliente

utilizando el atributo method=get o method=post

protected void procesarPeticion(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

responsesetContentType(texthtml)

PrintWriter out = responsegetWriter()

outprintln(lthtmlgt)

El archivo class se encontraraacute dentro de una carpeta llamada misServlets que seraacute el paquete

creado o utilizado por la aplicacioacuten en este caso del HolaMundo dependiendo si exitiacutea o no

antes de compilar la aplicacioacuten A continuacioacuten deberemos copiar dentro de la carpeta

webappsROOTWEB-INFclasses del Tomcat la carpeta misServlets junto con el

HolaMundoclass que estaraacute dentro de ella y ejecutar el servlet en el explorador escribiendo

httplocalhost8080servletmisServletsHolaMundo

317 PROCESAMIENTO DE FORMULARIOS

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Hasta este punto los servlets que hemos estudiado soacutelo enviacutean informacioacuten al navegador del

cliente No obstante estos clientes Web pueden Mostar formularios que permitan solicitar

datos a los usuarios que seraacuten enviados al servidor para por ejemplo ser almacenados en

una base de datos para posteriores peticiones o para otros procesos o bien para dar al usuario

una respuesta ajustada a dicha peticioacuten

En el siguiente URL se invoca la ejecucioacuten de un servlet llamado Parametros aportando la

lista de pares (Nombre Mario)-(Edad 22) en formato GET

httplocalhost8080ParametrosservletParametrosNombre=MarioampEdad=22

Hay que observar la manera de colocar los datos tras el siacutembolo ldquordquo y de separarlos con el

siacutembolo ldquoamprdquo El coacutedigo del servlet es el siguiente

import javaio

import javaxservlet

import javaxservlethttp

public class Parametros extends HttpServlet

public void doGet(HttpServletRequest request HttpServletResponse

response)

throws IOException ServletException

responsesetContentType(texthtml)

PrintWriter out = responsegetWriter()

outprintln(lthtmlgt)

outprintln(ltbodygt)

String NombreRecibido = requestgetParameter(Nombre)

String EdadRecibida = requestgetParameter(Edad)

outprintln(lth1gt Hola + NombreRecibido + lth1gt)

outprintln(lth1gt Tienes + EdadRecibida + antildeos lth1gt)

outprintln(ltbodygt)

outprintln(lthtmlgt)

El objeto httpServletRequest en el coacutedigo anterior request contiene una serie de meacutetodos de

utilidad para recibir informacioacuten proveniente del usuario en concreto el meacutetodo

getParameter permite obtener el valor asociado a un nombre en la lista de pares (nombre

valor) que puede proporcionar un URL

Ademaacutes de poder introducir el URL anterior en el navegador proporcionando directamente

los datos enviados al servlet en dicha URL

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Tambieacuten podemos generar el URL mediante una paacutegina Web que podraacute utilizar el usuario

lthtmlgt

ltbodygt

lth1gt Cuestionario lth1gt

ltform action=httplocalhost8080ParametrosservletParametros

method=getgt

Nombre ltinput type=text name=Nombregt ltbrgt

Edad ltinput type=text name=Edadgt ltbrgtltbrgt

ltinput type=submit value=Enviar datosgt ltbrgt

ltformgt

ltbodygt

lthtmlgt

Los formularios en HTML permiten enviar datos al servidor Web En la liacutenea 5 de la paacutegina

Web mostrada se encuentra la etiqueta form que en el ejemplo contiene el atributo action

que indica la accioacuten que debe realizarse en el servidor en este caso ejecutar el servlet

Parametros y el atributo method que indica la manera en la que se enviacutean los datos (en este

caso la peticioacuten GET)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Peticioacuten HTTP GET Cuando el tipo de peticioacuten HTTP es GET los datos del formulario

son enviados al servidor a continuacioacuten del URL especificado por el atributo action de form

El tamantildeo de la cadena enviada estaacute limitado y al estar en ASCII es totalmente legible por

tanto no es un modo seguro

Es por ello que cuando se requiere del enviacuteo de datos seguros y ademaacutes el nuacutemero de datos

del formulario que son enviados al servidor son muchos resulta ser mejor el uso del meacutetodo

POST Veamos otro ejemplo

import javaio

import javaxservlet

import javaxservlethttp

import javautil

public class MostrarParametros extends HttpServlet

public void doGet(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

responsesetContentType(texthtml)

PrintWriter out= responsegetWriter()

String titulo=Lectura de todos los paraacutemetros de Peticioacuten

outprintln(ltdoctype html public -W3CDTD HTML 40 +

TransitionalENgt)

outprintln(lthtmlgt)

outprintln(ltheadgtlttitlegt+titulo+lttitlegtltheadgt)

outprintln(ltbody bgcolor=FDF5E6gtn+

lth1 align=centergt+titulo+lth1gtn+

lttable border=1 align=centergtn+

lttr bgcolor=FFAD00gtn+

ltthgtNombre del parampaacutemetroltthgtValor(es) del

parampaacutemetro)

Enumeration nombresParam=requestgetParameterNames()

while(nombresParamhasMoreElements())

String nombreParam= (String)nombresParamnextElement()

outprint(lttrgtlttdgt+nombreParam+nltTDgt)

String[]valoresParam=

requestgetParameterValues(nombreParam)

if (valoresParamlength==1)

String valorParam=valoresParam[0]

if (valorParamlength()==0)

outprintln(ltigt Sin valor ltigt)

else

outprintln(valorParam)

else

outprintln(ltulgt)

for (int i=0 iltvaloresParamlengthi++)

outprintln(ltligt+valoresParam[i])

outprintln(ltulgt)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

outprintln(lttablegtnltbodygtlthtmlgt)

public void doPost(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

doGet(requestresponse)

El servlet escrito utiliza un meacutetodo doPost que soacutelo ejecuta a Donet Esto es porque se quiere

que el servlet pueda manejar tanto las peticiones GET como las POST Por otro lado el

formulario es el siguiente

ltdoctype html public -W3CDTD HTML 40 TransitionalENgt

lthtmlgt

ltheadgt

lttitlegt Un Formulario de ejemplo que utiliza POST lttitlegt

ltheadgt

ltbody bgcolor=FDF5E6gt

lth1 align=centergt Un formulario de Ejemplo que utiliza POST

lth1gt

ltform action=httplocalhost8080MostrarParametros

servletMostrarParametros

method=postgt

Nuacutemero de elemento ltinput type=text name=elemNumgt ltbrgt

Cantidad ltinput type=text name=cantidadgt ltbrgt

Precio Unitario ltinput type=text name=precio value=$gt

ltbrgtlthrgt

Nombre de Pila ltinput type=text name=nombrePilagt ltbrgt

Apellido(s) ltinput type=text name=apellidogt ltbrgt

Iniciales ltinput type=text name=inicialesgt ltbrgt

Domicilio de envio lttextarea name=domicilio rows=3

cols=40gtlttextareagt ltbrgt

Tarjeta de creacutedito ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta value=VisagtVisa ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta value=Master Cardgt

Master Card ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta value=AmexgtAmerican

Expresss ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta

value=DiscovergtDiscover ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta

value=Java Smart CardgtTarjeta Inteligente de Java

ltbrgt

Nuacutemero de la tarjeta de creacutedito

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltinput type=password name=numTarjetagtltbrgt

Repita el nuacutemero de la tarjeta de creacutedito

ltinput type=password name=numTarjetagtltbrgtltbrgt

ltcentergt

ltinput type=submit value=Enviar pedidogt

ltcentergt

ltformgt

ltbodygt

lthtmlgt

El formulario HTML del listado anterior utiliza POST como deberiacutea ser en todos los campos

que tienen contrasentildea

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Si intenta ejecutar el servlet MostrarParametros directamente en el explorador con el URL

httplocalhost8080MostrarParametrosservletMostrarParametros se obtendraacute la paacutegina

Web sin resultados

Peticioacuten HTTP POST Cuando el tipo de peticioacuten HTTP es POST los datos son enviados

al servidor en el cuerpo de la peticioacuten Es el meacutetodo maacutes usual de enviar los datos de un

formulario Con este tipo de peticioacuten la informacioacuten del formulario se enviacutea despueacutes del URL

indicado por action en el cuerpo de la peticioacuten y el tamantildeo de la informacioacuten enviada no esta

limitado

Seguacuten lo expuesto escoger el meacutetodo para enviar la informacioacuten no es difiacutecil Si los datos

son pocos y no importa su confidencialidad o manipulacioacuten utilizamos GET Si son largos

privados o importantes utilizamos POST

318 ACCESO A BASES DE DATOS CON SERVLETS

Una aplicacioacuten Java que realiza accesos a bases de datos funciona seguacuten una arquitectura que

permite escribir los programas abstrayeacutendose de los detalles de los niveles inferiores (discos

controladores sistema operativo etc) como lo muestra la figura siguiente

JDBC (Java DataBase Connectivity ndash Conexioacuten con Bases de Datos desde Java) es una API

de Java que permite ejecutar instrucciones SQL para manipular y gestionar bases de datos

relacionales Para que una aplicacioacuten Java pueda hacer operaciones sobre una base de datos

previamente tiene que establecer una conexioacuten con la misma Esta conexioacuten se realiza a

traveacutes de un controlador (driver) seguacuten la figura de arriba La API-JDBC se proporciona en

dos paquetes javasql y javaxsql El primer paquete contiene las interfaces y clases Java

fundamentales de JDBC en tanto que el segundo paquete es una extensioacuten del primero e

APLICACION

SISTEMA OPERATIVO

CONTROLADOR

Oracle Access MySql

JVM

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

incluye las clases que interactuacutean con JNDI y otras que gestionan conjuntos de conexiones

con una misma base de datos Para maacutes detalles del uso de JDBC veacutease el apeacutendice A de

estas notas

El primer paso para crear una conexioacuten entre una aplicacioacuten Java y una base de datos es

registrar el controlador JDBC adecuado para esa base con el fin de que la JVM pueda

utilizarlo Existen distintos tipos de controladores JDBC por ejemplo

ldquocommysqljdbcDriverrdquo que es el controlador utilizado cuando el motor de base de datos

que se utiliza es MySql

En el supuesto caso de que la base de datos soacutelo permitiera el acceso a traveacutes de controladores

ODBC como lo hace ACCESS siempre podemos usar el controlador puente JDBC-ODBC

incluido como parte del JDK ldquosunjdbcodbcJdbcOdbcDriverrdquo Este tipo de controladores

es decir los basados en ODBC (Open DataBase Connectivity) son bastante utilizados en

entornos Windows pues este SO incluye ODBC El apeacutendice A describe al final como

administrar los oriacutegenes de datos ODBC en Windows

Asiacute pues la mayor ventaja de los servlets con respecto a la conexioacuten con bases de datos viacutea

JDBC es que su ciclo de vida les permite mantener conexiones abiertas con las mismas a lo

largo de toda una sesioacuten Esto permite recortar tiempo con respecto a otras tecnologiacuteas como

la CGI Ademaacutes JDBC es una tecnologiacutea independiente de las bases de datos

Como ejemplo vamos a implementar una simple aplicacioacuten Web basada en servlets que

muestre una especie de directorio de personas La aplicacioacuten podraacute consultar insertar

modificar borrar o listar la informacioacuten de cada una de las personas almacenadas en la base

de datos a la que se hace acceso (que estaraacute en formato access)

La estructura de la Base de Datos es una tabla con los siguientes campos

DNI Nombre Apellido Edad

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

53023767A Pedro Rubio 18

77459822P Luis Tejedor 47

123456MRL Mario Rossainz 35

La estructura de la aplicacioacuten se muestra en la figura siguiente

lthtmlgt

ltbodygt

lttable border=1gtlttrgtlttdgt

ltform action=httplocalhost8080directorioTelservletSvAccesoBD

method=getgt

DNI ltinput type=text name=DNIgt ltbrgt

Nombre ltinput type=text name=Nombregt ltbrgt

Apellido ltinput type=text name=Apellidogt ltbrgt

Edad ltinput type=text name=Edadgt ltbrgtltbrgt

ltinput type=submit value=Consultar name=BotonConsultargt

ltinput type=submit value=Insertar name=BotonInsertargt

ltinput type=submit value=Modificar name=BotonModificargt

ltinput type=submit value=Borrar name=BotonBorrargt

ltinput type=submit value=Listar name=BotonListargt ltbrgt

ltcentergt

ltinput type=submit value= |lt name=BotonPrimerogt

ltinput type=submit value= -- name=BotonMenosCincogt

ltinput type=submit value= - name=BotonAnteriorgt

ltinput type=submit value= + name=BotonSiguientegt

ltinput type=submit value= ++ name=BotonMasCincogt

ltinput type=submit value= gt| name=BotonUltimogt

ltcentergt

lttdgt

lttdgt

lttextarea name=AreaDeListado rows=10 cols=35gtlttextareagt

SvAccesoBDhtml

SvAccesoBD

ObBorrado ObListado ObConsulta

ObInsercion

ObModificacion

ObPosicionamiento

ObRegistro

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lttdgt

lttrgt

ltformgt

lttablegt

ltbodygt

lthtmlgt

SvAccesoBDhtml

import javaio

import javaxservlet

import javaxservlethttp

public class SvAccesoBD extends HttpServlet

private int PosicionBuscada = 1

private String AreaDeListado=

PrintWriter out

public void doGet(HttpServletRequest request HttpServletResponse response)

throws IOException ServletException

String DNI = requestgetParameter(DNI)

String Nombre = requestgetParameter(Nombre)

String Apellido = requestgetParameter(Apellido)

String Edad = requestgetParameter(Edad)

String BotonConsultar = requestgetParameter(BotonConsultar)

String BotonInsertar = requestgetParameter(BotonInsertar)

String BotonModificar = requestgetParameter(BotonModificar)

String BotonBorrar = requestgetParameter(BotonBorrar)

String BotonListar = requestgetParameter(BotonListar)

String BotonPrimero = requestgetParameter(BotonPrimero)

String BotonMenosCinco = requestgetParameter(BotonMenosCinco)

String BotonAnterior = requestgetParameter(BotonAnterior)

String BotonSiguiente = requestgetParameter(BotonSiguiente)

String BotonMasCinco = requestgetParameter(BotonMasCinco)

String BotonUltimo = requestgetParameter(BotonUltimo)

AreaDeListado = requestgetParameter(AreaDeListado)

responsesetContentType(texthtml)

out = responsegetWriter()

outprintln(lthtmlgt)

outprintln(ltbodygt)

if (BotonConsultar=null) ConsultarDatos(DNI)

if (BotonInsertar=null) InsertarDatos(DNINombreApellidoEdad)

if (BotonModificar=null) ModificarDatos(DNINombreApellidoEdad)

if (BotonBorrar=null) BorrarDatos(DNI)

if (BotonListar=null) ListarDatos(DNI)

if (BotonPrimero=null) Controles(1)

if (BotonMenosCinco=null) Controles(2)

if (BotonAnterior=null) Controles(3)

if (BotonSiguiente=null) Controles(4)

if (BotonMasCinco=null) Controles(5)

if (BotonUltimo=null) Controles(0)

outprintln(ltbodygt)

outprintln(lthtmlgt)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

private void ConsultarDatos(String DNI)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObRegistro InstanciaFila = InstanciaConsultaDameDatos()

GenerarRespuesta(InstanciaFilaDameDNI()InstanciaFilaDameNombre()

InstanciaFilaDameApellido()

StringvalueOf(InstanciaFilaDameEdad()))

else

GenerarRespuesta(DNI------------)

PosicionBuscada = 1

public void ListarDatos(String DNI)

ObListado InstanciaListado = new ObListado()

AreaDeListado = InstanciaListadoDameResultado()

ConsultarDatos(DNI)

PosicionBuscada = 1

public void BorrarDatos(String DNI)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObBorrado InstanciaBorrado = new ObBorrado(PosicionBuscada)

GenerarRespuesta()

else

GenerarRespuesta(----------------)

PosicionBuscada = 1

public void ModificarDatos(String DNI String Nombre String Apellido

String Edad)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObRegistro InstanciaFila = new ObRegistro(DNI Nombre Apellido

IntegerparseInt(Edad))

ObModificacion InstanciaModificacion = new ObModificacion(PosicionBuscada

InstanciaFila)

GenerarRespuesta(DNINombreApellidoEdad)

else

GenerarRespuesta(----------------)

PosicionBuscada = 1

public void InsertarDatos(String DNI String Nombre String Apellido

String Edad)

ObRegistro InstanciaFila = new ObRegistro(DNI Nombre Apellido

IntegerparseInt(Edad))

ObInserccion InstanciaInserccion = new ObInserccion(InstanciaFila)

GenerarRespuesta()

PosicionBuscada=1

public void Controles(String Identificador)

ObPosicionamiento InstanciaPosicionamiento =

new ObPosicionamiento(IdentificadorPosicionBuscada)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ObRegistro InstanciaFila = InstanciaPosicionamientoDameDatos()

GenerarRespuesta(InstanciaFilaDameDNI()InstanciaFilaDameNombre()

InstanciaFilaDameApellido()

StringvalueOf(InstanciaFilaDameEdad()))

PosicionBuscada = InstanciaPosicionamientoPosicion()

private void GenerarRespuesta(String DNI String Nombre String Apellido

String Edad)

outprintln(lttable border=1gt)

outprintln(lttrgt)

outprintln(lttdgt)

outprintln(ltform

action=httplocalhost8080directorioTelservletSvAccesoBD

method=getgt)

outprintln( DNI ltinput type=text name=DNI value=+DNI+gtltbrgt)

outprintln( Nombre ltinput type=text name=Nombre

value=+Nombre+gtltbrgt)

outprintln( Apellido ltinput type=text name=Apellido

value=+Apellido+gtltbrgt)

outprintln( Edad ltinput type=text name=Edad

value=+Edad+gtltbrgtltbrgt)

outprintln( ltinput type=submit value=Consultar

name=BotonConsultargt)

outprintln( ltinput type=submit value=Insertar

name=BotonInsertargt)

outprintln( ltinput type=submit value=Modificar

name=BotonModificargt)

outprintln( ltinput type=submit value=Borrar name=BotonBorrargt)

outprintln( ltinput type=submit value=Listar name=BotonListargt

ltbrgt)

outprintln( ltcentergt)

outprintln( ltinput type=submit value= |lt name=BotonPrimerogt)

outprintln( ltinput type=submit value= --

name=BotonMenosCincogt)

outprintln( ltinput type=submit value= - name=BotonAnteriorgt)

outprintln( ltinput type=submit value= +

name=BotonSiguientegt)

outprintln( ltinput type=submit value= ++

name=BotonMasCincogt)

outprintln( ltinput type=submit value= gt| name=BotonUltimogt)

outprintln( ltcentergt)

outprintln( lttdgt)

outprintln( lttdgt)

outprintln( lttextarea name=AreaDeListado rows=10

cols=35gt+AreaDeListado+lttextareagt)

outprintln( lttdgt)

outprintln( lttrgt)

outprintln( ltformgt)

outprintln( lttablegt)

SvAccesoBDjava

import javasql

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

public class ObBorrado

ObBorrado(int PosicionBuscada)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

Personasabsolute(PosicionBuscada)

PersonasdeleteRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

ObBorradojava

import javasql

import javaawtTextArea

public class ObListado

private String Resultado=

ObListado()

String DNI Nombre Apellido Linea

int Edad Posicion

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement()

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

while (Personasnext())

DNI = PersonasgetString(DNI)

Nombre = PersonasgetString(Nombre)

Apellido = PersonasgetString(Apellido)

Edad = PersonasgetInt(Edad)

Posicion = PersonasgetRow()

Linea = DNI+ +Nombre+ +Apellido+ +StringvalueOf(Edad)

Resultado=Resultado+StringvalueOf(Posicion)+ +Linea+n

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public String DameResultado()

return Resultado

ObListadojava

public class ObRegistro

private String DNI Nombre Apellido

private int Edad

ObRegistro (String DNI String Nombre String Apellido int Edad)

thisDNI = DNI

thisNombre = Nombre

thisApellido = Apellido

thisEdad = Edad

String DameDNI()

return DNI

String DameNombre()

return Nombre

String DameApellido()

return Apellido

int DameEdad()

return Edad

ObRegistrojava

import javasql

public class ObConsulta

private int Posicion = 0

private ObRegistro DatosPersona

ObConsulta(String DNIPedido)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement()

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

while (Personasnext())

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

String DNI = PersonasgetString(DNI)

if (DNIequalsIgnoreCase(DNIPedido))

Posicion = PersonasgetRow()

String Nombre = PersonasgetString(Nombre)

String Apellido = PersonasgetString(Apellido)

int Edad = PersonasgetInt(Edad)

DatosPersona = new ObRegistro(DNINombreApellidoEdad)

break

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public int PosicionEncontrada()

return Posicion

public ObRegistro DameDatos()

return DatosPersona

ObConsultajava

import javasql

public class ObInserccion

ObInserccion(ObRegistro Datos)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

PersonasmoveToInsertRow()

PersonasupdateString(DNI DatosDameDNI())

PersonasupdateString(NombreDatosDameNombre())

PersonasupdateString(Apellido DatosDameApellido())

PersonasupdateInt(EdadDatosDameEdad())

PersonasinsertRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

catch (SQLException e)

Systemoutprintln(e)

ObInsercionjava

import javasql

public class ObModificacion

ObModificacion(int PosicionBuscada ObRegistro Datos)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

Personasabsolute(PosicionBuscada)

PersonasupdateString(DNIDatosDameDNI())

PersonasupdateString(NombreDatosDameNombre())

PersonasupdateString(ApellidoDatosDameApellido())

PersonasupdateInt(EdadDatosDameEdad())

PersonasupdateRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

ObModificacionjava

import javasql

public class ObPosicionamiento

private ObRegistro DatosPersona

private int Posicion

ObPosicionamiento(String Accion int Posicion)

int IDAccionEdad

String DNINombreApellido

boolean PosicionCorrecta=false

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

FROM DatosPersonales)

Personasabsolute(Posicion)

IDAccion = IntegerparseInt(Accion)

switch (IDAccion)

case 0

PosicionCorrecta = Personaslast()

break

case 1

PosicionCorrecta = Personasfirst()

break

case 2

PosicionCorrecta = Personasrelative(-5)

break

case 3

PosicionCorrecta = Personasprevious()

break

case 4

PosicionCorrecta = Personasnext()

break

case 5

PosicionCorrecta = Personasrelative(+5)

break

if (PosicionCorrecta)

thisPosicion = PersonasgetRow()

DNI = PersonasgetString(DNI)

Nombre = PersonasgetString(Nombre)

Apellido = PersonasgetString(Apellido)

Edad = PersonasgetInt(Edad)

else

thisPosicion = Posicion

DNI = ----

Nombre = ----

Apellido = ----

Edad = 0

DatosPersona = new ObRegistro(DNINombreApellidoEdad)

Personasclose()

Conexionclose()

SentenciaSQLclose()

Systemoutprintln(StringvalueOf(Posicion)++StringvalueOf(thisPosicion))

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public int Posicion()

return Posicion

public ObRegistro DameDatos() return DatosPersona

ObPosicionamientojava

En este ejemplo se emplean servlets y paacuteginas Web Los clientes habitualmente trabajan en

una computadora remota y los programas se ejecutan en un servidor El mecanismo de

comunicaciones que soporta el protocolo http nos permite consultar en el servidor los datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

que ha seleccionado o escrito el usuario de esta manera se puede observar una disociacioacuten

entre la interfaz graacutefica de usuario (que se ejecuta en los equipos de los clientes) y el

programa que recoge los datos y ejecuta las acciones pertinentes (que se ejecuta en el

servidor)

Como puede observarse el coacutedigo SvAccessoBD es un servlet que lleva a cabo las siguientes

operaciones

1 Recoge los valores provenientes del usuario

2 Determina la naturaleza de la accioacuten a realizar

3 Realiza su cometido con la base de datos

4 Genera la respuesta que recibiraacute el usuario

32 JSP

JSP significa Java Server Pages que traducido quiere decir Paacuteginas de Servidor Java y es

por tanto una tecnologiacutea orientada a crear paacuteginas Web con programacioacuten en JAVA es decir

permite mezclar HTML estaacutendar y estaacutetico con un contenido dinaacutemico etiquetas especiales

(oacuterdenes) y trozos de coacutedigo JAVA (scriptlets o secuencias de oacuterdenes) o contenido dinaacutemico

generado por servlets Eacuteste contenido dinaacutemico se encuentra encerrado en etiquetas

especiales muchas de las cuales inician con lt y finalizan con gt El motor de las paacuteginas

JSP esta basado en los servlets de JAVA

En la tecnologiacutea JSP se crean paacuteginas parecidas a las paacuteginas que se crean en ASP (Active

Server Page de Microsoft) o PHP (Personal Home Page) que son dos tecnologiacuteas de paacuteginas

ejecutadas en el servidor Sin embargo JSP no se cintildee a un sistema operativo o servidor Web

en particular ademaacutes de que proporciona acceso a la tecnologiacutea de Servlets y a JAVA en la

parte dinaacutemica

El proceso para generar paacuteginas JSP accesibles en Web es mucho maacutes simple que en los

servlets Dando por hecho que se tiene un servidor Web que permite usar JSP el coacutedigo se

almacenaraacute en archivos con extensioacuten jsp que incluyen dentro de la estructuras de etiquetas

HTML las sentencias JAVA a ejecutar y tan soacutelo se colocaraacuten en cualquier lugar en donde

se pusiera una paacutegina Web normal sin compilacioacuten sin paquetes y sin configuracioacuten aunque

el servidor tendraacute que ser configurado para acceder a los archivos de clases Servlets y de

JSPs

Aunque lo que se escriba con frecuencia luciraacute como un archivo HTML estaacutendar detraacutes de

ello la paacutegina JSP se convierte automaacuteticamente en un servlet normal donde el HTML

estaacutetico tan soacutelo es enviado al flujo de salida asociado con el meacutetodo service del servlet Esta

traduccioacuten se realiza la primera vez que se solicita la paacutegina De acuerdo como este

configurado el servidor es posible ver el coacutedigo fuente de los servlets generados a partir de

sus paacuteginas JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Por ejemplo supongamos que se ha escrito el siguiente coacutedigo en el archivo Saludojsp

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtEjemplo JSPlttitlegtltheadgt

ltbody bgcolor=ffffccgt

ltcentergt

lth2gtHola mundolth2gt

ltjavautilDate hoy = new javautilDate()gt

La fecha de hoy es lt=hoygt

ltcentergt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional y un fragmento de un scriptlet de JAVA La etiqueta

lt identifica el comienzo del scriptlet y gt el final Una expresioacuten de la forma =variable

es sustituida por el valor de esa variable Para ejecutar esta paacutegina o cualquier otra paacutegina

JSP desde un navegador hay que instalarla en el servidor de aplicaciones de la misma manera

en como se hizo con los servlets Suponiendo entonces que se tiene instalado el Tomcat 5

siga los siguientes pasos

1 Antildeadir en el servidor la carpeta digamos JSP2 dentro de la carpeta webapps del Tomcat

y construir sobre ella la jerarquiacutea de clases ya conocida de los servlets

webappsrarrJSP2rarrWEB-INFrarrclasses

WEB-INFrarrlib

WEB-INFrarrtags

2 Editar en la carpeta WEB-INF el descriptor de despliegue webxml que se indica a

continuacioacuten Este archivo XML indica doacutende se localiza el esquema XML para la

especificacioacuten Servlet 24 que a suvez utiliza el esquema XML para la especificacioacuten

Java Server Page 20 que son las especificaciones que soporta en servidor Tomcat

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=

httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

3 Crear en JSP2 la carpeta saludo que contendraacute la aplicacioacuten y copiar en ella la paacutegina

Saludojsp

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

4 Arrancar el servidor Si el servidor ya estaba arrancado detenerlo y volverlo a arrancar o

bien abrir el explorador escribir el URL httplocalhost8080managerhtml e instalar

la aplicacioacuten

5 Una vez arrancado el servidor verificar si estaacute funcionando correctamente escribiendo

el URL siguiente en el explorador httplocalhost8080 El explorador debe mostrar la

paacutegina del Tomcat

6 Ejecutar la paacutegina JSP iniciando el explorador y escribiendo el URL siguiente

httplocalhost8080JSP2saludoSaludojsp donde la sintaxis geneacuterica es

httpservidor[puerto]MiCarpetapaginajsp

Cuando esta paacutegina (Saludojsp) es invocada por primera vez el motor JSP lleva a cabo una

fase de traduccioacuten de la misma en un servlet y el motor Servlet es el que ejecutaraacute eacuteste uacuteltimo

para generar el HTML dinaacutemico que seraacute enviado al explorador cliente seguacuten puede

deducirse de la figura siguiente La proacutexima vez que la paacutegina sea solicitada el motor JSP

ejecutaraacute el servlet que fue caragado la primera vez a no ser que la paacutegina haya cambiado

en cuyo caso seraacute compilada automaacuteticamente en un nuevo servlet y ejecutada

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Regresando al ejemplo el archivo java generado por el Tomcat a partir del archivo

Saludojsp se localiza en la carpeta workCatalinalocalhost de la instalacioacuten de Tomcat

321 ELEMENTOS PARA SECUENCIAS DE COMANDOS

Los elementos para secuencias de comandos permiten insertar coacutedigo en el servlet que seraacute

generado a partir de la paacutegina JSP Existen tres formas

1 Expresiones del tipo lt= expresioacuten gt que se evaluacutean e insertan en el resultado del

servlet

2 Los scriptlets del tipo lt codigo gt que se insertan en el meacutetodo _jspService del

servlet (ejecutado por service)

3 Las declaraciones del tipo lt Codigo gt que se insertan en el cuerpo de la clase del

servlet fuera de cualquier meacutetodo existente

NOTA Los comentarios en JSP se escriben lt-- Comentario JSP --gt en tanto que los

comentarios en HTML son de la forma lt--Comentario HTML --gt La diferencia

semaacutentica radica en que los comentarios HTML cuando se insertan en la respuesta enviada

por el servidor al cliente no se muestran cuando se visualiza el documento HTML pero si

Servidor Maacutequina Cliente

Explorador Web

Contenedor Web

Motor Servlet

Motor JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

los podemos ver cuando se visualiza el coacutedigo fuente en tanto que los comentarios JSP

aunque se inserten en la respuesta enviada por el servidor al cliente no son enviados al

explorador de forma que tampoco se muestran ni se ven cuando se visualiza el coacutedigo fuente

HTML desde el explorador

3211 EXPRESIONES

Se utiliza una expresioacuten JSP para insertar valores directamente en el resultado La sintaxis es

lt= expresioacuten gt Por ejemplo

lt= requestgetParameter(ldquoparNombre) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt lt= s gt

La fecha y hora actual es lt= new javautilDate() gt

La expresioacuten se evaluacutea se convierte a cadena y se inserta en la paacutegina Esta evaluacioacuten se

realiza durante la ejecucioacuten

32111 VARIABLES PREDEFINIDAS

Para simplificar estas expresiones se pueden utilizar cierta cantidad de variables

predefinidas Estos objetos impliacutecitos como tambieacuten se les llama estaacuten disponibles para su

uso durante la implementacioacuten de una paacutegina Web

bull pageContext Es un objeto de la clase PageContext que proporciona acceso a objetos

relacionados con los servlets

bull request Es un objeto de la clase HttpServletRequest que se puede obtener a traveacutes del

meacutetodo getRequest que encapsula los datos enviados por el cliente al servidor

bull response Es un objeto de la clase HttpServletResponse que puede obtenerse a traveacutes

del meacutetodo getResponse que encapsula los datos que el servidor enviaraacute al cliente

bull application Es un objeto de la clase ServletContext que se obtiene a traveacutes del meacutetodo

getServletContext que define un conjunto de meacutetodos que todo servlet utiliza para

comunicar con el contenedor de servlets

bull config Es un objeto de la clase ServletConfig que se obtiene a traveacutes del meacutetodo

getServletConfig y que se utiliza por el contenedor de servlets para pasar informacioacuten

al servlet durante la iniciacioacuten

bull session Es un objeto de la clase HttpSession que se obtiene a traveacutes del meacutetodo

getSession que proporciona una forma de identificar a un usuario que visita las paacuteginas

de un sitio Web

bull out Es un objeto de la clase JspWriter que se obtiene a traveacutes del meacutetodo getOut que

se utiliza para almacenar la respuesta que seraacute enviada al cliente que hizo la peticioacuten de

la paacutegina

bull page Es un objeto geneacuterico de la clase Object que se obtiene a traveacutes del meacutetodo

getPage y que representa al servlet obtenido a partir de la paacutegina JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

bull exception Es un objeto de la clase Exception que se obtiene a traveacutes del meacutetodo

getException que contendraacute informacioacuten a cerca de cualquier excepcioacuten que se lance

desde la paacutegina JSP

Un ejemplo del uso de uno de estos objetos impliacutecitos seriacutea el siguiente

El nombre de tu host es lt= requestgetRemoteHost() gt

El listado siguiente da un ejemplo de una paacutegina JSP que utiliza algunas variables

predefinidas como uso de expresiones JSP

ltDOCTYPE HTML PUBLIC -W3CDTD HTML 40 Transitional ENgt

lthtmlgt

ltheadgt

lttitlegt Expresiones JSP lttitlegt

ltheadgt

ltbodygt

lth2gt Expresiones JSP lth2gt

ltULgt

ltligt Fecha y hora en curso lt= new javautilDate() gt ltligt

ltligt Nombre de su host lt= requestgetRemoteHost() gt ltligt

ltligt Identificador de su sesioacuten lt= sessiongetId() gt ltligt

ltligt El paraacutemetro ltcodegt paramPrueba ltcodegt del formulario

lt= requestgetParameter(paramPrueba) gt ltligt

ltULgt

ltbodygt

lthtmlgt

Cuya salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3212 LOS SCRIPTLETS JSP

Si se desea hacer algo maacutes complejo que una simple expresioacuten los scriptlets permiten insertar

coacutedigo JAVA en el meacutetodo _jspService del servlet (que es ejecutado por service) La sintaxis

utilizada por los scriptlets es lt coacutedigo java gt Los escriptlets tienen acceso a las

mismas variables definidas de forma automaacutetica como expresiones A manera de ejemplo si

se desea que el resultado aparezca en la paacutegina generada deberiacutea de utilizarse la variable out

como en la siguiente instruccioacuten

lt String datosConsultados= requestgetQueryString()

outprintln(ldquoDatos GET adjuntos ldquo+datosConsultados)

gt

En este ejemplo podriacutea haberse obtenido el mismo resultado utilizando la siguiente expresioacuten

JSP

Datos GET adjuntos lt=requestgetQueryString() gt

En general los scriptlets pueden ejecutar varias tareas que no podriacutean realizarse con las

expresiones Tales tareas incluyen

bull La determinacioacuten de encabezados de respuesta

bull Actualizacioacuten de Bases de Datos

bull Ejecucioacuten de bucles condiciones y otras estructuras complejas

lt for (int i=1 ilt=6 i++)

gt

lth lt=i gtgt Hola Mundo lthlt=i gtgt

lt gt

Como un ejemplo concreto se muestra la siguiente paacutegina JSP llamada Cuentajsp en donde

se observa coacutemo se hace un seguimiento del nuacutemero de veces que un cliente accede a esta

paacutegina a traveacutes de distintas sesiones Para ello supondremos que dicha cuenta es el valor del

atributo atrCuenta del objeto impliacutecito application ya citado La primera vez que el cliente

accede a la paacutegina el valor de atrCuenta seraacute null debido a que auacuten no ha sido fijado este

atributo en este caso se fijaraacute con el valor 1 En los siguientes accesos se leeraacute el valor del

atributo atrCuenta se incrementaraacute en una unidad y se volveraacute a fijar Finalmente se enviacutea

la respuesta al cliente para que se muestre al usuario el valor del contador

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en el objeto impliacutecito application con el nombre

atrCuenta

--gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt

Integer cuenta = (Integer)applicationgetAttribute(atrCuenta)

String s = vez

if (cuenta == null)

cuenta = new Integer(1)

else

cuenta = new Integer(cuentaintValue() + 1)

s = veces

applicationsetAttribute(atrCuenta cuenta)

gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

Has visitado esta paacutegina lt= cuenta gt lt= s gt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional un fragmento de coacutedigo JAVA o scriptlet

expresiones y comentarioshellip

Aquiacute otro ejemplo de la ejecucioacuten de un coacutedigo demasiado complejo para una expresioacuten JSP

Este listado presenta una paacutegina JSP que utiliza el paraacutemetro de peticioacuten colorFondo para

establecer el color de fondo de la paacutegina

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgt

lttitlegt Prueba de Color lttitlegt

ltheadgt

lt

String colorFondo=requestgetParameter(colorFondo)

boolean tieneColorExplicito

if (colorFondo =null)

tieneColorExplicito=true

else

tieneColorExplicito=false

colorFondo=WHITE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt

ltbody bgcolor=lt= colorFondo gtgt

lth2 align=centergt Prueba de color lth2gt

lt

if (tieneColorExplicito)

outprintln(Ha indicado un color de fondo expliacutecito +

colorFondo +)

else

outprintln(Usareacute el color de fondo predeterminado WHITE +

Indique el atributo de peticioacuten

ltigtcolorFondoltigt+

para intentar un color estaacutendar un +

valor RRGGBB o para ver si el navegador Web +

permite el uso de nombres de color X11)

gt

ltbodygt

lthtmlgt

Cuyas posibles salidas son

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3213 DECLARACIONES JSP

Una declaracioacuten JSP permite definir meacutetodos o campos que seraacuten insertados en el cuerpo

principal de la clase del servlet (fuera del meacutetodo _jspService) Una declaracioacuten tiene la

sintaxis lt Coacutedigo Java gt Por ejemplo

lt int i=0 gt

lt

Public void jspinit()

coacutedigo de iniciacioacuten

gt

Una declaracioacuten no genera ninguacuten resultado y se usan junto con las expresiones JSP o los

scriptlets A continuacioacuten se muestra una paacutegina JSP que despliega la cantidad de veces que

se ha solicitado esta paacutegina desde que se arrancoacute el servidor haciendo uso de las

declaraciones JSP

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtDeclaraciones JSPlttitlegtltheadgt

ltbodygt

lth1gtDeclaraciones JSPlth1gt

lt-- Esto es un comentario en JSP --gt

lt private int recuentoAccesos=0 gt

lth2gt Accesos a la paacutegina desde el reinicio del servidor

lt= ++recuentoAccesos gt lth2gt

ltbodygt

lthtmlgt

La salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

322 EL LENGUAJE DE EXPRESION EN JSP 20

Anteriormente se ha visto la necesidad de utilizar fragmentos de coacutedigo java en el desarrollo

de paacuteginas JSP pero con la aparicioacuten de la especificacioacuten JSP 20 ya no hay necesidad de

utilizar fragmentos de coacutedigo Java para nada gracias al nuevo lenguaje de expresioacuten EL

(Expresioacuten Language) a la biblioteca de etiquetas estandar JSTL (JSP Standar Tag Library)

y a las nuevas formas para desarrollar etiquetas personalizadas

El lenguaje de expresioacuten JSP es maacutes un lenguaje de acceso a datos que un lenguaje de

programacioacuten Ya se ha visto que para pasar informacioacuten de un cliente a una paacutegina JSP se

utilizan paraacutemetros en la peticioacuten y atributos en la paacutegina El lenguaje de expresioacuten lo hace

posible sin tener que utilizar scriptlets o expresiones (lt= expresioacuten gt) Por ejemplo las

liacuteneas JSP 12 siguientes escritas utilizando coacutedigo Java

lt= requestgetParameter(ldquoparNombrerdquo) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt veces

bajo la especificacioacuten JSP 20 se pueden escribir de una forma maacutes sencilla como sigue

(ahora no se trata de coacutedigo JAVA)

$paramparNombre has visitado esta paacutegina

$atrCuenta veces

La sintaxis de JSP es sensible a mayuacutesculas y minuacutesculas pero un par de comillas simples es

equivalente a un par de comillas dobles

3221 VARIABLES PREDEFINIDAS (Objetos Impliacutecitos)

El lenguaje de expresioacuten JSP 20 soporta los objetos impliacutecitos siguientes

pageContext Objeto de javaxservletjspPageContext que proporciona acceso a los

datos de una peticioacuten

param Coleccioacuten (objeto de tipo javautilMap) de todos los valores de los paraacutemetros

enviados en una peticioacuten un String por paraacutemetro

paramValues Coleccioacuten de todos los valores de los paraacutemetros enviados en una

peticioacuten una matriz de tipo String por paraacutemetro

header Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten un

String por cabecera

headerValues Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten

una matriz de tipo String por cabecera

cookie Coleccioacuten de todos los valores de las cookies un objeto javaxservlethttpCookie

por cookie

initParam Coleccioacuten de todos los valores de los paraacutemetros de iniciacioacuten de la

aplicacioacuten un String por paraacutemetro

Tambieacuten hay objetos que permiten acceder a variables definidas en diferentes aacutembitos lo que

posibilita compartir informacioacuten

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

pageScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de paacutegina

requestScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

peticioacuten

sessionScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de sesioacuten

applicationScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

aplicacioacuten

3222 DIRECTRICES

Las directrices page incluye y taglib son mensajes para el motor JSP y son siempre incluidas

entre los siacutembolos lt y gt

32221 LA DIRECTRIZ PAGE

Define atributos que se aplican a toda la paacutegina JSP donde es incluida

lt page lista_de_atributos gt

Donde la lista_de_atributos puede contener algunos de los siguientes (aquellos que estaacuten

escritos en negrita son los tomados por omisioacuten)

language= ldquoscriptingLanguagerdquo

extends= rdquoclassNamerdquo

import= ldquoimportListrdquo

session= ldquotrue|falserdquo

buffer= ldquonone|sizeKb

autoflush= ldquotrue|falserdquo

isThreadSafe= rdquotrue|falserdquo

info= rdquoinfo_textrdquo

errorPage= ldquoerror_urlrdquo

isErrorPage= rdquotrue|falserdquo

contentType= rdquoctinfordquo

pageEncoding= rdquopeinfordquo

isELIgnored= ldquotrue|falserdquo

Tiacutepicamente se localiza al principio de la paacutegina JSP y puede haber cualquier nuacutemero de

ellas El lenguaje por omisioacuten es Java Ejemplos

lt page contentType=rdquotexthtmlrdquo language=rdquojavardquo gt

lt page import=rdquojavautil javalangrdquo gt

lt page buffer=rdquo5kbrdquo autoflush=rdquofalserdquo gt

32222 LA DIRECTRIZ INCLUDE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

La directriz include incluye un archivo (html jsp xml o de texto) en una paacutegina JSP Esto

permite dividir el contenido de la paacutegina en trozos maacutes manejables

lt incluye file=rdquoURL_relativordquo gt

El ejemplo siguiente muestra dos archivos el primero incluye al segundo para mostrar la

fecha y hora actuales

lt-- fichero mostrarFechaHorajsp --gt

lthtmlgt

ltheadgtlttitlegtIncluir un ficherolttitlegtltheadgt

ltbody bgcolor=whitegt

ltfont color=bluegt

La fecha y hora actuales son

lt include file=fechaHorajsp gt

ltfontgt

ltbodygt

lthtmlgt

lt-- fichero fechaHorajsp --gt

lt page import=javautil gt

lt= (new javautilDate())toLocaleString() gt

32223 LA DIRECTRIZ TAGLIB

La directriz taglib indica la biblioteca de acciones personalizadas que podremos utilizar en

la codificacioacuten de la paacutegina JSP Para distinguir esas acciones entre otras existentes se utiliza

un prefijo (prefix) Su sintaxis es

lt taglib (uri=rdquoURI_bibliotecardquo|tagdir=rdquoDir_biblioteca_tagrdquo)

prefix=rdquoprefijordquo gt

Cuando se trata de una biblioteca definida mediante una clase Java y un descriptor (archivo

tld) eacutesta se identifica mediante un URI (Uniform Resource Identifier- URL relativos) Por

ejemplo

lt taglib uri=rdquohttpMarioRossainzLopezmiBibliotecardquo

prefix=rdquofunrdquo gt

ltpgtltfunaccion01 gt

La uacuteltima liacutenea del ejemplo tiene dos etiquetas una etiqueta p HTML y otra accion01

perteneciente a la biblioteca miBiblioteca En cambio si la biblioteca se define mediante un

archivo tag entonces se identifica mediante su ruta relativa en el sistema de archivos

lt taglib tagdir=rdquoWEB-INFtagsrdquo prefix=rdquofunrdquo gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpgtltfunaccion01 gt

La directriz taglib debe colocarse antes de utilizar en la paacutegina JSP las acciones

personalizadas definidas por la misma Se puede utilizar maacutes de una directriz pero el prefijo

utilizado debe ser uacutenico para cada una de ellas

3223 ACTIVACION DEL LENGUAJE DE EXPRESION (LE)

La especificacioacuten JSP 20 define un lenguaje de expresioacuten como alternativa a elementos de

programacioacuten escritos con coacutedigo Java y especificaciones anteriores a la JSP 20 Para que

este lenguaje pueda ser interpretado tienen que cumplirse 2 requisitos

1 Que la propiedad isELIgnored de la directriz page valga false

lt page isELIgnored= ldquofalserdquo gt

2 Que el descriptor de despliegue webxml en la carpeta WEB-INF indique doacutende se

localiza el esquema XML para la especificacioacuten Servlet 24 que a su vez utiliza el

esquema XML para la especificacioacuten Java Server Page 20

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

Utilizando el lenguaje de expresioacuten se podriacutea modificar la paacutegina Cuentajsp de la seccioacuten

3212 de este documento como se muestra a continuacioacuten Esta nueva paacutegina

1 Especifica que utilizaraacute la biblioteca core de etiquetas estandar (de la que se hablaraacute maacutes

adelante)

2 La primera vez que sea accedida definiraacute la variable atrCuenta en el aacutembito de la

aplicacioacuten con un valor inicial nulo y la incrementaraacute en una unidad cuando sea accedida

sucesivas veces simplemente incrementaraacute esta variable en una unidad

3 Finalmente mostraraacute una paacutegina con un contenido anaacutelogo al siguiente Esta formado

por una cabecera y una segunda liacutenea compuesta por el valor del paraacutemetro parNombre

enviado con la peticioacuten un texto fijo el valor de la variable atrCuenta y otro texto fijo

dependiente del valor de esta variable

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

El coacutedigo completo es el siguiente

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

3224 VARIABLES Y EXPRESIONES

Para acceder a una simple variable se puede escribir algo como lo siguiente $nombre y

para acceder a una propiedad de un objeto podemos escribir algo como

$paramparNombre

$applicationScopeatrCuenta

$pageContextrequestrequestURI

La primera liacutenea del ejemplo anterior obtiene el valor de la propiedad parNombre del objeto

param la segunda el valor del atributo atrCuenta del objeto applicationScope y la tercera

el URL relativo de la paacutegina JSP solicitada

El lenguaje de expresioacuten es maacutes tolerante con respecto a las variables con valor null y ejecuta

muchas maacutes conversiones de forma automaacutetica sobre el tipo de los datos cuando la expresioacuten

a evaluar asiacute lo requiere Por ejemplo la etiqueta condicional siguiente incluye una expresioacuten

que compara el valor del atributo atrCuenta con aacutembito de aplicacioacuten con 10 (convirtiendo

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

impliacutecitamente el valor del atributo al tipo de la constante para poder realizar la comparacioacuten

El resultado seraacute un valor de tipo boolean

ltcif test=rdquo$applicationScopeatrCuenta gt 10rdquogt

ltcifgt

o bien

ltcif test=rdquo$atrCuenta gt 10rdquogt

ltcifgt

Para que una literal pueda incluir un caracter significativo para el lenguaje dicho caracter

debe ser especificado como una secuencia de escape (caracter) Por ejemplo la siguiente

expresioacuten da lugar al literal ldquovezrdquo o ldquovecesrdquo entre comillas dobles

$(atrCuenta gt 1) iquest ldquordquovecesrdquordquo ldquordquovezrdquordquo

Cualquier objeto o atributo de un objeto definido en algunos de los aacutembitos de una paacutegina

puede ser utilizado como una variable Por ejemplo $atrCuenta+1 es una expresioacuten que

realiza la suma de la variable atrCuenta con 1

Cuando se trate de una propiedad de un objeto para acceder a ella se utilizaraacute el operador

punto o bien la notacioacuten empleada para acceder a un elemento de una matriz Por ejemplo

$paramparNombre

$param[ldquoparNombrerdquo]

Una expresioacuten LE puede aparecer en cualquier lugar donde pueda aparecer un texto fijo Por

tanto para informar al contenedor JSP que se trata de una expresioacuten y no de un texto fijo se

utilizan los delimitadores $ al principio y al final

3225 OPERADORES

OPERADOR DESCRIPCIOacuteN Acceso a la propiedad de un objeto o a un elemento de un Map

[] Acceso al elemento de una matriz o de un objeto List

() Pareacutentesis para alterar la prioridad en la evaluacioacuten de una expresioacuten

If ternario condicion expresion1 expresioacuten 2

+ Suma

- Resta

Producto

oacute div Divisioacuten

oacute mod Moacutedulo o resto de una divisioacuten

== oacute eq Igualdad

= oacute ne Diferente

lt oacute lt Menor que

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt oacute gt Mayor que

lt= oacute le Menor o igual que

gt= oacute ge Mayor o igual que

ampamp oacute and Operacioacuten Loacutegica AND

|| oacute or Operacioacuten Loacutegica OR

oacute not Operacioacuten Loacutegica NOT

empty Verifica si el valor de una variable es null si un String esta vaciacuteo o si una matriz Map

o Collection no tienen elementos

func(args) Llamada a una funcioacuten donde func es el nombre de la funcioacuten y arg representa cero o

maacutes argumentos separados por comas

El ejemplo siguiente muestra una paacutegina JSP compuesta por elementos HTML expresiones

LE y objetos impliacutecitos

lthtmlgt

ltheadgtlttitlegtJSP 20lttitlegtltheadgt

ltbodygt

lth3gtLenguaje de expresioacuten (LE)lth3gt

ltpgtLa siguiente tabla ilustra algunas expresiones LE

ltbrgtltbrgtlttable border=1gt

lttrgt

ltthgtltbgtExpresioacutenltbgtltthgt

ltthgtltbgtValorltbgtltthgt

lttrgt

lttrgt

lttdgt$3 + 6lttdgt

lttdgt$3 + 6lttdgt

lttdgt

lttrgt

lttdgt$(7 gt 4) 7 4lttdgt

lttdgt$(7 gt 4) 7 4lttdgt

lttrgt

lttrgt

lttdgt$header[host]lttdgt

lttdgt$header[host]lttdgt

lttrgt

lttablegt

ltbodygt

lthtmlgt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

323 BIBLIOTECA ESTANDAR DE ETIQUETAS

La biblioteca estaacutendar de etiquetas JSP (JSTL ndash Java Server Page Estaacutendar Tag Library)

incluye una cantidad amplia de etiquetas para diferentes aacutereas de trabajo

Aacuterea baacutesica (su prefijo es c ndash core) y contiene

o Soporte de variables (remove y set)

o Control del flujo (choose when otherwise forEach forTokens if)

o Manejo de URL (import param redirect param y url param)

o Operaciones varias (match y out)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlcore

Aacuterea XML (su prefijo es x) y contiene

o Sentencias baacutesicas (out parse y set)

o Control del flujo (choosehellip whenhellip otherwise forEach e if)

o Transformacioacuten de Documentos (transformhellipparam)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlxml

Aacuterea Internacionalizacioacuten (su prefijo es fmt) Contiene

o Localidad (setLocale y requestEncoding)

o Mensajes (bundle message param y setBundle)

o Formateo de Fechas y nuacutemeros (formatNumber formateacuteate parseDate

parseNumber setTimeZone timeZone)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlfmt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Aacuterea SQL (su prefijo es sql) es el lenguaje estandar para interactuar con bases de datos

relacionales y contiene setDataSource Quero dateParam param transaction y

update dateParam param) El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlsql

Aacuterea Funciones (su prefijo es fn) y contiene

o Longitud de una coleccioacuten (length)

o Manipulacioacuten de String (toUpperCase toLowerCase substring

substringAfter substringBefore trim replace indexOf startsWith

endsWith contains containsIgnoreCase split join y escapeXml)

o El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlfunctions

3231 OPERACIONES CON ETIQUETAS BAacuteSICAS

En un ejemplo pasado teniacuteamos el siguiente coacutedigo

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

En este ejemplo se hace referencia al aacuterea baacutesica de JSTL con el prefijo c y se utiliza la

etiqueta cset para definir la variable atrCuenta Si la variable ya esta definida simplemente

se le asigna el valor especificado

La uacuteltima parte del ejemplo anterior podriacutea haberse escrito de esta otra forma

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcif test=rdquo$atrCuenta gt 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcifgt

$atrCuenta $str

La etiqueta cif permite la ejecucioacuten condicional de su cuerpo en funcioacuten del valor del

atributo de test

La etiqueta cchoose permite la ejecucioacuten del cuerpo de la primera etiqueta cwhen cuyo

atributo test sea evaluado a true Si ninguna de las condiciones se evaluacutea a true entonces se

evaluacutea el cuerpo de la etiqueta cotherwise si estaacute presente El siguiente coacutedigo muestra otra

manera de escribir el ejemplo anterior utilizando estas uacuteltimas etiquetas

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcchoosegt

ltcwhen test=rdquo$atrCuenta == 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcwhengt

ltcotherwisegt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcotherwisegt

ltcchoosegt

$atrCuenta $str

La etiqueta cforEach permite iterar sobre una coleccioacuten de objetos La coleccioacuten se

especifica por medio del atributo iacutetems y el elemento actual de la coleccioacuten estaacute disponible a

traveacutes de la variable establecida por el atributo var Por ejemplo el siguiente fragmento de

coacutedigo visualiza una tabla con las variables definidas a nivel de aacutembito de paacutegina

lttable border=rdquo1rdquogt

ltcforEach var=rdquoitemrdquo iacutetems=rdquo$pageScoperdquogt

lttrgt

lttdgt $item lttdgt

lttrgt

ltcforEachgt

lttablegt

La etiqueta ccatch atrapa una excepcioacuten que ocurra en el cuerpo de la misma Por ejemplo

el siguiente segmento de coacutedigo lanzaraacute una excepcioacuten si el paraacutemetro mes se escribe con

letras en vez de con nuacutemeros

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltbodygt

lthtmlgt

Un URL anaacutelogo al siguiente daraacute lugar a que la excepcioacuten sea lanzada cuando se ejecute la

expresioacuten $nMes 3 de la paacutegina anterior

httplocalhost8080JSP2exceppruebajspmes=marzo

La excepcioacuten indica que ha ocurrido un error al tratar de convertir ldquomarzordquo a un entero de

tipo Long Para cachar esta excepcioacuten y darle un tratamiento adecuado habraacute que modificar

la paacutegina JSP anterior como se indica a continuacioacuten

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltccatch var=rdquoerrorOcurridordquogt

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltccatchgt

ltcif test=rdquo$not empty errorOcurridordquogt

Error el paraacutemetro mes debe ser un nuacutemero ltbgt

ltbrgt Informacioacuten del error dada por el sistema

ltbrgt ltfont color=rdquoFF0000rdquogt $errorOcurrido ltfontgt

ltcifgt

ltbodygt

lthtmlgt

3232 ACCESO A BASES DE DATOS CON JSP

Las etiquetas que proporciona el aacuterea SQL permiten realizar

Conexioacuten con una base de datos

Realizacioacuten de consultas a la base de datos

Acceso al conjunto de resultados

Ejecucioacuten de actualizaciones y transacciones

Todas las etiquetas SQL actuacutean sobre una base de datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

32321 CONEXIOacuteN CON LA BASE DE DATOS

La conexioacuten con la base de datos puede realizarse con la etiqueta sqlsetDataSource Por

ejemplo si se esta utilizando el administrador de bases de datos MySql con el controlador

JDBC se puede realizar una conexioacuten con una base de datos digamos bd_tutorias de la

manera siguiente

ltsqlsetDataSource var=rdquobdrdquo

driver=rdquocommysqljdbcDriverrdquo

url=rdquojdbcmysqllocalhost3306bd_tutoriasrdquo

user=rdquoadminrdquo

password=rdquoadminadminrdquo gt

32322 CONSULTA A LA BASE DE DATOS

La etiqueta sqlQuero permite realizar una consulta a una base de datos Por ejemplo el

siguiente fragmento de coacutedigo realiza una consulta a la base de datos representada por bd y

obtiene un conjunto de resultados representado por cdr

ltsqlquery var=rdquocdrrdquo dataSource=rdquo$bdrdquogt

SELECT professor dia hora alumno

FROM profesores tutorias citas

WHERE profesoresid_profesor=tutoriasid_profesor

AND tutoriasid_tutoria=citasid_tutoria

ltsqlquerygt

32323 MODIFICACIONES SOBRE LA BASE DE DATOS

La etiqueta sqlupdate permite ejecutar una sentencia SQL INSERT UPDATE o DELETE

y cualquier otra sentencia SQL que no retorne ninguacuten valor Por ejemplo

ltsqlupdate var=rdquocontrdquo dataSource=rdquo$bdrdquo gt

UPDATE profesores

SET profesor=

WHERE profesor=

ltsqlparam value=rdquo$paramProfesorrdquo gt

ltsqlparam value=rdquo$paramIDrdquo gt

ltsqlupdategt

Una operacioacuten UPDATE puede utilizar el siacutembolo para indicar que el valor que tendriacutea que

evaluarse en esa posicioacuten seraacute suministrado por una etiqueta sqlparam como por ejemplo

httplocalhost8080JSP2sqlpruebajspProfesor=Mario+Rossainz+LopezampID=514

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Hasta este punto los servlets que hemos estudiado soacutelo enviacutean informacioacuten al navegador del

cliente No obstante estos clientes Web pueden Mostar formularios que permitan solicitar

datos a los usuarios que seraacuten enviados al servidor para por ejemplo ser almacenados en

una base de datos para posteriores peticiones o para otros procesos o bien para dar al usuario

una respuesta ajustada a dicha peticioacuten

En el siguiente URL se invoca la ejecucioacuten de un servlet llamado Parametros aportando la

lista de pares (Nombre Mario)-(Edad 22) en formato GET

httplocalhost8080ParametrosservletParametrosNombre=MarioampEdad=22

Hay que observar la manera de colocar los datos tras el siacutembolo ldquordquo y de separarlos con el

siacutembolo ldquoamprdquo El coacutedigo del servlet es el siguiente

import javaio

import javaxservlet

import javaxservlethttp

public class Parametros extends HttpServlet

public void doGet(HttpServletRequest request HttpServletResponse

response)

throws IOException ServletException

responsesetContentType(texthtml)

PrintWriter out = responsegetWriter()

outprintln(lthtmlgt)

outprintln(ltbodygt)

String NombreRecibido = requestgetParameter(Nombre)

String EdadRecibida = requestgetParameter(Edad)

outprintln(lth1gt Hola + NombreRecibido + lth1gt)

outprintln(lth1gt Tienes + EdadRecibida + antildeos lth1gt)

outprintln(ltbodygt)

outprintln(lthtmlgt)

El objeto httpServletRequest en el coacutedigo anterior request contiene una serie de meacutetodos de

utilidad para recibir informacioacuten proveniente del usuario en concreto el meacutetodo

getParameter permite obtener el valor asociado a un nombre en la lista de pares (nombre

valor) que puede proporcionar un URL

Ademaacutes de poder introducir el URL anterior en el navegador proporcionando directamente

los datos enviados al servlet en dicha URL

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Tambieacuten podemos generar el URL mediante una paacutegina Web que podraacute utilizar el usuario

lthtmlgt

ltbodygt

lth1gt Cuestionario lth1gt

ltform action=httplocalhost8080ParametrosservletParametros

method=getgt

Nombre ltinput type=text name=Nombregt ltbrgt

Edad ltinput type=text name=Edadgt ltbrgtltbrgt

ltinput type=submit value=Enviar datosgt ltbrgt

ltformgt

ltbodygt

lthtmlgt

Los formularios en HTML permiten enviar datos al servidor Web En la liacutenea 5 de la paacutegina

Web mostrada se encuentra la etiqueta form que en el ejemplo contiene el atributo action

que indica la accioacuten que debe realizarse en el servidor en este caso ejecutar el servlet

Parametros y el atributo method que indica la manera en la que se enviacutean los datos (en este

caso la peticioacuten GET)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Peticioacuten HTTP GET Cuando el tipo de peticioacuten HTTP es GET los datos del formulario

son enviados al servidor a continuacioacuten del URL especificado por el atributo action de form

El tamantildeo de la cadena enviada estaacute limitado y al estar en ASCII es totalmente legible por

tanto no es un modo seguro

Es por ello que cuando se requiere del enviacuteo de datos seguros y ademaacutes el nuacutemero de datos

del formulario que son enviados al servidor son muchos resulta ser mejor el uso del meacutetodo

POST Veamos otro ejemplo

import javaio

import javaxservlet

import javaxservlethttp

import javautil

public class MostrarParametros extends HttpServlet

public void doGet(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

responsesetContentType(texthtml)

PrintWriter out= responsegetWriter()

String titulo=Lectura de todos los paraacutemetros de Peticioacuten

outprintln(ltdoctype html public -W3CDTD HTML 40 +

TransitionalENgt)

outprintln(lthtmlgt)

outprintln(ltheadgtlttitlegt+titulo+lttitlegtltheadgt)

outprintln(ltbody bgcolor=FDF5E6gtn+

lth1 align=centergt+titulo+lth1gtn+

lttable border=1 align=centergtn+

lttr bgcolor=FFAD00gtn+

ltthgtNombre del parampaacutemetroltthgtValor(es) del

parampaacutemetro)

Enumeration nombresParam=requestgetParameterNames()

while(nombresParamhasMoreElements())

String nombreParam= (String)nombresParamnextElement()

outprint(lttrgtlttdgt+nombreParam+nltTDgt)

String[]valoresParam=

requestgetParameterValues(nombreParam)

if (valoresParamlength==1)

String valorParam=valoresParam[0]

if (valorParamlength()==0)

outprintln(ltigt Sin valor ltigt)

else

outprintln(valorParam)

else

outprintln(ltulgt)

for (int i=0 iltvaloresParamlengthi++)

outprintln(ltligt+valoresParam[i])

outprintln(ltulgt)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

outprintln(lttablegtnltbodygtlthtmlgt)

public void doPost(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

doGet(requestresponse)

El servlet escrito utiliza un meacutetodo doPost que soacutelo ejecuta a Donet Esto es porque se quiere

que el servlet pueda manejar tanto las peticiones GET como las POST Por otro lado el

formulario es el siguiente

ltdoctype html public -W3CDTD HTML 40 TransitionalENgt

lthtmlgt

ltheadgt

lttitlegt Un Formulario de ejemplo que utiliza POST lttitlegt

ltheadgt

ltbody bgcolor=FDF5E6gt

lth1 align=centergt Un formulario de Ejemplo que utiliza POST

lth1gt

ltform action=httplocalhost8080MostrarParametros

servletMostrarParametros

method=postgt

Nuacutemero de elemento ltinput type=text name=elemNumgt ltbrgt

Cantidad ltinput type=text name=cantidadgt ltbrgt

Precio Unitario ltinput type=text name=precio value=$gt

ltbrgtlthrgt

Nombre de Pila ltinput type=text name=nombrePilagt ltbrgt

Apellido(s) ltinput type=text name=apellidogt ltbrgt

Iniciales ltinput type=text name=inicialesgt ltbrgt

Domicilio de envio lttextarea name=domicilio rows=3

cols=40gtlttextareagt ltbrgt

Tarjeta de creacutedito ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta value=VisagtVisa ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta value=Master Cardgt

Master Card ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta value=AmexgtAmerican

Expresss ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta

value=DiscovergtDiscover ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta

value=Java Smart CardgtTarjeta Inteligente de Java

ltbrgt

Nuacutemero de la tarjeta de creacutedito

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltinput type=password name=numTarjetagtltbrgt

Repita el nuacutemero de la tarjeta de creacutedito

ltinput type=password name=numTarjetagtltbrgtltbrgt

ltcentergt

ltinput type=submit value=Enviar pedidogt

ltcentergt

ltformgt

ltbodygt

lthtmlgt

El formulario HTML del listado anterior utiliza POST como deberiacutea ser en todos los campos

que tienen contrasentildea

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Si intenta ejecutar el servlet MostrarParametros directamente en el explorador con el URL

httplocalhost8080MostrarParametrosservletMostrarParametros se obtendraacute la paacutegina

Web sin resultados

Peticioacuten HTTP POST Cuando el tipo de peticioacuten HTTP es POST los datos son enviados

al servidor en el cuerpo de la peticioacuten Es el meacutetodo maacutes usual de enviar los datos de un

formulario Con este tipo de peticioacuten la informacioacuten del formulario se enviacutea despueacutes del URL

indicado por action en el cuerpo de la peticioacuten y el tamantildeo de la informacioacuten enviada no esta

limitado

Seguacuten lo expuesto escoger el meacutetodo para enviar la informacioacuten no es difiacutecil Si los datos

son pocos y no importa su confidencialidad o manipulacioacuten utilizamos GET Si son largos

privados o importantes utilizamos POST

318 ACCESO A BASES DE DATOS CON SERVLETS

Una aplicacioacuten Java que realiza accesos a bases de datos funciona seguacuten una arquitectura que

permite escribir los programas abstrayeacutendose de los detalles de los niveles inferiores (discos

controladores sistema operativo etc) como lo muestra la figura siguiente

JDBC (Java DataBase Connectivity ndash Conexioacuten con Bases de Datos desde Java) es una API

de Java que permite ejecutar instrucciones SQL para manipular y gestionar bases de datos

relacionales Para que una aplicacioacuten Java pueda hacer operaciones sobre una base de datos

previamente tiene que establecer una conexioacuten con la misma Esta conexioacuten se realiza a

traveacutes de un controlador (driver) seguacuten la figura de arriba La API-JDBC se proporciona en

dos paquetes javasql y javaxsql El primer paquete contiene las interfaces y clases Java

fundamentales de JDBC en tanto que el segundo paquete es una extensioacuten del primero e

APLICACION

SISTEMA OPERATIVO

CONTROLADOR

Oracle Access MySql

JVM

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

incluye las clases que interactuacutean con JNDI y otras que gestionan conjuntos de conexiones

con una misma base de datos Para maacutes detalles del uso de JDBC veacutease el apeacutendice A de

estas notas

El primer paso para crear una conexioacuten entre una aplicacioacuten Java y una base de datos es

registrar el controlador JDBC adecuado para esa base con el fin de que la JVM pueda

utilizarlo Existen distintos tipos de controladores JDBC por ejemplo

ldquocommysqljdbcDriverrdquo que es el controlador utilizado cuando el motor de base de datos

que se utiliza es MySql

En el supuesto caso de que la base de datos soacutelo permitiera el acceso a traveacutes de controladores

ODBC como lo hace ACCESS siempre podemos usar el controlador puente JDBC-ODBC

incluido como parte del JDK ldquosunjdbcodbcJdbcOdbcDriverrdquo Este tipo de controladores

es decir los basados en ODBC (Open DataBase Connectivity) son bastante utilizados en

entornos Windows pues este SO incluye ODBC El apeacutendice A describe al final como

administrar los oriacutegenes de datos ODBC en Windows

Asiacute pues la mayor ventaja de los servlets con respecto a la conexioacuten con bases de datos viacutea

JDBC es que su ciclo de vida les permite mantener conexiones abiertas con las mismas a lo

largo de toda una sesioacuten Esto permite recortar tiempo con respecto a otras tecnologiacuteas como

la CGI Ademaacutes JDBC es una tecnologiacutea independiente de las bases de datos

Como ejemplo vamos a implementar una simple aplicacioacuten Web basada en servlets que

muestre una especie de directorio de personas La aplicacioacuten podraacute consultar insertar

modificar borrar o listar la informacioacuten de cada una de las personas almacenadas en la base

de datos a la que se hace acceso (que estaraacute en formato access)

La estructura de la Base de Datos es una tabla con los siguientes campos

DNI Nombre Apellido Edad

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

53023767A Pedro Rubio 18

77459822P Luis Tejedor 47

123456MRL Mario Rossainz 35

La estructura de la aplicacioacuten se muestra en la figura siguiente

lthtmlgt

ltbodygt

lttable border=1gtlttrgtlttdgt

ltform action=httplocalhost8080directorioTelservletSvAccesoBD

method=getgt

DNI ltinput type=text name=DNIgt ltbrgt

Nombre ltinput type=text name=Nombregt ltbrgt

Apellido ltinput type=text name=Apellidogt ltbrgt

Edad ltinput type=text name=Edadgt ltbrgtltbrgt

ltinput type=submit value=Consultar name=BotonConsultargt

ltinput type=submit value=Insertar name=BotonInsertargt

ltinput type=submit value=Modificar name=BotonModificargt

ltinput type=submit value=Borrar name=BotonBorrargt

ltinput type=submit value=Listar name=BotonListargt ltbrgt

ltcentergt

ltinput type=submit value= |lt name=BotonPrimerogt

ltinput type=submit value= -- name=BotonMenosCincogt

ltinput type=submit value= - name=BotonAnteriorgt

ltinput type=submit value= + name=BotonSiguientegt

ltinput type=submit value= ++ name=BotonMasCincogt

ltinput type=submit value= gt| name=BotonUltimogt

ltcentergt

lttdgt

lttdgt

lttextarea name=AreaDeListado rows=10 cols=35gtlttextareagt

SvAccesoBDhtml

SvAccesoBD

ObBorrado ObListado ObConsulta

ObInsercion

ObModificacion

ObPosicionamiento

ObRegistro

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lttdgt

lttrgt

ltformgt

lttablegt

ltbodygt

lthtmlgt

SvAccesoBDhtml

import javaio

import javaxservlet

import javaxservlethttp

public class SvAccesoBD extends HttpServlet

private int PosicionBuscada = 1

private String AreaDeListado=

PrintWriter out

public void doGet(HttpServletRequest request HttpServletResponse response)

throws IOException ServletException

String DNI = requestgetParameter(DNI)

String Nombre = requestgetParameter(Nombre)

String Apellido = requestgetParameter(Apellido)

String Edad = requestgetParameter(Edad)

String BotonConsultar = requestgetParameter(BotonConsultar)

String BotonInsertar = requestgetParameter(BotonInsertar)

String BotonModificar = requestgetParameter(BotonModificar)

String BotonBorrar = requestgetParameter(BotonBorrar)

String BotonListar = requestgetParameter(BotonListar)

String BotonPrimero = requestgetParameter(BotonPrimero)

String BotonMenosCinco = requestgetParameter(BotonMenosCinco)

String BotonAnterior = requestgetParameter(BotonAnterior)

String BotonSiguiente = requestgetParameter(BotonSiguiente)

String BotonMasCinco = requestgetParameter(BotonMasCinco)

String BotonUltimo = requestgetParameter(BotonUltimo)

AreaDeListado = requestgetParameter(AreaDeListado)

responsesetContentType(texthtml)

out = responsegetWriter()

outprintln(lthtmlgt)

outprintln(ltbodygt)

if (BotonConsultar=null) ConsultarDatos(DNI)

if (BotonInsertar=null) InsertarDatos(DNINombreApellidoEdad)

if (BotonModificar=null) ModificarDatos(DNINombreApellidoEdad)

if (BotonBorrar=null) BorrarDatos(DNI)

if (BotonListar=null) ListarDatos(DNI)

if (BotonPrimero=null) Controles(1)

if (BotonMenosCinco=null) Controles(2)

if (BotonAnterior=null) Controles(3)

if (BotonSiguiente=null) Controles(4)

if (BotonMasCinco=null) Controles(5)

if (BotonUltimo=null) Controles(0)

outprintln(ltbodygt)

outprintln(lthtmlgt)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

private void ConsultarDatos(String DNI)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObRegistro InstanciaFila = InstanciaConsultaDameDatos()

GenerarRespuesta(InstanciaFilaDameDNI()InstanciaFilaDameNombre()

InstanciaFilaDameApellido()

StringvalueOf(InstanciaFilaDameEdad()))

else

GenerarRespuesta(DNI------------)

PosicionBuscada = 1

public void ListarDatos(String DNI)

ObListado InstanciaListado = new ObListado()

AreaDeListado = InstanciaListadoDameResultado()

ConsultarDatos(DNI)

PosicionBuscada = 1

public void BorrarDatos(String DNI)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObBorrado InstanciaBorrado = new ObBorrado(PosicionBuscada)

GenerarRespuesta()

else

GenerarRespuesta(----------------)

PosicionBuscada = 1

public void ModificarDatos(String DNI String Nombre String Apellido

String Edad)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObRegistro InstanciaFila = new ObRegistro(DNI Nombre Apellido

IntegerparseInt(Edad))

ObModificacion InstanciaModificacion = new ObModificacion(PosicionBuscada

InstanciaFila)

GenerarRespuesta(DNINombreApellidoEdad)

else

GenerarRespuesta(----------------)

PosicionBuscada = 1

public void InsertarDatos(String DNI String Nombre String Apellido

String Edad)

ObRegistro InstanciaFila = new ObRegistro(DNI Nombre Apellido

IntegerparseInt(Edad))

ObInserccion InstanciaInserccion = new ObInserccion(InstanciaFila)

GenerarRespuesta()

PosicionBuscada=1

public void Controles(String Identificador)

ObPosicionamiento InstanciaPosicionamiento =

new ObPosicionamiento(IdentificadorPosicionBuscada)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ObRegistro InstanciaFila = InstanciaPosicionamientoDameDatos()

GenerarRespuesta(InstanciaFilaDameDNI()InstanciaFilaDameNombre()

InstanciaFilaDameApellido()

StringvalueOf(InstanciaFilaDameEdad()))

PosicionBuscada = InstanciaPosicionamientoPosicion()

private void GenerarRespuesta(String DNI String Nombre String Apellido

String Edad)

outprintln(lttable border=1gt)

outprintln(lttrgt)

outprintln(lttdgt)

outprintln(ltform

action=httplocalhost8080directorioTelservletSvAccesoBD

method=getgt)

outprintln( DNI ltinput type=text name=DNI value=+DNI+gtltbrgt)

outprintln( Nombre ltinput type=text name=Nombre

value=+Nombre+gtltbrgt)

outprintln( Apellido ltinput type=text name=Apellido

value=+Apellido+gtltbrgt)

outprintln( Edad ltinput type=text name=Edad

value=+Edad+gtltbrgtltbrgt)

outprintln( ltinput type=submit value=Consultar

name=BotonConsultargt)

outprintln( ltinput type=submit value=Insertar

name=BotonInsertargt)

outprintln( ltinput type=submit value=Modificar

name=BotonModificargt)

outprintln( ltinput type=submit value=Borrar name=BotonBorrargt)

outprintln( ltinput type=submit value=Listar name=BotonListargt

ltbrgt)

outprintln( ltcentergt)

outprintln( ltinput type=submit value= |lt name=BotonPrimerogt)

outprintln( ltinput type=submit value= --

name=BotonMenosCincogt)

outprintln( ltinput type=submit value= - name=BotonAnteriorgt)

outprintln( ltinput type=submit value= +

name=BotonSiguientegt)

outprintln( ltinput type=submit value= ++

name=BotonMasCincogt)

outprintln( ltinput type=submit value= gt| name=BotonUltimogt)

outprintln( ltcentergt)

outprintln( lttdgt)

outprintln( lttdgt)

outprintln( lttextarea name=AreaDeListado rows=10

cols=35gt+AreaDeListado+lttextareagt)

outprintln( lttdgt)

outprintln( lttrgt)

outprintln( ltformgt)

outprintln( lttablegt)

SvAccesoBDjava

import javasql

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

public class ObBorrado

ObBorrado(int PosicionBuscada)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

Personasabsolute(PosicionBuscada)

PersonasdeleteRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

ObBorradojava

import javasql

import javaawtTextArea

public class ObListado

private String Resultado=

ObListado()

String DNI Nombre Apellido Linea

int Edad Posicion

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement()

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

while (Personasnext())

DNI = PersonasgetString(DNI)

Nombre = PersonasgetString(Nombre)

Apellido = PersonasgetString(Apellido)

Edad = PersonasgetInt(Edad)

Posicion = PersonasgetRow()

Linea = DNI+ +Nombre+ +Apellido+ +StringvalueOf(Edad)

Resultado=Resultado+StringvalueOf(Posicion)+ +Linea+n

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public String DameResultado()

return Resultado

ObListadojava

public class ObRegistro

private String DNI Nombre Apellido

private int Edad

ObRegistro (String DNI String Nombre String Apellido int Edad)

thisDNI = DNI

thisNombre = Nombre

thisApellido = Apellido

thisEdad = Edad

String DameDNI()

return DNI

String DameNombre()

return Nombre

String DameApellido()

return Apellido

int DameEdad()

return Edad

ObRegistrojava

import javasql

public class ObConsulta

private int Posicion = 0

private ObRegistro DatosPersona

ObConsulta(String DNIPedido)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement()

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

while (Personasnext())

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

String DNI = PersonasgetString(DNI)

if (DNIequalsIgnoreCase(DNIPedido))

Posicion = PersonasgetRow()

String Nombre = PersonasgetString(Nombre)

String Apellido = PersonasgetString(Apellido)

int Edad = PersonasgetInt(Edad)

DatosPersona = new ObRegistro(DNINombreApellidoEdad)

break

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public int PosicionEncontrada()

return Posicion

public ObRegistro DameDatos()

return DatosPersona

ObConsultajava

import javasql

public class ObInserccion

ObInserccion(ObRegistro Datos)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

PersonasmoveToInsertRow()

PersonasupdateString(DNI DatosDameDNI())

PersonasupdateString(NombreDatosDameNombre())

PersonasupdateString(Apellido DatosDameApellido())

PersonasupdateInt(EdadDatosDameEdad())

PersonasinsertRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

catch (SQLException e)

Systemoutprintln(e)

ObInsercionjava

import javasql

public class ObModificacion

ObModificacion(int PosicionBuscada ObRegistro Datos)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

Personasabsolute(PosicionBuscada)

PersonasupdateString(DNIDatosDameDNI())

PersonasupdateString(NombreDatosDameNombre())

PersonasupdateString(ApellidoDatosDameApellido())

PersonasupdateInt(EdadDatosDameEdad())

PersonasupdateRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

ObModificacionjava

import javasql

public class ObPosicionamiento

private ObRegistro DatosPersona

private int Posicion

ObPosicionamiento(String Accion int Posicion)

int IDAccionEdad

String DNINombreApellido

boolean PosicionCorrecta=false

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

FROM DatosPersonales)

Personasabsolute(Posicion)

IDAccion = IntegerparseInt(Accion)

switch (IDAccion)

case 0

PosicionCorrecta = Personaslast()

break

case 1

PosicionCorrecta = Personasfirst()

break

case 2

PosicionCorrecta = Personasrelative(-5)

break

case 3

PosicionCorrecta = Personasprevious()

break

case 4

PosicionCorrecta = Personasnext()

break

case 5

PosicionCorrecta = Personasrelative(+5)

break

if (PosicionCorrecta)

thisPosicion = PersonasgetRow()

DNI = PersonasgetString(DNI)

Nombre = PersonasgetString(Nombre)

Apellido = PersonasgetString(Apellido)

Edad = PersonasgetInt(Edad)

else

thisPosicion = Posicion

DNI = ----

Nombre = ----

Apellido = ----

Edad = 0

DatosPersona = new ObRegistro(DNINombreApellidoEdad)

Personasclose()

Conexionclose()

SentenciaSQLclose()

Systemoutprintln(StringvalueOf(Posicion)++StringvalueOf(thisPosicion))

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public int Posicion()

return Posicion

public ObRegistro DameDatos() return DatosPersona

ObPosicionamientojava

En este ejemplo se emplean servlets y paacuteginas Web Los clientes habitualmente trabajan en

una computadora remota y los programas se ejecutan en un servidor El mecanismo de

comunicaciones que soporta el protocolo http nos permite consultar en el servidor los datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

que ha seleccionado o escrito el usuario de esta manera se puede observar una disociacioacuten

entre la interfaz graacutefica de usuario (que se ejecuta en los equipos de los clientes) y el

programa que recoge los datos y ejecuta las acciones pertinentes (que se ejecuta en el

servidor)

Como puede observarse el coacutedigo SvAccessoBD es un servlet que lleva a cabo las siguientes

operaciones

1 Recoge los valores provenientes del usuario

2 Determina la naturaleza de la accioacuten a realizar

3 Realiza su cometido con la base de datos

4 Genera la respuesta que recibiraacute el usuario

32 JSP

JSP significa Java Server Pages que traducido quiere decir Paacuteginas de Servidor Java y es

por tanto una tecnologiacutea orientada a crear paacuteginas Web con programacioacuten en JAVA es decir

permite mezclar HTML estaacutendar y estaacutetico con un contenido dinaacutemico etiquetas especiales

(oacuterdenes) y trozos de coacutedigo JAVA (scriptlets o secuencias de oacuterdenes) o contenido dinaacutemico

generado por servlets Eacuteste contenido dinaacutemico se encuentra encerrado en etiquetas

especiales muchas de las cuales inician con lt y finalizan con gt El motor de las paacuteginas

JSP esta basado en los servlets de JAVA

En la tecnologiacutea JSP se crean paacuteginas parecidas a las paacuteginas que se crean en ASP (Active

Server Page de Microsoft) o PHP (Personal Home Page) que son dos tecnologiacuteas de paacuteginas

ejecutadas en el servidor Sin embargo JSP no se cintildee a un sistema operativo o servidor Web

en particular ademaacutes de que proporciona acceso a la tecnologiacutea de Servlets y a JAVA en la

parte dinaacutemica

El proceso para generar paacuteginas JSP accesibles en Web es mucho maacutes simple que en los

servlets Dando por hecho que se tiene un servidor Web que permite usar JSP el coacutedigo se

almacenaraacute en archivos con extensioacuten jsp que incluyen dentro de la estructuras de etiquetas

HTML las sentencias JAVA a ejecutar y tan soacutelo se colocaraacuten en cualquier lugar en donde

se pusiera una paacutegina Web normal sin compilacioacuten sin paquetes y sin configuracioacuten aunque

el servidor tendraacute que ser configurado para acceder a los archivos de clases Servlets y de

JSPs

Aunque lo que se escriba con frecuencia luciraacute como un archivo HTML estaacutendar detraacutes de

ello la paacutegina JSP se convierte automaacuteticamente en un servlet normal donde el HTML

estaacutetico tan soacutelo es enviado al flujo de salida asociado con el meacutetodo service del servlet Esta

traduccioacuten se realiza la primera vez que se solicita la paacutegina De acuerdo como este

configurado el servidor es posible ver el coacutedigo fuente de los servlets generados a partir de

sus paacuteginas JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Por ejemplo supongamos que se ha escrito el siguiente coacutedigo en el archivo Saludojsp

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtEjemplo JSPlttitlegtltheadgt

ltbody bgcolor=ffffccgt

ltcentergt

lth2gtHola mundolth2gt

ltjavautilDate hoy = new javautilDate()gt

La fecha de hoy es lt=hoygt

ltcentergt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional y un fragmento de un scriptlet de JAVA La etiqueta

lt identifica el comienzo del scriptlet y gt el final Una expresioacuten de la forma =variable

es sustituida por el valor de esa variable Para ejecutar esta paacutegina o cualquier otra paacutegina

JSP desde un navegador hay que instalarla en el servidor de aplicaciones de la misma manera

en como se hizo con los servlets Suponiendo entonces que se tiene instalado el Tomcat 5

siga los siguientes pasos

1 Antildeadir en el servidor la carpeta digamos JSP2 dentro de la carpeta webapps del Tomcat

y construir sobre ella la jerarquiacutea de clases ya conocida de los servlets

webappsrarrJSP2rarrWEB-INFrarrclasses

WEB-INFrarrlib

WEB-INFrarrtags

2 Editar en la carpeta WEB-INF el descriptor de despliegue webxml que se indica a

continuacioacuten Este archivo XML indica doacutende se localiza el esquema XML para la

especificacioacuten Servlet 24 que a suvez utiliza el esquema XML para la especificacioacuten

Java Server Page 20 que son las especificaciones que soporta en servidor Tomcat

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=

httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

3 Crear en JSP2 la carpeta saludo que contendraacute la aplicacioacuten y copiar en ella la paacutegina

Saludojsp

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

4 Arrancar el servidor Si el servidor ya estaba arrancado detenerlo y volverlo a arrancar o

bien abrir el explorador escribir el URL httplocalhost8080managerhtml e instalar

la aplicacioacuten

5 Una vez arrancado el servidor verificar si estaacute funcionando correctamente escribiendo

el URL siguiente en el explorador httplocalhost8080 El explorador debe mostrar la

paacutegina del Tomcat

6 Ejecutar la paacutegina JSP iniciando el explorador y escribiendo el URL siguiente

httplocalhost8080JSP2saludoSaludojsp donde la sintaxis geneacuterica es

httpservidor[puerto]MiCarpetapaginajsp

Cuando esta paacutegina (Saludojsp) es invocada por primera vez el motor JSP lleva a cabo una

fase de traduccioacuten de la misma en un servlet y el motor Servlet es el que ejecutaraacute eacuteste uacuteltimo

para generar el HTML dinaacutemico que seraacute enviado al explorador cliente seguacuten puede

deducirse de la figura siguiente La proacutexima vez que la paacutegina sea solicitada el motor JSP

ejecutaraacute el servlet que fue caragado la primera vez a no ser que la paacutegina haya cambiado

en cuyo caso seraacute compilada automaacuteticamente en un nuevo servlet y ejecutada

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Regresando al ejemplo el archivo java generado por el Tomcat a partir del archivo

Saludojsp se localiza en la carpeta workCatalinalocalhost de la instalacioacuten de Tomcat

321 ELEMENTOS PARA SECUENCIAS DE COMANDOS

Los elementos para secuencias de comandos permiten insertar coacutedigo en el servlet que seraacute

generado a partir de la paacutegina JSP Existen tres formas

1 Expresiones del tipo lt= expresioacuten gt que se evaluacutean e insertan en el resultado del

servlet

2 Los scriptlets del tipo lt codigo gt que se insertan en el meacutetodo _jspService del

servlet (ejecutado por service)

3 Las declaraciones del tipo lt Codigo gt que se insertan en el cuerpo de la clase del

servlet fuera de cualquier meacutetodo existente

NOTA Los comentarios en JSP se escriben lt-- Comentario JSP --gt en tanto que los

comentarios en HTML son de la forma lt--Comentario HTML --gt La diferencia

semaacutentica radica en que los comentarios HTML cuando se insertan en la respuesta enviada

por el servidor al cliente no se muestran cuando se visualiza el documento HTML pero si

Servidor Maacutequina Cliente

Explorador Web

Contenedor Web

Motor Servlet

Motor JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

los podemos ver cuando se visualiza el coacutedigo fuente en tanto que los comentarios JSP

aunque se inserten en la respuesta enviada por el servidor al cliente no son enviados al

explorador de forma que tampoco se muestran ni se ven cuando se visualiza el coacutedigo fuente

HTML desde el explorador

3211 EXPRESIONES

Se utiliza una expresioacuten JSP para insertar valores directamente en el resultado La sintaxis es

lt= expresioacuten gt Por ejemplo

lt= requestgetParameter(ldquoparNombre) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt lt= s gt

La fecha y hora actual es lt= new javautilDate() gt

La expresioacuten se evaluacutea se convierte a cadena y se inserta en la paacutegina Esta evaluacioacuten se

realiza durante la ejecucioacuten

32111 VARIABLES PREDEFINIDAS

Para simplificar estas expresiones se pueden utilizar cierta cantidad de variables

predefinidas Estos objetos impliacutecitos como tambieacuten se les llama estaacuten disponibles para su

uso durante la implementacioacuten de una paacutegina Web

bull pageContext Es un objeto de la clase PageContext que proporciona acceso a objetos

relacionados con los servlets

bull request Es un objeto de la clase HttpServletRequest que se puede obtener a traveacutes del

meacutetodo getRequest que encapsula los datos enviados por el cliente al servidor

bull response Es un objeto de la clase HttpServletResponse que puede obtenerse a traveacutes

del meacutetodo getResponse que encapsula los datos que el servidor enviaraacute al cliente

bull application Es un objeto de la clase ServletContext que se obtiene a traveacutes del meacutetodo

getServletContext que define un conjunto de meacutetodos que todo servlet utiliza para

comunicar con el contenedor de servlets

bull config Es un objeto de la clase ServletConfig que se obtiene a traveacutes del meacutetodo

getServletConfig y que se utiliza por el contenedor de servlets para pasar informacioacuten

al servlet durante la iniciacioacuten

bull session Es un objeto de la clase HttpSession que se obtiene a traveacutes del meacutetodo

getSession que proporciona una forma de identificar a un usuario que visita las paacuteginas

de un sitio Web

bull out Es un objeto de la clase JspWriter que se obtiene a traveacutes del meacutetodo getOut que

se utiliza para almacenar la respuesta que seraacute enviada al cliente que hizo la peticioacuten de

la paacutegina

bull page Es un objeto geneacuterico de la clase Object que se obtiene a traveacutes del meacutetodo

getPage y que representa al servlet obtenido a partir de la paacutegina JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

bull exception Es un objeto de la clase Exception que se obtiene a traveacutes del meacutetodo

getException que contendraacute informacioacuten a cerca de cualquier excepcioacuten que se lance

desde la paacutegina JSP

Un ejemplo del uso de uno de estos objetos impliacutecitos seriacutea el siguiente

El nombre de tu host es lt= requestgetRemoteHost() gt

El listado siguiente da un ejemplo de una paacutegina JSP que utiliza algunas variables

predefinidas como uso de expresiones JSP

ltDOCTYPE HTML PUBLIC -W3CDTD HTML 40 Transitional ENgt

lthtmlgt

ltheadgt

lttitlegt Expresiones JSP lttitlegt

ltheadgt

ltbodygt

lth2gt Expresiones JSP lth2gt

ltULgt

ltligt Fecha y hora en curso lt= new javautilDate() gt ltligt

ltligt Nombre de su host lt= requestgetRemoteHost() gt ltligt

ltligt Identificador de su sesioacuten lt= sessiongetId() gt ltligt

ltligt El paraacutemetro ltcodegt paramPrueba ltcodegt del formulario

lt= requestgetParameter(paramPrueba) gt ltligt

ltULgt

ltbodygt

lthtmlgt

Cuya salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3212 LOS SCRIPTLETS JSP

Si se desea hacer algo maacutes complejo que una simple expresioacuten los scriptlets permiten insertar

coacutedigo JAVA en el meacutetodo _jspService del servlet (que es ejecutado por service) La sintaxis

utilizada por los scriptlets es lt coacutedigo java gt Los escriptlets tienen acceso a las

mismas variables definidas de forma automaacutetica como expresiones A manera de ejemplo si

se desea que el resultado aparezca en la paacutegina generada deberiacutea de utilizarse la variable out

como en la siguiente instruccioacuten

lt String datosConsultados= requestgetQueryString()

outprintln(ldquoDatos GET adjuntos ldquo+datosConsultados)

gt

En este ejemplo podriacutea haberse obtenido el mismo resultado utilizando la siguiente expresioacuten

JSP

Datos GET adjuntos lt=requestgetQueryString() gt

En general los scriptlets pueden ejecutar varias tareas que no podriacutean realizarse con las

expresiones Tales tareas incluyen

bull La determinacioacuten de encabezados de respuesta

bull Actualizacioacuten de Bases de Datos

bull Ejecucioacuten de bucles condiciones y otras estructuras complejas

lt for (int i=1 ilt=6 i++)

gt

lth lt=i gtgt Hola Mundo lthlt=i gtgt

lt gt

Como un ejemplo concreto se muestra la siguiente paacutegina JSP llamada Cuentajsp en donde

se observa coacutemo se hace un seguimiento del nuacutemero de veces que un cliente accede a esta

paacutegina a traveacutes de distintas sesiones Para ello supondremos que dicha cuenta es el valor del

atributo atrCuenta del objeto impliacutecito application ya citado La primera vez que el cliente

accede a la paacutegina el valor de atrCuenta seraacute null debido a que auacuten no ha sido fijado este

atributo en este caso se fijaraacute con el valor 1 En los siguientes accesos se leeraacute el valor del

atributo atrCuenta se incrementaraacute en una unidad y se volveraacute a fijar Finalmente se enviacutea

la respuesta al cliente para que se muestre al usuario el valor del contador

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en el objeto impliacutecito application con el nombre

atrCuenta

--gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt

Integer cuenta = (Integer)applicationgetAttribute(atrCuenta)

String s = vez

if (cuenta == null)

cuenta = new Integer(1)

else

cuenta = new Integer(cuentaintValue() + 1)

s = veces

applicationsetAttribute(atrCuenta cuenta)

gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

Has visitado esta paacutegina lt= cuenta gt lt= s gt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional un fragmento de coacutedigo JAVA o scriptlet

expresiones y comentarioshellip

Aquiacute otro ejemplo de la ejecucioacuten de un coacutedigo demasiado complejo para una expresioacuten JSP

Este listado presenta una paacutegina JSP que utiliza el paraacutemetro de peticioacuten colorFondo para

establecer el color de fondo de la paacutegina

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgt

lttitlegt Prueba de Color lttitlegt

ltheadgt

lt

String colorFondo=requestgetParameter(colorFondo)

boolean tieneColorExplicito

if (colorFondo =null)

tieneColorExplicito=true

else

tieneColorExplicito=false

colorFondo=WHITE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt

ltbody bgcolor=lt= colorFondo gtgt

lth2 align=centergt Prueba de color lth2gt

lt

if (tieneColorExplicito)

outprintln(Ha indicado un color de fondo expliacutecito +

colorFondo +)

else

outprintln(Usareacute el color de fondo predeterminado WHITE +

Indique el atributo de peticioacuten

ltigtcolorFondoltigt+

para intentar un color estaacutendar un +

valor RRGGBB o para ver si el navegador Web +

permite el uso de nombres de color X11)

gt

ltbodygt

lthtmlgt

Cuyas posibles salidas son

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3213 DECLARACIONES JSP

Una declaracioacuten JSP permite definir meacutetodos o campos que seraacuten insertados en el cuerpo

principal de la clase del servlet (fuera del meacutetodo _jspService) Una declaracioacuten tiene la

sintaxis lt Coacutedigo Java gt Por ejemplo

lt int i=0 gt

lt

Public void jspinit()

coacutedigo de iniciacioacuten

gt

Una declaracioacuten no genera ninguacuten resultado y se usan junto con las expresiones JSP o los

scriptlets A continuacioacuten se muestra una paacutegina JSP que despliega la cantidad de veces que

se ha solicitado esta paacutegina desde que se arrancoacute el servidor haciendo uso de las

declaraciones JSP

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtDeclaraciones JSPlttitlegtltheadgt

ltbodygt

lth1gtDeclaraciones JSPlth1gt

lt-- Esto es un comentario en JSP --gt

lt private int recuentoAccesos=0 gt

lth2gt Accesos a la paacutegina desde el reinicio del servidor

lt= ++recuentoAccesos gt lth2gt

ltbodygt

lthtmlgt

La salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

322 EL LENGUAJE DE EXPRESION EN JSP 20

Anteriormente se ha visto la necesidad de utilizar fragmentos de coacutedigo java en el desarrollo

de paacuteginas JSP pero con la aparicioacuten de la especificacioacuten JSP 20 ya no hay necesidad de

utilizar fragmentos de coacutedigo Java para nada gracias al nuevo lenguaje de expresioacuten EL

(Expresioacuten Language) a la biblioteca de etiquetas estandar JSTL (JSP Standar Tag Library)

y a las nuevas formas para desarrollar etiquetas personalizadas

El lenguaje de expresioacuten JSP es maacutes un lenguaje de acceso a datos que un lenguaje de

programacioacuten Ya se ha visto que para pasar informacioacuten de un cliente a una paacutegina JSP se

utilizan paraacutemetros en la peticioacuten y atributos en la paacutegina El lenguaje de expresioacuten lo hace

posible sin tener que utilizar scriptlets o expresiones (lt= expresioacuten gt) Por ejemplo las

liacuteneas JSP 12 siguientes escritas utilizando coacutedigo Java

lt= requestgetParameter(ldquoparNombrerdquo) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt veces

bajo la especificacioacuten JSP 20 se pueden escribir de una forma maacutes sencilla como sigue

(ahora no se trata de coacutedigo JAVA)

$paramparNombre has visitado esta paacutegina

$atrCuenta veces

La sintaxis de JSP es sensible a mayuacutesculas y minuacutesculas pero un par de comillas simples es

equivalente a un par de comillas dobles

3221 VARIABLES PREDEFINIDAS (Objetos Impliacutecitos)

El lenguaje de expresioacuten JSP 20 soporta los objetos impliacutecitos siguientes

pageContext Objeto de javaxservletjspPageContext que proporciona acceso a los

datos de una peticioacuten

param Coleccioacuten (objeto de tipo javautilMap) de todos los valores de los paraacutemetros

enviados en una peticioacuten un String por paraacutemetro

paramValues Coleccioacuten de todos los valores de los paraacutemetros enviados en una

peticioacuten una matriz de tipo String por paraacutemetro

header Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten un

String por cabecera

headerValues Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten

una matriz de tipo String por cabecera

cookie Coleccioacuten de todos los valores de las cookies un objeto javaxservlethttpCookie

por cookie

initParam Coleccioacuten de todos los valores de los paraacutemetros de iniciacioacuten de la

aplicacioacuten un String por paraacutemetro

Tambieacuten hay objetos que permiten acceder a variables definidas en diferentes aacutembitos lo que

posibilita compartir informacioacuten

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

pageScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de paacutegina

requestScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

peticioacuten

sessionScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de sesioacuten

applicationScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

aplicacioacuten

3222 DIRECTRICES

Las directrices page incluye y taglib son mensajes para el motor JSP y son siempre incluidas

entre los siacutembolos lt y gt

32221 LA DIRECTRIZ PAGE

Define atributos que se aplican a toda la paacutegina JSP donde es incluida

lt page lista_de_atributos gt

Donde la lista_de_atributos puede contener algunos de los siguientes (aquellos que estaacuten

escritos en negrita son los tomados por omisioacuten)

language= ldquoscriptingLanguagerdquo

extends= rdquoclassNamerdquo

import= ldquoimportListrdquo

session= ldquotrue|falserdquo

buffer= ldquonone|sizeKb

autoflush= ldquotrue|falserdquo

isThreadSafe= rdquotrue|falserdquo

info= rdquoinfo_textrdquo

errorPage= ldquoerror_urlrdquo

isErrorPage= rdquotrue|falserdquo

contentType= rdquoctinfordquo

pageEncoding= rdquopeinfordquo

isELIgnored= ldquotrue|falserdquo

Tiacutepicamente se localiza al principio de la paacutegina JSP y puede haber cualquier nuacutemero de

ellas El lenguaje por omisioacuten es Java Ejemplos

lt page contentType=rdquotexthtmlrdquo language=rdquojavardquo gt

lt page import=rdquojavautil javalangrdquo gt

lt page buffer=rdquo5kbrdquo autoflush=rdquofalserdquo gt

32222 LA DIRECTRIZ INCLUDE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

La directriz include incluye un archivo (html jsp xml o de texto) en una paacutegina JSP Esto

permite dividir el contenido de la paacutegina en trozos maacutes manejables

lt incluye file=rdquoURL_relativordquo gt

El ejemplo siguiente muestra dos archivos el primero incluye al segundo para mostrar la

fecha y hora actuales

lt-- fichero mostrarFechaHorajsp --gt

lthtmlgt

ltheadgtlttitlegtIncluir un ficherolttitlegtltheadgt

ltbody bgcolor=whitegt

ltfont color=bluegt

La fecha y hora actuales son

lt include file=fechaHorajsp gt

ltfontgt

ltbodygt

lthtmlgt

lt-- fichero fechaHorajsp --gt

lt page import=javautil gt

lt= (new javautilDate())toLocaleString() gt

32223 LA DIRECTRIZ TAGLIB

La directriz taglib indica la biblioteca de acciones personalizadas que podremos utilizar en

la codificacioacuten de la paacutegina JSP Para distinguir esas acciones entre otras existentes se utiliza

un prefijo (prefix) Su sintaxis es

lt taglib (uri=rdquoURI_bibliotecardquo|tagdir=rdquoDir_biblioteca_tagrdquo)

prefix=rdquoprefijordquo gt

Cuando se trata de una biblioteca definida mediante una clase Java y un descriptor (archivo

tld) eacutesta se identifica mediante un URI (Uniform Resource Identifier- URL relativos) Por

ejemplo

lt taglib uri=rdquohttpMarioRossainzLopezmiBibliotecardquo

prefix=rdquofunrdquo gt

ltpgtltfunaccion01 gt

La uacuteltima liacutenea del ejemplo tiene dos etiquetas una etiqueta p HTML y otra accion01

perteneciente a la biblioteca miBiblioteca En cambio si la biblioteca se define mediante un

archivo tag entonces se identifica mediante su ruta relativa en el sistema de archivos

lt taglib tagdir=rdquoWEB-INFtagsrdquo prefix=rdquofunrdquo gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpgtltfunaccion01 gt

La directriz taglib debe colocarse antes de utilizar en la paacutegina JSP las acciones

personalizadas definidas por la misma Se puede utilizar maacutes de una directriz pero el prefijo

utilizado debe ser uacutenico para cada una de ellas

3223 ACTIVACION DEL LENGUAJE DE EXPRESION (LE)

La especificacioacuten JSP 20 define un lenguaje de expresioacuten como alternativa a elementos de

programacioacuten escritos con coacutedigo Java y especificaciones anteriores a la JSP 20 Para que

este lenguaje pueda ser interpretado tienen que cumplirse 2 requisitos

1 Que la propiedad isELIgnored de la directriz page valga false

lt page isELIgnored= ldquofalserdquo gt

2 Que el descriptor de despliegue webxml en la carpeta WEB-INF indique doacutende se

localiza el esquema XML para la especificacioacuten Servlet 24 que a su vez utiliza el

esquema XML para la especificacioacuten Java Server Page 20

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

Utilizando el lenguaje de expresioacuten se podriacutea modificar la paacutegina Cuentajsp de la seccioacuten

3212 de este documento como se muestra a continuacioacuten Esta nueva paacutegina

1 Especifica que utilizaraacute la biblioteca core de etiquetas estandar (de la que se hablaraacute maacutes

adelante)

2 La primera vez que sea accedida definiraacute la variable atrCuenta en el aacutembito de la

aplicacioacuten con un valor inicial nulo y la incrementaraacute en una unidad cuando sea accedida

sucesivas veces simplemente incrementaraacute esta variable en una unidad

3 Finalmente mostraraacute una paacutegina con un contenido anaacutelogo al siguiente Esta formado

por una cabecera y una segunda liacutenea compuesta por el valor del paraacutemetro parNombre

enviado con la peticioacuten un texto fijo el valor de la variable atrCuenta y otro texto fijo

dependiente del valor de esta variable

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

El coacutedigo completo es el siguiente

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

3224 VARIABLES Y EXPRESIONES

Para acceder a una simple variable se puede escribir algo como lo siguiente $nombre y

para acceder a una propiedad de un objeto podemos escribir algo como

$paramparNombre

$applicationScopeatrCuenta

$pageContextrequestrequestURI

La primera liacutenea del ejemplo anterior obtiene el valor de la propiedad parNombre del objeto

param la segunda el valor del atributo atrCuenta del objeto applicationScope y la tercera

el URL relativo de la paacutegina JSP solicitada

El lenguaje de expresioacuten es maacutes tolerante con respecto a las variables con valor null y ejecuta

muchas maacutes conversiones de forma automaacutetica sobre el tipo de los datos cuando la expresioacuten

a evaluar asiacute lo requiere Por ejemplo la etiqueta condicional siguiente incluye una expresioacuten

que compara el valor del atributo atrCuenta con aacutembito de aplicacioacuten con 10 (convirtiendo

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

impliacutecitamente el valor del atributo al tipo de la constante para poder realizar la comparacioacuten

El resultado seraacute un valor de tipo boolean

ltcif test=rdquo$applicationScopeatrCuenta gt 10rdquogt

ltcifgt

o bien

ltcif test=rdquo$atrCuenta gt 10rdquogt

ltcifgt

Para que una literal pueda incluir un caracter significativo para el lenguaje dicho caracter

debe ser especificado como una secuencia de escape (caracter) Por ejemplo la siguiente

expresioacuten da lugar al literal ldquovezrdquo o ldquovecesrdquo entre comillas dobles

$(atrCuenta gt 1) iquest ldquordquovecesrdquordquo ldquordquovezrdquordquo

Cualquier objeto o atributo de un objeto definido en algunos de los aacutembitos de una paacutegina

puede ser utilizado como una variable Por ejemplo $atrCuenta+1 es una expresioacuten que

realiza la suma de la variable atrCuenta con 1

Cuando se trate de una propiedad de un objeto para acceder a ella se utilizaraacute el operador

punto o bien la notacioacuten empleada para acceder a un elemento de una matriz Por ejemplo

$paramparNombre

$param[ldquoparNombrerdquo]

Una expresioacuten LE puede aparecer en cualquier lugar donde pueda aparecer un texto fijo Por

tanto para informar al contenedor JSP que se trata de una expresioacuten y no de un texto fijo se

utilizan los delimitadores $ al principio y al final

3225 OPERADORES

OPERADOR DESCRIPCIOacuteN Acceso a la propiedad de un objeto o a un elemento de un Map

[] Acceso al elemento de una matriz o de un objeto List

() Pareacutentesis para alterar la prioridad en la evaluacioacuten de una expresioacuten

If ternario condicion expresion1 expresioacuten 2

+ Suma

- Resta

Producto

oacute div Divisioacuten

oacute mod Moacutedulo o resto de una divisioacuten

== oacute eq Igualdad

= oacute ne Diferente

lt oacute lt Menor que

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt oacute gt Mayor que

lt= oacute le Menor o igual que

gt= oacute ge Mayor o igual que

ampamp oacute and Operacioacuten Loacutegica AND

|| oacute or Operacioacuten Loacutegica OR

oacute not Operacioacuten Loacutegica NOT

empty Verifica si el valor de una variable es null si un String esta vaciacuteo o si una matriz Map

o Collection no tienen elementos

func(args) Llamada a una funcioacuten donde func es el nombre de la funcioacuten y arg representa cero o

maacutes argumentos separados por comas

El ejemplo siguiente muestra una paacutegina JSP compuesta por elementos HTML expresiones

LE y objetos impliacutecitos

lthtmlgt

ltheadgtlttitlegtJSP 20lttitlegtltheadgt

ltbodygt

lth3gtLenguaje de expresioacuten (LE)lth3gt

ltpgtLa siguiente tabla ilustra algunas expresiones LE

ltbrgtltbrgtlttable border=1gt

lttrgt

ltthgtltbgtExpresioacutenltbgtltthgt

ltthgtltbgtValorltbgtltthgt

lttrgt

lttrgt

lttdgt$3 + 6lttdgt

lttdgt$3 + 6lttdgt

lttdgt

lttrgt

lttdgt$(7 gt 4) 7 4lttdgt

lttdgt$(7 gt 4) 7 4lttdgt

lttrgt

lttrgt

lttdgt$header[host]lttdgt

lttdgt$header[host]lttdgt

lttrgt

lttablegt

ltbodygt

lthtmlgt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

323 BIBLIOTECA ESTANDAR DE ETIQUETAS

La biblioteca estaacutendar de etiquetas JSP (JSTL ndash Java Server Page Estaacutendar Tag Library)

incluye una cantidad amplia de etiquetas para diferentes aacutereas de trabajo

Aacuterea baacutesica (su prefijo es c ndash core) y contiene

o Soporte de variables (remove y set)

o Control del flujo (choose when otherwise forEach forTokens if)

o Manejo de URL (import param redirect param y url param)

o Operaciones varias (match y out)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlcore

Aacuterea XML (su prefijo es x) y contiene

o Sentencias baacutesicas (out parse y set)

o Control del flujo (choosehellip whenhellip otherwise forEach e if)

o Transformacioacuten de Documentos (transformhellipparam)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlxml

Aacuterea Internacionalizacioacuten (su prefijo es fmt) Contiene

o Localidad (setLocale y requestEncoding)

o Mensajes (bundle message param y setBundle)

o Formateo de Fechas y nuacutemeros (formatNumber formateacuteate parseDate

parseNumber setTimeZone timeZone)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlfmt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Aacuterea SQL (su prefijo es sql) es el lenguaje estandar para interactuar con bases de datos

relacionales y contiene setDataSource Quero dateParam param transaction y

update dateParam param) El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlsql

Aacuterea Funciones (su prefijo es fn) y contiene

o Longitud de una coleccioacuten (length)

o Manipulacioacuten de String (toUpperCase toLowerCase substring

substringAfter substringBefore trim replace indexOf startsWith

endsWith contains containsIgnoreCase split join y escapeXml)

o El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlfunctions

3231 OPERACIONES CON ETIQUETAS BAacuteSICAS

En un ejemplo pasado teniacuteamos el siguiente coacutedigo

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

En este ejemplo se hace referencia al aacuterea baacutesica de JSTL con el prefijo c y se utiliza la

etiqueta cset para definir la variable atrCuenta Si la variable ya esta definida simplemente

se le asigna el valor especificado

La uacuteltima parte del ejemplo anterior podriacutea haberse escrito de esta otra forma

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcif test=rdquo$atrCuenta gt 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcifgt

$atrCuenta $str

La etiqueta cif permite la ejecucioacuten condicional de su cuerpo en funcioacuten del valor del

atributo de test

La etiqueta cchoose permite la ejecucioacuten del cuerpo de la primera etiqueta cwhen cuyo

atributo test sea evaluado a true Si ninguna de las condiciones se evaluacutea a true entonces se

evaluacutea el cuerpo de la etiqueta cotherwise si estaacute presente El siguiente coacutedigo muestra otra

manera de escribir el ejemplo anterior utilizando estas uacuteltimas etiquetas

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcchoosegt

ltcwhen test=rdquo$atrCuenta == 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcwhengt

ltcotherwisegt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcotherwisegt

ltcchoosegt

$atrCuenta $str

La etiqueta cforEach permite iterar sobre una coleccioacuten de objetos La coleccioacuten se

especifica por medio del atributo iacutetems y el elemento actual de la coleccioacuten estaacute disponible a

traveacutes de la variable establecida por el atributo var Por ejemplo el siguiente fragmento de

coacutedigo visualiza una tabla con las variables definidas a nivel de aacutembito de paacutegina

lttable border=rdquo1rdquogt

ltcforEach var=rdquoitemrdquo iacutetems=rdquo$pageScoperdquogt

lttrgt

lttdgt $item lttdgt

lttrgt

ltcforEachgt

lttablegt

La etiqueta ccatch atrapa una excepcioacuten que ocurra en el cuerpo de la misma Por ejemplo

el siguiente segmento de coacutedigo lanzaraacute una excepcioacuten si el paraacutemetro mes se escribe con

letras en vez de con nuacutemeros

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltbodygt

lthtmlgt

Un URL anaacutelogo al siguiente daraacute lugar a que la excepcioacuten sea lanzada cuando se ejecute la

expresioacuten $nMes 3 de la paacutegina anterior

httplocalhost8080JSP2exceppruebajspmes=marzo

La excepcioacuten indica que ha ocurrido un error al tratar de convertir ldquomarzordquo a un entero de

tipo Long Para cachar esta excepcioacuten y darle un tratamiento adecuado habraacute que modificar

la paacutegina JSP anterior como se indica a continuacioacuten

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltccatch var=rdquoerrorOcurridordquogt

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltccatchgt

ltcif test=rdquo$not empty errorOcurridordquogt

Error el paraacutemetro mes debe ser un nuacutemero ltbgt

ltbrgt Informacioacuten del error dada por el sistema

ltbrgt ltfont color=rdquoFF0000rdquogt $errorOcurrido ltfontgt

ltcifgt

ltbodygt

lthtmlgt

3232 ACCESO A BASES DE DATOS CON JSP

Las etiquetas que proporciona el aacuterea SQL permiten realizar

Conexioacuten con una base de datos

Realizacioacuten de consultas a la base de datos

Acceso al conjunto de resultados

Ejecucioacuten de actualizaciones y transacciones

Todas las etiquetas SQL actuacutean sobre una base de datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

32321 CONEXIOacuteN CON LA BASE DE DATOS

La conexioacuten con la base de datos puede realizarse con la etiqueta sqlsetDataSource Por

ejemplo si se esta utilizando el administrador de bases de datos MySql con el controlador

JDBC se puede realizar una conexioacuten con una base de datos digamos bd_tutorias de la

manera siguiente

ltsqlsetDataSource var=rdquobdrdquo

driver=rdquocommysqljdbcDriverrdquo

url=rdquojdbcmysqllocalhost3306bd_tutoriasrdquo

user=rdquoadminrdquo

password=rdquoadminadminrdquo gt

32322 CONSULTA A LA BASE DE DATOS

La etiqueta sqlQuero permite realizar una consulta a una base de datos Por ejemplo el

siguiente fragmento de coacutedigo realiza una consulta a la base de datos representada por bd y

obtiene un conjunto de resultados representado por cdr

ltsqlquery var=rdquocdrrdquo dataSource=rdquo$bdrdquogt

SELECT professor dia hora alumno

FROM profesores tutorias citas

WHERE profesoresid_profesor=tutoriasid_profesor

AND tutoriasid_tutoria=citasid_tutoria

ltsqlquerygt

32323 MODIFICACIONES SOBRE LA BASE DE DATOS

La etiqueta sqlupdate permite ejecutar una sentencia SQL INSERT UPDATE o DELETE

y cualquier otra sentencia SQL que no retorne ninguacuten valor Por ejemplo

ltsqlupdate var=rdquocontrdquo dataSource=rdquo$bdrdquo gt

UPDATE profesores

SET profesor=

WHERE profesor=

ltsqlparam value=rdquo$paramProfesorrdquo gt

ltsqlparam value=rdquo$paramIDrdquo gt

ltsqlupdategt

Una operacioacuten UPDATE puede utilizar el siacutembolo para indicar que el valor que tendriacutea que

evaluarse en esa posicioacuten seraacute suministrado por una etiqueta sqlparam como por ejemplo

httplocalhost8080JSP2sqlpruebajspProfesor=Mario+Rossainz+LopezampID=514

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Tambieacuten podemos generar el URL mediante una paacutegina Web que podraacute utilizar el usuario

lthtmlgt

ltbodygt

lth1gt Cuestionario lth1gt

ltform action=httplocalhost8080ParametrosservletParametros

method=getgt

Nombre ltinput type=text name=Nombregt ltbrgt

Edad ltinput type=text name=Edadgt ltbrgtltbrgt

ltinput type=submit value=Enviar datosgt ltbrgt

ltformgt

ltbodygt

lthtmlgt

Los formularios en HTML permiten enviar datos al servidor Web En la liacutenea 5 de la paacutegina

Web mostrada se encuentra la etiqueta form que en el ejemplo contiene el atributo action

que indica la accioacuten que debe realizarse en el servidor en este caso ejecutar el servlet

Parametros y el atributo method que indica la manera en la que se enviacutean los datos (en este

caso la peticioacuten GET)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Peticioacuten HTTP GET Cuando el tipo de peticioacuten HTTP es GET los datos del formulario

son enviados al servidor a continuacioacuten del URL especificado por el atributo action de form

El tamantildeo de la cadena enviada estaacute limitado y al estar en ASCII es totalmente legible por

tanto no es un modo seguro

Es por ello que cuando se requiere del enviacuteo de datos seguros y ademaacutes el nuacutemero de datos

del formulario que son enviados al servidor son muchos resulta ser mejor el uso del meacutetodo

POST Veamos otro ejemplo

import javaio

import javaxservlet

import javaxservlethttp

import javautil

public class MostrarParametros extends HttpServlet

public void doGet(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

responsesetContentType(texthtml)

PrintWriter out= responsegetWriter()

String titulo=Lectura de todos los paraacutemetros de Peticioacuten

outprintln(ltdoctype html public -W3CDTD HTML 40 +

TransitionalENgt)

outprintln(lthtmlgt)

outprintln(ltheadgtlttitlegt+titulo+lttitlegtltheadgt)

outprintln(ltbody bgcolor=FDF5E6gtn+

lth1 align=centergt+titulo+lth1gtn+

lttable border=1 align=centergtn+

lttr bgcolor=FFAD00gtn+

ltthgtNombre del parampaacutemetroltthgtValor(es) del

parampaacutemetro)

Enumeration nombresParam=requestgetParameterNames()

while(nombresParamhasMoreElements())

String nombreParam= (String)nombresParamnextElement()

outprint(lttrgtlttdgt+nombreParam+nltTDgt)

String[]valoresParam=

requestgetParameterValues(nombreParam)

if (valoresParamlength==1)

String valorParam=valoresParam[0]

if (valorParamlength()==0)

outprintln(ltigt Sin valor ltigt)

else

outprintln(valorParam)

else

outprintln(ltulgt)

for (int i=0 iltvaloresParamlengthi++)

outprintln(ltligt+valoresParam[i])

outprintln(ltulgt)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

outprintln(lttablegtnltbodygtlthtmlgt)

public void doPost(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

doGet(requestresponse)

El servlet escrito utiliza un meacutetodo doPost que soacutelo ejecuta a Donet Esto es porque se quiere

que el servlet pueda manejar tanto las peticiones GET como las POST Por otro lado el

formulario es el siguiente

ltdoctype html public -W3CDTD HTML 40 TransitionalENgt

lthtmlgt

ltheadgt

lttitlegt Un Formulario de ejemplo que utiliza POST lttitlegt

ltheadgt

ltbody bgcolor=FDF5E6gt

lth1 align=centergt Un formulario de Ejemplo que utiliza POST

lth1gt

ltform action=httplocalhost8080MostrarParametros

servletMostrarParametros

method=postgt

Nuacutemero de elemento ltinput type=text name=elemNumgt ltbrgt

Cantidad ltinput type=text name=cantidadgt ltbrgt

Precio Unitario ltinput type=text name=precio value=$gt

ltbrgtlthrgt

Nombre de Pila ltinput type=text name=nombrePilagt ltbrgt

Apellido(s) ltinput type=text name=apellidogt ltbrgt

Iniciales ltinput type=text name=inicialesgt ltbrgt

Domicilio de envio lttextarea name=domicilio rows=3

cols=40gtlttextareagt ltbrgt

Tarjeta de creacutedito ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta value=VisagtVisa ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta value=Master Cardgt

Master Card ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta value=AmexgtAmerican

Expresss ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta

value=DiscovergtDiscover ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta

value=Java Smart CardgtTarjeta Inteligente de Java

ltbrgt

Nuacutemero de la tarjeta de creacutedito

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltinput type=password name=numTarjetagtltbrgt

Repita el nuacutemero de la tarjeta de creacutedito

ltinput type=password name=numTarjetagtltbrgtltbrgt

ltcentergt

ltinput type=submit value=Enviar pedidogt

ltcentergt

ltformgt

ltbodygt

lthtmlgt

El formulario HTML del listado anterior utiliza POST como deberiacutea ser en todos los campos

que tienen contrasentildea

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Si intenta ejecutar el servlet MostrarParametros directamente en el explorador con el URL

httplocalhost8080MostrarParametrosservletMostrarParametros se obtendraacute la paacutegina

Web sin resultados

Peticioacuten HTTP POST Cuando el tipo de peticioacuten HTTP es POST los datos son enviados

al servidor en el cuerpo de la peticioacuten Es el meacutetodo maacutes usual de enviar los datos de un

formulario Con este tipo de peticioacuten la informacioacuten del formulario se enviacutea despueacutes del URL

indicado por action en el cuerpo de la peticioacuten y el tamantildeo de la informacioacuten enviada no esta

limitado

Seguacuten lo expuesto escoger el meacutetodo para enviar la informacioacuten no es difiacutecil Si los datos

son pocos y no importa su confidencialidad o manipulacioacuten utilizamos GET Si son largos

privados o importantes utilizamos POST

318 ACCESO A BASES DE DATOS CON SERVLETS

Una aplicacioacuten Java que realiza accesos a bases de datos funciona seguacuten una arquitectura que

permite escribir los programas abstrayeacutendose de los detalles de los niveles inferiores (discos

controladores sistema operativo etc) como lo muestra la figura siguiente

JDBC (Java DataBase Connectivity ndash Conexioacuten con Bases de Datos desde Java) es una API

de Java que permite ejecutar instrucciones SQL para manipular y gestionar bases de datos

relacionales Para que una aplicacioacuten Java pueda hacer operaciones sobre una base de datos

previamente tiene que establecer una conexioacuten con la misma Esta conexioacuten se realiza a

traveacutes de un controlador (driver) seguacuten la figura de arriba La API-JDBC se proporciona en

dos paquetes javasql y javaxsql El primer paquete contiene las interfaces y clases Java

fundamentales de JDBC en tanto que el segundo paquete es una extensioacuten del primero e

APLICACION

SISTEMA OPERATIVO

CONTROLADOR

Oracle Access MySql

JVM

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

incluye las clases que interactuacutean con JNDI y otras que gestionan conjuntos de conexiones

con una misma base de datos Para maacutes detalles del uso de JDBC veacutease el apeacutendice A de

estas notas

El primer paso para crear una conexioacuten entre una aplicacioacuten Java y una base de datos es

registrar el controlador JDBC adecuado para esa base con el fin de que la JVM pueda

utilizarlo Existen distintos tipos de controladores JDBC por ejemplo

ldquocommysqljdbcDriverrdquo que es el controlador utilizado cuando el motor de base de datos

que se utiliza es MySql

En el supuesto caso de que la base de datos soacutelo permitiera el acceso a traveacutes de controladores

ODBC como lo hace ACCESS siempre podemos usar el controlador puente JDBC-ODBC

incluido como parte del JDK ldquosunjdbcodbcJdbcOdbcDriverrdquo Este tipo de controladores

es decir los basados en ODBC (Open DataBase Connectivity) son bastante utilizados en

entornos Windows pues este SO incluye ODBC El apeacutendice A describe al final como

administrar los oriacutegenes de datos ODBC en Windows

Asiacute pues la mayor ventaja de los servlets con respecto a la conexioacuten con bases de datos viacutea

JDBC es que su ciclo de vida les permite mantener conexiones abiertas con las mismas a lo

largo de toda una sesioacuten Esto permite recortar tiempo con respecto a otras tecnologiacuteas como

la CGI Ademaacutes JDBC es una tecnologiacutea independiente de las bases de datos

Como ejemplo vamos a implementar una simple aplicacioacuten Web basada en servlets que

muestre una especie de directorio de personas La aplicacioacuten podraacute consultar insertar

modificar borrar o listar la informacioacuten de cada una de las personas almacenadas en la base

de datos a la que se hace acceso (que estaraacute en formato access)

La estructura de la Base de Datos es una tabla con los siguientes campos

DNI Nombre Apellido Edad

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

53023767A Pedro Rubio 18

77459822P Luis Tejedor 47

123456MRL Mario Rossainz 35

La estructura de la aplicacioacuten se muestra en la figura siguiente

lthtmlgt

ltbodygt

lttable border=1gtlttrgtlttdgt

ltform action=httplocalhost8080directorioTelservletSvAccesoBD

method=getgt

DNI ltinput type=text name=DNIgt ltbrgt

Nombre ltinput type=text name=Nombregt ltbrgt

Apellido ltinput type=text name=Apellidogt ltbrgt

Edad ltinput type=text name=Edadgt ltbrgtltbrgt

ltinput type=submit value=Consultar name=BotonConsultargt

ltinput type=submit value=Insertar name=BotonInsertargt

ltinput type=submit value=Modificar name=BotonModificargt

ltinput type=submit value=Borrar name=BotonBorrargt

ltinput type=submit value=Listar name=BotonListargt ltbrgt

ltcentergt

ltinput type=submit value= |lt name=BotonPrimerogt

ltinput type=submit value= -- name=BotonMenosCincogt

ltinput type=submit value= - name=BotonAnteriorgt

ltinput type=submit value= + name=BotonSiguientegt

ltinput type=submit value= ++ name=BotonMasCincogt

ltinput type=submit value= gt| name=BotonUltimogt

ltcentergt

lttdgt

lttdgt

lttextarea name=AreaDeListado rows=10 cols=35gtlttextareagt

SvAccesoBDhtml

SvAccesoBD

ObBorrado ObListado ObConsulta

ObInsercion

ObModificacion

ObPosicionamiento

ObRegistro

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lttdgt

lttrgt

ltformgt

lttablegt

ltbodygt

lthtmlgt

SvAccesoBDhtml

import javaio

import javaxservlet

import javaxservlethttp

public class SvAccesoBD extends HttpServlet

private int PosicionBuscada = 1

private String AreaDeListado=

PrintWriter out

public void doGet(HttpServletRequest request HttpServletResponse response)

throws IOException ServletException

String DNI = requestgetParameter(DNI)

String Nombre = requestgetParameter(Nombre)

String Apellido = requestgetParameter(Apellido)

String Edad = requestgetParameter(Edad)

String BotonConsultar = requestgetParameter(BotonConsultar)

String BotonInsertar = requestgetParameter(BotonInsertar)

String BotonModificar = requestgetParameter(BotonModificar)

String BotonBorrar = requestgetParameter(BotonBorrar)

String BotonListar = requestgetParameter(BotonListar)

String BotonPrimero = requestgetParameter(BotonPrimero)

String BotonMenosCinco = requestgetParameter(BotonMenosCinco)

String BotonAnterior = requestgetParameter(BotonAnterior)

String BotonSiguiente = requestgetParameter(BotonSiguiente)

String BotonMasCinco = requestgetParameter(BotonMasCinco)

String BotonUltimo = requestgetParameter(BotonUltimo)

AreaDeListado = requestgetParameter(AreaDeListado)

responsesetContentType(texthtml)

out = responsegetWriter()

outprintln(lthtmlgt)

outprintln(ltbodygt)

if (BotonConsultar=null) ConsultarDatos(DNI)

if (BotonInsertar=null) InsertarDatos(DNINombreApellidoEdad)

if (BotonModificar=null) ModificarDatos(DNINombreApellidoEdad)

if (BotonBorrar=null) BorrarDatos(DNI)

if (BotonListar=null) ListarDatos(DNI)

if (BotonPrimero=null) Controles(1)

if (BotonMenosCinco=null) Controles(2)

if (BotonAnterior=null) Controles(3)

if (BotonSiguiente=null) Controles(4)

if (BotonMasCinco=null) Controles(5)

if (BotonUltimo=null) Controles(0)

outprintln(ltbodygt)

outprintln(lthtmlgt)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

private void ConsultarDatos(String DNI)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObRegistro InstanciaFila = InstanciaConsultaDameDatos()

GenerarRespuesta(InstanciaFilaDameDNI()InstanciaFilaDameNombre()

InstanciaFilaDameApellido()

StringvalueOf(InstanciaFilaDameEdad()))

else

GenerarRespuesta(DNI------------)

PosicionBuscada = 1

public void ListarDatos(String DNI)

ObListado InstanciaListado = new ObListado()

AreaDeListado = InstanciaListadoDameResultado()

ConsultarDatos(DNI)

PosicionBuscada = 1

public void BorrarDatos(String DNI)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObBorrado InstanciaBorrado = new ObBorrado(PosicionBuscada)

GenerarRespuesta()

else

GenerarRespuesta(----------------)

PosicionBuscada = 1

public void ModificarDatos(String DNI String Nombre String Apellido

String Edad)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObRegistro InstanciaFila = new ObRegistro(DNI Nombre Apellido

IntegerparseInt(Edad))

ObModificacion InstanciaModificacion = new ObModificacion(PosicionBuscada

InstanciaFila)

GenerarRespuesta(DNINombreApellidoEdad)

else

GenerarRespuesta(----------------)

PosicionBuscada = 1

public void InsertarDatos(String DNI String Nombre String Apellido

String Edad)

ObRegistro InstanciaFila = new ObRegistro(DNI Nombre Apellido

IntegerparseInt(Edad))

ObInserccion InstanciaInserccion = new ObInserccion(InstanciaFila)

GenerarRespuesta()

PosicionBuscada=1

public void Controles(String Identificador)

ObPosicionamiento InstanciaPosicionamiento =

new ObPosicionamiento(IdentificadorPosicionBuscada)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ObRegistro InstanciaFila = InstanciaPosicionamientoDameDatos()

GenerarRespuesta(InstanciaFilaDameDNI()InstanciaFilaDameNombre()

InstanciaFilaDameApellido()

StringvalueOf(InstanciaFilaDameEdad()))

PosicionBuscada = InstanciaPosicionamientoPosicion()

private void GenerarRespuesta(String DNI String Nombre String Apellido

String Edad)

outprintln(lttable border=1gt)

outprintln(lttrgt)

outprintln(lttdgt)

outprintln(ltform

action=httplocalhost8080directorioTelservletSvAccesoBD

method=getgt)

outprintln( DNI ltinput type=text name=DNI value=+DNI+gtltbrgt)

outprintln( Nombre ltinput type=text name=Nombre

value=+Nombre+gtltbrgt)

outprintln( Apellido ltinput type=text name=Apellido

value=+Apellido+gtltbrgt)

outprintln( Edad ltinput type=text name=Edad

value=+Edad+gtltbrgtltbrgt)

outprintln( ltinput type=submit value=Consultar

name=BotonConsultargt)

outprintln( ltinput type=submit value=Insertar

name=BotonInsertargt)

outprintln( ltinput type=submit value=Modificar

name=BotonModificargt)

outprintln( ltinput type=submit value=Borrar name=BotonBorrargt)

outprintln( ltinput type=submit value=Listar name=BotonListargt

ltbrgt)

outprintln( ltcentergt)

outprintln( ltinput type=submit value= |lt name=BotonPrimerogt)

outprintln( ltinput type=submit value= --

name=BotonMenosCincogt)

outprintln( ltinput type=submit value= - name=BotonAnteriorgt)

outprintln( ltinput type=submit value= +

name=BotonSiguientegt)

outprintln( ltinput type=submit value= ++

name=BotonMasCincogt)

outprintln( ltinput type=submit value= gt| name=BotonUltimogt)

outprintln( ltcentergt)

outprintln( lttdgt)

outprintln( lttdgt)

outprintln( lttextarea name=AreaDeListado rows=10

cols=35gt+AreaDeListado+lttextareagt)

outprintln( lttdgt)

outprintln( lttrgt)

outprintln( ltformgt)

outprintln( lttablegt)

SvAccesoBDjava

import javasql

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

public class ObBorrado

ObBorrado(int PosicionBuscada)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

Personasabsolute(PosicionBuscada)

PersonasdeleteRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

ObBorradojava

import javasql

import javaawtTextArea

public class ObListado

private String Resultado=

ObListado()

String DNI Nombre Apellido Linea

int Edad Posicion

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement()

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

while (Personasnext())

DNI = PersonasgetString(DNI)

Nombre = PersonasgetString(Nombre)

Apellido = PersonasgetString(Apellido)

Edad = PersonasgetInt(Edad)

Posicion = PersonasgetRow()

Linea = DNI+ +Nombre+ +Apellido+ +StringvalueOf(Edad)

Resultado=Resultado+StringvalueOf(Posicion)+ +Linea+n

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public String DameResultado()

return Resultado

ObListadojava

public class ObRegistro

private String DNI Nombre Apellido

private int Edad

ObRegistro (String DNI String Nombre String Apellido int Edad)

thisDNI = DNI

thisNombre = Nombre

thisApellido = Apellido

thisEdad = Edad

String DameDNI()

return DNI

String DameNombre()

return Nombre

String DameApellido()

return Apellido

int DameEdad()

return Edad

ObRegistrojava

import javasql

public class ObConsulta

private int Posicion = 0

private ObRegistro DatosPersona

ObConsulta(String DNIPedido)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement()

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

while (Personasnext())

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

String DNI = PersonasgetString(DNI)

if (DNIequalsIgnoreCase(DNIPedido))

Posicion = PersonasgetRow()

String Nombre = PersonasgetString(Nombre)

String Apellido = PersonasgetString(Apellido)

int Edad = PersonasgetInt(Edad)

DatosPersona = new ObRegistro(DNINombreApellidoEdad)

break

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public int PosicionEncontrada()

return Posicion

public ObRegistro DameDatos()

return DatosPersona

ObConsultajava

import javasql

public class ObInserccion

ObInserccion(ObRegistro Datos)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

PersonasmoveToInsertRow()

PersonasupdateString(DNI DatosDameDNI())

PersonasupdateString(NombreDatosDameNombre())

PersonasupdateString(Apellido DatosDameApellido())

PersonasupdateInt(EdadDatosDameEdad())

PersonasinsertRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

catch (SQLException e)

Systemoutprintln(e)

ObInsercionjava

import javasql

public class ObModificacion

ObModificacion(int PosicionBuscada ObRegistro Datos)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

Personasabsolute(PosicionBuscada)

PersonasupdateString(DNIDatosDameDNI())

PersonasupdateString(NombreDatosDameNombre())

PersonasupdateString(ApellidoDatosDameApellido())

PersonasupdateInt(EdadDatosDameEdad())

PersonasupdateRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

ObModificacionjava

import javasql

public class ObPosicionamiento

private ObRegistro DatosPersona

private int Posicion

ObPosicionamiento(String Accion int Posicion)

int IDAccionEdad

String DNINombreApellido

boolean PosicionCorrecta=false

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

FROM DatosPersonales)

Personasabsolute(Posicion)

IDAccion = IntegerparseInt(Accion)

switch (IDAccion)

case 0

PosicionCorrecta = Personaslast()

break

case 1

PosicionCorrecta = Personasfirst()

break

case 2

PosicionCorrecta = Personasrelative(-5)

break

case 3

PosicionCorrecta = Personasprevious()

break

case 4

PosicionCorrecta = Personasnext()

break

case 5

PosicionCorrecta = Personasrelative(+5)

break

if (PosicionCorrecta)

thisPosicion = PersonasgetRow()

DNI = PersonasgetString(DNI)

Nombre = PersonasgetString(Nombre)

Apellido = PersonasgetString(Apellido)

Edad = PersonasgetInt(Edad)

else

thisPosicion = Posicion

DNI = ----

Nombre = ----

Apellido = ----

Edad = 0

DatosPersona = new ObRegistro(DNINombreApellidoEdad)

Personasclose()

Conexionclose()

SentenciaSQLclose()

Systemoutprintln(StringvalueOf(Posicion)++StringvalueOf(thisPosicion))

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public int Posicion()

return Posicion

public ObRegistro DameDatos() return DatosPersona

ObPosicionamientojava

En este ejemplo se emplean servlets y paacuteginas Web Los clientes habitualmente trabajan en

una computadora remota y los programas se ejecutan en un servidor El mecanismo de

comunicaciones que soporta el protocolo http nos permite consultar en el servidor los datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

que ha seleccionado o escrito el usuario de esta manera se puede observar una disociacioacuten

entre la interfaz graacutefica de usuario (que se ejecuta en los equipos de los clientes) y el

programa que recoge los datos y ejecuta las acciones pertinentes (que se ejecuta en el

servidor)

Como puede observarse el coacutedigo SvAccessoBD es un servlet que lleva a cabo las siguientes

operaciones

1 Recoge los valores provenientes del usuario

2 Determina la naturaleza de la accioacuten a realizar

3 Realiza su cometido con la base de datos

4 Genera la respuesta que recibiraacute el usuario

32 JSP

JSP significa Java Server Pages que traducido quiere decir Paacuteginas de Servidor Java y es

por tanto una tecnologiacutea orientada a crear paacuteginas Web con programacioacuten en JAVA es decir

permite mezclar HTML estaacutendar y estaacutetico con un contenido dinaacutemico etiquetas especiales

(oacuterdenes) y trozos de coacutedigo JAVA (scriptlets o secuencias de oacuterdenes) o contenido dinaacutemico

generado por servlets Eacuteste contenido dinaacutemico se encuentra encerrado en etiquetas

especiales muchas de las cuales inician con lt y finalizan con gt El motor de las paacuteginas

JSP esta basado en los servlets de JAVA

En la tecnologiacutea JSP se crean paacuteginas parecidas a las paacuteginas que se crean en ASP (Active

Server Page de Microsoft) o PHP (Personal Home Page) que son dos tecnologiacuteas de paacuteginas

ejecutadas en el servidor Sin embargo JSP no se cintildee a un sistema operativo o servidor Web

en particular ademaacutes de que proporciona acceso a la tecnologiacutea de Servlets y a JAVA en la

parte dinaacutemica

El proceso para generar paacuteginas JSP accesibles en Web es mucho maacutes simple que en los

servlets Dando por hecho que se tiene un servidor Web que permite usar JSP el coacutedigo se

almacenaraacute en archivos con extensioacuten jsp que incluyen dentro de la estructuras de etiquetas

HTML las sentencias JAVA a ejecutar y tan soacutelo se colocaraacuten en cualquier lugar en donde

se pusiera una paacutegina Web normal sin compilacioacuten sin paquetes y sin configuracioacuten aunque

el servidor tendraacute que ser configurado para acceder a los archivos de clases Servlets y de

JSPs

Aunque lo que se escriba con frecuencia luciraacute como un archivo HTML estaacutendar detraacutes de

ello la paacutegina JSP se convierte automaacuteticamente en un servlet normal donde el HTML

estaacutetico tan soacutelo es enviado al flujo de salida asociado con el meacutetodo service del servlet Esta

traduccioacuten se realiza la primera vez que se solicita la paacutegina De acuerdo como este

configurado el servidor es posible ver el coacutedigo fuente de los servlets generados a partir de

sus paacuteginas JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Por ejemplo supongamos que se ha escrito el siguiente coacutedigo en el archivo Saludojsp

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtEjemplo JSPlttitlegtltheadgt

ltbody bgcolor=ffffccgt

ltcentergt

lth2gtHola mundolth2gt

ltjavautilDate hoy = new javautilDate()gt

La fecha de hoy es lt=hoygt

ltcentergt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional y un fragmento de un scriptlet de JAVA La etiqueta

lt identifica el comienzo del scriptlet y gt el final Una expresioacuten de la forma =variable

es sustituida por el valor de esa variable Para ejecutar esta paacutegina o cualquier otra paacutegina

JSP desde un navegador hay que instalarla en el servidor de aplicaciones de la misma manera

en como se hizo con los servlets Suponiendo entonces que se tiene instalado el Tomcat 5

siga los siguientes pasos

1 Antildeadir en el servidor la carpeta digamos JSP2 dentro de la carpeta webapps del Tomcat

y construir sobre ella la jerarquiacutea de clases ya conocida de los servlets

webappsrarrJSP2rarrWEB-INFrarrclasses

WEB-INFrarrlib

WEB-INFrarrtags

2 Editar en la carpeta WEB-INF el descriptor de despliegue webxml que se indica a

continuacioacuten Este archivo XML indica doacutende se localiza el esquema XML para la

especificacioacuten Servlet 24 que a suvez utiliza el esquema XML para la especificacioacuten

Java Server Page 20 que son las especificaciones que soporta en servidor Tomcat

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=

httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

3 Crear en JSP2 la carpeta saludo que contendraacute la aplicacioacuten y copiar en ella la paacutegina

Saludojsp

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

4 Arrancar el servidor Si el servidor ya estaba arrancado detenerlo y volverlo a arrancar o

bien abrir el explorador escribir el URL httplocalhost8080managerhtml e instalar

la aplicacioacuten

5 Una vez arrancado el servidor verificar si estaacute funcionando correctamente escribiendo

el URL siguiente en el explorador httplocalhost8080 El explorador debe mostrar la

paacutegina del Tomcat

6 Ejecutar la paacutegina JSP iniciando el explorador y escribiendo el URL siguiente

httplocalhost8080JSP2saludoSaludojsp donde la sintaxis geneacuterica es

httpservidor[puerto]MiCarpetapaginajsp

Cuando esta paacutegina (Saludojsp) es invocada por primera vez el motor JSP lleva a cabo una

fase de traduccioacuten de la misma en un servlet y el motor Servlet es el que ejecutaraacute eacuteste uacuteltimo

para generar el HTML dinaacutemico que seraacute enviado al explorador cliente seguacuten puede

deducirse de la figura siguiente La proacutexima vez que la paacutegina sea solicitada el motor JSP

ejecutaraacute el servlet que fue caragado la primera vez a no ser que la paacutegina haya cambiado

en cuyo caso seraacute compilada automaacuteticamente en un nuevo servlet y ejecutada

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Regresando al ejemplo el archivo java generado por el Tomcat a partir del archivo

Saludojsp se localiza en la carpeta workCatalinalocalhost de la instalacioacuten de Tomcat

321 ELEMENTOS PARA SECUENCIAS DE COMANDOS

Los elementos para secuencias de comandos permiten insertar coacutedigo en el servlet que seraacute

generado a partir de la paacutegina JSP Existen tres formas

1 Expresiones del tipo lt= expresioacuten gt que se evaluacutean e insertan en el resultado del

servlet

2 Los scriptlets del tipo lt codigo gt que se insertan en el meacutetodo _jspService del

servlet (ejecutado por service)

3 Las declaraciones del tipo lt Codigo gt que se insertan en el cuerpo de la clase del

servlet fuera de cualquier meacutetodo existente

NOTA Los comentarios en JSP se escriben lt-- Comentario JSP --gt en tanto que los

comentarios en HTML son de la forma lt--Comentario HTML --gt La diferencia

semaacutentica radica en que los comentarios HTML cuando se insertan en la respuesta enviada

por el servidor al cliente no se muestran cuando se visualiza el documento HTML pero si

Servidor Maacutequina Cliente

Explorador Web

Contenedor Web

Motor Servlet

Motor JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

los podemos ver cuando se visualiza el coacutedigo fuente en tanto que los comentarios JSP

aunque se inserten en la respuesta enviada por el servidor al cliente no son enviados al

explorador de forma que tampoco se muestran ni se ven cuando se visualiza el coacutedigo fuente

HTML desde el explorador

3211 EXPRESIONES

Se utiliza una expresioacuten JSP para insertar valores directamente en el resultado La sintaxis es

lt= expresioacuten gt Por ejemplo

lt= requestgetParameter(ldquoparNombre) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt lt= s gt

La fecha y hora actual es lt= new javautilDate() gt

La expresioacuten se evaluacutea se convierte a cadena y se inserta en la paacutegina Esta evaluacioacuten se

realiza durante la ejecucioacuten

32111 VARIABLES PREDEFINIDAS

Para simplificar estas expresiones se pueden utilizar cierta cantidad de variables

predefinidas Estos objetos impliacutecitos como tambieacuten se les llama estaacuten disponibles para su

uso durante la implementacioacuten de una paacutegina Web

bull pageContext Es un objeto de la clase PageContext que proporciona acceso a objetos

relacionados con los servlets

bull request Es un objeto de la clase HttpServletRequest que se puede obtener a traveacutes del

meacutetodo getRequest que encapsula los datos enviados por el cliente al servidor

bull response Es un objeto de la clase HttpServletResponse que puede obtenerse a traveacutes

del meacutetodo getResponse que encapsula los datos que el servidor enviaraacute al cliente

bull application Es un objeto de la clase ServletContext que se obtiene a traveacutes del meacutetodo

getServletContext que define un conjunto de meacutetodos que todo servlet utiliza para

comunicar con el contenedor de servlets

bull config Es un objeto de la clase ServletConfig que se obtiene a traveacutes del meacutetodo

getServletConfig y que se utiliza por el contenedor de servlets para pasar informacioacuten

al servlet durante la iniciacioacuten

bull session Es un objeto de la clase HttpSession que se obtiene a traveacutes del meacutetodo

getSession que proporciona una forma de identificar a un usuario que visita las paacuteginas

de un sitio Web

bull out Es un objeto de la clase JspWriter que se obtiene a traveacutes del meacutetodo getOut que

se utiliza para almacenar la respuesta que seraacute enviada al cliente que hizo la peticioacuten de

la paacutegina

bull page Es un objeto geneacuterico de la clase Object que se obtiene a traveacutes del meacutetodo

getPage y que representa al servlet obtenido a partir de la paacutegina JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

bull exception Es un objeto de la clase Exception que se obtiene a traveacutes del meacutetodo

getException que contendraacute informacioacuten a cerca de cualquier excepcioacuten que se lance

desde la paacutegina JSP

Un ejemplo del uso de uno de estos objetos impliacutecitos seriacutea el siguiente

El nombre de tu host es lt= requestgetRemoteHost() gt

El listado siguiente da un ejemplo de una paacutegina JSP que utiliza algunas variables

predefinidas como uso de expresiones JSP

ltDOCTYPE HTML PUBLIC -W3CDTD HTML 40 Transitional ENgt

lthtmlgt

ltheadgt

lttitlegt Expresiones JSP lttitlegt

ltheadgt

ltbodygt

lth2gt Expresiones JSP lth2gt

ltULgt

ltligt Fecha y hora en curso lt= new javautilDate() gt ltligt

ltligt Nombre de su host lt= requestgetRemoteHost() gt ltligt

ltligt Identificador de su sesioacuten lt= sessiongetId() gt ltligt

ltligt El paraacutemetro ltcodegt paramPrueba ltcodegt del formulario

lt= requestgetParameter(paramPrueba) gt ltligt

ltULgt

ltbodygt

lthtmlgt

Cuya salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3212 LOS SCRIPTLETS JSP

Si se desea hacer algo maacutes complejo que una simple expresioacuten los scriptlets permiten insertar

coacutedigo JAVA en el meacutetodo _jspService del servlet (que es ejecutado por service) La sintaxis

utilizada por los scriptlets es lt coacutedigo java gt Los escriptlets tienen acceso a las

mismas variables definidas de forma automaacutetica como expresiones A manera de ejemplo si

se desea que el resultado aparezca en la paacutegina generada deberiacutea de utilizarse la variable out

como en la siguiente instruccioacuten

lt String datosConsultados= requestgetQueryString()

outprintln(ldquoDatos GET adjuntos ldquo+datosConsultados)

gt

En este ejemplo podriacutea haberse obtenido el mismo resultado utilizando la siguiente expresioacuten

JSP

Datos GET adjuntos lt=requestgetQueryString() gt

En general los scriptlets pueden ejecutar varias tareas que no podriacutean realizarse con las

expresiones Tales tareas incluyen

bull La determinacioacuten de encabezados de respuesta

bull Actualizacioacuten de Bases de Datos

bull Ejecucioacuten de bucles condiciones y otras estructuras complejas

lt for (int i=1 ilt=6 i++)

gt

lth lt=i gtgt Hola Mundo lthlt=i gtgt

lt gt

Como un ejemplo concreto se muestra la siguiente paacutegina JSP llamada Cuentajsp en donde

se observa coacutemo se hace un seguimiento del nuacutemero de veces que un cliente accede a esta

paacutegina a traveacutes de distintas sesiones Para ello supondremos que dicha cuenta es el valor del

atributo atrCuenta del objeto impliacutecito application ya citado La primera vez que el cliente

accede a la paacutegina el valor de atrCuenta seraacute null debido a que auacuten no ha sido fijado este

atributo en este caso se fijaraacute con el valor 1 En los siguientes accesos se leeraacute el valor del

atributo atrCuenta se incrementaraacute en una unidad y se volveraacute a fijar Finalmente se enviacutea

la respuesta al cliente para que se muestre al usuario el valor del contador

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en el objeto impliacutecito application con el nombre

atrCuenta

--gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt

Integer cuenta = (Integer)applicationgetAttribute(atrCuenta)

String s = vez

if (cuenta == null)

cuenta = new Integer(1)

else

cuenta = new Integer(cuentaintValue() + 1)

s = veces

applicationsetAttribute(atrCuenta cuenta)

gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

Has visitado esta paacutegina lt= cuenta gt lt= s gt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional un fragmento de coacutedigo JAVA o scriptlet

expresiones y comentarioshellip

Aquiacute otro ejemplo de la ejecucioacuten de un coacutedigo demasiado complejo para una expresioacuten JSP

Este listado presenta una paacutegina JSP que utiliza el paraacutemetro de peticioacuten colorFondo para

establecer el color de fondo de la paacutegina

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgt

lttitlegt Prueba de Color lttitlegt

ltheadgt

lt

String colorFondo=requestgetParameter(colorFondo)

boolean tieneColorExplicito

if (colorFondo =null)

tieneColorExplicito=true

else

tieneColorExplicito=false

colorFondo=WHITE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt

ltbody bgcolor=lt= colorFondo gtgt

lth2 align=centergt Prueba de color lth2gt

lt

if (tieneColorExplicito)

outprintln(Ha indicado un color de fondo expliacutecito +

colorFondo +)

else

outprintln(Usareacute el color de fondo predeterminado WHITE +

Indique el atributo de peticioacuten

ltigtcolorFondoltigt+

para intentar un color estaacutendar un +

valor RRGGBB o para ver si el navegador Web +

permite el uso de nombres de color X11)

gt

ltbodygt

lthtmlgt

Cuyas posibles salidas son

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3213 DECLARACIONES JSP

Una declaracioacuten JSP permite definir meacutetodos o campos que seraacuten insertados en el cuerpo

principal de la clase del servlet (fuera del meacutetodo _jspService) Una declaracioacuten tiene la

sintaxis lt Coacutedigo Java gt Por ejemplo

lt int i=0 gt

lt

Public void jspinit()

coacutedigo de iniciacioacuten

gt

Una declaracioacuten no genera ninguacuten resultado y se usan junto con las expresiones JSP o los

scriptlets A continuacioacuten se muestra una paacutegina JSP que despliega la cantidad de veces que

se ha solicitado esta paacutegina desde que se arrancoacute el servidor haciendo uso de las

declaraciones JSP

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtDeclaraciones JSPlttitlegtltheadgt

ltbodygt

lth1gtDeclaraciones JSPlth1gt

lt-- Esto es un comentario en JSP --gt

lt private int recuentoAccesos=0 gt

lth2gt Accesos a la paacutegina desde el reinicio del servidor

lt= ++recuentoAccesos gt lth2gt

ltbodygt

lthtmlgt

La salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

322 EL LENGUAJE DE EXPRESION EN JSP 20

Anteriormente se ha visto la necesidad de utilizar fragmentos de coacutedigo java en el desarrollo

de paacuteginas JSP pero con la aparicioacuten de la especificacioacuten JSP 20 ya no hay necesidad de

utilizar fragmentos de coacutedigo Java para nada gracias al nuevo lenguaje de expresioacuten EL

(Expresioacuten Language) a la biblioteca de etiquetas estandar JSTL (JSP Standar Tag Library)

y a las nuevas formas para desarrollar etiquetas personalizadas

El lenguaje de expresioacuten JSP es maacutes un lenguaje de acceso a datos que un lenguaje de

programacioacuten Ya se ha visto que para pasar informacioacuten de un cliente a una paacutegina JSP se

utilizan paraacutemetros en la peticioacuten y atributos en la paacutegina El lenguaje de expresioacuten lo hace

posible sin tener que utilizar scriptlets o expresiones (lt= expresioacuten gt) Por ejemplo las

liacuteneas JSP 12 siguientes escritas utilizando coacutedigo Java

lt= requestgetParameter(ldquoparNombrerdquo) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt veces

bajo la especificacioacuten JSP 20 se pueden escribir de una forma maacutes sencilla como sigue

(ahora no se trata de coacutedigo JAVA)

$paramparNombre has visitado esta paacutegina

$atrCuenta veces

La sintaxis de JSP es sensible a mayuacutesculas y minuacutesculas pero un par de comillas simples es

equivalente a un par de comillas dobles

3221 VARIABLES PREDEFINIDAS (Objetos Impliacutecitos)

El lenguaje de expresioacuten JSP 20 soporta los objetos impliacutecitos siguientes

pageContext Objeto de javaxservletjspPageContext que proporciona acceso a los

datos de una peticioacuten

param Coleccioacuten (objeto de tipo javautilMap) de todos los valores de los paraacutemetros

enviados en una peticioacuten un String por paraacutemetro

paramValues Coleccioacuten de todos los valores de los paraacutemetros enviados en una

peticioacuten una matriz de tipo String por paraacutemetro

header Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten un

String por cabecera

headerValues Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten

una matriz de tipo String por cabecera

cookie Coleccioacuten de todos los valores de las cookies un objeto javaxservlethttpCookie

por cookie

initParam Coleccioacuten de todos los valores de los paraacutemetros de iniciacioacuten de la

aplicacioacuten un String por paraacutemetro

Tambieacuten hay objetos que permiten acceder a variables definidas en diferentes aacutembitos lo que

posibilita compartir informacioacuten

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

pageScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de paacutegina

requestScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

peticioacuten

sessionScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de sesioacuten

applicationScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

aplicacioacuten

3222 DIRECTRICES

Las directrices page incluye y taglib son mensajes para el motor JSP y son siempre incluidas

entre los siacutembolos lt y gt

32221 LA DIRECTRIZ PAGE

Define atributos que se aplican a toda la paacutegina JSP donde es incluida

lt page lista_de_atributos gt

Donde la lista_de_atributos puede contener algunos de los siguientes (aquellos que estaacuten

escritos en negrita son los tomados por omisioacuten)

language= ldquoscriptingLanguagerdquo

extends= rdquoclassNamerdquo

import= ldquoimportListrdquo

session= ldquotrue|falserdquo

buffer= ldquonone|sizeKb

autoflush= ldquotrue|falserdquo

isThreadSafe= rdquotrue|falserdquo

info= rdquoinfo_textrdquo

errorPage= ldquoerror_urlrdquo

isErrorPage= rdquotrue|falserdquo

contentType= rdquoctinfordquo

pageEncoding= rdquopeinfordquo

isELIgnored= ldquotrue|falserdquo

Tiacutepicamente se localiza al principio de la paacutegina JSP y puede haber cualquier nuacutemero de

ellas El lenguaje por omisioacuten es Java Ejemplos

lt page contentType=rdquotexthtmlrdquo language=rdquojavardquo gt

lt page import=rdquojavautil javalangrdquo gt

lt page buffer=rdquo5kbrdquo autoflush=rdquofalserdquo gt

32222 LA DIRECTRIZ INCLUDE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

La directriz include incluye un archivo (html jsp xml o de texto) en una paacutegina JSP Esto

permite dividir el contenido de la paacutegina en trozos maacutes manejables

lt incluye file=rdquoURL_relativordquo gt

El ejemplo siguiente muestra dos archivos el primero incluye al segundo para mostrar la

fecha y hora actuales

lt-- fichero mostrarFechaHorajsp --gt

lthtmlgt

ltheadgtlttitlegtIncluir un ficherolttitlegtltheadgt

ltbody bgcolor=whitegt

ltfont color=bluegt

La fecha y hora actuales son

lt include file=fechaHorajsp gt

ltfontgt

ltbodygt

lthtmlgt

lt-- fichero fechaHorajsp --gt

lt page import=javautil gt

lt= (new javautilDate())toLocaleString() gt

32223 LA DIRECTRIZ TAGLIB

La directriz taglib indica la biblioteca de acciones personalizadas que podremos utilizar en

la codificacioacuten de la paacutegina JSP Para distinguir esas acciones entre otras existentes se utiliza

un prefijo (prefix) Su sintaxis es

lt taglib (uri=rdquoURI_bibliotecardquo|tagdir=rdquoDir_biblioteca_tagrdquo)

prefix=rdquoprefijordquo gt

Cuando se trata de una biblioteca definida mediante una clase Java y un descriptor (archivo

tld) eacutesta se identifica mediante un URI (Uniform Resource Identifier- URL relativos) Por

ejemplo

lt taglib uri=rdquohttpMarioRossainzLopezmiBibliotecardquo

prefix=rdquofunrdquo gt

ltpgtltfunaccion01 gt

La uacuteltima liacutenea del ejemplo tiene dos etiquetas una etiqueta p HTML y otra accion01

perteneciente a la biblioteca miBiblioteca En cambio si la biblioteca se define mediante un

archivo tag entonces se identifica mediante su ruta relativa en el sistema de archivos

lt taglib tagdir=rdquoWEB-INFtagsrdquo prefix=rdquofunrdquo gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpgtltfunaccion01 gt

La directriz taglib debe colocarse antes de utilizar en la paacutegina JSP las acciones

personalizadas definidas por la misma Se puede utilizar maacutes de una directriz pero el prefijo

utilizado debe ser uacutenico para cada una de ellas

3223 ACTIVACION DEL LENGUAJE DE EXPRESION (LE)

La especificacioacuten JSP 20 define un lenguaje de expresioacuten como alternativa a elementos de

programacioacuten escritos con coacutedigo Java y especificaciones anteriores a la JSP 20 Para que

este lenguaje pueda ser interpretado tienen que cumplirse 2 requisitos

1 Que la propiedad isELIgnored de la directriz page valga false

lt page isELIgnored= ldquofalserdquo gt

2 Que el descriptor de despliegue webxml en la carpeta WEB-INF indique doacutende se

localiza el esquema XML para la especificacioacuten Servlet 24 que a su vez utiliza el

esquema XML para la especificacioacuten Java Server Page 20

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

Utilizando el lenguaje de expresioacuten se podriacutea modificar la paacutegina Cuentajsp de la seccioacuten

3212 de este documento como se muestra a continuacioacuten Esta nueva paacutegina

1 Especifica que utilizaraacute la biblioteca core de etiquetas estandar (de la que se hablaraacute maacutes

adelante)

2 La primera vez que sea accedida definiraacute la variable atrCuenta en el aacutembito de la

aplicacioacuten con un valor inicial nulo y la incrementaraacute en una unidad cuando sea accedida

sucesivas veces simplemente incrementaraacute esta variable en una unidad

3 Finalmente mostraraacute una paacutegina con un contenido anaacutelogo al siguiente Esta formado

por una cabecera y una segunda liacutenea compuesta por el valor del paraacutemetro parNombre

enviado con la peticioacuten un texto fijo el valor de la variable atrCuenta y otro texto fijo

dependiente del valor de esta variable

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

El coacutedigo completo es el siguiente

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

3224 VARIABLES Y EXPRESIONES

Para acceder a una simple variable se puede escribir algo como lo siguiente $nombre y

para acceder a una propiedad de un objeto podemos escribir algo como

$paramparNombre

$applicationScopeatrCuenta

$pageContextrequestrequestURI

La primera liacutenea del ejemplo anterior obtiene el valor de la propiedad parNombre del objeto

param la segunda el valor del atributo atrCuenta del objeto applicationScope y la tercera

el URL relativo de la paacutegina JSP solicitada

El lenguaje de expresioacuten es maacutes tolerante con respecto a las variables con valor null y ejecuta

muchas maacutes conversiones de forma automaacutetica sobre el tipo de los datos cuando la expresioacuten

a evaluar asiacute lo requiere Por ejemplo la etiqueta condicional siguiente incluye una expresioacuten

que compara el valor del atributo atrCuenta con aacutembito de aplicacioacuten con 10 (convirtiendo

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

impliacutecitamente el valor del atributo al tipo de la constante para poder realizar la comparacioacuten

El resultado seraacute un valor de tipo boolean

ltcif test=rdquo$applicationScopeatrCuenta gt 10rdquogt

ltcifgt

o bien

ltcif test=rdquo$atrCuenta gt 10rdquogt

ltcifgt

Para que una literal pueda incluir un caracter significativo para el lenguaje dicho caracter

debe ser especificado como una secuencia de escape (caracter) Por ejemplo la siguiente

expresioacuten da lugar al literal ldquovezrdquo o ldquovecesrdquo entre comillas dobles

$(atrCuenta gt 1) iquest ldquordquovecesrdquordquo ldquordquovezrdquordquo

Cualquier objeto o atributo de un objeto definido en algunos de los aacutembitos de una paacutegina

puede ser utilizado como una variable Por ejemplo $atrCuenta+1 es una expresioacuten que

realiza la suma de la variable atrCuenta con 1

Cuando se trate de una propiedad de un objeto para acceder a ella se utilizaraacute el operador

punto o bien la notacioacuten empleada para acceder a un elemento de una matriz Por ejemplo

$paramparNombre

$param[ldquoparNombrerdquo]

Una expresioacuten LE puede aparecer en cualquier lugar donde pueda aparecer un texto fijo Por

tanto para informar al contenedor JSP que se trata de una expresioacuten y no de un texto fijo se

utilizan los delimitadores $ al principio y al final

3225 OPERADORES

OPERADOR DESCRIPCIOacuteN Acceso a la propiedad de un objeto o a un elemento de un Map

[] Acceso al elemento de una matriz o de un objeto List

() Pareacutentesis para alterar la prioridad en la evaluacioacuten de una expresioacuten

If ternario condicion expresion1 expresioacuten 2

+ Suma

- Resta

Producto

oacute div Divisioacuten

oacute mod Moacutedulo o resto de una divisioacuten

== oacute eq Igualdad

= oacute ne Diferente

lt oacute lt Menor que

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt oacute gt Mayor que

lt= oacute le Menor o igual que

gt= oacute ge Mayor o igual que

ampamp oacute and Operacioacuten Loacutegica AND

|| oacute or Operacioacuten Loacutegica OR

oacute not Operacioacuten Loacutegica NOT

empty Verifica si el valor de una variable es null si un String esta vaciacuteo o si una matriz Map

o Collection no tienen elementos

func(args) Llamada a una funcioacuten donde func es el nombre de la funcioacuten y arg representa cero o

maacutes argumentos separados por comas

El ejemplo siguiente muestra una paacutegina JSP compuesta por elementos HTML expresiones

LE y objetos impliacutecitos

lthtmlgt

ltheadgtlttitlegtJSP 20lttitlegtltheadgt

ltbodygt

lth3gtLenguaje de expresioacuten (LE)lth3gt

ltpgtLa siguiente tabla ilustra algunas expresiones LE

ltbrgtltbrgtlttable border=1gt

lttrgt

ltthgtltbgtExpresioacutenltbgtltthgt

ltthgtltbgtValorltbgtltthgt

lttrgt

lttrgt

lttdgt$3 + 6lttdgt

lttdgt$3 + 6lttdgt

lttdgt

lttrgt

lttdgt$(7 gt 4) 7 4lttdgt

lttdgt$(7 gt 4) 7 4lttdgt

lttrgt

lttrgt

lttdgt$header[host]lttdgt

lttdgt$header[host]lttdgt

lttrgt

lttablegt

ltbodygt

lthtmlgt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

323 BIBLIOTECA ESTANDAR DE ETIQUETAS

La biblioteca estaacutendar de etiquetas JSP (JSTL ndash Java Server Page Estaacutendar Tag Library)

incluye una cantidad amplia de etiquetas para diferentes aacutereas de trabajo

Aacuterea baacutesica (su prefijo es c ndash core) y contiene

o Soporte de variables (remove y set)

o Control del flujo (choose when otherwise forEach forTokens if)

o Manejo de URL (import param redirect param y url param)

o Operaciones varias (match y out)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlcore

Aacuterea XML (su prefijo es x) y contiene

o Sentencias baacutesicas (out parse y set)

o Control del flujo (choosehellip whenhellip otherwise forEach e if)

o Transformacioacuten de Documentos (transformhellipparam)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlxml

Aacuterea Internacionalizacioacuten (su prefijo es fmt) Contiene

o Localidad (setLocale y requestEncoding)

o Mensajes (bundle message param y setBundle)

o Formateo de Fechas y nuacutemeros (formatNumber formateacuteate parseDate

parseNumber setTimeZone timeZone)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlfmt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Aacuterea SQL (su prefijo es sql) es el lenguaje estandar para interactuar con bases de datos

relacionales y contiene setDataSource Quero dateParam param transaction y

update dateParam param) El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlsql

Aacuterea Funciones (su prefijo es fn) y contiene

o Longitud de una coleccioacuten (length)

o Manipulacioacuten de String (toUpperCase toLowerCase substring

substringAfter substringBefore trim replace indexOf startsWith

endsWith contains containsIgnoreCase split join y escapeXml)

o El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlfunctions

3231 OPERACIONES CON ETIQUETAS BAacuteSICAS

En un ejemplo pasado teniacuteamos el siguiente coacutedigo

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

En este ejemplo se hace referencia al aacuterea baacutesica de JSTL con el prefijo c y se utiliza la

etiqueta cset para definir la variable atrCuenta Si la variable ya esta definida simplemente

se le asigna el valor especificado

La uacuteltima parte del ejemplo anterior podriacutea haberse escrito de esta otra forma

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcif test=rdquo$atrCuenta gt 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcifgt

$atrCuenta $str

La etiqueta cif permite la ejecucioacuten condicional de su cuerpo en funcioacuten del valor del

atributo de test

La etiqueta cchoose permite la ejecucioacuten del cuerpo de la primera etiqueta cwhen cuyo

atributo test sea evaluado a true Si ninguna de las condiciones se evaluacutea a true entonces se

evaluacutea el cuerpo de la etiqueta cotherwise si estaacute presente El siguiente coacutedigo muestra otra

manera de escribir el ejemplo anterior utilizando estas uacuteltimas etiquetas

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcchoosegt

ltcwhen test=rdquo$atrCuenta == 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcwhengt

ltcotherwisegt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcotherwisegt

ltcchoosegt

$atrCuenta $str

La etiqueta cforEach permite iterar sobre una coleccioacuten de objetos La coleccioacuten se

especifica por medio del atributo iacutetems y el elemento actual de la coleccioacuten estaacute disponible a

traveacutes de la variable establecida por el atributo var Por ejemplo el siguiente fragmento de

coacutedigo visualiza una tabla con las variables definidas a nivel de aacutembito de paacutegina

lttable border=rdquo1rdquogt

ltcforEach var=rdquoitemrdquo iacutetems=rdquo$pageScoperdquogt

lttrgt

lttdgt $item lttdgt

lttrgt

ltcforEachgt

lttablegt

La etiqueta ccatch atrapa una excepcioacuten que ocurra en el cuerpo de la misma Por ejemplo

el siguiente segmento de coacutedigo lanzaraacute una excepcioacuten si el paraacutemetro mes se escribe con

letras en vez de con nuacutemeros

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltbodygt

lthtmlgt

Un URL anaacutelogo al siguiente daraacute lugar a que la excepcioacuten sea lanzada cuando se ejecute la

expresioacuten $nMes 3 de la paacutegina anterior

httplocalhost8080JSP2exceppruebajspmes=marzo

La excepcioacuten indica que ha ocurrido un error al tratar de convertir ldquomarzordquo a un entero de

tipo Long Para cachar esta excepcioacuten y darle un tratamiento adecuado habraacute que modificar

la paacutegina JSP anterior como se indica a continuacioacuten

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltccatch var=rdquoerrorOcurridordquogt

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltccatchgt

ltcif test=rdquo$not empty errorOcurridordquogt

Error el paraacutemetro mes debe ser un nuacutemero ltbgt

ltbrgt Informacioacuten del error dada por el sistema

ltbrgt ltfont color=rdquoFF0000rdquogt $errorOcurrido ltfontgt

ltcifgt

ltbodygt

lthtmlgt

3232 ACCESO A BASES DE DATOS CON JSP

Las etiquetas que proporciona el aacuterea SQL permiten realizar

Conexioacuten con una base de datos

Realizacioacuten de consultas a la base de datos

Acceso al conjunto de resultados

Ejecucioacuten de actualizaciones y transacciones

Todas las etiquetas SQL actuacutean sobre una base de datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

32321 CONEXIOacuteN CON LA BASE DE DATOS

La conexioacuten con la base de datos puede realizarse con la etiqueta sqlsetDataSource Por

ejemplo si se esta utilizando el administrador de bases de datos MySql con el controlador

JDBC se puede realizar una conexioacuten con una base de datos digamos bd_tutorias de la

manera siguiente

ltsqlsetDataSource var=rdquobdrdquo

driver=rdquocommysqljdbcDriverrdquo

url=rdquojdbcmysqllocalhost3306bd_tutoriasrdquo

user=rdquoadminrdquo

password=rdquoadminadminrdquo gt

32322 CONSULTA A LA BASE DE DATOS

La etiqueta sqlQuero permite realizar una consulta a una base de datos Por ejemplo el

siguiente fragmento de coacutedigo realiza una consulta a la base de datos representada por bd y

obtiene un conjunto de resultados representado por cdr

ltsqlquery var=rdquocdrrdquo dataSource=rdquo$bdrdquogt

SELECT professor dia hora alumno

FROM profesores tutorias citas

WHERE profesoresid_profesor=tutoriasid_profesor

AND tutoriasid_tutoria=citasid_tutoria

ltsqlquerygt

32323 MODIFICACIONES SOBRE LA BASE DE DATOS

La etiqueta sqlupdate permite ejecutar una sentencia SQL INSERT UPDATE o DELETE

y cualquier otra sentencia SQL que no retorne ninguacuten valor Por ejemplo

ltsqlupdate var=rdquocontrdquo dataSource=rdquo$bdrdquo gt

UPDATE profesores

SET profesor=

WHERE profesor=

ltsqlparam value=rdquo$paramProfesorrdquo gt

ltsqlparam value=rdquo$paramIDrdquo gt

ltsqlupdategt

Una operacioacuten UPDATE puede utilizar el siacutembolo para indicar que el valor que tendriacutea que

evaluarse en esa posicioacuten seraacute suministrado por una etiqueta sqlparam como por ejemplo

httplocalhost8080JSP2sqlpruebajspProfesor=Mario+Rossainz+LopezampID=514

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Peticioacuten HTTP GET Cuando el tipo de peticioacuten HTTP es GET los datos del formulario

son enviados al servidor a continuacioacuten del URL especificado por el atributo action de form

El tamantildeo de la cadena enviada estaacute limitado y al estar en ASCII es totalmente legible por

tanto no es un modo seguro

Es por ello que cuando se requiere del enviacuteo de datos seguros y ademaacutes el nuacutemero de datos

del formulario que son enviados al servidor son muchos resulta ser mejor el uso del meacutetodo

POST Veamos otro ejemplo

import javaio

import javaxservlet

import javaxservlethttp

import javautil

public class MostrarParametros extends HttpServlet

public void doGet(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

responsesetContentType(texthtml)

PrintWriter out= responsegetWriter()

String titulo=Lectura de todos los paraacutemetros de Peticioacuten

outprintln(ltdoctype html public -W3CDTD HTML 40 +

TransitionalENgt)

outprintln(lthtmlgt)

outprintln(ltheadgtlttitlegt+titulo+lttitlegtltheadgt)

outprintln(ltbody bgcolor=FDF5E6gtn+

lth1 align=centergt+titulo+lth1gtn+

lttable border=1 align=centergtn+

lttr bgcolor=FFAD00gtn+

ltthgtNombre del parampaacutemetroltthgtValor(es) del

parampaacutemetro)

Enumeration nombresParam=requestgetParameterNames()

while(nombresParamhasMoreElements())

String nombreParam= (String)nombresParamnextElement()

outprint(lttrgtlttdgt+nombreParam+nltTDgt)

String[]valoresParam=

requestgetParameterValues(nombreParam)

if (valoresParamlength==1)

String valorParam=valoresParam[0]

if (valorParamlength()==0)

outprintln(ltigt Sin valor ltigt)

else

outprintln(valorParam)

else

outprintln(ltulgt)

for (int i=0 iltvaloresParamlengthi++)

outprintln(ltligt+valoresParam[i])

outprintln(ltulgt)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

outprintln(lttablegtnltbodygtlthtmlgt)

public void doPost(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

doGet(requestresponse)

El servlet escrito utiliza un meacutetodo doPost que soacutelo ejecuta a Donet Esto es porque se quiere

que el servlet pueda manejar tanto las peticiones GET como las POST Por otro lado el

formulario es el siguiente

ltdoctype html public -W3CDTD HTML 40 TransitionalENgt

lthtmlgt

ltheadgt

lttitlegt Un Formulario de ejemplo que utiliza POST lttitlegt

ltheadgt

ltbody bgcolor=FDF5E6gt

lth1 align=centergt Un formulario de Ejemplo que utiliza POST

lth1gt

ltform action=httplocalhost8080MostrarParametros

servletMostrarParametros

method=postgt

Nuacutemero de elemento ltinput type=text name=elemNumgt ltbrgt

Cantidad ltinput type=text name=cantidadgt ltbrgt

Precio Unitario ltinput type=text name=precio value=$gt

ltbrgtlthrgt

Nombre de Pila ltinput type=text name=nombrePilagt ltbrgt

Apellido(s) ltinput type=text name=apellidogt ltbrgt

Iniciales ltinput type=text name=inicialesgt ltbrgt

Domicilio de envio lttextarea name=domicilio rows=3

cols=40gtlttextareagt ltbrgt

Tarjeta de creacutedito ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta value=VisagtVisa ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta value=Master Cardgt

Master Card ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta value=AmexgtAmerican

Expresss ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta

value=DiscovergtDiscover ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta

value=Java Smart CardgtTarjeta Inteligente de Java

ltbrgt

Nuacutemero de la tarjeta de creacutedito

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltinput type=password name=numTarjetagtltbrgt

Repita el nuacutemero de la tarjeta de creacutedito

ltinput type=password name=numTarjetagtltbrgtltbrgt

ltcentergt

ltinput type=submit value=Enviar pedidogt

ltcentergt

ltformgt

ltbodygt

lthtmlgt

El formulario HTML del listado anterior utiliza POST como deberiacutea ser en todos los campos

que tienen contrasentildea

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Si intenta ejecutar el servlet MostrarParametros directamente en el explorador con el URL

httplocalhost8080MostrarParametrosservletMostrarParametros se obtendraacute la paacutegina

Web sin resultados

Peticioacuten HTTP POST Cuando el tipo de peticioacuten HTTP es POST los datos son enviados

al servidor en el cuerpo de la peticioacuten Es el meacutetodo maacutes usual de enviar los datos de un

formulario Con este tipo de peticioacuten la informacioacuten del formulario se enviacutea despueacutes del URL

indicado por action en el cuerpo de la peticioacuten y el tamantildeo de la informacioacuten enviada no esta

limitado

Seguacuten lo expuesto escoger el meacutetodo para enviar la informacioacuten no es difiacutecil Si los datos

son pocos y no importa su confidencialidad o manipulacioacuten utilizamos GET Si son largos

privados o importantes utilizamos POST

318 ACCESO A BASES DE DATOS CON SERVLETS

Una aplicacioacuten Java que realiza accesos a bases de datos funciona seguacuten una arquitectura que

permite escribir los programas abstrayeacutendose de los detalles de los niveles inferiores (discos

controladores sistema operativo etc) como lo muestra la figura siguiente

JDBC (Java DataBase Connectivity ndash Conexioacuten con Bases de Datos desde Java) es una API

de Java que permite ejecutar instrucciones SQL para manipular y gestionar bases de datos

relacionales Para que una aplicacioacuten Java pueda hacer operaciones sobre una base de datos

previamente tiene que establecer una conexioacuten con la misma Esta conexioacuten se realiza a

traveacutes de un controlador (driver) seguacuten la figura de arriba La API-JDBC se proporciona en

dos paquetes javasql y javaxsql El primer paquete contiene las interfaces y clases Java

fundamentales de JDBC en tanto que el segundo paquete es una extensioacuten del primero e

APLICACION

SISTEMA OPERATIVO

CONTROLADOR

Oracle Access MySql

JVM

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

incluye las clases que interactuacutean con JNDI y otras que gestionan conjuntos de conexiones

con una misma base de datos Para maacutes detalles del uso de JDBC veacutease el apeacutendice A de

estas notas

El primer paso para crear una conexioacuten entre una aplicacioacuten Java y una base de datos es

registrar el controlador JDBC adecuado para esa base con el fin de que la JVM pueda

utilizarlo Existen distintos tipos de controladores JDBC por ejemplo

ldquocommysqljdbcDriverrdquo que es el controlador utilizado cuando el motor de base de datos

que se utiliza es MySql

En el supuesto caso de que la base de datos soacutelo permitiera el acceso a traveacutes de controladores

ODBC como lo hace ACCESS siempre podemos usar el controlador puente JDBC-ODBC

incluido como parte del JDK ldquosunjdbcodbcJdbcOdbcDriverrdquo Este tipo de controladores

es decir los basados en ODBC (Open DataBase Connectivity) son bastante utilizados en

entornos Windows pues este SO incluye ODBC El apeacutendice A describe al final como

administrar los oriacutegenes de datos ODBC en Windows

Asiacute pues la mayor ventaja de los servlets con respecto a la conexioacuten con bases de datos viacutea

JDBC es que su ciclo de vida les permite mantener conexiones abiertas con las mismas a lo

largo de toda una sesioacuten Esto permite recortar tiempo con respecto a otras tecnologiacuteas como

la CGI Ademaacutes JDBC es una tecnologiacutea independiente de las bases de datos

Como ejemplo vamos a implementar una simple aplicacioacuten Web basada en servlets que

muestre una especie de directorio de personas La aplicacioacuten podraacute consultar insertar

modificar borrar o listar la informacioacuten de cada una de las personas almacenadas en la base

de datos a la que se hace acceso (que estaraacute en formato access)

La estructura de la Base de Datos es una tabla con los siguientes campos

DNI Nombre Apellido Edad

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

53023767A Pedro Rubio 18

77459822P Luis Tejedor 47

123456MRL Mario Rossainz 35

La estructura de la aplicacioacuten se muestra en la figura siguiente

lthtmlgt

ltbodygt

lttable border=1gtlttrgtlttdgt

ltform action=httplocalhost8080directorioTelservletSvAccesoBD

method=getgt

DNI ltinput type=text name=DNIgt ltbrgt

Nombre ltinput type=text name=Nombregt ltbrgt

Apellido ltinput type=text name=Apellidogt ltbrgt

Edad ltinput type=text name=Edadgt ltbrgtltbrgt

ltinput type=submit value=Consultar name=BotonConsultargt

ltinput type=submit value=Insertar name=BotonInsertargt

ltinput type=submit value=Modificar name=BotonModificargt

ltinput type=submit value=Borrar name=BotonBorrargt

ltinput type=submit value=Listar name=BotonListargt ltbrgt

ltcentergt

ltinput type=submit value= |lt name=BotonPrimerogt

ltinput type=submit value= -- name=BotonMenosCincogt

ltinput type=submit value= - name=BotonAnteriorgt

ltinput type=submit value= + name=BotonSiguientegt

ltinput type=submit value= ++ name=BotonMasCincogt

ltinput type=submit value= gt| name=BotonUltimogt

ltcentergt

lttdgt

lttdgt

lttextarea name=AreaDeListado rows=10 cols=35gtlttextareagt

SvAccesoBDhtml

SvAccesoBD

ObBorrado ObListado ObConsulta

ObInsercion

ObModificacion

ObPosicionamiento

ObRegistro

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lttdgt

lttrgt

ltformgt

lttablegt

ltbodygt

lthtmlgt

SvAccesoBDhtml

import javaio

import javaxservlet

import javaxservlethttp

public class SvAccesoBD extends HttpServlet

private int PosicionBuscada = 1

private String AreaDeListado=

PrintWriter out

public void doGet(HttpServletRequest request HttpServletResponse response)

throws IOException ServletException

String DNI = requestgetParameter(DNI)

String Nombre = requestgetParameter(Nombre)

String Apellido = requestgetParameter(Apellido)

String Edad = requestgetParameter(Edad)

String BotonConsultar = requestgetParameter(BotonConsultar)

String BotonInsertar = requestgetParameter(BotonInsertar)

String BotonModificar = requestgetParameter(BotonModificar)

String BotonBorrar = requestgetParameter(BotonBorrar)

String BotonListar = requestgetParameter(BotonListar)

String BotonPrimero = requestgetParameter(BotonPrimero)

String BotonMenosCinco = requestgetParameter(BotonMenosCinco)

String BotonAnterior = requestgetParameter(BotonAnterior)

String BotonSiguiente = requestgetParameter(BotonSiguiente)

String BotonMasCinco = requestgetParameter(BotonMasCinco)

String BotonUltimo = requestgetParameter(BotonUltimo)

AreaDeListado = requestgetParameter(AreaDeListado)

responsesetContentType(texthtml)

out = responsegetWriter()

outprintln(lthtmlgt)

outprintln(ltbodygt)

if (BotonConsultar=null) ConsultarDatos(DNI)

if (BotonInsertar=null) InsertarDatos(DNINombreApellidoEdad)

if (BotonModificar=null) ModificarDatos(DNINombreApellidoEdad)

if (BotonBorrar=null) BorrarDatos(DNI)

if (BotonListar=null) ListarDatos(DNI)

if (BotonPrimero=null) Controles(1)

if (BotonMenosCinco=null) Controles(2)

if (BotonAnterior=null) Controles(3)

if (BotonSiguiente=null) Controles(4)

if (BotonMasCinco=null) Controles(5)

if (BotonUltimo=null) Controles(0)

outprintln(ltbodygt)

outprintln(lthtmlgt)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

private void ConsultarDatos(String DNI)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObRegistro InstanciaFila = InstanciaConsultaDameDatos()

GenerarRespuesta(InstanciaFilaDameDNI()InstanciaFilaDameNombre()

InstanciaFilaDameApellido()

StringvalueOf(InstanciaFilaDameEdad()))

else

GenerarRespuesta(DNI------------)

PosicionBuscada = 1

public void ListarDatos(String DNI)

ObListado InstanciaListado = new ObListado()

AreaDeListado = InstanciaListadoDameResultado()

ConsultarDatos(DNI)

PosicionBuscada = 1

public void BorrarDatos(String DNI)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObBorrado InstanciaBorrado = new ObBorrado(PosicionBuscada)

GenerarRespuesta()

else

GenerarRespuesta(----------------)

PosicionBuscada = 1

public void ModificarDatos(String DNI String Nombre String Apellido

String Edad)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObRegistro InstanciaFila = new ObRegistro(DNI Nombre Apellido

IntegerparseInt(Edad))

ObModificacion InstanciaModificacion = new ObModificacion(PosicionBuscada

InstanciaFila)

GenerarRespuesta(DNINombreApellidoEdad)

else

GenerarRespuesta(----------------)

PosicionBuscada = 1

public void InsertarDatos(String DNI String Nombre String Apellido

String Edad)

ObRegistro InstanciaFila = new ObRegistro(DNI Nombre Apellido

IntegerparseInt(Edad))

ObInserccion InstanciaInserccion = new ObInserccion(InstanciaFila)

GenerarRespuesta()

PosicionBuscada=1

public void Controles(String Identificador)

ObPosicionamiento InstanciaPosicionamiento =

new ObPosicionamiento(IdentificadorPosicionBuscada)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ObRegistro InstanciaFila = InstanciaPosicionamientoDameDatos()

GenerarRespuesta(InstanciaFilaDameDNI()InstanciaFilaDameNombre()

InstanciaFilaDameApellido()

StringvalueOf(InstanciaFilaDameEdad()))

PosicionBuscada = InstanciaPosicionamientoPosicion()

private void GenerarRespuesta(String DNI String Nombre String Apellido

String Edad)

outprintln(lttable border=1gt)

outprintln(lttrgt)

outprintln(lttdgt)

outprintln(ltform

action=httplocalhost8080directorioTelservletSvAccesoBD

method=getgt)

outprintln( DNI ltinput type=text name=DNI value=+DNI+gtltbrgt)

outprintln( Nombre ltinput type=text name=Nombre

value=+Nombre+gtltbrgt)

outprintln( Apellido ltinput type=text name=Apellido

value=+Apellido+gtltbrgt)

outprintln( Edad ltinput type=text name=Edad

value=+Edad+gtltbrgtltbrgt)

outprintln( ltinput type=submit value=Consultar

name=BotonConsultargt)

outprintln( ltinput type=submit value=Insertar

name=BotonInsertargt)

outprintln( ltinput type=submit value=Modificar

name=BotonModificargt)

outprintln( ltinput type=submit value=Borrar name=BotonBorrargt)

outprintln( ltinput type=submit value=Listar name=BotonListargt

ltbrgt)

outprintln( ltcentergt)

outprintln( ltinput type=submit value= |lt name=BotonPrimerogt)

outprintln( ltinput type=submit value= --

name=BotonMenosCincogt)

outprintln( ltinput type=submit value= - name=BotonAnteriorgt)

outprintln( ltinput type=submit value= +

name=BotonSiguientegt)

outprintln( ltinput type=submit value= ++

name=BotonMasCincogt)

outprintln( ltinput type=submit value= gt| name=BotonUltimogt)

outprintln( ltcentergt)

outprintln( lttdgt)

outprintln( lttdgt)

outprintln( lttextarea name=AreaDeListado rows=10

cols=35gt+AreaDeListado+lttextareagt)

outprintln( lttdgt)

outprintln( lttrgt)

outprintln( ltformgt)

outprintln( lttablegt)

SvAccesoBDjava

import javasql

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

public class ObBorrado

ObBorrado(int PosicionBuscada)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

Personasabsolute(PosicionBuscada)

PersonasdeleteRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

ObBorradojava

import javasql

import javaawtTextArea

public class ObListado

private String Resultado=

ObListado()

String DNI Nombre Apellido Linea

int Edad Posicion

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement()

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

while (Personasnext())

DNI = PersonasgetString(DNI)

Nombre = PersonasgetString(Nombre)

Apellido = PersonasgetString(Apellido)

Edad = PersonasgetInt(Edad)

Posicion = PersonasgetRow()

Linea = DNI+ +Nombre+ +Apellido+ +StringvalueOf(Edad)

Resultado=Resultado+StringvalueOf(Posicion)+ +Linea+n

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public String DameResultado()

return Resultado

ObListadojava

public class ObRegistro

private String DNI Nombre Apellido

private int Edad

ObRegistro (String DNI String Nombre String Apellido int Edad)

thisDNI = DNI

thisNombre = Nombre

thisApellido = Apellido

thisEdad = Edad

String DameDNI()

return DNI

String DameNombre()

return Nombre

String DameApellido()

return Apellido

int DameEdad()

return Edad

ObRegistrojava

import javasql

public class ObConsulta

private int Posicion = 0

private ObRegistro DatosPersona

ObConsulta(String DNIPedido)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement()

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

while (Personasnext())

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

String DNI = PersonasgetString(DNI)

if (DNIequalsIgnoreCase(DNIPedido))

Posicion = PersonasgetRow()

String Nombre = PersonasgetString(Nombre)

String Apellido = PersonasgetString(Apellido)

int Edad = PersonasgetInt(Edad)

DatosPersona = new ObRegistro(DNINombreApellidoEdad)

break

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public int PosicionEncontrada()

return Posicion

public ObRegistro DameDatos()

return DatosPersona

ObConsultajava

import javasql

public class ObInserccion

ObInserccion(ObRegistro Datos)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

PersonasmoveToInsertRow()

PersonasupdateString(DNI DatosDameDNI())

PersonasupdateString(NombreDatosDameNombre())

PersonasupdateString(Apellido DatosDameApellido())

PersonasupdateInt(EdadDatosDameEdad())

PersonasinsertRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

catch (SQLException e)

Systemoutprintln(e)

ObInsercionjava

import javasql

public class ObModificacion

ObModificacion(int PosicionBuscada ObRegistro Datos)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

Personasabsolute(PosicionBuscada)

PersonasupdateString(DNIDatosDameDNI())

PersonasupdateString(NombreDatosDameNombre())

PersonasupdateString(ApellidoDatosDameApellido())

PersonasupdateInt(EdadDatosDameEdad())

PersonasupdateRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

ObModificacionjava

import javasql

public class ObPosicionamiento

private ObRegistro DatosPersona

private int Posicion

ObPosicionamiento(String Accion int Posicion)

int IDAccionEdad

String DNINombreApellido

boolean PosicionCorrecta=false

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

FROM DatosPersonales)

Personasabsolute(Posicion)

IDAccion = IntegerparseInt(Accion)

switch (IDAccion)

case 0

PosicionCorrecta = Personaslast()

break

case 1

PosicionCorrecta = Personasfirst()

break

case 2

PosicionCorrecta = Personasrelative(-5)

break

case 3

PosicionCorrecta = Personasprevious()

break

case 4

PosicionCorrecta = Personasnext()

break

case 5

PosicionCorrecta = Personasrelative(+5)

break

if (PosicionCorrecta)

thisPosicion = PersonasgetRow()

DNI = PersonasgetString(DNI)

Nombre = PersonasgetString(Nombre)

Apellido = PersonasgetString(Apellido)

Edad = PersonasgetInt(Edad)

else

thisPosicion = Posicion

DNI = ----

Nombre = ----

Apellido = ----

Edad = 0

DatosPersona = new ObRegistro(DNINombreApellidoEdad)

Personasclose()

Conexionclose()

SentenciaSQLclose()

Systemoutprintln(StringvalueOf(Posicion)++StringvalueOf(thisPosicion))

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public int Posicion()

return Posicion

public ObRegistro DameDatos() return DatosPersona

ObPosicionamientojava

En este ejemplo se emplean servlets y paacuteginas Web Los clientes habitualmente trabajan en

una computadora remota y los programas se ejecutan en un servidor El mecanismo de

comunicaciones que soporta el protocolo http nos permite consultar en el servidor los datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

que ha seleccionado o escrito el usuario de esta manera se puede observar una disociacioacuten

entre la interfaz graacutefica de usuario (que se ejecuta en los equipos de los clientes) y el

programa que recoge los datos y ejecuta las acciones pertinentes (que se ejecuta en el

servidor)

Como puede observarse el coacutedigo SvAccessoBD es un servlet que lleva a cabo las siguientes

operaciones

1 Recoge los valores provenientes del usuario

2 Determina la naturaleza de la accioacuten a realizar

3 Realiza su cometido con la base de datos

4 Genera la respuesta que recibiraacute el usuario

32 JSP

JSP significa Java Server Pages que traducido quiere decir Paacuteginas de Servidor Java y es

por tanto una tecnologiacutea orientada a crear paacuteginas Web con programacioacuten en JAVA es decir

permite mezclar HTML estaacutendar y estaacutetico con un contenido dinaacutemico etiquetas especiales

(oacuterdenes) y trozos de coacutedigo JAVA (scriptlets o secuencias de oacuterdenes) o contenido dinaacutemico

generado por servlets Eacuteste contenido dinaacutemico se encuentra encerrado en etiquetas

especiales muchas de las cuales inician con lt y finalizan con gt El motor de las paacuteginas

JSP esta basado en los servlets de JAVA

En la tecnologiacutea JSP se crean paacuteginas parecidas a las paacuteginas que se crean en ASP (Active

Server Page de Microsoft) o PHP (Personal Home Page) que son dos tecnologiacuteas de paacuteginas

ejecutadas en el servidor Sin embargo JSP no se cintildee a un sistema operativo o servidor Web

en particular ademaacutes de que proporciona acceso a la tecnologiacutea de Servlets y a JAVA en la

parte dinaacutemica

El proceso para generar paacuteginas JSP accesibles en Web es mucho maacutes simple que en los

servlets Dando por hecho que se tiene un servidor Web que permite usar JSP el coacutedigo se

almacenaraacute en archivos con extensioacuten jsp que incluyen dentro de la estructuras de etiquetas

HTML las sentencias JAVA a ejecutar y tan soacutelo se colocaraacuten en cualquier lugar en donde

se pusiera una paacutegina Web normal sin compilacioacuten sin paquetes y sin configuracioacuten aunque

el servidor tendraacute que ser configurado para acceder a los archivos de clases Servlets y de

JSPs

Aunque lo que se escriba con frecuencia luciraacute como un archivo HTML estaacutendar detraacutes de

ello la paacutegina JSP se convierte automaacuteticamente en un servlet normal donde el HTML

estaacutetico tan soacutelo es enviado al flujo de salida asociado con el meacutetodo service del servlet Esta

traduccioacuten se realiza la primera vez que se solicita la paacutegina De acuerdo como este

configurado el servidor es posible ver el coacutedigo fuente de los servlets generados a partir de

sus paacuteginas JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Por ejemplo supongamos que se ha escrito el siguiente coacutedigo en el archivo Saludojsp

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtEjemplo JSPlttitlegtltheadgt

ltbody bgcolor=ffffccgt

ltcentergt

lth2gtHola mundolth2gt

ltjavautilDate hoy = new javautilDate()gt

La fecha de hoy es lt=hoygt

ltcentergt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional y un fragmento de un scriptlet de JAVA La etiqueta

lt identifica el comienzo del scriptlet y gt el final Una expresioacuten de la forma =variable

es sustituida por el valor de esa variable Para ejecutar esta paacutegina o cualquier otra paacutegina

JSP desde un navegador hay que instalarla en el servidor de aplicaciones de la misma manera

en como se hizo con los servlets Suponiendo entonces que se tiene instalado el Tomcat 5

siga los siguientes pasos

1 Antildeadir en el servidor la carpeta digamos JSP2 dentro de la carpeta webapps del Tomcat

y construir sobre ella la jerarquiacutea de clases ya conocida de los servlets

webappsrarrJSP2rarrWEB-INFrarrclasses

WEB-INFrarrlib

WEB-INFrarrtags

2 Editar en la carpeta WEB-INF el descriptor de despliegue webxml que se indica a

continuacioacuten Este archivo XML indica doacutende se localiza el esquema XML para la

especificacioacuten Servlet 24 que a suvez utiliza el esquema XML para la especificacioacuten

Java Server Page 20 que son las especificaciones que soporta en servidor Tomcat

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=

httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

3 Crear en JSP2 la carpeta saludo que contendraacute la aplicacioacuten y copiar en ella la paacutegina

Saludojsp

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

4 Arrancar el servidor Si el servidor ya estaba arrancado detenerlo y volverlo a arrancar o

bien abrir el explorador escribir el URL httplocalhost8080managerhtml e instalar

la aplicacioacuten

5 Una vez arrancado el servidor verificar si estaacute funcionando correctamente escribiendo

el URL siguiente en el explorador httplocalhost8080 El explorador debe mostrar la

paacutegina del Tomcat

6 Ejecutar la paacutegina JSP iniciando el explorador y escribiendo el URL siguiente

httplocalhost8080JSP2saludoSaludojsp donde la sintaxis geneacuterica es

httpservidor[puerto]MiCarpetapaginajsp

Cuando esta paacutegina (Saludojsp) es invocada por primera vez el motor JSP lleva a cabo una

fase de traduccioacuten de la misma en un servlet y el motor Servlet es el que ejecutaraacute eacuteste uacuteltimo

para generar el HTML dinaacutemico que seraacute enviado al explorador cliente seguacuten puede

deducirse de la figura siguiente La proacutexima vez que la paacutegina sea solicitada el motor JSP

ejecutaraacute el servlet que fue caragado la primera vez a no ser que la paacutegina haya cambiado

en cuyo caso seraacute compilada automaacuteticamente en un nuevo servlet y ejecutada

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Regresando al ejemplo el archivo java generado por el Tomcat a partir del archivo

Saludojsp se localiza en la carpeta workCatalinalocalhost de la instalacioacuten de Tomcat

321 ELEMENTOS PARA SECUENCIAS DE COMANDOS

Los elementos para secuencias de comandos permiten insertar coacutedigo en el servlet que seraacute

generado a partir de la paacutegina JSP Existen tres formas

1 Expresiones del tipo lt= expresioacuten gt que se evaluacutean e insertan en el resultado del

servlet

2 Los scriptlets del tipo lt codigo gt que se insertan en el meacutetodo _jspService del

servlet (ejecutado por service)

3 Las declaraciones del tipo lt Codigo gt que se insertan en el cuerpo de la clase del

servlet fuera de cualquier meacutetodo existente

NOTA Los comentarios en JSP se escriben lt-- Comentario JSP --gt en tanto que los

comentarios en HTML son de la forma lt--Comentario HTML --gt La diferencia

semaacutentica radica en que los comentarios HTML cuando se insertan en la respuesta enviada

por el servidor al cliente no se muestran cuando se visualiza el documento HTML pero si

Servidor Maacutequina Cliente

Explorador Web

Contenedor Web

Motor Servlet

Motor JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

los podemos ver cuando se visualiza el coacutedigo fuente en tanto que los comentarios JSP

aunque se inserten en la respuesta enviada por el servidor al cliente no son enviados al

explorador de forma que tampoco se muestran ni se ven cuando se visualiza el coacutedigo fuente

HTML desde el explorador

3211 EXPRESIONES

Se utiliza una expresioacuten JSP para insertar valores directamente en el resultado La sintaxis es

lt= expresioacuten gt Por ejemplo

lt= requestgetParameter(ldquoparNombre) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt lt= s gt

La fecha y hora actual es lt= new javautilDate() gt

La expresioacuten se evaluacutea se convierte a cadena y se inserta en la paacutegina Esta evaluacioacuten se

realiza durante la ejecucioacuten

32111 VARIABLES PREDEFINIDAS

Para simplificar estas expresiones se pueden utilizar cierta cantidad de variables

predefinidas Estos objetos impliacutecitos como tambieacuten se les llama estaacuten disponibles para su

uso durante la implementacioacuten de una paacutegina Web

bull pageContext Es un objeto de la clase PageContext que proporciona acceso a objetos

relacionados con los servlets

bull request Es un objeto de la clase HttpServletRequest que se puede obtener a traveacutes del

meacutetodo getRequest que encapsula los datos enviados por el cliente al servidor

bull response Es un objeto de la clase HttpServletResponse que puede obtenerse a traveacutes

del meacutetodo getResponse que encapsula los datos que el servidor enviaraacute al cliente

bull application Es un objeto de la clase ServletContext que se obtiene a traveacutes del meacutetodo

getServletContext que define un conjunto de meacutetodos que todo servlet utiliza para

comunicar con el contenedor de servlets

bull config Es un objeto de la clase ServletConfig que se obtiene a traveacutes del meacutetodo

getServletConfig y que se utiliza por el contenedor de servlets para pasar informacioacuten

al servlet durante la iniciacioacuten

bull session Es un objeto de la clase HttpSession que se obtiene a traveacutes del meacutetodo

getSession que proporciona una forma de identificar a un usuario que visita las paacuteginas

de un sitio Web

bull out Es un objeto de la clase JspWriter que se obtiene a traveacutes del meacutetodo getOut que

se utiliza para almacenar la respuesta que seraacute enviada al cliente que hizo la peticioacuten de

la paacutegina

bull page Es un objeto geneacuterico de la clase Object que se obtiene a traveacutes del meacutetodo

getPage y que representa al servlet obtenido a partir de la paacutegina JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

bull exception Es un objeto de la clase Exception que se obtiene a traveacutes del meacutetodo

getException que contendraacute informacioacuten a cerca de cualquier excepcioacuten que se lance

desde la paacutegina JSP

Un ejemplo del uso de uno de estos objetos impliacutecitos seriacutea el siguiente

El nombre de tu host es lt= requestgetRemoteHost() gt

El listado siguiente da un ejemplo de una paacutegina JSP que utiliza algunas variables

predefinidas como uso de expresiones JSP

ltDOCTYPE HTML PUBLIC -W3CDTD HTML 40 Transitional ENgt

lthtmlgt

ltheadgt

lttitlegt Expresiones JSP lttitlegt

ltheadgt

ltbodygt

lth2gt Expresiones JSP lth2gt

ltULgt

ltligt Fecha y hora en curso lt= new javautilDate() gt ltligt

ltligt Nombre de su host lt= requestgetRemoteHost() gt ltligt

ltligt Identificador de su sesioacuten lt= sessiongetId() gt ltligt

ltligt El paraacutemetro ltcodegt paramPrueba ltcodegt del formulario

lt= requestgetParameter(paramPrueba) gt ltligt

ltULgt

ltbodygt

lthtmlgt

Cuya salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3212 LOS SCRIPTLETS JSP

Si se desea hacer algo maacutes complejo que una simple expresioacuten los scriptlets permiten insertar

coacutedigo JAVA en el meacutetodo _jspService del servlet (que es ejecutado por service) La sintaxis

utilizada por los scriptlets es lt coacutedigo java gt Los escriptlets tienen acceso a las

mismas variables definidas de forma automaacutetica como expresiones A manera de ejemplo si

se desea que el resultado aparezca en la paacutegina generada deberiacutea de utilizarse la variable out

como en la siguiente instruccioacuten

lt String datosConsultados= requestgetQueryString()

outprintln(ldquoDatos GET adjuntos ldquo+datosConsultados)

gt

En este ejemplo podriacutea haberse obtenido el mismo resultado utilizando la siguiente expresioacuten

JSP

Datos GET adjuntos lt=requestgetQueryString() gt

En general los scriptlets pueden ejecutar varias tareas que no podriacutean realizarse con las

expresiones Tales tareas incluyen

bull La determinacioacuten de encabezados de respuesta

bull Actualizacioacuten de Bases de Datos

bull Ejecucioacuten de bucles condiciones y otras estructuras complejas

lt for (int i=1 ilt=6 i++)

gt

lth lt=i gtgt Hola Mundo lthlt=i gtgt

lt gt

Como un ejemplo concreto se muestra la siguiente paacutegina JSP llamada Cuentajsp en donde

se observa coacutemo se hace un seguimiento del nuacutemero de veces que un cliente accede a esta

paacutegina a traveacutes de distintas sesiones Para ello supondremos que dicha cuenta es el valor del

atributo atrCuenta del objeto impliacutecito application ya citado La primera vez que el cliente

accede a la paacutegina el valor de atrCuenta seraacute null debido a que auacuten no ha sido fijado este

atributo en este caso se fijaraacute con el valor 1 En los siguientes accesos se leeraacute el valor del

atributo atrCuenta se incrementaraacute en una unidad y se volveraacute a fijar Finalmente se enviacutea

la respuesta al cliente para que se muestre al usuario el valor del contador

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en el objeto impliacutecito application con el nombre

atrCuenta

--gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt

Integer cuenta = (Integer)applicationgetAttribute(atrCuenta)

String s = vez

if (cuenta == null)

cuenta = new Integer(1)

else

cuenta = new Integer(cuentaintValue() + 1)

s = veces

applicationsetAttribute(atrCuenta cuenta)

gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

Has visitado esta paacutegina lt= cuenta gt lt= s gt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional un fragmento de coacutedigo JAVA o scriptlet

expresiones y comentarioshellip

Aquiacute otro ejemplo de la ejecucioacuten de un coacutedigo demasiado complejo para una expresioacuten JSP

Este listado presenta una paacutegina JSP que utiliza el paraacutemetro de peticioacuten colorFondo para

establecer el color de fondo de la paacutegina

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgt

lttitlegt Prueba de Color lttitlegt

ltheadgt

lt

String colorFondo=requestgetParameter(colorFondo)

boolean tieneColorExplicito

if (colorFondo =null)

tieneColorExplicito=true

else

tieneColorExplicito=false

colorFondo=WHITE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt

ltbody bgcolor=lt= colorFondo gtgt

lth2 align=centergt Prueba de color lth2gt

lt

if (tieneColorExplicito)

outprintln(Ha indicado un color de fondo expliacutecito +

colorFondo +)

else

outprintln(Usareacute el color de fondo predeterminado WHITE +

Indique el atributo de peticioacuten

ltigtcolorFondoltigt+

para intentar un color estaacutendar un +

valor RRGGBB o para ver si el navegador Web +

permite el uso de nombres de color X11)

gt

ltbodygt

lthtmlgt

Cuyas posibles salidas son

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3213 DECLARACIONES JSP

Una declaracioacuten JSP permite definir meacutetodos o campos que seraacuten insertados en el cuerpo

principal de la clase del servlet (fuera del meacutetodo _jspService) Una declaracioacuten tiene la

sintaxis lt Coacutedigo Java gt Por ejemplo

lt int i=0 gt

lt

Public void jspinit()

coacutedigo de iniciacioacuten

gt

Una declaracioacuten no genera ninguacuten resultado y se usan junto con las expresiones JSP o los

scriptlets A continuacioacuten se muestra una paacutegina JSP que despliega la cantidad de veces que

se ha solicitado esta paacutegina desde que se arrancoacute el servidor haciendo uso de las

declaraciones JSP

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtDeclaraciones JSPlttitlegtltheadgt

ltbodygt

lth1gtDeclaraciones JSPlth1gt

lt-- Esto es un comentario en JSP --gt

lt private int recuentoAccesos=0 gt

lth2gt Accesos a la paacutegina desde el reinicio del servidor

lt= ++recuentoAccesos gt lth2gt

ltbodygt

lthtmlgt

La salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

322 EL LENGUAJE DE EXPRESION EN JSP 20

Anteriormente se ha visto la necesidad de utilizar fragmentos de coacutedigo java en el desarrollo

de paacuteginas JSP pero con la aparicioacuten de la especificacioacuten JSP 20 ya no hay necesidad de

utilizar fragmentos de coacutedigo Java para nada gracias al nuevo lenguaje de expresioacuten EL

(Expresioacuten Language) a la biblioteca de etiquetas estandar JSTL (JSP Standar Tag Library)

y a las nuevas formas para desarrollar etiquetas personalizadas

El lenguaje de expresioacuten JSP es maacutes un lenguaje de acceso a datos que un lenguaje de

programacioacuten Ya se ha visto que para pasar informacioacuten de un cliente a una paacutegina JSP se

utilizan paraacutemetros en la peticioacuten y atributos en la paacutegina El lenguaje de expresioacuten lo hace

posible sin tener que utilizar scriptlets o expresiones (lt= expresioacuten gt) Por ejemplo las

liacuteneas JSP 12 siguientes escritas utilizando coacutedigo Java

lt= requestgetParameter(ldquoparNombrerdquo) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt veces

bajo la especificacioacuten JSP 20 se pueden escribir de una forma maacutes sencilla como sigue

(ahora no se trata de coacutedigo JAVA)

$paramparNombre has visitado esta paacutegina

$atrCuenta veces

La sintaxis de JSP es sensible a mayuacutesculas y minuacutesculas pero un par de comillas simples es

equivalente a un par de comillas dobles

3221 VARIABLES PREDEFINIDAS (Objetos Impliacutecitos)

El lenguaje de expresioacuten JSP 20 soporta los objetos impliacutecitos siguientes

pageContext Objeto de javaxservletjspPageContext que proporciona acceso a los

datos de una peticioacuten

param Coleccioacuten (objeto de tipo javautilMap) de todos los valores de los paraacutemetros

enviados en una peticioacuten un String por paraacutemetro

paramValues Coleccioacuten de todos los valores de los paraacutemetros enviados en una

peticioacuten una matriz de tipo String por paraacutemetro

header Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten un

String por cabecera

headerValues Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten

una matriz de tipo String por cabecera

cookie Coleccioacuten de todos los valores de las cookies un objeto javaxservlethttpCookie

por cookie

initParam Coleccioacuten de todos los valores de los paraacutemetros de iniciacioacuten de la

aplicacioacuten un String por paraacutemetro

Tambieacuten hay objetos que permiten acceder a variables definidas en diferentes aacutembitos lo que

posibilita compartir informacioacuten

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

pageScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de paacutegina

requestScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

peticioacuten

sessionScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de sesioacuten

applicationScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

aplicacioacuten

3222 DIRECTRICES

Las directrices page incluye y taglib son mensajes para el motor JSP y son siempre incluidas

entre los siacutembolos lt y gt

32221 LA DIRECTRIZ PAGE

Define atributos que se aplican a toda la paacutegina JSP donde es incluida

lt page lista_de_atributos gt

Donde la lista_de_atributos puede contener algunos de los siguientes (aquellos que estaacuten

escritos en negrita son los tomados por omisioacuten)

language= ldquoscriptingLanguagerdquo

extends= rdquoclassNamerdquo

import= ldquoimportListrdquo

session= ldquotrue|falserdquo

buffer= ldquonone|sizeKb

autoflush= ldquotrue|falserdquo

isThreadSafe= rdquotrue|falserdquo

info= rdquoinfo_textrdquo

errorPage= ldquoerror_urlrdquo

isErrorPage= rdquotrue|falserdquo

contentType= rdquoctinfordquo

pageEncoding= rdquopeinfordquo

isELIgnored= ldquotrue|falserdquo

Tiacutepicamente se localiza al principio de la paacutegina JSP y puede haber cualquier nuacutemero de

ellas El lenguaje por omisioacuten es Java Ejemplos

lt page contentType=rdquotexthtmlrdquo language=rdquojavardquo gt

lt page import=rdquojavautil javalangrdquo gt

lt page buffer=rdquo5kbrdquo autoflush=rdquofalserdquo gt

32222 LA DIRECTRIZ INCLUDE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

La directriz include incluye un archivo (html jsp xml o de texto) en una paacutegina JSP Esto

permite dividir el contenido de la paacutegina en trozos maacutes manejables

lt incluye file=rdquoURL_relativordquo gt

El ejemplo siguiente muestra dos archivos el primero incluye al segundo para mostrar la

fecha y hora actuales

lt-- fichero mostrarFechaHorajsp --gt

lthtmlgt

ltheadgtlttitlegtIncluir un ficherolttitlegtltheadgt

ltbody bgcolor=whitegt

ltfont color=bluegt

La fecha y hora actuales son

lt include file=fechaHorajsp gt

ltfontgt

ltbodygt

lthtmlgt

lt-- fichero fechaHorajsp --gt

lt page import=javautil gt

lt= (new javautilDate())toLocaleString() gt

32223 LA DIRECTRIZ TAGLIB

La directriz taglib indica la biblioteca de acciones personalizadas que podremos utilizar en

la codificacioacuten de la paacutegina JSP Para distinguir esas acciones entre otras existentes se utiliza

un prefijo (prefix) Su sintaxis es

lt taglib (uri=rdquoURI_bibliotecardquo|tagdir=rdquoDir_biblioteca_tagrdquo)

prefix=rdquoprefijordquo gt

Cuando se trata de una biblioteca definida mediante una clase Java y un descriptor (archivo

tld) eacutesta se identifica mediante un URI (Uniform Resource Identifier- URL relativos) Por

ejemplo

lt taglib uri=rdquohttpMarioRossainzLopezmiBibliotecardquo

prefix=rdquofunrdquo gt

ltpgtltfunaccion01 gt

La uacuteltima liacutenea del ejemplo tiene dos etiquetas una etiqueta p HTML y otra accion01

perteneciente a la biblioteca miBiblioteca En cambio si la biblioteca se define mediante un

archivo tag entonces se identifica mediante su ruta relativa en el sistema de archivos

lt taglib tagdir=rdquoWEB-INFtagsrdquo prefix=rdquofunrdquo gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpgtltfunaccion01 gt

La directriz taglib debe colocarse antes de utilizar en la paacutegina JSP las acciones

personalizadas definidas por la misma Se puede utilizar maacutes de una directriz pero el prefijo

utilizado debe ser uacutenico para cada una de ellas

3223 ACTIVACION DEL LENGUAJE DE EXPRESION (LE)

La especificacioacuten JSP 20 define un lenguaje de expresioacuten como alternativa a elementos de

programacioacuten escritos con coacutedigo Java y especificaciones anteriores a la JSP 20 Para que

este lenguaje pueda ser interpretado tienen que cumplirse 2 requisitos

1 Que la propiedad isELIgnored de la directriz page valga false

lt page isELIgnored= ldquofalserdquo gt

2 Que el descriptor de despliegue webxml en la carpeta WEB-INF indique doacutende se

localiza el esquema XML para la especificacioacuten Servlet 24 que a su vez utiliza el

esquema XML para la especificacioacuten Java Server Page 20

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

Utilizando el lenguaje de expresioacuten se podriacutea modificar la paacutegina Cuentajsp de la seccioacuten

3212 de este documento como se muestra a continuacioacuten Esta nueva paacutegina

1 Especifica que utilizaraacute la biblioteca core de etiquetas estandar (de la que se hablaraacute maacutes

adelante)

2 La primera vez que sea accedida definiraacute la variable atrCuenta en el aacutembito de la

aplicacioacuten con un valor inicial nulo y la incrementaraacute en una unidad cuando sea accedida

sucesivas veces simplemente incrementaraacute esta variable en una unidad

3 Finalmente mostraraacute una paacutegina con un contenido anaacutelogo al siguiente Esta formado

por una cabecera y una segunda liacutenea compuesta por el valor del paraacutemetro parNombre

enviado con la peticioacuten un texto fijo el valor de la variable atrCuenta y otro texto fijo

dependiente del valor de esta variable

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

El coacutedigo completo es el siguiente

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

3224 VARIABLES Y EXPRESIONES

Para acceder a una simple variable se puede escribir algo como lo siguiente $nombre y

para acceder a una propiedad de un objeto podemos escribir algo como

$paramparNombre

$applicationScopeatrCuenta

$pageContextrequestrequestURI

La primera liacutenea del ejemplo anterior obtiene el valor de la propiedad parNombre del objeto

param la segunda el valor del atributo atrCuenta del objeto applicationScope y la tercera

el URL relativo de la paacutegina JSP solicitada

El lenguaje de expresioacuten es maacutes tolerante con respecto a las variables con valor null y ejecuta

muchas maacutes conversiones de forma automaacutetica sobre el tipo de los datos cuando la expresioacuten

a evaluar asiacute lo requiere Por ejemplo la etiqueta condicional siguiente incluye una expresioacuten

que compara el valor del atributo atrCuenta con aacutembito de aplicacioacuten con 10 (convirtiendo

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

impliacutecitamente el valor del atributo al tipo de la constante para poder realizar la comparacioacuten

El resultado seraacute un valor de tipo boolean

ltcif test=rdquo$applicationScopeatrCuenta gt 10rdquogt

ltcifgt

o bien

ltcif test=rdquo$atrCuenta gt 10rdquogt

ltcifgt

Para que una literal pueda incluir un caracter significativo para el lenguaje dicho caracter

debe ser especificado como una secuencia de escape (caracter) Por ejemplo la siguiente

expresioacuten da lugar al literal ldquovezrdquo o ldquovecesrdquo entre comillas dobles

$(atrCuenta gt 1) iquest ldquordquovecesrdquordquo ldquordquovezrdquordquo

Cualquier objeto o atributo de un objeto definido en algunos de los aacutembitos de una paacutegina

puede ser utilizado como una variable Por ejemplo $atrCuenta+1 es una expresioacuten que

realiza la suma de la variable atrCuenta con 1

Cuando se trate de una propiedad de un objeto para acceder a ella se utilizaraacute el operador

punto o bien la notacioacuten empleada para acceder a un elemento de una matriz Por ejemplo

$paramparNombre

$param[ldquoparNombrerdquo]

Una expresioacuten LE puede aparecer en cualquier lugar donde pueda aparecer un texto fijo Por

tanto para informar al contenedor JSP que se trata de una expresioacuten y no de un texto fijo se

utilizan los delimitadores $ al principio y al final

3225 OPERADORES

OPERADOR DESCRIPCIOacuteN Acceso a la propiedad de un objeto o a un elemento de un Map

[] Acceso al elemento de una matriz o de un objeto List

() Pareacutentesis para alterar la prioridad en la evaluacioacuten de una expresioacuten

If ternario condicion expresion1 expresioacuten 2

+ Suma

- Resta

Producto

oacute div Divisioacuten

oacute mod Moacutedulo o resto de una divisioacuten

== oacute eq Igualdad

= oacute ne Diferente

lt oacute lt Menor que

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt oacute gt Mayor que

lt= oacute le Menor o igual que

gt= oacute ge Mayor o igual que

ampamp oacute and Operacioacuten Loacutegica AND

|| oacute or Operacioacuten Loacutegica OR

oacute not Operacioacuten Loacutegica NOT

empty Verifica si el valor de una variable es null si un String esta vaciacuteo o si una matriz Map

o Collection no tienen elementos

func(args) Llamada a una funcioacuten donde func es el nombre de la funcioacuten y arg representa cero o

maacutes argumentos separados por comas

El ejemplo siguiente muestra una paacutegina JSP compuesta por elementos HTML expresiones

LE y objetos impliacutecitos

lthtmlgt

ltheadgtlttitlegtJSP 20lttitlegtltheadgt

ltbodygt

lth3gtLenguaje de expresioacuten (LE)lth3gt

ltpgtLa siguiente tabla ilustra algunas expresiones LE

ltbrgtltbrgtlttable border=1gt

lttrgt

ltthgtltbgtExpresioacutenltbgtltthgt

ltthgtltbgtValorltbgtltthgt

lttrgt

lttrgt

lttdgt$3 + 6lttdgt

lttdgt$3 + 6lttdgt

lttdgt

lttrgt

lttdgt$(7 gt 4) 7 4lttdgt

lttdgt$(7 gt 4) 7 4lttdgt

lttrgt

lttrgt

lttdgt$header[host]lttdgt

lttdgt$header[host]lttdgt

lttrgt

lttablegt

ltbodygt

lthtmlgt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

323 BIBLIOTECA ESTANDAR DE ETIQUETAS

La biblioteca estaacutendar de etiquetas JSP (JSTL ndash Java Server Page Estaacutendar Tag Library)

incluye una cantidad amplia de etiquetas para diferentes aacutereas de trabajo

Aacuterea baacutesica (su prefijo es c ndash core) y contiene

o Soporte de variables (remove y set)

o Control del flujo (choose when otherwise forEach forTokens if)

o Manejo de URL (import param redirect param y url param)

o Operaciones varias (match y out)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlcore

Aacuterea XML (su prefijo es x) y contiene

o Sentencias baacutesicas (out parse y set)

o Control del flujo (choosehellip whenhellip otherwise forEach e if)

o Transformacioacuten de Documentos (transformhellipparam)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlxml

Aacuterea Internacionalizacioacuten (su prefijo es fmt) Contiene

o Localidad (setLocale y requestEncoding)

o Mensajes (bundle message param y setBundle)

o Formateo de Fechas y nuacutemeros (formatNumber formateacuteate parseDate

parseNumber setTimeZone timeZone)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlfmt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Aacuterea SQL (su prefijo es sql) es el lenguaje estandar para interactuar con bases de datos

relacionales y contiene setDataSource Quero dateParam param transaction y

update dateParam param) El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlsql

Aacuterea Funciones (su prefijo es fn) y contiene

o Longitud de una coleccioacuten (length)

o Manipulacioacuten de String (toUpperCase toLowerCase substring

substringAfter substringBefore trim replace indexOf startsWith

endsWith contains containsIgnoreCase split join y escapeXml)

o El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlfunctions

3231 OPERACIONES CON ETIQUETAS BAacuteSICAS

En un ejemplo pasado teniacuteamos el siguiente coacutedigo

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

En este ejemplo se hace referencia al aacuterea baacutesica de JSTL con el prefijo c y se utiliza la

etiqueta cset para definir la variable atrCuenta Si la variable ya esta definida simplemente

se le asigna el valor especificado

La uacuteltima parte del ejemplo anterior podriacutea haberse escrito de esta otra forma

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcif test=rdquo$atrCuenta gt 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcifgt

$atrCuenta $str

La etiqueta cif permite la ejecucioacuten condicional de su cuerpo en funcioacuten del valor del

atributo de test

La etiqueta cchoose permite la ejecucioacuten del cuerpo de la primera etiqueta cwhen cuyo

atributo test sea evaluado a true Si ninguna de las condiciones se evaluacutea a true entonces se

evaluacutea el cuerpo de la etiqueta cotherwise si estaacute presente El siguiente coacutedigo muestra otra

manera de escribir el ejemplo anterior utilizando estas uacuteltimas etiquetas

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcchoosegt

ltcwhen test=rdquo$atrCuenta == 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcwhengt

ltcotherwisegt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcotherwisegt

ltcchoosegt

$atrCuenta $str

La etiqueta cforEach permite iterar sobre una coleccioacuten de objetos La coleccioacuten se

especifica por medio del atributo iacutetems y el elemento actual de la coleccioacuten estaacute disponible a

traveacutes de la variable establecida por el atributo var Por ejemplo el siguiente fragmento de

coacutedigo visualiza una tabla con las variables definidas a nivel de aacutembito de paacutegina

lttable border=rdquo1rdquogt

ltcforEach var=rdquoitemrdquo iacutetems=rdquo$pageScoperdquogt

lttrgt

lttdgt $item lttdgt

lttrgt

ltcforEachgt

lttablegt

La etiqueta ccatch atrapa una excepcioacuten que ocurra en el cuerpo de la misma Por ejemplo

el siguiente segmento de coacutedigo lanzaraacute una excepcioacuten si el paraacutemetro mes se escribe con

letras en vez de con nuacutemeros

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltbodygt

lthtmlgt

Un URL anaacutelogo al siguiente daraacute lugar a que la excepcioacuten sea lanzada cuando se ejecute la

expresioacuten $nMes 3 de la paacutegina anterior

httplocalhost8080JSP2exceppruebajspmes=marzo

La excepcioacuten indica que ha ocurrido un error al tratar de convertir ldquomarzordquo a un entero de

tipo Long Para cachar esta excepcioacuten y darle un tratamiento adecuado habraacute que modificar

la paacutegina JSP anterior como se indica a continuacioacuten

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltccatch var=rdquoerrorOcurridordquogt

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltccatchgt

ltcif test=rdquo$not empty errorOcurridordquogt

Error el paraacutemetro mes debe ser un nuacutemero ltbgt

ltbrgt Informacioacuten del error dada por el sistema

ltbrgt ltfont color=rdquoFF0000rdquogt $errorOcurrido ltfontgt

ltcifgt

ltbodygt

lthtmlgt

3232 ACCESO A BASES DE DATOS CON JSP

Las etiquetas que proporciona el aacuterea SQL permiten realizar

Conexioacuten con una base de datos

Realizacioacuten de consultas a la base de datos

Acceso al conjunto de resultados

Ejecucioacuten de actualizaciones y transacciones

Todas las etiquetas SQL actuacutean sobre una base de datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

32321 CONEXIOacuteN CON LA BASE DE DATOS

La conexioacuten con la base de datos puede realizarse con la etiqueta sqlsetDataSource Por

ejemplo si se esta utilizando el administrador de bases de datos MySql con el controlador

JDBC se puede realizar una conexioacuten con una base de datos digamos bd_tutorias de la

manera siguiente

ltsqlsetDataSource var=rdquobdrdquo

driver=rdquocommysqljdbcDriverrdquo

url=rdquojdbcmysqllocalhost3306bd_tutoriasrdquo

user=rdquoadminrdquo

password=rdquoadminadminrdquo gt

32322 CONSULTA A LA BASE DE DATOS

La etiqueta sqlQuero permite realizar una consulta a una base de datos Por ejemplo el

siguiente fragmento de coacutedigo realiza una consulta a la base de datos representada por bd y

obtiene un conjunto de resultados representado por cdr

ltsqlquery var=rdquocdrrdquo dataSource=rdquo$bdrdquogt

SELECT professor dia hora alumno

FROM profesores tutorias citas

WHERE profesoresid_profesor=tutoriasid_profesor

AND tutoriasid_tutoria=citasid_tutoria

ltsqlquerygt

32323 MODIFICACIONES SOBRE LA BASE DE DATOS

La etiqueta sqlupdate permite ejecutar una sentencia SQL INSERT UPDATE o DELETE

y cualquier otra sentencia SQL que no retorne ninguacuten valor Por ejemplo

ltsqlupdate var=rdquocontrdquo dataSource=rdquo$bdrdquo gt

UPDATE profesores

SET profesor=

WHERE profesor=

ltsqlparam value=rdquo$paramProfesorrdquo gt

ltsqlparam value=rdquo$paramIDrdquo gt

ltsqlupdategt

Una operacioacuten UPDATE puede utilizar el siacutembolo para indicar que el valor que tendriacutea que

evaluarse en esa posicioacuten seraacute suministrado por una etiqueta sqlparam como por ejemplo

httplocalhost8080JSP2sqlpruebajspProfesor=Mario+Rossainz+LopezampID=514

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

outprintln(lttablegtnltbodygtlthtmlgt)

public void doPost(HttpServletRequest request

HttpServletResponse response)

throws ServletException IOException

doGet(requestresponse)

El servlet escrito utiliza un meacutetodo doPost que soacutelo ejecuta a Donet Esto es porque se quiere

que el servlet pueda manejar tanto las peticiones GET como las POST Por otro lado el

formulario es el siguiente

ltdoctype html public -W3CDTD HTML 40 TransitionalENgt

lthtmlgt

ltheadgt

lttitlegt Un Formulario de ejemplo que utiliza POST lttitlegt

ltheadgt

ltbody bgcolor=FDF5E6gt

lth1 align=centergt Un formulario de Ejemplo que utiliza POST

lth1gt

ltform action=httplocalhost8080MostrarParametros

servletMostrarParametros

method=postgt

Nuacutemero de elemento ltinput type=text name=elemNumgt ltbrgt

Cantidad ltinput type=text name=cantidadgt ltbrgt

Precio Unitario ltinput type=text name=precio value=$gt

ltbrgtlthrgt

Nombre de Pila ltinput type=text name=nombrePilagt ltbrgt

Apellido(s) ltinput type=text name=apellidogt ltbrgt

Iniciales ltinput type=text name=inicialesgt ltbrgt

Domicilio de envio lttextarea name=domicilio rows=3

cols=40gtlttextareagt ltbrgt

Tarjeta de creacutedito ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta value=VisagtVisa ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta value=Master Cardgt

Master Card ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta value=AmexgtAmerican

Expresss ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta

value=DiscovergtDiscover ltbrgt

ampnbspampnbsp

ltinput type=radio name=tipoTarjeta

value=Java Smart CardgtTarjeta Inteligente de Java

ltbrgt

Nuacutemero de la tarjeta de creacutedito

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltinput type=password name=numTarjetagtltbrgt

Repita el nuacutemero de la tarjeta de creacutedito

ltinput type=password name=numTarjetagtltbrgtltbrgt

ltcentergt

ltinput type=submit value=Enviar pedidogt

ltcentergt

ltformgt

ltbodygt

lthtmlgt

El formulario HTML del listado anterior utiliza POST como deberiacutea ser en todos los campos

que tienen contrasentildea

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Si intenta ejecutar el servlet MostrarParametros directamente en el explorador con el URL

httplocalhost8080MostrarParametrosservletMostrarParametros se obtendraacute la paacutegina

Web sin resultados

Peticioacuten HTTP POST Cuando el tipo de peticioacuten HTTP es POST los datos son enviados

al servidor en el cuerpo de la peticioacuten Es el meacutetodo maacutes usual de enviar los datos de un

formulario Con este tipo de peticioacuten la informacioacuten del formulario se enviacutea despueacutes del URL

indicado por action en el cuerpo de la peticioacuten y el tamantildeo de la informacioacuten enviada no esta

limitado

Seguacuten lo expuesto escoger el meacutetodo para enviar la informacioacuten no es difiacutecil Si los datos

son pocos y no importa su confidencialidad o manipulacioacuten utilizamos GET Si son largos

privados o importantes utilizamos POST

318 ACCESO A BASES DE DATOS CON SERVLETS

Una aplicacioacuten Java que realiza accesos a bases de datos funciona seguacuten una arquitectura que

permite escribir los programas abstrayeacutendose de los detalles de los niveles inferiores (discos

controladores sistema operativo etc) como lo muestra la figura siguiente

JDBC (Java DataBase Connectivity ndash Conexioacuten con Bases de Datos desde Java) es una API

de Java que permite ejecutar instrucciones SQL para manipular y gestionar bases de datos

relacionales Para que una aplicacioacuten Java pueda hacer operaciones sobre una base de datos

previamente tiene que establecer una conexioacuten con la misma Esta conexioacuten se realiza a

traveacutes de un controlador (driver) seguacuten la figura de arriba La API-JDBC se proporciona en

dos paquetes javasql y javaxsql El primer paquete contiene las interfaces y clases Java

fundamentales de JDBC en tanto que el segundo paquete es una extensioacuten del primero e

APLICACION

SISTEMA OPERATIVO

CONTROLADOR

Oracle Access MySql

JVM

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

incluye las clases que interactuacutean con JNDI y otras que gestionan conjuntos de conexiones

con una misma base de datos Para maacutes detalles del uso de JDBC veacutease el apeacutendice A de

estas notas

El primer paso para crear una conexioacuten entre una aplicacioacuten Java y una base de datos es

registrar el controlador JDBC adecuado para esa base con el fin de que la JVM pueda

utilizarlo Existen distintos tipos de controladores JDBC por ejemplo

ldquocommysqljdbcDriverrdquo que es el controlador utilizado cuando el motor de base de datos

que se utiliza es MySql

En el supuesto caso de que la base de datos soacutelo permitiera el acceso a traveacutes de controladores

ODBC como lo hace ACCESS siempre podemos usar el controlador puente JDBC-ODBC

incluido como parte del JDK ldquosunjdbcodbcJdbcOdbcDriverrdquo Este tipo de controladores

es decir los basados en ODBC (Open DataBase Connectivity) son bastante utilizados en

entornos Windows pues este SO incluye ODBC El apeacutendice A describe al final como

administrar los oriacutegenes de datos ODBC en Windows

Asiacute pues la mayor ventaja de los servlets con respecto a la conexioacuten con bases de datos viacutea

JDBC es que su ciclo de vida les permite mantener conexiones abiertas con las mismas a lo

largo de toda una sesioacuten Esto permite recortar tiempo con respecto a otras tecnologiacuteas como

la CGI Ademaacutes JDBC es una tecnologiacutea independiente de las bases de datos

Como ejemplo vamos a implementar una simple aplicacioacuten Web basada en servlets que

muestre una especie de directorio de personas La aplicacioacuten podraacute consultar insertar

modificar borrar o listar la informacioacuten de cada una de las personas almacenadas en la base

de datos a la que se hace acceso (que estaraacute en formato access)

La estructura de la Base de Datos es una tabla con los siguientes campos

DNI Nombre Apellido Edad

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

53023767A Pedro Rubio 18

77459822P Luis Tejedor 47

123456MRL Mario Rossainz 35

La estructura de la aplicacioacuten se muestra en la figura siguiente

lthtmlgt

ltbodygt

lttable border=1gtlttrgtlttdgt

ltform action=httplocalhost8080directorioTelservletSvAccesoBD

method=getgt

DNI ltinput type=text name=DNIgt ltbrgt

Nombre ltinput type=text name=Nombregt ltbrgt

Apellido ltinput type=text name=Apellidogt ltbrgt

Edad ltinput type=text name=Edadgt ltbrgtltbrgt

ltinput type=submit value=Consultar name=BotonConsultargt

ltinput type=submit value=Insertar name=BotonInsertargt

ltinput type=submit value=Modificar name=BotonModificargt

ltinput type=submit value=Borrar name=BotonBorrargt

ltinput type=submit value=Listar name=BotonListargt ltbrgt

ltcentergt

ltinput type=submit value= |lt name=BotonPrimerogt

ltinput type=submit value= -- name=BotonMenosCincogt

ltinput type=submit value= - name=BotonAnteriorgt

ltinput type=submit value= + name=BotonSiguientegt

ltinput type=submit value= ++ name=BotonMasCincogt

ltinput type=submit value= gt| name=BotonUltimogt

ltcentergt

lttdgt

lttdgt

lttextarea name=AreaDeListado rows=10 cols=35gtlttextareagt

SvAccesoBDhtml

SvAccesoBD

ObBorrado ObListado ObConsulta

ObInsercion

ObModificacion

ObPosicionamiento

ObRegistro

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lttdgt

lttrgt

ltformgt

lttablegt

ltbodygt

lthtmlgt

SvAccesoBDhtml

import javaio

import javaxservlet

import javaxservlethttp

public class SvAccesoBD extends HttpServlet

private int PosicionBuscada = 1

private String AreaDeListado=

PrintWriter out

public void doGet(HttpServletRequest request HttpServletResponse response)

throws IOException ServletException

String DNI = requestgetParameter(DNI)

String Nombre = requestgetParameter(Nombre)

String Apellido = requestgetParameter(Apellido)

String Edad = requestgetParameter(Edad)

String BotonConsultar = requestgetParameter(BotonConsultar)

String BotonInsertar = requestgetParameter(BotonInsertar)

String BotonModificar = requestgetParameter(BotonModificar)

String BotonBorrar = requestgetParameter(BotonBorrar)

String BotonListar = requestgetParameter(BotonListar)

String BotonPrimero = requestgetParameter(BotonPrimero)

String BotonMenosCinco = requestgetParameter(BotonMenosCinco)

String BotonAnterior = requestgetParameter(BotonAnterior)

String BotonSiguiente = requestgetParameter(BotonSiguiente)

String BotonMasCinco = requestgetParameter(BotonMasCinco)

String BotonUltimo = requestgetParameter(BotonUltimo)

AreaDeListado = requestgetParameter(AreaDeListado)

responsesetContentType(texthtml)

out = responsegetWriter()

outprintln(lthtmlgt)

outprintln(ltbodygt)

if (BotonConsultar=null) ConsultarDatos(DNI)

if (BotonInsertar=null) InsertarDatos(DNINombreApellidoEdad)

if (BotonModificar=null) ModificarDatos(DNINombreApellidoEdad)

if (BotonBorrar=null) BorrarDatos(DNI)

if (BotonListar=null) ListarDatos(DNI)

if (BotonPrimero=null) Controles(1)

if (BotonMenosCinco=null) Controles(2)

if (BotonAnterior=null) Controles(3)

if (BotonSiguiente=null) Controles(4)

if (BotonMasCinco=null) Controles(5)

if (BotonUltimo=null) Controles(0)

outprintln(ltbodygt)

outprintln(lthtmlgt)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

private void ConsultarDatos(String DNI)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObRegistro InstanciaFila = InstanciaConsultaDameDatos()

GenerarRespuesta(InstanciaFilaDameDNI()InstanciaFilaDameNombre()

InstanciaFilaDameApellido()

StringvalueOf(InstanciaFilaDameEdad()))

else

GenerarRespuesta(DNI------------)

PosicionBuscada = 1

public void ListarDatos(String DNI)

ObListado InstanciaListado = new ObListado()

AreaDeListado = InstanciaListadoDameResultado()

ConsultarDatos(DNI)

PosicionBuscada = 1

public void BorrarDatos(String DNI)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObBorrado InstanciaBorrado = new ObBorrado(PosicionBuscada)

GenerarRespuesta()

else

GenerarRespuesta(----------------)

PosicionBuscada = 1

public void ModificarDatos(String DNI String Nombre String Apellido

String Edad)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObRegistro InstanciaFila = new ObRegistro(DNI Nombre Apellido

IntegerparseInt(Edad))

ObModificacion InstanciaModificacion = new ObModificacion(PosicionBuscada

InstanciaFila)

GenerarRespuesta(DNINombreApellidoEdad)

else

GenerarRespuesta(----------------)

PosicionBuscada = 1

public void InsertarDatos(String DNI String Nombre String Apellido

String Edad)

ObRegistro InstanciaFila = new ObRegistro(DNI Nombre Apellido

IntegerparseInt(Edad))

ObInserccion InstanciaInserccion = new ObInserccion(InstanciaFila)

GenerarRespuesta()

PosicionBuscada=1

public void Controles(String Identificador)

ObPosicionamiento InstanciaPosicionamiento =

new ObPosicionamiento(IdentificadorPosicionBuscada)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ObRegistro InstanciaFila = InstanciaPosicionamientoDameDatos()

GenerarRespuesta(InstanciaFilaDameDNI()InstanciaFilaDameNombre()

InstanciaFilaDameApellido()

StringvalueOf(InstanciaFilaDameEdad()))

PosicionBuscada = InstanciaPosicionamientoPosicion()

private void GenerarRespuesta(String DNI String Nombre String Apellido

String Edad)

outprintln(lttable border=1gt)

outprintln(lttrgt)

outprintln(lttdgt)

outprintln(ltform

action=httplocalhost8080directorioTelservletSvAccesoBD

method=getgt)

outprintln( DNI ltinput type=text name=DNI value=+DNI+gtltbrgt)

outprintln( Nombre ltinput type=text name=Nombre

value=+Nombre+gtltbrgt)

outprintln( Apellido ltinput type=text name=Apellido

value=+Apellido+gtltbrgt)

outprintln( Edad ltinput type=text name=Edad

value=+Edad+gtltbrgtltbrgt)

outprintln( ltinput type=submit value=Consultar

name=BotonConsultargt)

outprintln( ltinput type=submit value=Insertar

name=BotonInsertargt)

outprintln( ltinput type=submit value=Modificar

name=BotonModificargt)

outprintln( ltinput type=submit value=Borrar name=BotonBorrargt)

outprintln( ltinput type=submit value=Listar name=BotonListargt

ltbrgt)

outprintln( ltcentergt)

outprintln( ltinput type=submit value= |lt name=BotonPrimerogt)

outprintln( ltinput type=submit value= --

name=BotonMenosCincogt)

outprintln( ltinput type=submit value= - name=BotonAnteriorgt)

outprintln( ltinput type=submit value= +

name=BotonSiguientegt)

outprintln( ltinput type=submit value= ++

name=BotonMasCincogt)

outprintln( ltinput type=submit value= gt| name=BotonUltimogt)

outprintln( ltcentergt)

outprintln( lttdgt)

outprintln( lttdgt)

outprintln( lttextarea name=AreaDeListado rows=10

cols=35gt+AreaDeListado+lttextareagt)

outprintln( lttdgt)

outprintln( lttrgt)

outprintln( ltformgt)

outprintln( lttablegt)

SvAccesoBDjava

import javasql

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

public class ObBorrado

ObBorrado(int PosicionBuscada)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

Personasabsolute(PosicionBuscada)

PersonasdeleteRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

ObBorradojava

import javasql

import javaawtTextArea

public class ObListado

private String Resultado=

ObListado()

String DNI Nombre Apellido Linea

int Edad Posicion

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement()

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

while (Personasnext())

DNI = PersonasgetString(DNI)

Nombre = PersonasgetString(Nombre)

Apellido = PersonasgetString(Apellido)

Edad = PersonasgetInt(Edad)

Posicion = PersonasgetRow()

Linea = DNI+ +Nombre+ +Apellido+ +StringvalueOf(Edad)

Resultado=Resultado+StringvalueOf(Posicion)+ +Linea+n

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public String DameResultado()

return Resultado

ObListadojava

public class ObRegistro

private String DNI Nombre Apellido

private int Edad

ObRegistro (String DNI String Nombre String Apellido int Edad)

thisDNI = DNI

thisNombre = Nombre

thisApellido = Apellido

thisEdad = Edad

String DameDNI()

return DNI

String DameNombre()

return Nombre

String DameApellido()

return Apellido

int DameEdad()

return Edad

ObRegistrojava

import javasql

public class ObConsulta

private int Posicion = 0

private ObRegistro DatosPersona

ObConsulta(String DNIPedido)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement()

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

while (Personasnext())

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

String DNI = PersonasgetString(DNI)

if (DNIequalsIgnoreCase(DNIPedido))

Posicion = PersonasgetRow()

String Nombre = PersonasgetString(Nombre)

String Apellido = PersonasgetString(Apellido)

int Edad = PersonasgetInt(Edad)

DatosPersona = new ObRegistro(DNINombreApellidoEdad)

break

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public int PosicionEncontrada()

return Posicion

public ObRegistro DameDatos()

return DatosPersona

ObConsultajava

import javasql

public class ObInserccion

ObInserccion(ObRegistro Datos)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

PersonasmoveToInsertRow()

PersonasupdateString(DNI DatosDameDNI())

PersonasupdateString(NombreDatosDameNombre())

PersonasupdateString(Apellido DatosDameApellido())

PersonasupdateInt(EdadDatosDameEdad())

PersonasinsertRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

catch (SQLException e)

Systemoutprintln(e)

ObInsercionjava

import javasql

public class ObModificacion

ObModificacion(int PosicionBuscada ObRegistro Datos)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

Personasabsolute(PosicionBuscada)

PersonasupdateString(DNIDatosDameDNI())

PersonasupdateString(NombreDatosDameNombre())

PersonasupdateString(ApellidoDatosDameApellido())

PersonasupdateInt(EdadDatosDameEdad())

PersonasupdateRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

ObModificacionjava

import javasql

public class ObPosicionamiento

private ObRegistro DatosPersona

private int Posicion

ObPosicionamiento(String Accion int Posicion)

int IDAccionEdad

String DNINombreApellido

boolean PosicionCorrecta=false

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

FROM DatosPersonales)

Personasabsolute(Posicion)

IDAccion = IntegerparseInt(Accion)

switch (IDAccion)

case 0

PosicionCorrecta = Personaslast()

break

case 1

PosicionCorrecta = Personasfirst()

break

case 2

PosicionCorrecta = Personasrelative(-5)

break

case 3

PosicionCorrecta = Personasprevious()

break

case 4

PosicionCorrecta = Personasnext()

break

case 5

PosicionCorrecta = Personasrelative(+5)

break

if (PosicionCorrecta)

thisPosicion = PersonasgetRow()

DNI = PersonasgetString(DNI)

Nombre = PersonasgetString(Nombre)

Apellido = PersonasgetString(Apellido)

Edad = PersonasgetInt(Edad)

else

thisPosicion = Posicion

DNI = ----

Nombre = ----

Apellido = ----

Edad = 0

DatosPersona = new ObRegistro(DNINombreApellidoEdad)

Personasclose()

Conexionclose()

SentenciaSQLclose()

Systemoutprintln(StringvalueOf(Posicion)++StringvalueOf(thisPosicion))

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public int Posicion()

return Posicion

public ObRegistro DameDatos() return DatosPersona

ObPosicionamientojava

En este ejemplo se emplean servlets y paacuteginas Web Los clientes habitualmente trabajan en

una computadora remota y los programas se ejecutan en un servidor El mecanismo de

comunicaciones que soporta el protocolo http nos permite consultar en el servidor los datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

que ha seleccionado o escrito el usuario de esta manera se puede observar una disociacioacuten

entre la interfaz graacutefica de usuario (que se ejecuta en los equipos de los clientes) y el

programa que recoge los datos y ejecuta las acciones pertinentes (que se ejecuta en el

servidor)

Como puede observarse el coacutedigo SvAccessoBD es un servlet que lleva a cabo las siguientes

operaciones

1 Recoge los valores provenientes del usuario

2 Determina la naturaleza de la accioacuten a realizar

3 Realiza su cometido con la base de datos

4 Genera la respuesta que recibiraacute el usuario

32 JSP

JSP significa Java Server Pages que traducido quiere decir Paacuteginas de Servidor Java y es

por tanto una tecnologiacutea orientada a crear paacuteginas Web con programacioacuten en JAVA es decir

permite mezclar HTML estaacutendar y estaacutetico con un contenido dinaacutemico etiquetas especiales

(oacuterdenes) y trozos de coacutedigo JAVA (scriptlets o secuencias de oacuterdenes) o contenido dinaacutemico

generado por servlets Eacuteste contenido dinaacutemico se encuentra encerrado en etiquetas

especiales muchas de las cuales inician con lt y finalizan con gt El motor de las paacuteginas

JSP esta basado en los servlets de JAVA

En la tecnologiacutea JSP se crean paacuteginas parecidas a las paacuteginas que se crean en ASP (Active

Server Page de Microsoft) o PHP (Personal Home Page) que son dos tecnologiacuteas de paacuteginas

ejecutadas en el servidor Sin embargo JSP no se cintildee a un sistema operativo o servidor Web

en particular ademaacutes de que proporciona acceso a la tecnologiacutea de Servlets y a JAVA en la

parte dinaacutemica

El proceso para generar paacuteginas JSP accesibles en Web es mucho maacutes simple que en los

servlets Dando por hecho que se tiene un servidor Web que permite usar JSP el coacutedigo se

almacenaraacute en archivos con extensioacuten jsp que incluyen dentro de la estructuras de etiquetas

HTML las sentencias JAVA a ejecutar y tan soacutelo se colocaraacuten en cualquier lugar en donde

se pusiera una paacutegina Web normal sin compilacioacuten sin paquetes y sin configuracioacuten aunque

el servidor tendraacute que ser configurado para acceder a los archivos de clases Servlets y de

JSPs

Aunque lo que se escriba con frecuencia luciraacute como un archivo HTML estaacutendar detraacutes de

ello la paacutegina JSP se convierte automaacuteticamente en un servlet normal donde el HTML

estaacutetico tan soacutelo es enviado al flujo de salida asociado con el meacutetodo service del servlet Esta

traduccioacuten se realiza la primera vez que se solicita la paacutegina De acuerdo como este

configurado el servidor es posible ver el coacutedigo fuente de los servlets generados a partir de

sus paacuteginas JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Por ejemplo supongamos que se ha escrito el siguiente coacutedigo en el archivo Saludojsp

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtEjemplo JSPlttitlegtltheadgt

ltbody bgcolor=ffffccgt

ltcentergt

lth2gtHola mundolth2gt

ltjavautilDate hoy = new javautilDate()gt

La fecha de hoy es lt=hoygt

ltcentergt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional y un fragmento de un scriptlet de JAVA La etiqueta

lt identifica el comienzo del scriptlet y gt el final Una expresioacuten de la forma =variable

es sustituida por el valor de esa variable Para ejecutar esta paacutegina o cualquier otra paacutegina

JSP desde un navegador hay que instalarla en el servidor de aplicaciones de la misma manera

en como se hizo con los servlets Suponiendo entonces que se tiene instalado el Tomcat 5

siga los siguientes pasos

1 Antildeadir en el servidor la carpeta digamos JSP2 dentro de la carpeta webapps del Tomcat

y construir sobre ella la jerarquiacutea de clases ya conocida de los servlets

webappsrarrJSP2rarrWEB-INFrarrclasses

WEB-INFrarrlib

WEB-INFrarrtags

2 Editar en la carpeta WEB-INF el descriptor de despliegue webxml que se indica a

continuacioacuten Este archivo XML indica doacutende se localiza el esquema XML para la

especificacioacuten Servlet 24 que a suvez utiliza el esquema XML para la especificacioacuten

Java Server Page 20 que son las especificaciones que soporta en servidor Tomcat

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=

httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

3 Crear en JSP2 la carpeta saludo que contendraacute la aplicacioacuten y copiar en ella la paacutegina

Saludojsp

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

4 Arrancar el servidor Si el servidor ya estaba arrancado detenerlo y volverlo a arrancar o

bien abrir el explorador escribir el URL httplocalhost8080managerhtml e instalar

la aplicacioacuten

5 Una vez arrancado el servidor verificar si estaacute funcionando correctamente escribiendo

el URL siguiente en el explorador httplocalhost8080 El explorador debe mostrar la

paacutegina del Tomcat

6 Ejecutar la paacutegina JSP iniciando el explorador y escribiendo el URL siguiente

httplocalhost8080JSP2saludoSaludojsp donde la sintaxis geneacuterica es

httpservidor[puerto]MiCarpetapaginajsp

Cuando esta paacutegina (Saludojsp) es invocada por primera vez el motor JSP lleva a cabo una

fase de traduccioacuten de la misma en un servlet y el motor Servlet es el que ejecutaraacute eacuteste uacuteltimo

para generar el HTML dinaacutemico que seraacute enviado al explorador cliente seguacuten puede

deducirse de la figura siguiente La proacutexima vez que la paacutegina sea solicitada el motor JSP

ejecutaraacute el servlet que fue caragado la primera vez a no ser que la paacutegina haya cambiado

en cuyo caso seraacute compilada automaacuteticamente en un nuevo servlet y ejecutada

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Regresando al ejemplo el archivo java generado por el Tomcat a partir del archivo

Saludojsp se localiza en la carpeta workCatalinalocalhost de la instalacioacuten de Tomcat

321 ELEMENTOS PARA SECUENCIAS DE COMANDOS

Los elementos para secuencias de comandos permiten insertar coacutedigo en el servlet que seraacute

generado a partir de la paacutegina JSP Existen tres formas

1 Expresiones del tipo lt= expresioacuten gt que se evaluacutean e insertan en el resultado del

servlet

2 Los scriptlets del tipo lt codigo gt que se insertan en el meacutetodo _jspService del

servlet (ejecutado por service)

3 Las declaraciones del tipo lt Codigo gt que se insertan en el cuerpo de la clase del

servlet fuera de cualquier meacutetodo existente

NOTA Los comentarios en JSP se escriben lt-- Comentario JSP --gt en tanto que los

comentarios en HTML son de la forma lt--Comentario HTML --gt La diferencia

semaacutentica radica en que los comentarios HTML cuando se insertan en la respuesta enviada

por el servidor al cliente no se muestran cuando se visualiza el documento HTML pero si

Servidor Maacutequina Cliente

Explorador Web

Contenedor Web

Motor Servlet

Motor JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

los podemos ver cuando se visualiza el coacutedigo fuente en tanto que los comentarios JSP

aunque se inserten en la respuesta enviada por el servidor al cliente no son enviados al

explorador de forma que tampoco se muestran ni se ven cuando se visualiza el coacutedigo fuente

HTML desde el explorador

3211 EXPRESIONES

Se utiliza una expresioacuten JSP para insertar valores directamente en el resultado La sintaxis es

lt= expresioacuten gt Por ejemplo

lt= requestgetParameter(ldquoparNombre) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt lt= s gt

La fecha y hora actual es lt= new javautilDate() gt

La expresioacuten se evaluacutea se convierte a cadena y se inserta en la paacutegina Esta evaluacioacuten se

realiza durante la ejecucioacuten

32111 VARIABLES PREDEFINIDAS

Para simplificar estas expresiones se pueden utilizar cierta cantidad de variables

predefinidas Estos objetos impliacutecitos como tambieacuten se les llama estaacuten disponibles para su

uso durante la implementacioacuten de una paacutegina Web

bull pageContext Es un objeto de la clase PageContext que proporciona acceso a objetos

relacionados con los servlets

bull request Es un objeto de la clase HttpServletRequest que se puede obtener a traveacutes del

meacutetodo getRequest que encapsula los datos enviados por el cliente al servidor

bull response Es un objeto de la clase HttpServletResponse que puede obtenerse a traveacutes

del meacutetodo getResponse que encapsula los datos que el servidor enviaraacute al cliente

bull application Es un objeto de la clase ServletContext que se obtiene a traveacutes del meacutetodo

getServletContext que define un conjunto de meacutetodos que todo servlet utiliza para

comunicar con el contenedor de servlets

bull config Es un objeto de la clase ServletConfig que se obtiene a traveacutes del meacutetodo

getServletConfig y que se utiliza por el contenedor de servlets para pasar informacioacuten

al servlet durante la iniciacioacuten

bull session Es un objeto de la clase HttpSession que se obtiene a traveacutes del meacutetodo

getSession que proporciona una forma de identificar a un usuario que visita las paacuteginas

de un sitio Web

bull out Es un objeto de la clase JspWriter que se obtiene a traveacutes del meacutetodo getOut que

se utiliza para almacenar la respuesta que seraacute enviada al cliente que hizo la peticioacuten de

la paacutegina

bull page Es un objeto geneacuterico de la clase Object que se obtiene a traveacutes del meacutetodo

getPage y que representa al servlet obtenido a partir de la paacutegina JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

bull exception Es un objeto de la clase Exception que se obtiene a traveacutes del meacutetodo

getException que contendraacute informacioacuten a cerca de cualquier excepcioacuten que se lance

desde la paacutegina JSP

Un ejemplo del uso de uno de estos objetos impliacutecitos seriacutea el siguiente

El nombre de tu host es lt= requestgetRemoteHost() gt

El listado siguiente da un ejemplo de una paacutegina JSP que utiliza algunas variables

predefinidas como uso de expresiones JSP

ltDOCTYPE HTML PUBLIC -W3CDTD HTML 40 Transitional ENgt

lthtmlgt

ltheadgt

lttitlegt Expresiones JSP lttitlegt

ltheadgt

ltbodygt

lth2gt Expresiones JSP lth2gt

ltULgt

ltligt Fecha y hora en curso lt= new javautilDate() gt ltligt

ltligt Nombre de su host lt= requestgetRemoteHost() gt ltligt

ltligt Identificador de su sesioacuten lt= sessiongetId() gt ltligt

ltligt El paraacutemetro ltcodegt paramPrueba ltcodegt del formulario

lt= requestgetParameter(paramPrueba) gt ltligt

ltULgt

ltbodygt

lthtmlgt

Cuya salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3212 LOS SCRIPTLETS JSP

Si se desea hacer algo maacutes complejo que una simple expresioacuten los scriptlets permiten insertar

coacutedigo JAVA en el meacutetodo _jspService del servlet (que es ejecutado por service) La sintaxis

utilizada por los scriptlets es lt coacutedigo java gt Los escriptlets tienen acceso a las

mismas variables definidas de forma automaacutetica como expresiones A manera de ejemplo si

se desea que el resultado aparezca en la paacutegina generada deberiacutea de utilizarse la variable out

como en la siguiente instruccioacuten

lt String datosConsultados= requestgetQueryString()

outprintln(ldquoDatos GET adjuntos ldquo+datosConsultados)

gt

En este ejemplo podriacutea haberse obtenido el mismo resultado utilizando la siguiente expresioacuten

JSP

Datos GET adjuntos lt=requestgetQueryString() gt

En general los scriptlets pueden ejecutar varias tareas que no podriacutean realizarse con las

expresiones Tales tareas incluyen

bull La determinacioacuten de encabezados de respuesta

bull Actualizacioacuten de Bases de Datos

bull Ejecucioacuten de bucles condiciones y otras estructuras complejas

lt for (int i=1 ilt=6 i++)

gt

lth lt=i gtgt Hola Mundo lthlt=i gtgt

lt gt

Como un ejemplo concreto se muestra la siguiente paacutegina JSP llamada Cuentajsp en donde

se observa coacutemo se hace un seguimiento del nuacutemero de veces que un cliente accede a esta

paacutegina a traveacutes de distintas sesiones Para ello supondremos que dicha cuenta es el valor del

atributo atrCuenta del objeto impliacutecito application ya citado La primera vez que el cliente

accede a la paacutegina el valor de atrCuenta seraacute null debido a que auacuten no ha sido fijado este

atributo en este caso se fijaraacute con el valor 1 En los siguientes accesos se leeraacute el valor del

atributo atrCuenta se incrementaraacute en una unidad y se volveraacute a fijar Finalmente se enviacutea

la respuesta al cliente para que se muestre al usuario el valor del contador

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en el objeto impliacutecito application con el nombre

atrCuenta

--gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt

Integer cuenta = (Integer)applicationgetAttribute(atrCuenta)

String s = vez

if (cuenta == null)

cuenta = new Integer(1)

else

cuenta = new Integer(cuentaintValue() + 1)

s = veces

applicationsetAttribute(atrCuenta cuenta)

gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

Has visitado esta paacutegina lt= cuenta gt lt= s gt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional un fragmento de coacutedigo JAVA o scriptlet

expresiones y comentarioshellip

Aquiacute otro ejemplo de la ejecucioacuten de un coacutedigo demasiado complejo para una expresioacuten JSP

Este listado presenta una paacutegina JSP que utiliza el paraacutemetro de peticioacuten colorFondo para

establecer el color de fondo de la paacutegina

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgt

lttitlegt Prueba de Color lttitlegt

ltheadgt

lt

String colorFondo=requestgetParameter(colorFondo)

boolean tieneColorExplicito

if (colorFondo =null)

tieneColorExplicito=true

else

tieneColorExplicito=false

colorFondo=WHITE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt

ltbody bgcolor=lt= colorFondo gtgt

lth2 align=centergt Prueba de color lth2gt

lt

if (tieneColorExplicito)

outprintln(Ha indicado un color de fondo expliacutecito +

colorFondo +)

else

outprintln(Usareacute el color de fondo predeterminado WHITE +

Indique el atributo de peticioacuten

ltigtcolorFondoltigt+

para intentar un color estaacutendar un +

valor RRGGBB o para ver si el navegador Web +

permite el uso de nombres de color X11)

gt

ltbodygt

lthtmlgt

Cuyas posibles salidas son

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3213 DECLARACIONES JSP

Una declaracioacuten JSP permite definir meacutetodos o campos que seraacuten insertados en el cuerpo

principal de la clase del servlet (fuera del meacutetodo _jspService) Una declaracioacuten tiene la

sintaxis lt Coacutedigo Java gt Por ejemplo

lt int i=0 gt

lt

Public void jspinit()

coacutedigo de iniciacioacuten

gt

Una declaracioacuten no genera ninguacuten resultado y se usan junto con las expresiones JSP o los

scriptlets A continuacioacuten se muestra una paacutegina JSP que despliega la cantidad de veces que

se ha solicitado esta paacutegina desde que se arrancoacute el servidor haciendo uso de las

declaraciones JSP

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtDeclaraciones JSPlttitlegtltheadgt

ltbodygt

lth1gtDeclaraciones JSPlth1gt

lt-- Esto es un comentario en JSP --gt

lt private int recuentoAccesos=0 gt

lth2gt Accesos a la paacutegina desde el reinicio del servidor

lt= ++recuentoAccesos gt lth2gt

ltbodygt

lthtmlgt

La salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

322 EL LENGUAJE DE EXPRESION EN JSP 20

Anteriormente se ha visto la necesidad de utilizar fragmentos de coacutedigo java en el desarrollo

de paacuteginas JSP pero con la aparicioacuten de la especificacioacuten JSP 20 ya no hay necesidad de

utilizar fragmentos de coacutedigo Java para nada gracias al nuevo lenguaje de expresioacuten EL

(Expresioacuten Language) a la biblioteca de etiquetas estandar JSTL (JSP Standar Tag Library)

y a las nuevas formas para desarrollar etiquetas personalizadas

El lenguaje de expresioacuten JSP es maacutes un lenguaje de acceso a datos que un lenguaje de

programacioacuten Ya se ha visto que para pasar informacioacuten de un cliente a una paacutegina JSP se

utilizan paraacutemetros en la peticioacuten y atributos en la paacutegina El lenguaje de expresioacuten lo hace

posible sin tener que utilizar scriptlets o expresiones (lt= expresioacuten gt) Por ejemplo las

liacuteneas JSP 12 siguientes escritas utilizando coacutedigo Java

lt= requestgetParameter(ldquoparNombrerdquo) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt veces

bajo la especificacioacuten JSP 20 se pueden escribir de una forma maacutes sencilla como sigue

(ahora no se trata de coacutedigo JAVA)

$paramparNombre has visitado esta paacutegina

$atrCuenta veces

La sintaxis de JSP es sensible a mayuacutesculas y minuacutesculas pero un par de comillas simples es

equivalente a un par de comillas dobles

3221 VARIABLES PREDEFINIDAS (Objetos Impliacutecitos)

El lenguaje de expresioacuten JSP 20 soporta los objetos impliacutecitos siguientes

pageContext Objeto de javaxservletjspPageContext que proporciona acceso a los

datos de una peticioacuten

param Coleccioacuten (objeto de tipo javautilMap) de todos los valores de los paraacutemetros

enviados en una peticioacuten un String por paraacutemetro

paramValues Coleccioacuten de todos los valores de los paraacutemetros enviados en una

peticioacuten una matriz de tipo String por paraacutemetro

header Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten un

String por cabecera

headerValues Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten

una matriz de tipo String por cabecera

cookie Coleccioacuten de todos los valores de las cookies un objeto javaxservlethttpCookie

por cookie

initParam Coleccioacuten de todos los valores de los paraacutemetros de iniciacioacuten de la

aplicacioacuten un String por paraacutemetro

Tambieacuten hay objetos que permiten acceder a variables definidas en diferentes aacutembitos lo que

posibilita compartir informacioacuten

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

pageScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de paacutegina

requestScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

peticioacuten

sessionScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de sesioacuten

applicationScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

aplicacioacuten

3222 DIRECTRICES

Las directrices page incluye y taglib son mensajes para el motor JSP y son siempre incluidas

entre los siacutembolos lt y gt

32221 LA DIRECTRIZ PAGE

Define atributos que se aplican a toda la paacutegina JSP donde es incluida

lt page lista_de_atributos gt

Donde la lista_de_atributos puede contener algunos de los siguientes (aquellos que estaacuten

escritos en negrita son los tomados por omisioacuten)

language= ldquoscriptingLanguagerdquo

extends= rdquoclassNamerdquo

import= ldquoimportListrdquo

session= ldquotrue|falserdquo

buffer= ldquonone|sizeKb

autoflush= ldquotrue|falserdquo

isThreadSafe= rdquotrue|falserdquo

info= rdquoinfo_textrdquo

errorPage= ldquoerror_urlrdquo

isErrorPage= rdquotrue|falserdquo

contentType= rdquoctinfordquo

pageEncoding= rdquopeinfordquo

isELIgnored= ldquotrue|falserdquo

Tiacutepicamente se localiza al principio de la paacutegina JSP y puede haber cualquier nuacutemero de

ellas El lenguaje por omisioacuten es Java Ejemplos

lt page contentType=rdquotexthtmlrdquo language=rdquojavardquo gt

lt page import=rdquojavautil javalangrdquo gt

lt page buffer=rdquo5kbrdquo autoflush=rdquofalserdquo gt

32222 LA DIRECTRIZ INCLUDE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

La directriz include incluye un archivo (html jsp xml o de texto) en una paacutegina JSP Esto

permite dividir el contenido de la paacutegina en trozos maacutes manejables

lt incluye file=rdquoURL_relativordquo gt

El ejemplo siguiente muestra dos archivos el primero incluye al segundo para mostrar la

fecha y hora actuales

lt-- fichero mostrarFechaHorajsp --gt

lthtmlgt

ltheadgtlttitlegtIncluir un ficherolttitlegtltheadgt

ltbody bgcolor=whitegt

ltfont color=bluegt

La fecha y hora actuales son

lt include file=fechaHorajsp gt

ltfontgt

ltbodygt

lthtmlgt

lt-- fichero fechaHorajsp --gt

lt page import=javautil gt

lt= (new javautilDate())toLocaleString() gt

32223 LA DIRECTRIZ TAGLIB

La directriz taglib indica la biblioteca de acciones personalizadas que podremos utilizar en

la codificacioacuten de la paacutegina JSP Para distinguir esas acciones entre otras existentes se utiliza

un prefijo (prefix) Su sintaxis es

lt taglib (uri=rdquoURI_bibliotecardquo|tagdir=rdquoDir_biblioteca_tagrdquo)

prefix=rdquoprefijordquo gt

Cuando se trata de una biblioteca definida mediante una clase Java y un descriptor (archivo

tld) eacutesta se identifica mediante un URI (Uniform Resource Identifier- URL relativos) Por

ejemplo

lt taglib uri=rdquohttpMarioRossainzLopezmiBibliotecardquo

prefix=rdquofunrdquo gt

ltpgtltfunaccion01 gt

La uacuteltima liacutenea del ejemplo tiene dos etiquetas una etiqueta p HTML y otra accion01

perteneciente a la biblioteca miBiblioteca En cambio si la biblioteca se define mediante un

archivo tag entonces se identifica mediante su ruta relativa en el sistema de archivos

lt taglib tagdir=rdquoWEB-INFtagsrdquo prefix=rdquofunrdquo gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpgtltfunaccion01 gt

La directriz taglib debe colocarse antes de utilizar en la paacutegina JSP las acciones

personalizadas definidas por la misma Se puede utilizar maacutes de una directriz pero el prefijo

utilizado debe ser uacutenico para cada una de ellas

3223 ACTIVACION DEL LENGUAJE DE EXPRESION (LE)

La especificacioacuten JSP 20 define un lenguaje de expresioacuten como alternativa a elementos de

programacioacuten escritos con coacutedigo Java y especificaciones anteriores a la JSP 20 Para que

este lenguaje pueda ser interpretado tienen que cumplirse 2 requisitos

1 Que la propiedad isELIgnored de la directriz page valga false

lt page isELIgnored= ldquofalserdquo gt

2 Que el descriptor de despliegue webxml en la carpeta WEB-INF indique doacutende se

localiza el esquema XML para la especificacioacuten Servlet 24 que a su vez utiliza el

esquema XML para la especificacioacuten Java Server Page 20

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

Utilizando el lenguaje de expresioacuten se podriacutea modificar la paacutegina Cuentajsp de la seccioacuten

3212 de este documento como se muestra a continuacioacuten Esta nueva paacutegina

1 Especifica que utilizaraacute la biblioteca core de etiquetas estandar (de la que se hablaraacute maacutes

adelante)

2 La primera vez que sea accedida definiraacute la variable atrCuenta en el aacutembito de la

aplicacioacuten con un valor inicial nulo y la incrementaraacute en una unidad cuando sea accedida

sucesivas veces simplemente incrementaraacute esta variable en una unidad

3 Finalmente mostraraacute una paacutegina con un contenido anaacutelogo al siguiente Esta formado

por una cabecera y una segunda liacutenea compuesta por el valor del paraacutemetro parNombre

enviado con la peticioacuten un texto fijo el valor de la variable atrCuenta y otro texto fijo

dependiente del valor de esta variable

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

El coacutedigo completo es el siguiente

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

3224 VARIABLES Y EXPRESIONES

Para acceder a una simple variable se puede escribir algo como lo siguiente $nombre y

para acceder a una propiedad de un objeto podemos escribir algo como

$paramparNombre

$applicationScopeatrCuenta

$pageContextrequestrequestURI

La primera liacutenea del ejemplo anterior obtiene el valor de la propiedad parNombre del objeto

param la segunda el valor del atributo atrCuenta del objeto applicationScope y la tercera

el URL relativo de la paacutegina JSP solicitada

El lenguaje de expresioacuten es maacutes tolerante con respecto a las variables con valor null y ejecuta

muchas maacutes conversiones de forma automaacutetica sobre el tipo de los datos cuando la expresioacuten

a evaluar asiacute lo requiere Por ejemplo la etiqueta condicional siguiente incluye una expresioacuten

que compara el valor del atributo atrCuenta con aacutembito de aplicacioacuten con 10 (convirtiendo

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

impliacutecitamente el valor del atributo al tipo de la constante para poder realizar la comparacioacuten

El resultado seraacute un valor de tipo boolean

ltcif test=rdquo$applicationScopeatrCuenta gt 10rdquogt

ltcifgt

o bien

ltcif test=rdquo$atrCuenta gt 10rdquogt

ltcifgt

Para que una literal pueda incluir un caracter significativo para el lenguaje dicho caracter

debe ser especificado como una secuencia de escape (caracter) Por ejemplo la siguiente

expresioacuten da lugar al literal ldquovezrdquo o ldquovecesrdquo entre comillas dobles

$(atrCuenta gt 1) iquest ldquordquovecesrdquordquo ldquordquovezrdquordquo

Cualquier objeto o atributo de un objeto definido en algunos de los aacutembitos de una paacutegina

puede ser utilizado como una variable Por ejemplo $atrCuenta+1 es una expresioacuten que

realiza la suma de la variable atrCuenta con 1

Cuando se trate de una propiedad de un objeto para acceder a ella se utilizaraacute el operador

punto o bien la notacioacuten empleada para acceder a un elemento de una matriz Por ejemplo

$paramparNombre

$param[ldquoparNombrerdquo]

Una expresioacuten LE puede aparecer en cualquier lugar donde pueda aparecer un texto fijo Por

tanto para informar al contenedor JSP que se trata de una expresioacuten y no de un texto fijo se

utilizan los delimitadores $ al principio y al final

3225 OPERADORES

OPERADOR DESCRIPCIOacuteN Acceso a la propiedad de un objeto o a un elemento de un Map

[] Acceso al elemento de una matriz o de un objeto List

() Pareacutentesis para alterar la prioridad en la evaluacioacuten de una expresioacuten

If ternario condicion expresion1 expresioacuten 2

+ Suma

- Resta

Producto

oacute div Divisioacuten

oacute mod Moacutedulo o resto de una divisioacuten

== oacute eq Igualdad

= oacute ne Diferente

lt oacute lt Menor que

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt oacute gt Mayor que

lt= oacute le Menor o igual que

gt= oacute ge Mayor o igual que

ampamp oacute and Operacioacuten Loacutegica AND

|| oacute or Operacioacuten Loacutegica OR

oacute not Operacioacuten Loacutegica NOT

empty Verifica si el valor de una variable es null si un String esta vaciacuteo o si una matriz Map

o Collection no tienen elementos

func(args) Llamada a una funcioacuten donde func es el nombre de la funcioacuten y arg representa cero o

maacutes argumentos separados por comas

El ejemplo siguiente muestra una paacutegina JSP compuesta por elementos HTML expresiones

LE y objetos impliacutecitos

lthtmlgt

ltheadgtlttitlegtJSP 20lttitlegtltheadgt

ltbodygt

lth3gtLenguaje de expresioacuten (LE)lth3gt

ltpgtLa siguiente tabla ilustra algunas expresiones LE

ltbrgtltbrgtlttable border=1gt

lttrgt

ltthgtltbgtExpresioacutenltbgtltthgt

ltthgtltbgtValorltbgtltthgt

lttrgt

lttrgt

lttdgt$3 + 6lttdgt

lttdgt$3 + 6lttdgt

lttdgt

lttrgt

lttdgt$(7 gt 4) 7 4lttdgt

lttdgt$(7 gt 4) 7 4lttdgt

lttrgt

lttrgt

lttdgt$header[host]lttdgt

lttdgt$header[host]lttdgt

lttrgt

lttablegt

ltbodygt

lthtmlgt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

323 BIBLIOTECA ESTANDAR DE ETIQUETAS

La biblioteca estaacutendar de etiquetas JSP (JSTL ndash Java Server Page Estaacutendar Tag Library)

incluye una cantidad amplia de etiquetas para diferentes aacutereas de trabajo

Aacuterea baacutesica (su prefijo es c ndash core) y contiene

o Soporte de variables (remove y set)

o Control del flujo (choose when otherwise forEach forTokens if)

o Manejo de URL (import param redirect param y url param)

o Operaciones varias (match y out)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlcore

Aacuterea XML (su prefijo es x) y contiene

o Sentencias baacutesicas (out parse y set)

o Control del flujo (choosehellip whenhellip otherwise forEach e if)

o Transformacioacuten de Documentos (transformhellipparam)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlxml

Aacuterea Internacionalizacioacuten (su prefijo es fmt) Contiene

o Localidad (setLocale y requestEncoding)

o Mensajes (bundle message param y setBundle)

o Formateo de Fechas y nuacutemeros (formatNumber formateacuteate parseDate

parseNumber setTimeZone timeZone)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlfmt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Aacuterea SQL (su prefijo es sql) es el lenguaje estandar para interactuar con bases de datos

relacionales y contiene setDataSource Quero dateParam param transaction y

update dateParam param) El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlsql

Aacuterea Funciones (su prefijo es fn) y contiene

o Longitud de una coleccioacuten (length)

o Manipulacioacuten de String (toUpperCase toLowerCase substring

substringAfter substringBefore trim replace indexOf startsWith

endsWith contains containsIgnoreCase split join y escapeXml)

o El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlfunctions

3231 OPERACIONES CON ETIQUETAS BAacuteSICAS

En un ejemplo pasado teniacuteamos el siguiente coacutedigo

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

En este ejemplo se hace referencia al aacuterea baacutesica de JSTL con el prefijo c y se utiliza la

etiqueta cset para definir la variable atrCuenta Si la variable ya esta definida simplemente

se le asigna el valor especificado

La uacuteltima parte del ejemplo anterior podriacutea haberse escrito de esta otra forma

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcif test=rdquo$atrCuenta gt 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcifgt

$atrCuenta $str

La etiqueta cif permite la ejecucioacuten condicional de su cuerpo en funcioacuten del valor del

atributo de test

La etiqueta cchoose permite la ejecucioacuten del cuerpo de la primera etiqueta cwhen cuyo

atributo test sea evaluado a true Si ninguna de las condiciones se evaluacutea a true entonces se

evaluacutea el cuerpo de la etiqueta cotherwise si estaacute presente El siguiente coacutedigo muestra otra

manera de escribir el ejemplo anterior utilizando estas uacuteltimas etiquetas

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcchoosegt

ltcwhen test=rdquo$atrCuenta == 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcwhengt

ltcotherwisegt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcotherwisegt

ltcchoosegt

$atrCuenta $str

La etiqueta cforEach permite iterar sobre una coleccioacuten de objetos La coleccioacuten se

especifica por medio del atributo iacutetems y el elemento actual de la coleccioacuten estaacute disponible a

traveacutes de la variable establecida por el atributo var Por ejemplo el siguiente fragmento de

coacutedigo visualiza una tabla con las variables definidas a nivel de aacutembito de paacutegina

lttable border=rdquo1rdquogt

ltcforEach var=rdquoitemrdquo iacutetems=rdquo$pageScoperdquogt

lttrgt

lttdgt $item lttdgt

lttrgt

ltcforEachgt

lttablegt

La etiqueta ccatch atrapa una excepcioacuten que ocurra en el cuerpo de la misma Por ejemplo

el siguiente segmento de coacutedigo lanzaraacute una excepcioacuten si el paraacutemetro mes se escribe con

letras en vez de con nuacutemeros

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltbodygt

lthtmlgt

Un URL anaacutelogo al siguiente daraacute lugar a que la excepcioacuten sea lanzada cuando se ejecute la

expresioacuten $nMes 3 de la paacutegina anterior

httplocalhost8080JSP2exceppruebajspmes=marzo

La excepcioacuten indica que ha ocurrido un error al tratar de convertir ldquomarzordquo a un entero de

tipo Long Para cachar esta excepcioacuten y darle un tratamiento adecuado habraacute que modificar

la paacutegina JSP anterior como se indica a continuacioacuten

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltccatch var=rdquoerrorOcurridordquogt

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltccatchgt

ltcif test=rdquo$not empty errorOcurridordquogt

Error el paraacutemetro mes debe ser un nuacutemero ltbgt

ltbrgt Informacioacuten del error dada por el sistema

ltbrgt ltfont color=rdquoFF0000rdquogt $errorOcurrido ltfontgt

ltcifgt

ltbodygt

lthtmlgt

3232 ACCESO A BASES DE DATOS CON JSP

Las etiquetas que proporciona el aacuterea SQL permiten realizar

Conexioacuten con una base de datos

Realizacioacuten de consultas a la base de datos

Acceso al conjunto de resultados

Ejecucioacuten de actualizaciones y transacciones

Todas las etiquetas SQL actuacutean sobre una base de datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

32321 CONEXIOacuteN CON LA BASE DE DATOS

La conexioacuten con la base de datos puede realizarse con la etiqueta sqlsetDataSource Por

ejemplo si se esta utilizando el administrador de bases de datos MySql con el controlador

JDBC se puede realizar una conexioacuten con una base de datos digamos bd_tutorias de la

manera siguiente

ltsqlsetDataSource var=rdquobdrdquo

driver=rdquocommysqljdbcDriverrdquo

url=rdquojdbcmysqllocalhost3306bd_tutoriasrdquo

user=rdquoadminrdquo

password=rdquoadminadminrdquo gt

32322 CONSULTA A LA BASE DE DATOS

La etiqueta sqlQuero permite realizar una consulta a una base de datos Por ejemplo el

siguiente fragmento de coacutedigo realiza una consulta a la base de datos representada por bd y

obtiene un conjunto de resultados representado por cdr

ltsqlquery var=rdquocdrrdquo dataSource=rdquo$bdrdquogt

SELECT professor dia hora alumno

FROM profesores tutorias citas

WHERE profesoresid_profesor=tutoriasid_profesor

AND tutoriasid_tutoria=citasid_tutoria

ltsqlquerygt

32323 MODIFICACIONES SOBRE LA BASE DE DATOS

La etiqueta sqlupdate permite ejecutar una sentencia SQL INSERT UPDATE o DELETE

y cualquier otra sentencia SQL que no retorne ninguacuten valor Por ejemplo

ltsqlupdate var=rdquocontrdquo dataSource=rdquo$bdrdquo gt

UPDATE profesores

SET profesor=

WHERE profesor=

ltsqlparam value=rdquo$paramProfesorrdquo gt

ltsqlparam value=rdquo$paramIDrdquo gt

ltsqlupdategt

Una operacioacuten UPDATE puede utilizar el siacutembolo para indicar que el valor que tendriacutea que

evaluarse en esa posicioacuten seraacute suministrado por una etiqueta sqlparam como por ejemplo

httplocalhost8080JSP2sqlpruebajspProfesor=Mario+Rossainz+LopezampID=514

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltinput type=password name=numTarjetagtltbrgt

Repita el nuacutemero de la tarjeta de creacutedito

ltinput type=password name=numTarjetagtltbrgtltbrgt

ltcentergt

ltinput type=submit value=Enviar pedidogt

ltcentergt

ltformgt

ltbodygt

lthtmlgt

El formulario HTML del listado anterior utiliza POST como deberiacutea ser en todos los campos

que tienen contrasentildea

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Si intenta ejecutar el servlet MostrarParametros directamente en el explorador con el URL

httplocalhost8080MostrarParametrosservletMostrarParametros se obtendraacute la paacutegina

Web sin resultados

Peticioacuten HTTP POST Cuando el tipo de peticioacuten HTTP es POST los datos son enviados

al servidor en el cuerpo de la peticioacuten Es el meacutetodo maacutes usual de enviar los datos de un

formulario Con este tipo de peticioacuten la informacioacuten del formulario se enviacutea despueacutes del URL

indicado por action en el cuerpo de la peticioacuten y el tamantildeo de la informacioacuten enviada no esta

limitado

Seguacuten lo expuesto escoger el meacutetodo para enviar la informacioacuten no es difiacutecil Si los datos

son pocos y no importa su confidencialidad o manipulacioacuten utilizamos GET Si son largos

privados o importantes utilizamos POST

318 ACCESO A BASES DE DATOS CON SERVLETS

Una aplicacioacuten Java que realiza accesos a bases de datos funciona seguacuten una arquitectura que

permite escribir los programas abstrayeacutendose de los detalles de los niveles inferiores (discos

controladores sistema operativo etc) como lo muestra la figura siguiente

JDBC (Java DataBase Connectivity ndash Conexioacuten con Bases de Datos desde Java) es una API

de Java que permite ejecutar instrucciones SQL para manipular y gestionar bases de datos

relacionales Para que una aplicacioacuten Java pueda hacer operaciones sobre una base de datos

previamente tiene que establecer una conexioacuten con la misma Esta conexioacuten se realiza a

traveacutes de un controlador (driver) seguacuten la figura de arriba La API-JDBC se proporciona en

dos paquetes javasql y javaxsql El primer paquete contiene las interfaces y clases Java

fundamentales de JDBC en tanto que el segundo paquete es una extensioacuten del primero e

APLICACION

SISTEMA OPERATIVO

CONTROLADOR

Oracle Access MySql

JVM

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

incluye las clases que interactuacutean con JNDI y otras que gestionan conjuntos de conexiones

con una misma base de datos Para maacutes detalles del uso de JDBC veacutease el apeacutendice A de

estas notas

El primer paso para crear una conexioacuten entre una aplicacioacuten Java y una base de datos es

registrar el controlador JDBC adecuado para esa base con el fin de que la JVM pueda

utilizarlo Existen distintos tipos de controladores JDBC por ejemplo

ldquocommysqljdbcDriverrdquo que es el controlador utilizado cuando el motor de base de datos

que se utiliza es MySql

En el supuesto caso de que la base de datos soacutelo permitiera el acceso a traveacutes de controladores

ODBC como lo hace ACCESS siempre podemos usar el controlador puente JDBC-ODBC

incluido como parte del JDK ldquosunjdbcodbcJdbcOdbcDriverrdquo Este tipo de controladores

es decir los basados en ODBC (Open DataBase Connectivity) son bastante utilizados en

entornos Windows pues este SO incluye ODBC El apeacutendice A describe al final como

administrar los oriacutegenes de datos ODBC en Windows

Asiacute pues la mayor ventaja de los servlets con respecto a la conexioacuten con bases de datos viacutea

JDBC es que su ciclo de vida les permite mantener conexiones abiertas con las mismas a lo

largo de toda una sesioacuten Esto permite recortar tiempo con respecto a otras tecnologiacuteas como

la CGI Ademaacutes JDBC es una tecnologiacutea independiente de las bases de datos

Como ejemplo vamos a implementar una simple aplicacioacuten Web basada en servlets que

muestre una especie de directorio de personas La aplicacioacuten podraacute consultar insertar

modificar borrar o listar la informacioacuten de cada una de las personas almacenadas en la base

de datos a la que se hace acceso (que estaraacute en formato access)

La estructura de la Base de Datos es una tabla con los siguientes campos

DNI Nombre Apellido Edad

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

53023767A Pedro Rubio 18

77459822P Luis Tejedor 47

123456MRL Mario Rossainz 35

La estructura de la aplicacioacuten se muestra en la figura siguiente

lthtmlgt

ltbodygt

lttable border=1gtlttrgtlttdgt

ltform action=httplocalhost8080directorioTelservletSvAccesoBD

method=getgt

DNI ltinput type=text name=DNIgt ltbrgt

Nombre ltinput type=text name=Nombregt ltbrgt

Apellido ltinput type=text name=Apellidogt ltbrgt

Edad ltinput type=text name=Edadgt ltbrgtltbrgt

ltinput type=submit value=Consultar name=BotonConsultargt

ltinput type=submit value=Insertar name=BotonInsertargt

ltinput type=submit value=Modificar name=BotonModificargt

ltinput type=submit value=Borrar name=BotonBorrargt

ltinput type=submit value=Listar name=BotonListargt ltbrgt

ltcentergt

ltinput type=submit value= |lt name=BotonPrimerogt

ltinput type=submit value= -- name=BotonMenosCincogt

ltinput type=submit value= - name=BotonAnteriorgt

ltinput type=submit value= + name=BotonSiguientegt

ltinput type=submit value= ++ name=BotonMasCincogt

ltinput type=submit value= gt| name=BotonUltimogt

ltcentergt

lttdgt

lttdgt

lttextarea name=AreaDeListado rows=10 cols=35gtlttextareagt

SvAccesoBDhtml

SvAccesoBD

ObBorrado ObListado ObConsulta

ObInsercion

ObModificacion

ObPosicionamiento

ObRegistro

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lttdgt

lttrgt

ltformgt

lttablegt

ltbodygt

lthtmlgt

SvAccesoBDhtml

import javaio

import javaxservlet

import javaxservlethttp

public class SvAccesoBD extends HttpServlet

private int PosicionBuscada = 1

private String AreaDeListado=

PrintWriter out

public void doGet(HttpServletRequest request HttpServletResponse response)

throws IOException ServletException

String DNI = requestgetParameter(DNI)

String Nombre = requestgetParameter(Nombre)

String Apellido = requestgetParameter(Apellido)

String Edad = requestgetParameter(Edad)

String BotonConsultar = requestgetParameter(BotonConsultar)

String BotonInsertar = requestgetParameter(BotonInsertar)

String BotonModificar = requestgetParameter(BotonModificar)

String BotonBorrar = requestgetParameter(BotonBorrar)

String BotonListar = requestgetParameter(BotonListar)

String BotonPrimero = requestgetParameter(BotonPrimero)

String BotonMenosCinco = requestgetParameter(BotonMenosCinco)

String BotonAnterior = requestgetParameter(BotonAnterior)

String BotonSiguiente = requestgetParameter(BotonSiguiente)

String BotonMasCinco = requestgetParameter(BotonMasCinco)

String BotonUltimo = requestgetParameter(BotonUltimo)

AreaDeListado = requestgetParameter(AreaDeListado)

responsesetContentType(texthtml)

out = responsegetWriter()

outprintln(lthtmlgt)

outprintln(ltbodygt)

if (BotonConsultar=null) ConsultarDatos(DNI)

if (BotonInsertar=null) InsertarDatos(DNINombreApellidoEdad)

if (BotonModificar=null) ModificarDatos(DNINombreApellidoEdad)

if (BotonBorrar=null) BorrarDatos(DNI)

if (BotonListar=null) ListarDatos(DNI)

if (BotonPrimero=null) Controles(1)

if (BotonMenosCinco=null) Controles(2)

if (BotonAnterior=null) Controles(3)

if (BotonSiguiente=null) Controles(4)

if (BotonMasCinco=null) Controles(5)

if (BotonUltimo=null) Controles(0)

outprintln(ltbodygt)

outprintln(lthtmlgt)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

private void ConsultarDatos(String DNI)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObRegistro InstanciaFila = InstanciaConsultaDameDatos()

GenerarRespuesta(InstanciaFilaDameDNI()InstanciaFilaDameNombre()

InstanciaFilaDameApellido()

StringvalueOf(InstanciaFilaDameEdad()))

else

GenerarRespuesta(DNI------------)

PosicionBuscada = 1

public void ListarDatos(String DNI)

ObListado InstanciaListado = new ObListado()

AreaDeListado = InstanciaListadoDameResultado()

ConsultarDatos(DNI)

PosicionBuscada = 1

public void BorrarDatos(String DNI)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObBorrado InstanciaBorrado = new ObBorrado(PosicionBuscada)

GenerarRespuesta()

else

GenerarRespuesta(----------------)

PosicionBuscada = 1

public void ModificarDatos(String DNI String Nombre String Apellido

String Edad)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObRegistro InstanciaFila = new ObRegistro(DNI Nombre Apellido

IntegerparseInt(Edad))

ObModificacion InstanciaModificacion = new ObModificacion(PosicionBuscada

InstanciaFila)

GenerarRespuesta(DNINombreApellidoEdad)

else

GenerarRespuesta(----------------)

PosicionBuscada = 1

public void InsertarDatos(String DNI String Nombre String Apellido

String Edad)

ObRegistro InstanciaFila = new ObRegistro(DNI Nombre Apellido

IntegerparseInt(Edad))

ObInserccion InstanciaInserccion = new ObInserccion(InstanciaFila)

GenerarRespuesta()

PosicionBuscada=1

public void Controles(String Identificador)

ObPosicionamiento InstanciaPosicionamiento =

new ObPosicionamiento(IdentificadorPosicionBuscada)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ObRegistro InstanciaFila = InstanciaPosicionamientoDameDatos()

GenerarRespuesta(InstanciaFilaDameDNI()InstanciaFilaDameNombre()

InstanciaFilaDameApellido()

StringvalueOf(InstanciaFilaDameEdad()))

PosicionBuscada = InstanciaPosicionamientoPosicion()

private void GenerarRespuesta(String DNI String Nombre String Apellido

String Edad)

outprintln(lttable border=1gt)

outprintln(lttrgt)

outprintln(lttdgt)

outprintln(ltform

action=httplocalhost8080directorioTelservletSvAccesoBD

method=getgt)

outprintln( DNI ltinput type=text name=DNI value=+DNI+gtltbrgt)

outprintln( Nombre ltinput type=text name=Nombre

value=+Nombre+gtltbrgt)

outprintln( Apellido ltinput type=text name=Apellido

value=+Apellido+gtltbrgt)

outprintln( Edad ltinput type=text name=Edad

value=+Edad+gtltbrgtltbrgt)

outprintln( ltinput type=submit value=Consultar

name=BotonConsultargt)

outprintln( ltinput type=submit value=Insertar

name=BotonInsertargt)

outprintln( ltinput type=submit value=Modificar

name=BotonModificargt)

outprintln( ltinput type=submit value=Borrar name=BotonBorrargt)

outprintln( ltinput type=submit value=Listar name=BotonListargt

ltbrgt)

outprintln( ltcentergt)

outprintln( ltinput type=submit value= |lt name=BotonPrimerogt)

outprintln( ltinput type=submit value= --

name=BotonMenosCincogt)

outprintln( ltinput type=submit value= - name=BotonAnteriorgt)

outprintln( ltinput type=submit value= +

name=BotonSiguientegt)

outprintln( ltinput type=submit value= ++

name=BotonMasCincogt)

outprintln( ltinput type=submit value= gt| name=BotonUltimogt)

outprintln( ltcentergt)

outprintln( lttdgt)

outprintln( lttdgt)

outprintln( lttextarea name=AreaDeListado rows=10

cols=35gt+AreaDeListado+lttextareagt)

outprintln( lttdgt)

outprintln( lttrgt)

outprintln( ltformgt)

outprintln( lttablegt)

SvAccesoBDjava

import javasql

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

public class ObBorrado

ObBorrado(int PosicionBuscada)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

Personasabsolute(PosicionBuscada)

PersonasdeleteRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

ObBorradojava

import javasql

import javaawtTextArea

public class ObListado

private String Resultado=

ObListado()

String DNI Nombre Apellido Linea

int Edad Posicion

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement()

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

while (Personasnext())

DNI = PersonasgetString(DNI)

Nombre = PersonasgetString(Nombre)

Apellido = PersonasgetString(Apellido)

Edad = PersonasgetInt(Edad)

Posicion = PersonasgetRow()

Linea = DNI+ +Nombre+ +Apellido+ +StringvalueOf(Edad)

Resultado=Resultado+StringvalueOf(Posicion)+ +Linea+n

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public String DameResultado()

return Resultado

ObListadojava

public class ObRegistro

private String DNI Nombre Apellido

private int Edad

ObRegistro (String DNI String Nombre String Apellido int Edad)

thisDNI = DNI

thisNombre = Nombre

thisApellido = Apellido

thisEdad = Edad

String DameDNI()

return DNI

String DameNombre()

return Nombre

String DameApellido()

return Apellido

int DameEdad()

return Edad

ObRegistrojava

import javasql

public class ObConsulta

private int Posicion = 0

private ObRegistro DatosPersona

ObConsulta(String DNIPedido)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement()

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

while (Personasnext())

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

String DNI = PersonasgetString(DNI)

if (DNIequalsIgnoreCase(DNIPedido))

Posicion = PersonasgetRow()

String Nombre = PersonasgetString(Nombre)

String Apellido = PersonasgetString(Apellido)

int Edad = PersonasgetInt(Edad)

DatosPersona = new ObRegistro(DNINombreApellidoEdad)

break

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public int PosicionEncontrada()

return Posicion

public ObRegistro DameDatos()

return DatosPersona

ObConsultajava

import javasql

public class ObInserccion

ObInserccion(ObRegistro Datos)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

PersonasmoveToInsertRow()

PersonasupdateString(DNI DatosDameDNI())

PersonasupdateString(NombreDatosDameNombre())

PersonasupdateString(Apellido DatosDameApellido())

PersonasupdateInt(EdadDatosDameEdad())

PersonasinsertRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

catch (SQLException e)

Systemoutprintln(e)

ObInsercionjava

import javasql

public class ObModificacion

ObModificacion(int PosicionBuscada ObRegistro Datos)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

Personasabsolute(PosicionBuscada)

PersonasupdateString(DNIDatosDameDNI())

PersonasupdateString(NombreDatosDameNombre())

PersonasupdateString(ApellidoDatosDameApellido())

PersonasupdateInt(EdadDatosDameEdad())

PersonasupdateRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

ObModificacionjava

import javasql

public class ObPosicionamiento

private ObRegistro DatosPersona

private int Posicion

ObPosicionamiento(String Accion int Posicion)

int IDAccionEdad

String DNINombreApellido

boolean PosicionCorrecta=false

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

FROM DatosPersonales)

Personasabsolute(Posicion)

IDAccion = IntegerparseInt(Accion)

switch (IDAccion)

case 0

PosicionCorrecta = Personaslast()

break

case 1

PosicionCorrecta = Personasfirst()

break

case 2

PosicionCorrecta = Personasrelative(-5)

break

case 3

PosicionCorrecta = Personasprevious()

break

case 4

PosicionCorrecta = Personasnext()

break

case 5

PosicionCorrecta = Personasrelative(+5)

break

if (PosicionCorrecta)

thisPosicion = PersonasgetRow()

DNI = PersonasgetString(DNI)

Nombre = PersonasgetString(Nombre)

Apellido = PersonasgetString(Apellido)

Edad = PersonasgetInt(Edad)

else

thisPosicion = Posicion

DNI = ----

Nombre = ----

Apellido = ----

Edad = 0

DatosPersona = new ObRegistro(DNINombreApellidoEdad)

Personasclose()

Conexionclose()

SentenciaSQLclose()

Systemoutprintln(StringvalueOf(Posicion)++StringvalueOf(thisPosicion))

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public int Posicion()

return Posicion

public ObRegistro DameDatos() return DatosPersona

ObPosicionamientojava

En este ejemplo se emplean servlets y paacuteginas Web Los clientes habitualmente trabajan en

una computadora remota y los programas se ejecutan en un servidor El mecanismo de

comunicaciones que soporta el protocolo http nos permite consultar en el servidor los datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

que ha seleccionado o escrito el usuario de esta manera se puede observar una disociacioacuten

entre la interfaz graacutefica de usuario (que se ejecuta en los equipos de los clientes) y el

programa que recoge los datos y ejecuta las acciones pertinentes (que se ejecuta en el

servidor)

Como puede observarse el coacutedigo SvAccessoBD es un servlet que lleva a cabo las siguientes

operaciones

1 Recoge los valores provenientes del usuario

2 Determina la naturaleza de la accioacuten a realizar

3 Realiza su cometido con la base de datos

4 Genera la respuesta que recibiraacute el usuario

32 JSP

JSP significa Java Server Pages que traducido quiere decir Paacuteginas de Servidor Java y es

por tanto una tecnologiacutea orientada a crear paacuteginas Web con programacioacuten en JAVA es decir

permite mezclar HTML estaacutendar y estaacutetico con un contenido dinaacutemico etiquetas especiales

(oacuterdenes) y trozos de coacutedigo JAVA (scriptlets o secuencias de oacuterdenes) o contenido dinaacutemico

generado por servlets Eacuteste contenido dinaacutemico se encuentra encerrado en etiquetas

especiales muchas de las cuales inician con lt y finalizan con gt El motor de las paacuteginas

JSP esta basado en los servlets de JAVA

En la tecnologiacutea JSP se crean paacuteginas parecidas a las paacuteginas que se crean en ASP (Active

Server Page de Microsoft) o PHP (Personal Home Page) que son dos tecnologiacuteas de paacuteginas

ejecutadas en el servidor Sin embargo JSP no se cintildee a un sistema operativo o servidor Web

en particular ademaacutes de que proporciona acceso a la tecnologiacutea de Servlets y a JAVA en la

parte dinaacutemica

El proceso para generar paacuteginas JSP accesibles en Web es mucho maacutes simple que en los

servlets Dando por hecho que se tiene un servidor Web que permite usar JSP el coacutedigo se

almacenaraacute en archivos con extensioacuten jsp que incluyen dentro de la estructuras de etiquetas

HTML las sentencias JAVA a ejecutar y tan soacutelo se colocaraacuten en cualquier lugar en donde

se pusiera una paacutegina Web normal sin compilacioacuten sin paquetes y sin configuracioacuten aunque

el servidor tendraacute que ser configurado para acceder a los archivos de clases Servlets y de

JSPs

Aunque lo que se escriba con frecuencia luciraacute como un archivo HTML estaacutendar detraacutes de

ello la paacutegina JSP se convierte automaacuteticamente en un servlet normal donde el HTML

estaacutetico tan soacutelo es enviado al flujo de salida asociado con el meacutetodo service del servlet Esta

traduccioacuten se realiza la primera vez que se solicita la paacutegina De acuerdo como este

configurado el servidor es posible ver el coacutedigo fuente de los servlets generados a partir de

sus paacuteginas JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Por ejemplo supongamos que se ha escrito el siguiente coacutedigo en el archivo Saludojsp

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtEjemplo JSPlttitlegtltheadgt

ltbody bgcolor=ffffccgt

ltcentergt

lth2gtHola mundolth2gt

ltjavautilDate hoy = new javautilDate()gt

La fecha de hoy es lt=hoygt

ltcentergt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional y un fragmento de un scriptlet de JAVA La etiqueta

lt identifica el comienzo del scriptlet y gt el final Una expresioacuten de la forma =variable

es sustituida por el valor de esa variable Para ejecutar esta paacutegina o cualquier otra paacutegina

JSP desde un navegador hay que instalarla en el servidor de aplicaciones de la misma manera

en como se hizo con los servlets Suponiendo entonces que se tiene instalado el Tomcat 5

siga los siguientes pasos

1 Antildeadir en el servidor la carpeta digamos JSP2 dentro de la carpeta webapps del Tomcat

y construir sobre ella la jerarquiacutea de clases ya conocida de los servlets

webappsrarrJSP2rarrWEB-INFrarrclasses

WEB-INFrarrlib

WEB-INFrarrtags

2 Editar en la carpeta WEB-INF el descriptor de despliegue webxml que se indica a

continuacioacuten Este archivo XML indica doacutende se localiza el esquema XML para la

especificacioacuten Servlet 24 que a suvez utiliza el esquema XML para la especificacioacuten

Java Server Page 20 que son las especificaciones que soporta en servidor Tomcat

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=

httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

3 Crear en JSP2 la carpeta saludo que contendraacute la aplicacioacuten y copiar en ella la paacutegina

Saludojsp

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

4 Arrancar el servidor Si el servidor ya estaba arrancado detenerlo y volverlo a arrancar o

bien abrir el explorador escribir el URL httplocalhost8080managerhtml e instalar

la aplicacioacuten

5 Una vez arrancado el servidor verificar si estaacute funcionando correctamente escribiendo

el URL siguiente en el explorador httplocalhost8080 El explorador debe mostrar la

paacutegina del Tomcat

6 Ejecutar la paacutegina JSP iniciando el explorador y escribiendo el URL siguiente

httplocalhost8080JSP2saludoSaludojsp donde la sintaxis geneacuterica es

httpservidor[puerto]MiCarpetapaginajsp

Cuando esta paacutegina (Saludojsp) es invocada por primera vez el motor JSP lleva a cabo una

fase de traduccioacuten de la misma en un servlet y el motor Servlet es el que ejecutaraacute eacuteste uacuteltimo

para generar el HTML dinaacutemico que seraacute enviado al explorador cliente seguacuten puede

deducirse de la figura siguiente La proacutexima vez que la paacutegina sea solicitada el motor JSP

ejecutaraacute el servlet que fue caragado la primera vez a no ser que la paacutegina haya cambiado

en cuyo caso seraacute compilada automaacuteticamente en un nuevo servlet y ejecutada

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Regresando al ejemplo el archivo java generado por el Tomcat a partir del archivo

Saludojsp se localiza en la carpeta workCatalinalocalhost de la instalacioacuten de Tomcat

321 ELEMENTOS PARA SECUENCIAS DE COMANDOS

Los elementos para secuencias de comandos permiten insertar coacutedigo en el servlet que seraacute

generado a partir de la paacutegina JSP Existen tres formas

1 Expresiones del tipo lt= expresioacuten gt que se evaluacutean e insertan en el resultado del

servlet

2 Los scriptlets del tipo lt codigo gt que se insertan en el meacutetodo _jspService del

servlet (ejecutado por service)

3 Las declaraciones del tipo lt Codigo gt que se insertan en el cuerpo de la clase del

servlet fuera de cualquier meacutetodo existente

NOTA Los comentarios en JSP se escriben lt-- Comentario JSP --gt en tanto que los

comentarios en HTML son de la forma lt--Comentario HTML --gt La diferencia

semaacutentica radica en que los comentarios HTML cuando se insertan en la respuesta enviada

por el servidor al cliente no se muestran cuando se visualiza el documento HTML pero si

Servidor Maacutequina Cliente

Explorador Web

Contenedor Web

Motor Servlet

Motor JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

los podemos ver cuando se visualiza el coacutedigo fuente en tanto que los comentarios JSP

aunque se inserten en la respuesta enviada por el servidor al cliente no son enviados al

explorador de forma que tampoco se muestran ni se ven cuando se visualiza el coacutedigo fuente

HTML desde el explorador

3211 EXPRESIONES

Se utiliza una expresioacuten JSP para insertar valores directamente en el resultado La sintaxis es

lt= expresioacuten gt Por ejemplo

lt= requestgetParameter(ldquoparNombre) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt lt= s gt

La fecha y hora actual es lt= new javautilDate() gt

La expresioacuten se evaluacutea se convierte a cadena y se inserta en la paacutegina Esta evaluacioacuten se

realiza durante la ejecucioacuten

32111 VARIABLES PREDEFINIDAS

Para simplificar estas expresiones se pueden utilizar cierta cantidad de variables

predefinidas Estos objetos impliacutecitos como tambieacuten se les llama estaacuten disponibles para su

uso durante la implementacioacuten de una paacutegina Web

bull pageContext Es un objeto de la clase PageContext que proporciona acceso a objetos

relacionados con los servlets

bull request Es un objeto de la clase HttpServletRequest que se puede obtener a traveacutes del

meacutetodo getRequest que encapsula los datos enviados por el cliente al servidor

bull response Es un objeto de la clase HttpServletResponse que puede obtenerse a traveacutes

del meacutetodo getResponse que encapsula los datos que el servidor enviaraacute al cliente

bull application Es un objeto de la clase ServletContext que se obtiene a traveacutes del meacutetodo

getServletContext que define un conjunto de meacutetodos que todo servlet utiliza para

comunicar con el contenedor de servlets

bull config Es un objeto de la clase ServletConfig que se obtiene a traveacutes del meacutetodo

getServletConfig y que se utiliza por el contenedor de servlets para pasar informacioacuten

al servlet durante la iniciacioacuten

bull session Es un objeto de la clase HttpSession que se obtiene a traveacutes del meacutetodo

getSession que proporciona una forma de identificar a un usuario que visita las paacuteginas

de un sitio Web

bull out Es un objeto de la clase JspWriter que se obtiene a traveacutes del meacutetodo getOut que

se utiliza para almacenar la respuesta que seraacute enviada al cliente que hizo la peticioacuten de

la paacutegina

bull page Es un objeto geneacuterico de la clase Object que se obtiene a traveacutes del meacutetodo

getPage y que representa al servlet obtenido a partir de la paacutegina JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

bull exception Es un objeto de la clase Exception que se obtiene a traveacutes del meacutetodo

getException que contendraacute informacioacuten a cerca de cualquier excepcioacuten que se lance

desde la paacutegina JSP

Un ejemplo del uso de uno de estos objetos impliacutecitos seriacutea el siguiente

El nombre de tu host es lt= requestgetRemoteHost() gt

El listado siguiente da un ejemplo de una paacutegina JSP que utiliza algunas variables

predefinidas como uso de expresiones JSP

ltDOCTYPE HTML PUBLIC -W3CDTD HTML 40 Transitional ENgt

lthtmlgt

ltheadgt

lttitlegt Expresiones JSP lttitlegt

ltheadgt

ltbodygt

lth2gt Expresiones JSP lth2gt

ltULgt

ltligt Fecha y hora en curso lt= new javautilDate() gt ltligt

ltligt Nombre de su host lt= requestgetRemoteHost() gt ltligt

ltligt Identificador de su sesioacuten lt= sessiongetId() gt ltligt

ltligt El paraacutemetro ltcodegt paramPrueba ltcodegt del formulario

lt= requestgetParameter(paramPrueba) gt ltligt

ltULgt

ltbodygt

lthtmlgt

Cuya salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3212 LOS SCRIPTLETS JSP

Si se desea hacer algo maacutes complejo que una simple expresioacuten los scriptlets permiten insertar

coacutedigo JAVA en el meacutetodo _jspService del servlet (que es ejecutado por service) La sintaxis

utilizada por los scriptlets es lt coacutedigo java gt Los escriptlets tienen acceso a las

mismas variables definidas de forma automaacutetica como expresiones A manera de ejemplo si

se desea que el resultado aparezca en la paacutegina generada deberiacutea de utilizarse la variable out

como en la siguiente instruccioacuten

lt String datosConsultados= requestgetQueryString()

outprintln(ldquoDatos GET adjuntos ldquo+datosConsultados)

gt

En este ejemplo podriacutea haberse obtenido el mismo resultado utilizando la siguiente expresioacuten

JSP

Datos GET adjuntos lt=requestgetQueryString() gt

En general los scriptlets pueden ejecutar varias tareas que no podriacutean realizarse con las

expresiones Tales tareas incluyen

bull La determinacioacuten de encabezados de respuesta

bull Actualizacioacuten de Bases de Datos

bull Ejecucioacuten de bucles condiciones y otras estructuras complejas

lt for (int i=1 ilt=6 i++)

gt

lth lt=i gtgt Hola Mundo lthlt=i gtgt

lt gt

Como un ejemplo concreto se muestra la siguiente paacutegina JSP llamada Cuentajsp en donde

se observa coacutemo se hace un seguimiento del nuacutemero de veces que un cliente accede a esta

paacutegina a traveacutes de distintas sesiones Para ello supondremos que dicha cuenta es el valor del

atributo atrCuenta del objeto impliacutecito application ya citado La primera vez que el cliente

accede a la paacutegina el valor de atrCuenta seraacute null debido a que auacuten no ha sido fijado este

atributo en este caso se fijaraacute con el valor 1 En los siguientes accesos se leeraacute el valor del

atributo atrCuenta se incrementaraacute en una unidad y se volveraacute a fijar Finalmente se enviacutea

la respuesta al cliente para que se muestre al usuario el valor del contador

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en el objeto impliacutecito application con el nombre

atrCuenta

--gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt

Integer cuenta = (Integer)applicationgetAttribute(atrCuenta)

String s = vez

if (cuenta == null)

cuenta = new Integer(1)

else

cuenta = new Integer(cuentaintValue() + 1)

s = veces

applicationsetAttribute(atrCuenta cuenta)

gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

Has visitado esta paacutegina lt= cuenta gt lt= s gt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional un fragmento de coacutedigo JAVA o scriptlet

expresiones y comentarioshellip

Aquiacute otro ejemplo de la ejecucioacuten de un coacutedigo demasiado complejo para una expresioacuten JSP

Este listado presenta una paacutegina JSP que utiliza el paraacutemetro de peticioacuten colorFondo para

establecer el color de fondo de la paacutegina

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgt

lttitlegt Prueba de Color lttitlegt

ltheadgt

lt

String colorFondo=requestgetParameter(colorFondo)

boolean tieneColorExplicito

if (colorFondo =null)

tieneColorExplicito=true

else

tieneColorExplicito=false

colorFondo=WHITE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt

ltbody bgcolor=lt= colorFondo gtgt

lth2 align=centergt Prueba de color lth2gt

lt

if (tieneColorExplicito)

outprintln(Ha indicado un color de fondo expliacutecito +

colorFondo +)

else

outprintln(Usareacute el color de fondo predeterminado WHITE +

Indique el atributo de peticioacuten

ltigtcolorFondoltigt+

para intentar un color estaacutendar un +

valor RRGGBB o para ver si el navegador Web +

permite el uso de nombres de color X11)

gt

ltbodygt

lthtmlgt

Cuyas posibles salidas son

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3213 DECLARACIONES JSP

Una declaracioacuten JSP permite definir meacutetodos o campos que seraacuten insertados en el cuerpo

principal de la clase del servlet (fuera del meacutetodo _jspService) Una declaracioacuten tiene la

sintaxis lt Coacutedigo Java gt Por ejemplo

lt int i=0 gt

lt

Public void jspinit()

coacutedigo de iniciacioacuten

gt

Una declaracioacuten no genera ninguacuten resultado y se usan junto con las expresiones JSP o los

scriptlets A continuacioacuten se muestra una paacutegina JSP que despliega la cantidad de veces que

se ha solicitado esta paacutegina desde que se arrancoacute el servidor haciendo uso de las

declaraciones JSP

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtDeclaraciones JSPlttitlegtltheadgt

ltbodygt

lth1gtDeclaraciones JSPlth1gt

lt-- Esto es un comentario en JSP --gt

lt private int recuentoAccesos=0 gt

lth2gt Accesos a la paacutegina desde el reinicio del servidor

lt= ++recuentoAccesos gt lth2gt

ltbodygt

lthtmlgt

La salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

322 EL LENGUAJE DE EXPRESION EN JSP 20

Anteriormente se ha visto la necesidad de utilizar fragmentos de coacutedigo java en el desarrollo

de paacuteginas JSP pero con la aparicioacuten de la especificacioacuten JSP 20 ya no hay necesidad de

utilizar fragmentos de coacutedigo Java para nada gracias al nuevo lenguaje de expresioacuten EL

(Expresioacuten Language) a la biblioteca de etiquetas estandar JSTL (JSP Standar Tag Library)

y a las nuevas formas para desarrollar etiquetas personalizadas

El lenguaje de expresioacuten JSP es maacutes un lenguaje de acceso a datos que un lenguaje de

programacioacuten Ya se ha visto que para pasar informacioacuten de un cliente a una paacutegina JSP se

utilizan paraacutemetros en la peticioacuten y atributos en la paacutegina El lenguaje de expresioacuten lo hace

posible sin tener que utilizar scriptlets o expresiones (lt= expresioacuten gt) Por ejemplo las

liacuteneas JSP 12 siguientes escritas utilizando coacutedigo Java

lt= requestgetParameter(ldquoparNombrerdquo) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt veces

bajo la especificacioacuten JSP 20 se pueden escribir de una forma maacutes sencilla como sigue

(ahora no se trata de coacutedigo JAVA)

$paramparNombre has visitado esta paacutegina

$atrCuenta veces

La sintaxis de JSP es sensible a mayuacutesculas y minuacutesculas pero un par de comillas simples es

equivalente a un par de comillas dobles

3221 VARIABLES PREDEFINIDAS (Objetos Impliacutecitos)

El lenguaje de expresioacuten JSP 20 soporta los objetos impliacutecitos siguientes

pageContext Objeto de javaxservletjspPageContext que proporciona acceso a los

datos de una peticioacuten

param Coleccioacuten (objeto de tipo javautilMap) de todos los valores de los paraacutemetros

enviados en una peticioacuten un String por paraacutemetro

paramValues Coleccioacuten de todos los valores de los paraacutemetros enviados en una

peticioacuten una matriz de tipo String por paraacutemetro

header Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten un

String por cabecera

headerValues Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten

una matriz de tipo String por cabecera

cookie Coleccioacuten de todos los valores de las cookies un objeto javaxservlethttpCookie

por cookie

initParam Coleccioacuten de todos los valores de los paraacutemetros de iniciacioacuten de la

aplicacioacuten un String por paraacutemetro

Tambieacuten hay objetos que permiten acceder a variables definidas en diferentes aacutembitos lo que

posibilita compartir informacioacuten

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

pageScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de paacutegina

requestScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

peticioacuten

sessionScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de sesioacuten

applicationScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

aplicacioacuten

3222 DIRECTRICES

Las directrices page incluye y taglib son mensajes para el motor JSP y son siempre incluidas

entre los siacutembolos lt y gt

32221 LA DIRECTRIZ PAGE

Define atributos que se aplican a toda la paacutegina JSP donde es incluida

lt page lista_de_atributos gt

Donde la lista_de_atributos puede contener algunos de los siguientes (aquellos que estaacuten

escritos en negrita son los tomados por omisioacuten)

language= ldquoscriptingLanguagerdquo

extends= rdquoclassNamerdquo

import= ldquoimportListrdquo

session= ldquotrue|falserdquo

buffer= ldquonone|sizeKb

autoflush= ldquotrue|falserdquo

isThreadSafe= rdquotrue|falserdquo

info= rdquoinfo_textrdquo

errorPage= ldquoerror_urlrdquo

isErrorPage= rdquotrue|falserdquo

contentType= rdquoctinfordquo

pageEncoding= rdquopeinfordquo

isELIgnored= ldquotrue|falserdquo

Tiacutepicamente se localiza al principio de la paacutegina JSP y puede haber cualquier nuacutemero de

ellas El lenguaje por omisioacuten es Java Ejemplos

lt page contentType=rdquotexthtmlrdquo language=rdquojavardquo gt

lt page import=rdquojavautil javalangrdquo gt

lt page buffer=rdquo5kbrdquo autoflush=rdquofalserdquo gt

32222 LA DIRECTRIZ INCLUDE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

La directriz include incluye un archivo (html jsp xml o de texto) en una paacutegina JSP Esto

permite dividir el contenido de la paacutegina en trozos maacutes manejables

lt incluye file=rdquoURL_relativordquo gt

El ejemplo siguiente muestra dos archivos el primero incluye al segundo para mostrar la

fecha y hora actuales

lt-- fichero mostrarFechaHorajsp --gt

lthtmlgt

ltheadgtlttitlegtIncluir un ficherolttitlegtltheadgt

ltbody bgcolor=whitegt

ltfont color=bluegt

La fecha y hora actuales son

lt include file=fechaHorajsp gt

ltfontgt

ltbodygt

lthtmlgt

lt-- fichero fechaHorajsp --gt

lt page import=javautil gt

lt= (new javautilDate())toLocaleString() gt

32223 LA DIRECTRIZ TAGLIB

La directriz taglib indica la biblioteca de acciones personalizadas que podremos utilizar en

la codificacioacuten de la paacutegina JSP Para distinguir esas acciones entre otras existentes se utiliza

un prefijo (prefix) Su sintaxis es

lt taglib (uri=rdquoURI_bibliotecardquo|tagdir=rdquoDir_biblioteca_tagrdquo)

prefix=rdquoprefijordquo gt

Cuando se trata de una biblioteca definida mediante una clase Java y un descriptor (archivo

tld) eacutesta se identifica mediante un URI (Uniform Resource Identifier- URL relativos) Por

ejemplo

lt taglib uri=rdquohttpMarioRossainzLopezmiBibliotecardquo

prefix=rdquofunrdquo gt

ltpgtltfunaccion01 gt

La uacuteltima liacutenea del ejemplo tiene dos etiquetas una etiqueta p HTML y otra accion01

perteneciente a la biblioteca miBiblioteca En cambio si la biblioteca se define mediante un

archivo tag entonces se identifica mediante su ruta relativa en el sistema de archivos

lt taglib tagdir=rdquoWEB-INFtagsrdquo prefix=rdquofunrdquo gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpgtltfunaccion01 gt

La directriz taglib debe colocarse antes de utilizar en la paacutegina JSP las acciones

personalizadas definidas por la misma Se puede utilizar maacutes de una directriz pero el prefijo

utilizado debe ser uacutenico para cada una de ellas

3223 ACTIVACION DEL LENGUAJE DE EXPRESION (LE)

La especificacioacuten JSP 20 define un lenguaje de expresioacuten como alternativa a elementos de

programacioacuten escritos con coacutedigo Java y especificaciones anteriores a la JSP 20 Para que

este lenguaje pueda ser interpretado tienen que cumplirse 2 requisitos

1 Que la propiedad isELIgnored de la directriz page valga false

lt page isELIgnored= ldquofalserdquo gt

2 Que el descriptor de despliegue webxml en la carpeta WEB-INF indique doacutende se

localiza el esquema XML para la especificacioacuten Servlet 24 que a su vez utiliza el

esquema XML para la especificacioacuten Java Server Page 20

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

Utilizando el lenguaje de expresioacuten se podriacutea modificar la paacutegina Cuentajsp de la seccioacuten

3212 de este documento como se muestra a continuacioacuten Esta nueva paacutegina

1 Especifica que utilizaraacute la biblioteca core de etiquetas estandar (de la que se hablaraacute maacutes

adelante)

2 La primera vez que sea accedida definiraacute la variable atrCuenta en el aacutembito de la

aplicacioacuten con un valor inicial nulo y la incrementaraacute en una unidad cuando sea accedida

sucesivas veces simplemente incrementaraacute esta variable en una unidad

3 Finalmente mostraraacute una paacutegina con un contenido anaacutelogo al siguiente Esta formado

por una cabecera y una segunda liacutenea compuesta por el valor del paraacutemetro parNombre

enviado con la peticioacuten un texto fijo el valor de la variable atrCuenta y otro texto fijo

dependiente del valor de esta variable

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

El coacutedigo completo es el siguiente

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

3224 VARIABLES Y EXPRESIONES

Para acceder a una simple variable se puede escribir algo como lo siguiente $nombre y

para acceder a una propiedad de un objeto podemos escribir algo como

$paramparNombre

$applicationScopeatrCuenta

$pageContextrequestrequestURI

La primera liacutenea del ejemplo anterior obtiene el valor de la propiedad parNombre del objeto

param la segunda el valor del atributo atrCuenta del objeto applicationScope y la tercera

el URL relativo de la paacutegina JSP solicitada

El lenguaje de expresioacuten es maacutes tolerante con respecto a las variables con valor null y ejecuta

muchas maacutes conversiones de forma automaacutetica sobre el tipo de los datos cuando la expresioacuten

a evaluar asiacute lo requiere Por ejemplo la etiqueta condicional siguiente incluye una expresioacuten

que compara el valor del atributo atrCuenta con aacutembito de aplicacioacuten con 10 (convirtiendo

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

impliacutecitamente el valor del atributo al tipo de la constante para poder realizar la comparacioacuten

El resultado seraacute un valor de tipo boolean

ltcif test=rdquo$applicationScopeatrCuenta gt 10rdquogt

ltcifgt

o bien

ltcif test=rdquo$atrCuenta gt 10rdquogt

ltcifgt

Para que una literal pueda incluir un caracter significativo para el lenguaje dicho caracter

debe ser especificado como una secuencia de escape (caracter) Por ejemplo la siguiente

expresioacuten da lugar al literal ldquovezrdquo o ldquovecesrdquo entre comillas dobles

$(atrCuenta gt 1) iquest ldquordquovecesrdquordquo ldquordquovezrdquordquo

Cualquier objeto o atributo de un objeto definido en algunos de los aacutembitos de una paacutegina

puede ser utilizado como una variable Por ejemplo $atrCuenta+1 es una expresioacuten que

realiza la suma de la variable atrCuenta con 1

Cuando se trate de una propiedad de un objeto para acceder a ella se utilizaraacute el operador

punto o bien la notacioacuten empleada para acceder a un elemento de una matriz Por ejemplo

$paramparNombre

$param[ldquoparNombrerdquo]

Una expresioacuten LE puede aparecer en cualquier lugar donde pueda aparecer un texto fijo Por

tanto para informar al contenedor JSP que se trata de una expresioacuten y no de un texto fijo se

utilizan los delimitadores $ al principio y al final

3225 OPERADORES

OPERADOR DESCRIPCIOacuteN Acceso a la propiedad de un objeto o a un elemento de un Map

[] Acceso al elemento de una matriz o de un objeto List

() Pareacutentesis para alterar la prioridad en la evaluacioacuten de una expresioacuten

If ternario condicion expresion1 expresioacuten 2

+ Suma

- Resta

Producto

oacute div Divisioacuten

oacute mod Moacutedulo o resto de una divisioacuten

== oacute eq Igualdad

= oacute ne Diferente

lt oacute lt Menor que

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt oacute gt Mayor que

lt= oacute le Menor o igual que

gt= oacute ge Mayor o igual que

ampamp oacute and Operacioacuten Loacutegica AND

|| oacute or Operacioacuten Loacutegica OR

oacute not Operacioacuten Loacutegica NOT

empty Verifica si el valor de una variable es null si un String esta vaciacuteo o si una matriz Map

o Collection no tienen elementos

func(args) Llamada a una funcioacuten donde func es el nombre de la funcioacuten y arg representa cero o

maacutes argumentos separados por comas

El ejemplo siguiente muestra una paacutegina JSP compuesta por elementos HTML expresiones

LE y objetos impliacutecitos

lthtmlgt

ltheadgtlttitlegtJSP 20lttitlegtltheadgt

ltbodygt

lth3gtLenguaje de expresioacuten (LE)lth3gt

ltpgtLa siguiente tabla ilustra algunas expresiones LE

ltbrgtltbrgtlttable border=1gt

lttrgt

ltthgtltbgtExpresioacutenltbgtltthgt

ltthgtltbgtValorltbgtltthgt

lttrgt

lttrgt

lttdgt$3 + 6lttdgt

lttdgt$3 + 6lttdgt

lttdgt

lttrgt

lttdgt$(7 gt 4) 7 4lttdgt

lttdgt$(7 gt 4) 7 4lttdgt

lttrgt

lttrgt

lttdgt$header[host]lttdgt

lttdgt$header[host]lttdgt

lttrgt

lttablegt

ltbodygt

lthtmlgt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

323 BIBLIOTECA ESTANDAR DE ETIQUETAS

La biblioteca estaacutendar de etiquetas JSP (JSTL ndash Java Server Page Estaacutendar Tag Library)

incluye una cantidad amplia de etiquetas para diferentes aacutereas de trabajo

Aacuterea baacutesica (su prefijo es c ndash core) y contiene

o Soporte de variables (remove y set)

o Control del flujo (choose when otherwise forEach forTokens if)

o Manejo de URL (import param redirect param y url param)

o Operaciones varias (match y out)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlcore

Aacuterea XML (su prefijo es x) y contiene

o Sentencias baacutesicas (out parse y set)

o Control del flujo (choosehellip whenhellip otherwise forEach e if)

o Transformacioacuten de Documentos (transformhellipparam)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlxml

Aacuterea Internacionalizacioacuten (su prefijo es fmt) Contiene

o Localidad (setLocale y requestEncoding)

o Mensajes (bundle message param y setBundle)

o Formateo de Fechas y nuacutemeros (formatNumber formateacuteate parseDate

parseNumber setTimeZone timeZone)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlfmt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Aacuterea SQL (su prefijo es sql) es el lenguaje estandar para interactuar con bases de datos

relacionales y contiene setDataSource Quero dateParam param transaction y

update dateParam param) El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlsql

Aacuterea Funciones (su prefijo es fn) y contiene

o Longitud de una coleccioacuten (length)

o Manipulacioacuten de String (toUpperCase toLowerCase substring

substringAfter substringBefore trim replace indexOf startsWith

endsWith contains containsIgnoreCase split join y escapeXml)

o El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlfunctions

3231 OPERACIONES CON ETIQUETAS BAacuteSICAS

En un ejemplo pasado teniacuteamos el siguiente coacutedigo

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

En este ejemplo se hace referencia al aacuterea baacutesica de JSTL con el prefijo c y se utiliza la

etiqueta cset para definir la variable atrCuenta Si la variable ya esta definida simplemente

se le asigna el valor especificado

La uacuteltima parte del ejemplo anterior podriacutea haberse escrito de esta otra forma

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcif test=rdquo$atrCuenta gt 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcifgt

$atrCuenta $str

La etiqueta cif permite la ejecucioacuten condicional de su cuerpo en funcioacuten del valor del

atributo de test

La etiqueta cchoose permite la ejecucioacuten del cuerpo de la primera etiqueta cwhen cuyo

atributo test sea evaluado a true Si ninguna de las condiciones se evaluacutea a true entonces se

evaluacutea el cuerpo de la etiqueta cotherwise si estaacute presente El siguiente coacutedigo muestra otra

manera de escribir el ejemplo anterior utilizando estas uacuteltimas etiquetas

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcchoosegt

ltcwhen test=rdquo$atrCuenta == 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcwhengt

ltcotherwisegt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcotherwisegt

ltcchoosegt

$atrCuenta $str

La etiqueta cforEach permite iterar sobre una coleccioacuten de objetos La coleccioacuten se

especifica por medio del atributo iacutetems y el elemento actual de la coleccioacuten estaacute disponible a

traveacutes de la variable establecida por el atributo var Por ejemplo el siguiente fragmento de

coacutedigo visualiza una tabla con las variables definidas a nivel de aacutembito de paacutegina

lttable border=rdquo1rdquogt

ltcforEach var=rdquoitemrdquo iacutetems=rdquo$pageScoperdquogt

lttrgt

lttdgt $item lttdgt

lttrgt

ltcforEachgt

lttablegt

La etiqueta ccatch atrapa una excepcioacuten que ocurra en el cuerpo de la misma Por ejemplo

el siguiente segmento de coacutedigo lanzaraacute una excepcioacuten si el paraacutemetro mes se escribe con

letras en vez de con nuacutemeros

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltbodygt

lthtmlgt

Un URL anaacutelogo al siguiente daraacute lugar a que la excepcioacuten sea lanzada cuando se ejecute la

expresioacuten $nMes 3 de la paacutegina anterior

httplocalhost8080JSP2exceppruebajspmes=marzo

La excepcioacuten indica que ha ocurrido un error al tratar de convertir ldquomarzordquo a un entero de

tipo Long Para cachar esta excepcioacuten y darle un tratamiento adecuado habraacute que modificar

la paacutegina JSP anterior como se indica a continuacioacuten

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltccatch var=rdquoerrorOcurridordquogt

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltccatchgt

ltcif test=rdquo$not empty errorOcurridordquogt

Error el paraacutemetro mes debe ser un nuacutemero ltbgt

ltbrgt Informacioacuten del error dada por el sistema

ltbrgt ltfont color=rdquoFF0000rdquogt $errorOcurrido ltfontgt

ltcifgt

ltbodygt

lthtmlgt

3232 ACCESO A BASES DE DATOS CON JSP

Las etiquetas que proporciona el aacuterea SQL permiten realizar

Conexioacuten con una base de datos

Realizacioacuten de consultas a la base de datos

Acceso al conjunto de resultados

Ejecucioacuten de actualizaciones y transacciones

Todas las etiquetas SQL actuacutean sobre una base de datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

32321 CONEXIOacuteN CON LA BASE DE DATOS

La conexioacuten con la base de datos puede realizarse con la etiqueta sqlsetDataSource Por

ejemplo si se esta utilizando el administrador de bases de datos MySql con el controlador

JDBC se puede realizar una conexioacuten con una base de datos digamos bd_tutorias de la

manera siguiente

ltsqlsetDataSource var=rdquobdrdquo

driver=rdquocommysqljdbcDriverrdquo

url=rdquojdbcmysqllocalhost3306bd_tutoriasrdquo

user=rdquoadminrdquo

password=rdquoadminadminrdquo gt

32322 CONSULTA A LA BASE DE DATOS

La etiqueta sqlQuero permite realizar una consulta a una base de datos Por ejemplo el

siguiente fragmento de coacutedigo realiza una consulta a la base de datos representada por bd y

obtiene un conjunto de resultados representado por cdr

ltsqlquery var=rdquocdrrdquo dataSource=rdquo$bdrdquogt

SELECT professor dia hora alumno

FROM profesores tutorias citas

WHERE profesoresid_profesor=tutoriasid_profesor

AND tutoriasid_tutoria=citasid_tutoria

ltsqlquerygt

32323 MODIFICACIONES SOBRE LA BASE DE DATOS

La etiqueta sqlupdate permite ejecutar una sentencia SQL INSERT UPDATE o DELETE

y cualquier otra sentencia SQL que no retorne ninguacuten valor Por ejemplo

ltsqlupdate var=rdquocontrdquo dataSource=rdquo$bdrdquo gt

UPDATE profesores

SET profesor=

WHERE profesor=

ltsqlparam value=rdquo$paramProfesorrdquo gt

ltsqlparam value=rdquo$paramIDrdquo gt

ltsqlupdategt

Una operacioacuten UPDATE puede utilizar el siacutembolo para indicar que el valor que tendriacutea que

evaluarse en esa posicioacuten seraacute suministrado por una etiqueta sqlparam como por ejemplo

httplocalhost8080JSP2sqlpruebajspProfesor=Mario+Rossainz+LopezampID=514

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Si intenta ejecutar el servlet MostrarParametros directamente en el explorador con el URL

httplocalhost8080MostrarParametrosservletMostrarParametros se obtendraacute la paacutegina

Web sin resultados

Peticioacuten HTTP POST Cuando el tipo de peticioacuten HTTP es POST los datos son enviados

al servidor en el cuerpo de la peticioacuten Es el meacutetodo maacutes usual de enviar los datos de un

formulario Con este tipo de peticioacuten la informacioacuten del formulario se enviacutea despueacutes del URL

indicado por action en el cuerpo de la peticioacuten y el tamantildeo de la informacioacuten enviada no esta

limitado

Seguacuten lo expuesto escoger el meacutetodo para enviar la informacioacuten no es difiacutecil Si los datos

son pocos y no importa su confidencialidad o manipulacioacuten utilizamos GET Si son largos

privados o importantes utilizamos POST

318 ACCESO A BASES DE DATOS CON SERVLETS

Una aplicacioacuten Java que realiza accesos a bases de datos funciona seguacuten una arquitectura que

permite escribir los programas abstrayeacutendose de los detalles de los niveles inferiores (discos

controladores sistema operativo etc) como lo muestra la figura siguiente

JDBC (Java DataBase Connectivity ndash Conexioacuten con Bases de Datos desde Java) es una API

de Java que permite ejecutar instrucciones SQL para manipular y gestionar bases de datos

relacionales Para que una aplicacioacuten Java pueda hacer operaciones sobre una base de datos

previamente tiene que establecer una conexioacuten con la misma Esta conexioacuten se realiza a

traveacutes de un controlador (driver) seguacuten la figura de arriba La API-JDBC se proporciona en

dos paquetes javasql y javaxsql El primer paquete contiene las interfaces y clases Java

fundamentales de JDBC en tanto que el segundo paquete es una extensioacuten del primero e

APLICACION

SISTEMA OPERATIVO

CONTROLADOR

Oracle Access MySql

JVM

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

incluye las clases que interactuacutean con JNDI y otras que gestionan conjuntos de conexiones

con una misma base de datos Para maacutes detalles del uso de JDBC veacutease el apeacutendice A de

estas notas

El primer paso para crear una conexioacuten entre una aplicacioacuten Java y una base de datos es

registrar el controlador JDBC adecuado para esa base con el fin de que la JVM pueda

utilizarlo Existen distintos tipos de controladores JDBC por ejemplo

ldquocommysqljdbcDriverrdquo que es el controlador utilizado cuando el motor de base de datos

que se utiliza es MySql

En el supuesto caso de que la base de datos soacutelo permitiera el acceso a traveacutes de controladores

ODBC como lo hace ACCESS siempre podemos usar el controlador puente JDBC-ODBC

incluido como parte del JDK ldquosunjdbcodbcJdbcOdbcDriverrdquo Este tipo de controladores

es decir los basados en ODBC (Open DataBase Connectivity) son bastante utilizados en

entornos Windows pues este SO incluye ODBC El apeacutendice A describe al final como

administrar los oriacutegenes de datos ODBC en Windows

Asiacute pues la mayor ventaja de los servlets con respecto a la conexioacuten con bases de datos viacutea

JDBC es que su ciclo de vida les permite mantener conexiones abiertas con las mismas a lo

largo de toda una sesioacuten Esto permite recortar tiempo con respecto a otras tecnologiacuteas como

la CGI Ademaacutes JDBC es una tecnologiacutea independiente de las bases de datos

Como ejemplo vamos a implementar una simple aplicacioacuten Web basada en servlets que

muestre una especie de directorio de personas La aplicacioacuten podraacute consultar insertar

modificar borrar o listar la informacioacuten de cada una de las personas almacenadas en la base

de datos a la que se hace acceso (que estaraacute en formato access)

La estructura de la Base de Datos es una tabla con los siguientes campos

DNI Nombre Apellido Edad

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

53023767A Pedro Rubio 18

77459822P Luis Tejedor 47

123456MRL Mario Rossainz 35

La estructura de la aplicacioacuten se muestra en la figura siguiente

lthtmlgt

ltbodygt

lttable border=1gtlttrgtlttdgt

ltform action=httplocalhost8080directorioTelservletSvAccesoBD

method=getgt

DNI ltinput type=text name=DNIgt ltbrgt

Nombre ltinput type=text name=Nombregt ltbrgt

Apellido ltinput type=text name=Apellidogt ltbrgt

Edad ltinput type=text name=Edadgt ltbrgtltbrgt

ltinput type=submit value=Consultar name=BotonConsultargt

ltinput type=submit value=Insertar name=BotonInsertargt

ltinput type=submit value=Modificar name=BotonModificargt

ltinput type=submit value=Borrar name=BotonBorrargt

ltinput type=submit value=Listar name=BotonListargt ltbrgt

ltcentergt

ltinput type=submit value= |lt name=BotonPrimerogt

ltinput type=submit value= -- name=BotonMenosCincogt

ltinput type=submit value= - name=BotonAnteriorgt

ltinput type=submit value= + name=BotonSiguientegt

ltinput type=submit value= ++ name=BotonMasCincogt

ltinput type=submit value= gt| name=BotonUltimogt

ltcentergt

lttdgt

lttdgt

lttextarea name=AreaDeListado rows=10 cols=35gtlttextareagt

SvAccesoBDhtml

SvAccesoBD

ObBorrado ObListado ObConsulta

ObInsercion

ObModificacion

ObPosicionamiento

ObRegistro

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lttdgt

lttrgt

ltformgt

lttablegt

ltbodygt

lthtmlgt

SvAccesoBDhtml

import javaio

import javaxservlet

import javaxservlethttp

public class SvAccesoBD extends HttpServlet

private int PosicionBuscada = 1

private String AreaDeListado=

PrintWriter out

public void doGet(HttpServletRequest request HttpServletResponse response)

throws IOException ServletException

String DNI = requestgetParameter(DNI)

String Nombre = requestgetParameter(Nombre)

String Apellido = requestgetParameter(Apellido)

String Edad = requestgetParameter(Edad)

String BotonConsultar = requestgetParameter(BotonConsultar)

String BotonInsertar = requestgetParameter(BotonInsertar)

String BotonModificar = requestgetParameter(BotonModificar)

String BotonBorrar = requestgetParameter(BotonBorrar)

String BotonListar = requestgetParameter(BotonListar)

String BotonPrimero = requestgetParameter(BotonPrimero)

String BotonMenosCinco = requestgetParameter(BotonMenosCinco)

String BotonAnterior = requestgetParameter(BotonAnterior)

String BotonSiguiente = requestgetParameter(BotonSiguiente)

String BotonMasCinco = requestgetParameter(BotonMasCinco)

String BotonUltimo = requestgetParameter(BotonUltimo)

AreaDeListado = requestgetParameter(AreaDeListado)

responsesetContentType(texthtml)

out = responsegetWriter()

outprintln(lthtmlgt)

outprintln(ltbodygt)

if (BotonConsultar=null) ConsultarDatos(DNI)

if (BotonInsertar=null) InsertarDatos(DNINombreApellidoEdad)

if (BotonModificar=null) ModificarDatos(DNINombreApellidoEdad)

if (BotonBorrar=null) BorrarDatos(DNI)

if (BotonListar=null) ListarDatos(DNI)

if (BotonPrimero=null) Controles(1)

if (BotonMenosCinco=null) Controles(2)

if (BotonAnterior=null) Controles(3)

if (BotonSiguiente=null) Controles(4)

if (BotonMasCinco=null) Controles(5)

if (BotonUltimo=null) Controles(0)

outprintln(ltbodygt)

outprintln(lthtmlgt)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

private void ConsultarDatos(String DNI)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObRegistro InstanciaFila = InstanciaConsultaDameDatos()

GenerarRespuesta(InstanciaFilaDameDNI()InstanciaFilaDameNombre()

InstanciaFilaDameApellido()

StringvalueOf(InstanciaFilaDameEdad()))

else

GenerarRespuesta(DNI------------)

PosicionBuscada = 1

public void ListarDatos(String DNI)

ObListado InstanciaListado = new ObListado()

AreaDeListado = InstanciaListadoDameResultado()

ConsultarDatos(DNI)

PosicionBuscada = 1

public void BorrarDatos(String DNI)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObBorrado InstanciaBorrado = new ObBorrado(PosicionBuscada)

GenerarRespuesta()

else

GenerarRespuesta(----------------)

PosicionBuscada = 1

public void ModificarDatos(String DNI String Nombre String Apellido

String Edad)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObRegistro InstanciaFila = new ObRegistro(DNI Nombre Apellido

IntegerparseInt(Edad))

ObModificacion InstanciaModificacion = new ObModificacion(PosicionBuscada

InstanciaFila)

GenerarRespuesta(DNINombreApellidoEdad)

else

GenerarRespuesta(----------------)

PosicionBuscada = 1

public void InsertarDatos(String DNI String Nombre String Apellido

String Edad)

ObRegistro InstanciaFila = new ObRegistro(DNI Nombre Apellido

IntegerparseInt(Edad))

ObInserccion InstanciaInserccion = new ObInserccion(InstanciaFila)

GenerarRespuesta()

PosicionBuscada=1

public void Controles(String Identificador)

ObPosicionamiento InstanciaPosicionamiento =

new ObPosicionamiento(IdentificadorPosicionBuscada)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ObRegistro InstanciaFila = InstanciaPosicionamientoDameDatos()

GenerarRespuesta(InstanciaFilaDameDNI()InstanciaFilaDameNombre()

InstanciaFilaDameApellido()

StringvalueOf(InstanciaFilaDameEdad()))

PosicionBuscada = InstanciaPosicionamientoPosicion()

private void GenerarRespuesta(String DNI String Nombre String Apellido

String Edad)

outprintln(lttable border=1gt)

outprintln(lttrgt)

outprintln(lttdgt)

outprintln(ltform

action=httplocalhost8080directorioTelservletSvAccesoBD

method=getgt)

outprintln( DNI ltinput type=text name=DNI value=+DNI+gtltbrgt)

outprintln( Nombre ltinput type=text name=Nombre

value=+Nombre+gtltbrgt)

outprintln( Apellido ltinput type=text name=Apellido

value=+Apellido+gtltbrgt)

outprintln( Edad ltinput type=text name=Edad

value=+Edad+gtltbrgtltbrgt)

outprintln( ltinput type=submit value=Consultar

name=BotonConsultargt)

outprintln( ltinput type=submit value=Insertar

name=BotonInsertargt)

outprintln( ltinput type=submit value=Modificar

name=BotonModificargt)

outprintln( ltinput type=submit value=Borrar name=BotonBorrargt)

outprintln( ltinput type=submit value=Listar name=BotonListargt

ltbrgt)

outprintln( ltcentergt)

outprintln( ltinput type=submit value= |lt name=BotonPrimerogt)

outprintln( ltinput type=submit value= --

name=BotonMenosCincogt)

outprintln( ltinput type=submit value= - name=BotonAnteriorgt)

outprintln( ltinput type=submit value= +

name=BotonSiguientegt)

outprintln( ltinput type=submit value= ++

name=BotonMasCincogt)

outprintln( ltinput type=submit value= gt| name=BotonUltimogt)

outprintln( ltcentergt)

outprintln( lttdgt)

outprintln( lttdgt)

outprintln( lttextarea name=AreaDeListado rows=10

cols=35gt+AreaDeListado+lttextareagt)

outprintln( lttdgt)

outprintln( lttrgt)

outprintln( ltformgt)

outprintln( lttablegt)

SvAccesoBDjava

import javasql

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

public class ObBorrado

ObBorrado(int PosicionBuscada)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

Personasabsolute(PosicionBuscada)

PersonasdeleteRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

ObBorradojava

import javasql

import javaawtTextArea

public class ObListado

private String Resultado=

ObListado()

String DNI Nombre Apellido Linea

int Edad Posicion

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement()

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

while (Personasnext())

DNI = PersonasgetString(DNI)

Nombre = PersonasgetString(Nombre)

Apellido = PersonasgetString(Apellido)

Edad = PersonasgetInt(Edad)

Posicion = PersonasgetRow()

Linea = DNI+ +Nombre+ +Apellido+ +StringvalueOf(Edad)

Resultado=Resultado+StringvalueOf(Posicion)+ +Linea+n

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public String DameResultado()

return Resultado

ObListadojava

public class ObRegistro

private String DNI Nombre Apellido

private int Edad

ObRegistro (String DNI String Nombre String Apellido int Edad)

thisDNI = DNI

thisNombre = Nombre

thisApellido = Apellido

thisEdad = Edad

String DameDNI()

return DNI

String DameNombre()

return Nombre

String DameApellido()

return Apellido

int DameEdad()

return Edad

ObRegistrojava

import javasql

public class ObConsulta

private int Posicion = 0

private ObRegistro DatosPersona

ObConsulta(String DNIPedido)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement()

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

while (Personasnext())

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

String DNI = PersonasgetString(DNI)

if (DNIequalsIgnoreCase(DNIPedido))

Posicion = PersonasgetRow()

String Nombre = PersonasgetString(Nombre)

String Apellido = PersonasgetString(Apellido)

int Edad = PersonasgetInt(Edad)

DatosPersona = new ObRegistro(DNINombreApellidoEdad)

break

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public int PosicionEncontrada()

return Posicion

public ObRegistro DameDatos()

return DatosPersona

ObConsultajava

import javasql

public class ObInserccion

ObInserccion(ObRegistro Datos)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

PersonasmoveToInsertRow()

PersonasupdateString(DNI DatosDameDNI())

PersonasupdateString(NombreDatosDameNombre())

PersonasupdateString(Apellido DatosDameApellido())

PersonasupdateInt(EdadDatosDameEdad())

PersonasinsertRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

catch (SQLException e)

Systemoutprintln(e)

ObInsercionjava

import javasql

public class ObModificacion

ObModificacion(int PosicionBuscada ObRegistro Datos)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

Personasabsolute(PosicionBuscada)

PersonasupdateString(DNIDatosDameDNI())

PersonasupdateString(NombreDatosDameNombre())

PersonasupdateString(ApellidoDatosDameApellido())

PersonasupdateInt(EdadDatosDameEdad())

PersonasupdateRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

ObModificacionjava

import javasql

public class ObPosicionamiento

private ObRegistro DatosPersona

private int Posicion

ObPosicionamiento(String Accion int Posicion)

int IDAccionEdad

String DNINombreApellido

boolean PosicionCorrecta=false

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

FROM DatosPersonales)

Personasabsolute(Posicion)

IDAccion = IntegerparseInt(Accion)

switch (IDAccion)

case 0

PosicionCorrecta = Personaslast()

break

case 1

PosicionCorrecta = Personasfirst()

break

case 2

PosicionCorrecta = Personasrelative(-5)

break

case 3

PosicionCorrecta = Personasprevious()

break

case 4

PosicionCorrecta = Personasnext()

break

case 5

PosicionCorrecta = Personasrelative(+5)

break

if (PosicionCorrecta)

thisPosicion = PersonasgetRow()

DNI = PersonasgetString(DNI)

Nombre = PersonasgetString(Nombre)

Apellido = PersonasgetString(Apellido)

Edad = PersonasgetInt(Edad)

else

thisPosicion = Posicion

DNI = ----

Nombre = ----

Apellido = ----

Edad = 0

DatosPersona = new ObRegistro(DNINombreApellidoEdad)

Personasclose()

Conexionclose()

SentenciaSQLclose()

Systemoutprintln(StringvalueOf(Posicion)++StringvalueOf(thisPosicion))

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public int Posicion()

return Posicion

public ObRegistro DameDatos() return DatosPersona

ObPosicionamientojava

En este ejemplo se emplean servlets y paacuteginas Web Los clientes habitualmente trabajan en

una computadora remota y los programas se ejecutan en un servidor El mecanismo de

comunicaciones que soporta el protocolo http nos permite consultar en el servidor los datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

que ha seleccionado o escrito el usuario de esta manera se puede observar una disociacioacuten

entre la interfaz graacutefica de usuario (que se ejecuta en los equipos de los clientes) y el

programa que recoge los datos y ejecuta las acciones pertinentes (que se ejecuta en el

servidor)

Como puede observarse el coacutedigo SvAccessoBD es un servlet que lleva a cabo las siguientes

operaciones

1 Recoge los valores provenientes del usuario

2 Determina la naturaleza de la accioacuten a realizar

3 Realiza su cometido con la base de datos

4 Genera la respuesta que recibiraacute el usuario

32 JSP

JSP significa Java Server Pages que traducido quiere decir Paacuteginas de Servidor Java y es

por tanto una tecnologiacutea orientada a crear paacuteginas Web con programacioacuten en JAVA es decir

permite mezclar HTML estaacutendar y estaacutetico con un contenido dinaacutemico etiquetas especiales

(oacuterdenes) y trozos de coacutedigo JAVA (scriptlets o secuencias de oacuterdenes) o contenido dinaacutemico

generado por servlets Eacuteste contenido dinaacutemico se encuentra encerrado en etiquetas

especiales muchas de las cuales inician con lt y finalizan con gt El motor de las paacuteginas

JSP esta basado en los servlets de JAVA

En la tecnologiacutea JSP se crean paacuteginas parecidas a las paacuteginas que se crean en ASP (Active

Server Page de Microsoft) o PHP (Personal Home Page) que son dos tecnologiacuteas de paacuteginas

ejecutadas en el servidor Sin embargo JSP no se cintildee a un sistema operativo o servidor Web

en particular ademaacutes de que proporciona acceso a la tecnologiacutea de Servlets y a JAVA en la

parte dinaacutemica

El proceso para generar paacuteginas JSP accesibles en Web es mucho maacutes simple que en los

servlets Dando por hecho que se tiene un servidor Web que permite usar JSP el coacutedigo se

almacenaraacute en archivos con extensioacuten jsp que incluyen dentro de la estructuras de etiquetas

HTML las sentencias JAVA a ejecutar y tan soacutelo se colocaraacuten en cualquier lugar en donde

se pusiera una paacutegina Web normal sin compilacioacuten sin paquetes y sin configuracioacuten aunque

el servidor tendraacute que ser configurado para acceder a los archivos de clases Servlets y de

JSPs

Aunque lo que se escriba con frecuencia luciraacute como un archivo HTML estaacutendar detraacutes de

ello la paacutegina JSP se convierte automaacuteticamente en un servlet normal donde el HTML

estaacutetico tan soacutelo es enviado al flujo de salida asociado con el meacutetodo service del servlet Esta

traduccioacuten se realiza la primera vez que se solicita la paacutegina De acuerdo como este

configurado el servidor es posible ver el coacutedigo fuente de los servlets generados a partir de

sus paacuteginas JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Por ejemplo supongamos que se ha escrito el siguiente coacutedigo en el archivo Saludojsp

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtEjemplo JSPlttitlegtltheadgt

ltbody bgcolor=ffffccgt

ltcentergt

lth2gtHola mundolth2gt

ltjavautilDate hoy = new javautilDate()gt

La fecha de hoy es lt=hoygt

ltcentergt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional y un fragmento de un scriptlet de JAVA La etiqueta

lt identifica el comienzo del scriptlet y gt el final Una expresioacuten de la forma =variable

es sustituida por el valor de esa variable Para ejecutar esta paacutegina o cualquier otra paacutegina

JSP desde un navegador hay que instalarla en el servidor de aplicaciones de la misma manera

en como se hizo con los servlets Suponiendo entonces que se tiene instalado el Tomcat 5

siga los siguientes pasos

1 Antildeadir en el servidor la carpeta digamos JSP2 dentro de la carpeta webapps del Tomcat

y construir sobre ella la jerarquiacutea de clases ya conocida de los servlets

webappsrarrJSP2rarrWEB-INFrarrclasses

WEB-INFrarrlib

WEB-INFrarrtags

2 Editar en la carpeta WEB-INF el descriptor de despliegue webxml que se indica a

continuacioacuten Este archivo XML indica doacutende se localiza el esquema XML para la

especificacioacuten Servlet 24 que a suvez utiliza el esquema XML para la especificacioacuten

Java Server Page 20 que son las especificaciones que soporta en servidor Tomcat

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=

httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

3 Crear en JSP2 la carpeta saludo que contendraacute la aplicacioacuten y copiar en ella la paacutegina

Saludojsp

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

4 Arrancar el servidor Si el servidor ya estaba arrancado detenerlo y volverlo a arrancar o

bien abrir el explorador escribir el URL httplocalhost8080managerhtml e instalar

la aplicacioacuten

5 Una vez arrancado el servidor verificar si estaacute funcionando correctamente escribiendo

el URL siguiente en el explorador httplocalhost8080 El explorador debe mostrar la

paacutegina del Tomcat

6 Ejecutar la paacutegina JSP iniciando el explorador y escribiendo el URL siguiente

httplocalhost8080JSP2saludoSaludojsp donde la sintaxis geneacuterica es

httpservidor[puerto]MiCarpetapaginajsp

Cuando esta paacutegina (Saludojsp) es invocada por primera vez el motor JSP lleva a cabo una

fase de traduccioacuten de la misma en un servlet y el motor Servlet es el que ejecutaraacute eacuteste uacuteltimo

para generar el HTML dinaacutemico que seraacute enviado al explorador cliente seguacuten puede

deducirse de la figura siguiente La proacutexima vez que la paacutegina sea solicitada el motor JSP

ejecutaraacute el servlet que fue caragado la primera vez a no ser que la paacutegina haya cambiado

en cuyo caso seraacute compilada automaacuteticamente en un nuevo servlet y ejecutada

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Regresando al ejemplo el archivo java generado por el Tomcat a partir del archivo

Saludojsp se localiza en la carpeta workCatalinalocalhost de la instalacioacuten de Tomcat

321 ELEMENTOS PARA SECUENCIAS DE COMANDOS

Los elementos para secuencias de comandos permiten insertar coacutedigo en el servlet que seraacute

generado a partir de la paacutegina JSP Existen tres formas

1 Expresiones del tipo lt= expresioacuten gt que se evaluacutean e insertan en el resultado del

servlet

2 Los scriptlets del tipo lt codigo gt que se insertan en el meacutetodo _jspService del

servlet (ejecutado por service)

3 Las declaraciones del tipo lt Codigo gt que se insertan en el cuerpo de la clase del

servlet fuera de cualquier meacutetodo existente

NOTA Los comentarios en JSP se escriben lt-- Comentario JSP --gt en tanto que los

comentarios en HTML son de la forma lt--Comentario HTML --gt La diferencia

semaacutentica radica en que los comentarios HTML cuando se insertan en la respuesta enviada

por el servidor al cliente no se muestran cuando se visualiza el documento HTML pero si

Servidor Maacutequina Cliente

Explorador Web

Contenedor Web

Motor Servlet

Motor JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

los podemos ver cuando se visualiza el coacutedigo fuente en tanto que los comentarios JSP

aunque se inserten en la respuesta enviada por el servidor al cliente no son enviados al

explorador de forma que tampoco se muestran ni se ven cuando se visualiza el coacutedigo fuente

HTML desde el explorador

3211 EXPRESIONES

Se utiliza una expresioacuten JSP para insertar valores directamente en el resultado La sintaxis es

lt= expresioacuten gt Por ejemplo

lt= requestgetParameter(ldquoparNombre) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt lt= s gt

La fecha y hora actual es lt= new javautilDate() gt

La expresioacuten se evaluacutea se convierte a cadena y se inserta en la paacutegina Esta evaluacioacuten se

realiza durante la ejecucioacuten

32111 VARIABLES PREDEFINIDAS

Para simplificar estas expresiones se pueden utilizar cierta cantidad de variables

predefinidas Estos objetos impliacutecitos como tambieacuten se les llama estaacuten disponibles para su

uso durante la implementacioacuten de una paacutegina Web

bull pageContext Es un objeto de la clase PageContext que proporciona acceso a objetos

relacionados con los servlets

bull request Es un objeto de la clase HttpServletRequest que se puede obtener a traveacutes del

meacutetodo getRequest que encapsula los datos enviados por el cliente al servidor

bull response Es un objeto de la clase HttpServletResponse que puede obtenerse a traveacutes

del meacutetodo getResponse que encapsula los datos que el servidor enviaraacute al cliente

bull application Es un objeto de la clase ServletContext que se obtiene a traveacutes del meacutetodo

getServletContext que define un conjunto de meacutetodos que todo servlet utiliza para

comunicar con el contenedor de servlets

bull config Es un objeto de la clase ServletConfig que se obtiene a traveacutes del meacutetodo

getServletConfig y que se utiliza por el contenedor de servlets para pasar informacioacuten

al servlet durante la iniciacioacuten

bull session Es un objeto de la clase HttpSession que se obtiene a traveacutes del meacutetodo

getSession que proporciona una forma de identificar a un usuario que visita las paacuteginas

de un sitio Web

bull out Es un objeto de la clase JspWriter que se obtiene a traveacutes del meacutetodo getOut que

se utiliza para almacenar la respuesta que seraacute enviada al cliente que hizo la peticioacuten de

la paacutegina

bull page Es un objeto geneacuterico de la clase Object que se obtiene a traveacutes del meacutetodo

getPage y que representa al servlet obtenido a partir de la paacutegina JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

bull exception Es un objeto de la clase Exception que se obtiene a traveacutes del meacutetodo

getException que contendraacute informacioacuten a cerca de cualquier excepcioacuten que se lance

desde la paacutegina JSP

Un ejemplo del uso de uno de estos objetos impliacutecitos seriacutea el siguiente

El nombre de tu host es lt= requestgetRemoteHost() gt

El listado siguiente da un ejemplo de una paacutegina JSP que utiliza algunas variables

predefinidas como uso de expresiones JSP

ltDOCTYPE HTML PUBLIC -W3CDTD HTML 40 Transitional ENgt

lthtmlgt

ltheadgt

lttitlegt Expresiones JSP lttitlegt

ltheadgt

ltbodygt

lth2gt Expresiones JSP lth2gt

ltULgt

ltligt Fecha y hora en curso lt= new javautilDate() gt ltligt

ltligt Nombre de su host lt= requestgetRemoteHost() gt ltligt

ltligt Identificador de su sesioacuten lt= sessiongetId() gt ltligt

ltligt El paraacutemetro ltcodegt paramPrueba ltcodegt del formulario

lt= requestgetParameter(paramPrueba) gt ltligt

ltULgt

ltbodygt

lthtmlgt

Cuya salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3212 LOS SCRIPTLETS JSP

Si se desea hacer algo maacutes complejo que una simple expresioacuten los scriptlets permiten insertar

coacutedigo JAVA en el meacutetodo _jspService del servlet (que es ejecutado por service) La sintaxis

utilizada por los scriptlets es lt coacutedigo java gt Los escriptlets tienen acceso a las

mismas variables definidas de forma automaacutetica como expresiones A manera de ejemplo si

se desea que el resultado aparezca en la paacutegina generada deberiacutea de utilizarse la variable out

como en la siguiente instruccioacuten

lt String datosConsultados= requestgetQueryString()

outprintln(ldquoDatos GET adjuntos ldquo+datosConsultados)

gt

En este ejemplo podriacutea haberse obtenido el mismo resultado utilizando la siguiente expresioacuten

JSP

Datos GET adjuntos lt=requestgetQueryString() gt

En general los scriptlets pueden ejecutar varias tareas que no podriacutean realizarse con las

expresiones Tales tareas incluyen

bull La determinacioacuten de encabezados de respuesta

bull Actualizacioacuten de Bases de Datos

bull Ejecucioacuten de bucles condiciones y otras estructuras complejas

lt for (int i=1 ilt=6 i++)

gt

lth lt=i gtgt Hola Mundo lthlt=i gtgt

lt gt

Como un ejemplo concreto se muestra la siguiente paacutegina JSP llamada Cuentajsp en donde

se observa coacutemo se hace un seguimiento del nuacutemero de veces que un cliente accede a esta

paacutegina a traveacutes de distintas sesiones Para ello supondremos que dicha cuenta es el valor del

atributo atrCuenta del objeto impliacutecito application ya citado La primera vez que el cliente

accede a la paacutegina el valor de atrCuenta seraacute null debido a que auacuten no ha sido fijado este

atributo en este caso se fijaraacute con el valor 1 En los siguientes accesos se leeraacute el valor del

atributo atrCuenta se incrementaraacute en una unidad y se volveraacute a fijar Finalmente se enviacutea

la respuesta al cliente para que se muestre al usuario el valor del contador

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en el objeto impliacutecito application con el nombre

atrCuenta

--gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt

Integer cuenta = (Integer)applicationgetAttribute(atrCuenta)

String s = vez

if (cuenta == null)

cuenta = new Integer(1)

else

cuenta = new Integer(cuentaintValue() + 1)

s = veces

applicationsetAttribute(atrCuenta cuenta)

gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

Has visitado esta paacutegina lt= cuenta gt lt= s gt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional un fragmento de coacutedigo JAVA o scriptlet

expresiones y comentarioshellip

Aquiacute otro ejemplo de la ejecucioacuten de un coacutedigo demasiado complejo para una expresioacuten JSP

Este listado presenta una paacutegina JSP que utiliza el paraacutemetro de peticioacuten colorFondo para

establecer el color de fondo de la paacutegina

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgt

lttitlegt Prueba de Color lttitlegt

ltheadgt

lt

String colorFondo=requestgetParameter(colorFondo)

boolean tieneColorExplicito

if (colorFondo =null)

tieneColorExplicito=true

else

tieneColorExplicito=false

colorFondo=WHITE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt

ltbody bgcolor=lt= colorFondo gtgt

lth2 align=centergt Prueba de color lth2gt

lt

if (tieneColorExplicito)

outprintln(Ha indicado un color de fondo expliacutecito +

colorFondo +)

else

outprintln(Usareacute el color de fondo predeterminado WHITE +

Indique el atributo de peticioacuten

ltigtcolorFondoltigt+

para intentar un color estaacutendar un +

valor RRGGBB o para ver si el navegador Web +

permite el uso de nombres de color X11)

gt

ltbodygt

lthtmlgt

Cuyas posibles salidas son

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3213 DECLARACIONES JSP

Una declaracioacuten JSP permite definir meacutetodos o campos que seraacuten insertados en el cuerpo

principal de la clase del servlet (fuera del meacutetodo _jspService) Una declaracioacuten tiene la

sintaxis lt Coacutedigo Java gt Por ejemplo

lt int i=0 gt

lt

Public void jspinit()

coacutedigo de iniciacioacuten

gt

Una declaracioacuten no genera ninguacuten resultado y se usan junto con las expresiones JSP o los

scriptlets A continuacioacuten se muestra una paacutegina JSP que despliega la cantidad de veces que

se ha solicitado esta paacutegina desde que se arrancoacute el servidor haciendo uso de las

declaraciones JSP

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtDeclaraciones JSPlttitlegtltheadgt

ltbodygt

lth1gtDeclaraciones JSPlth1gt

lt-- Esto es un comentario en JSP --gt

lt private int recuentoAccesos=0 gt

lth2gt Accesos a la paacutegina desde el reinicio del servidor

lt= ++recuentoAccesos gt lth2gt

ltbodygt

lthtmlgt

La salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

322 EL LENGUAJE DE EXPRESION EN JSP 20

Anteriormente se ha visto la necesidad de utilizar fragmentos de coacutedigo java en el desarrollo

de paacuteginas JSP pero con la aparicioacuten de la especificacioacuten JSP 20 ya no hay necesidad de

utilizar fragmentos de coacutedigo Java para nada gracias al nuevo lenguaje de expresioacuten EL

(Expresioacuten Language) a la biblioteca de etiquetas estandar JSTL (JSP Standar Tag Library)

y a las nuevas formas para desarrollar etiquetas personalizadas

El lenguaje de expresioacuten JSP es maacutes un lenguaje de acceso a datos que un lenguaje de

programacioacuten Ya se ha visto que para pasar informacioacuten de un cliente a una paacutegina JSP se

utilizan paraacutemetros en la peticioacuten y atributos en la paacutegina El lenguaje de expresioacuten lo hace

posible sin tener que utilizar scriptlets o expresiones (lt= expresioacuten gt) Por ejemplo las

liacuteneas JSP 12 siguientes escritas utilizando coacutedigo Java

lt= requestgetParameter(ldquoparNombrerdquo) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt veces

bajo la especificacioacuten JSP 20 se pueden escribir de una forma maacutes sencilla como sigue

(ahora no se trata de coacutedigo JAVA)

$paramparNombre has visitado esta paacutegina

$atrCuenta veces

La sintaxis de JSP es sensible a mayuacutesculas y minuacutesculas pero un par de comillas simples es

equivalente a un par de comillas dobles

3221 VARIABLES PREDEFINIDAS (Objetos Impliacutecitos)

El lenguaje de expresioacuten JSP 20 soporta los objetos impliacutecitos siguientes

pageContext Objeto de javaxservletjspPageContext que proporciona acceso a los

datos de una peticioacuten

param Coleccioacuten (objeto de tipo javautilMap) de todos los valores de los paraacutemetros

enviados en una peticioacuten un String por paraacutemetro

paramValues Coleccioacuten de todos los valores de los paraacutemetros enviados en una

peticioacuten una matriz de tipo String por paraacutemetro

header Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten un

String por cabecera

headerValues Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten

una matriz de tipo String por cabecera

cookie Coleccioacuten de todos los valores de las cookies un objeto javaxservlethttpCookie

por cookie

initParam Coleccioacuten de todos los valores de los paraacutemetros de iniciacioacuten de la

aplicacioacuten un String por paraacutemetro

Tambieacuten hay objetos que permiten acceder a variables definidas en diferentes aacutembitos lo que

posibilita compartir informacioacuten

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

pageScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de paacutegina

requestScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

peticioacuten

sessionScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de sesioacuten

applicationScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

aplicacioacuten

3222 DIRECTRICES

Las directrices page incluye y taglib son mensajes para el motor JSP y son siempre incluidas

entre los siacutembolos lt y gt

32221 LA DIRECTRIZ PAGE

Define atributos que se aplican a toda la paacutegina JSP donde es incluida

lt page lista_de_atributos gt

Donde la lista_de_atributos puede contener algunos de los siguientes (aquellos que estaacuten

escritos en negrita son los tomados por omisioacuten)

language= ldquoscriptingLanguagerdquo

extends= rdquoclassNamerdquo

import= ldquoimportListrdquo

session= ldquotrue|falserdquo

buffer= ldquonone|sizeKb

autoflush= ldquotrue|falserdquo

isThreadSafe= rdquotrue|falserdquo

info= rdquoinfo_textrdquo

errorPage= ldquoerror_urlrdquo

isErrorPage= rdquotrue|falserdquo

contentType= rdquoctinfordquo

pageEncoding= rdquopeinfordquo

isELIgnored= ldquotrue|falserdquo

Tiacutepicamente se localiza al principio de la paacutegina JSP y puede haber cualquier nuacutemero de

ellas El lenguaje por omisioacuten es Java Ejemplos

lt page contentType=rdquotexthtmlrdquo language=rdquojavardquo gt

lt page import=rdquojavautil javalangrdquo gt

lt page buffer=rdquo5kbrdquo autoflush=rdquofalserdquo gt

32222 LA DIRECTRIZ INCLUDE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

La directriz include incluye un archivo (html jsp xml o de texto) en una paacutegina JSP Esto

permite dividir el contenido de la paacutegina en trozos maacutes manejables

lt incluye file=rdquoURL_relativordquo gt

El ejemplo siguiente muestra dos archivos el primero incluye al segundo para mostrar la

fecha y hora actuales

lt-- fichero mostrarFechaHorajsp --gt

lthtmlgt

ltheadgtlttitlegtIncluir un ficherolttitlegtltheadgt

ltbody bgcolor=whitegt

ltfont color=bluegt

La fecha y hora actuales son

lt include file=fechaHorajsp gt

ltfontgt

ltbodygt

lthtmlgt

lt-- fichero fechaHorajsp --gt

lt page import=javautil gt

lt= (new javautilDate())toLocaleString() gt

32223 LA DIRECTRIZ TAGLIB

La directriz taglib indica la biblioteca de acciones personalizadas que podremos utilizar en

la codificacioacuten de la paacutegina JSP Para distinguir esas acciones entre otras existentes se utiliza

un prefijo (prefix) Su sintaxis es

lt taglib (uri=rdquoURI_bibliotecardquo|tagdir=rdquoDir_biblioteca_tagrdquo)

prefix=rdquoprefijordquo gt

Cuando se trata de una biblioteca definida mediante una clase Java y un descriptor (archivo

tld) eacutesta se identifica mediante un URI (Uniform Resource Identifier- URL relativos) Por

ejemplo

lt taglib uri=rdquohttpMarioRossainzLopezmiBibliotecardquo

prefix=rdquofunrdquo gt

ltpgtltfunaccion01 gt

La uacuteltima liacutenea del ejemplo tiene dos etiquetas una etiqueta p HTML y otra accion01

perteneciente a la biblioteca miBiblioteca En cambio si la biblioteca se define mediante un

archivo tag entonces se identifica mediante su ruta relativa en el sistema de archivos

lt taglib tagdir=rdquoWEB-INFtagsrdquo prefix=rdquofunrdquo gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpgtltfunaccion01 gt

La directriz taglib debe colocarse antes de utilizar en la paacutegina JSP las acciones

personalizadas definidas por la misma Se puede utilizar maacutes de una directriz pero el prefijo

utilizado debe ser uacutenico para cada una de ellas

3223 ACTIVACION DEL LENGUAJE DE EXPRESION (LE)

La especificacioacuten JSP 20 define un lenguaje de expresioacuten como alternativa a elementos de

programacioacuten escritos con coacutedigo Java y especificaciones anteriores a la JSP 20 Para que

este lenguaje pueda ser interpretado tienen que cumplirse 2 requisitos

1 Que la propiedad isELIgnored de la directriz page valga false

lt page isELIgnored= ldquofalserdquo gt

2 Que el descriptor de despliegue webxml en la carpeta WEB-INF indique doacutende se

localiza el esquema XML para la especificacioacuten Servlet 24 que a su vez utiliza el

esquema XML para la especificacioacuten Java Server Page 20

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

Utilizando el lenguaje de expresioacuten se podriacutea modificar la paacutegina Cuentajsp de la seccioacuten

3212 de este documento como se muestra a continuacioacuten Esta nueva paacutegina

1 Especifica que utilizaraacute la biblioteca core de etiquetas estandar (de la que se hablaraacute maacutes

adelante)

2 La primera vez que sea accedida definiraacute la variable atrCuenta en el aacutembito de la

aplicacioacuten con un valor inicial nulo y la incrementaraacute en una unidad cuando sea accedida

sucesivas veces simplemente incrementaraacute esta variable en una unidad

3 Finalmente mostraraacute una paacutegina con un contenido anaacutelogo al siguiente Esta formado

por una cabecera y una segunda liacutenea compuesta por el valor del paraacutemetro parNombre

enviado con la peticioacuten un texto fijo el valor de la variable atrCuenta y otro texto fijo

dependiente del valor de esta variable

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

El coacutedigo completo es el siguiente

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

3224 VARIABLES Y EXPRESIONES

Para acceder a una simple variable se puede escribir algo como lo siguiente $nombre y

para acceder a una propiedad de un objeto podemos escribir algo como

$paramparNombre

$applicationScopeatrCuenta

$pageContextrequestrequestURI

La primera liacutenea del ejemplo anterior obtiene el valor de la propiedad parNombre del objeto

param la segunda el valor del atributo atrCuenta del objeto applicationScope y la tercera

el URL relativo de la paacutegina JSP solicitada

El lenguaje de expresioacuten es maacutes tolerante con respecto a las variables con valor null y ejecuta

muchas maacutes conversiones de forma automaacutetica sobre el tipo de los datos cuando la expresioacuten

a evaluar asiacute lo requiere Por ejemplo la etiqueta condicional siguiente incluye una expresioacuten

que compara el valor del atributo atrCuenta con aacutembito de aplicacioacuten con 10 (convirtiendo

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

impliacutecitamente el valor del atributo al tipo de la constante para poder realizar la comparacioacuten

El resultado seraacute un valor de tipo boolean

ltcif test=rdquo$applicationScopeatrCuenta gt 10rdquogt

ltcifgt

o bien

ltcif test=rdquo$atrCuenta gt 10rdquogt

ltcifgt

Para que una literal pueda incluir un caracter significativo para el lenguaje dicho caracter

debe ser especificado como una secuencia de escape (caracter) Por ejemplo la siguiente

expresioacuten da lugar al literal ldquovezrdquo o ldquovecesrdquo entre comillas dobles

$(atrCuenta gt 1) iquest ldquordquovecesrdquordquo ldquordquovezrdquordquo

Cualquier objeto o atributo de un objeto definido en algunos de los aacutembitos de una paacutegina

puede ser utilizado como una variable Por ejemplo $atrCuenta+1 es una expresioacuten que

realiza la suma de la variable atrCuenta con 1

Cuando se trate de una propiedad de un objeto para acceder a ella se utilizaraacute el operador

punto o bien la notacioacuten empleada para acceder a un elemento de una matriz Por ejemplo

$paramparNombre

$param[ldquoparNombrerdquo]

Una expresioacuten LE puede aparecer en cualquier lugar donde pueda aparecer un texto fijo Por

tanto para informar al contenedor JSP que se trata de una expresioacuten y no de un texto fijo se

utilizan los delimitadores $ al principio y al final

3225 OPERADORES

OPERADOR DESCRIPCIOacuteN Acceso a la propiedad de un objeto o a un elemento de un Map

[] Acceso al elemento de una matriz o de un objeto List

() Pareacutentesis para alterar la prioridad en la evaluacioacuten de una expresioacuten

If ternario condicion expresion1 expresioacuten 2

+ Suma

- Resta

Producto

oacute div Divisioacuten

oacute mod Moacutedulo o resto de una divisioacuten

== oacute eq Igualdad

= oacute ne Diferente

lt oacute lt Menor que

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt oacute gt Mayor que

lt= oacute le Menor o igual que

gt= oacute ge Mayor o igual que

ampamp oacute and Operacioacuten Loacutegica AND

|| oacute or Operacioacuten Loacutegica OR

oacute not Operacioacuten Loacutegica NOT

empty Verifica si el valor de una variable es null si un String esta vaciacuteo o si una matriz Map

o Collection no tienen elementos

func(args) Llamada a una funcioacuten donde func es el nombre de la funcioacuten y arg representa cero o

maacutes argumentos separados por comas

El ejemplo siguiente muestra una paacutegina JSP compuesta por elementos HTML expresiones

LE y objetos impliacutecitos

lthtmlgt

ltheadgtlttitlegtJSP 20lttitlegtltheadgt

ltbodygt

lth3gtLenguaje de expresioacuten (LE)lth3gt

ltpgtLa siguiente tabla ilustra algunas expresiones LE

ltbrgtltbrgtlttable border=1gt

lttrgt

ltthgtltbgtExpresioacutenltbgtltthgt

ltthgtltbgtValorltbgtltthgt

lttrgt

lttrgt

lttdgt$3 + 6lttdgt

lttdgt$3 + 6lttdgt

lttdgt

lttrgt

lttdgt$(7 gt 4) 7 4lttdgt

lttdgt$(7 gt 4) 7 4lttdgt

lttrgt

lttrgt

lttdgt$header[host]lttdgt

lttdgt$header[host]lttdgt

lttrgt

lttablegt

ltbodygt

lthtmlgt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

323 BIBLIOTECA ESTANDAR DE ETIQUETAS

La biblioteca estaacutendar de etiquetas JSP (JSTL ndash Java Server Page Estaacutendar Tag Library)

incluye una cantidad amplia de etiquetas para diferentes aacutereas de trabajo

Aacuterea baacutesica (su prefijo es c ndash core) y contiene

o Soporte de variables (remove y set)

o Control del flujo (choose when otherwise forEach forTokens if)

o Manejo de URL (import param redirect param y url param)

o Operaciones varias (match y out)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlcore

Aacuterea XML (su prefijo es x) y contiene

o Sentencias baacutesicas (out parse y set)

o Control del flujo (choosehellip whenhellip otherwise forEach e if)

o Transformacioacuten de Documentos (transformhellipparam)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlxml

Aacuterea Internacionalizacioacuten (su prefijo es fmt) Contiene

o Localidad (setLocale y requestEncoding)

o Mensajes (bundle message param y setBundle)

o Formateo de Fechas y nuacutemeros (formatNumber formateacuteate parseDate

parseNumber setTimeZone timeZone)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlfmt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Aacuterea SQL (su prefijo es sql) es el lenguaje estandar para interactuar con bases de datos

relacionales y contiene setDataSource Quero dateParam param transaction y

update dateParam param) El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlsql

Aacuterea Funciones (su prefijo es fn) y contiene

o Longitud de una coleccioacuten (length)

o Manipulacioacuten de String (toUpperCase toLowerCase substring

substringAfter substringBefore trim replace indexOf startsWith

endsWith contains containsIgnoreCase split join y escapeXml)

o El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlfunctions

3231 OPERACIONES CON ETIQUETAS BAacuteSICAS

En un ejemplo pasado teniacuteamos el siguiente coacutedigo

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

En este ejemplo se hace referencia al aacuterea baacutesica de JSTL con el prefijo c y se utiliza la

etiqueta cset para definir la variable atrCuenta Si la variable ya esta definida simplemente

se le asigna el valor especificado

La uacuteltima parte del ejemplo anterior podriacutea haberse escrito de esta otra forma

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcif test=rdquo$atrCuenta gt 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcifgt

$atrCuenta $str

La etiqueta cif permite la ejecucioacuten condicional de su cuerpo en funcioacuten del valor del

atributo de test

La etiqueta cchoose permite la ejecucioacuten del cuerpo de la primera etiqueta cwhen cuyo

atributo test sea evaluado a true Si ninguna de las condiciones se evaluacutea a true entonces se

evaluacutea el cuerpo de la etiqueta cotherwise si estaacute presente El siguiente coacutedigo muestra otra

manera de escribir el ejemplo anterior utilizando estas uacuteltimas etiquetas

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcchoosegt

ltcwhen test=rdquo$atrCuenta == 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcwhengt

ltcotherwisegt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcotherwisegt

ltcchoosegt

$atrCuenta $str

La etiqueta cforEach permite iterar sobre una coleccioacuten de objetos La coleccioacuten se

especifica por medio del atributo iacutetems y el elemento actual de la coleccioacuten estaacute disponible a

traveacutes de la variable establecida por el atributo var Por ejemplo el siguiente fragmento de

coacutedigo visualiza una tabla con las variables definidas a nivel de aacutembito de paacutegina

lttable border=rdquo1rdquogt

ltcforEach var=rdquoitemrdquo iacutetems=rdquo$pageScoperdquogt

lttrgt

lttdgt $item lttdgt

lttrgt

ltcforEachgt

lttablegt

La etiqueta ccatch atrapa una excepcioacuten que ocurra en el cuerpo de la misma Por ejemplo

el siguiente segmento de coacutedigo lanzaraacute una excepcioacuten si el paraacutemetro mes se escribe con

letras en vez de con nuacutemeros

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltbodygt

lthtmlgt

Un URL anaacutelogo al siguiente daraacute lugar a que la excepcioacuten sea lanzada cuando se ejecute la

expresioacuten $nMes 3 de la paacutegina anterior

httplocalhost8080JSP2exceppruebajspmes=marzo

La excepcioacuten indica que ha ocurrido un error al tratar de convertir ldquomarzordquo a un entero de

tipo Long Para cachar esta excepcioacuten y darle un tratamiento adecuado habraacute que modificar

la paacutegina JSP anterior como se indica a continuacioacuten

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltccatch var=rdquoerrorOcurridordquogt

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltccatchgt

ltcif test=rdquo$not empty errorOcurridordquogt

Error el paraacutemetro mes debe ser un nuacutemero ltbgt

ltbrgt Informacioacuten del error dada por el sistema

ltbrgt ltfont color=rdquoFF0000rdquogt $errorOcurrido ltfontgt

ltcifgt

ltbodygt

lthtmlgt

3232 ACCESO A BASES DE DATOS CON JSP

Las etiquetas que proporciona el aacuterea SQL permiten realizar

Conexioacuten con una base de datos

Realizacioacuten de consultas a la base de datos

Acceso al conjunto de resultados

Ejecucioacuten de actualizaciones y transacciones

Todas las etiquetas SQL actuacutean sobre una base de datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

32321 CONEXIOacuteN CON LA BASE DE DATOS

La conexioacuten con la base de datos puede realizarse con la etiqueta sqlsetDataSource Por

ejemplo si se esta utilizando el administrador de bases de datos MySql con el controlador

JDBC se puede realizar una conexioacuten con una base de datos digamos bd_tutorias de la

manera siguiente

ltsqlsetDataSource var=rdquobdrdquo

driver=rdquocommysqljdbcDriverrdquo

url=rdquojdbcmysqllocalhost3306bd_tutoriasrdquo

user=rdquoadminrdquo

password=rdquoadminadminrdquo gt

32322 CONSULTA A LA BASE DE DATOS

La etiqueta sqlQuero permite realizar una consulta a una base de datos Por ejemplo el

siguiente fragmento de coacutedigo realiza una consulta a la base de datos representada por bd y

obtiene un conjunto de resultados representado por cdr

ltsqlquery var=rdquocdrrdquo dataSource=rdquo$bdrdquogt

SELECT professor dia hora alumno

FROM profesores tutorias citas

WHERE profesoresid_profesor=tutoriasid_profesor

AND tutoriasid_tutoria=citasid_tutoria

ltsqlquerygt

32323 MODIFICACIONES SOBRE LA BASE DE DATOS

La etiqueta sqlupdate permite ejecutar una sentencia SQL INSERT UPDATE o DELETE

y cualquier otra sentencia SQL que no retorne ninguacuten valor Por ejemplo

ltsqlupdate var=rdquocontrdquo dataSource=rdquo$bdrdquo gt

UPDATE profesores

SET profesor=

WHERE profesor=

ltsqlparam value=rdquo$paramProfesorrdquo gt

ltsqlparam value=rdquo$paramIDrdquo gt

ltsqlupdategt

Una operacioacuten UPDATE puede utilizar el siacutembolo para indicar que el valor que tendriacutea que

evaluarse en esa posicioacuten seraacute suministrado por una etiqueta sqlparam como por ejemplo

httplocalhost8080JSP2sqlpruebajspProfesor=Mario+Rossainz+LopezampID=514

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

incluye las clases que interactuacutean con JNDI y otras que gestionan conjuntos de conexiones

con una misma base de datos Para maacutes detalles del uso de JDBC veacutease el apeacutendice A de

estas notas

El primer paso para crear una conexioacuten entre una aplicacioacuten Java y una base de datos es

registrar el controlador JDBC adecuado para esa base con el fin de que la JVM pueda

utilizarlo Existen distintos tipos de controladores JDBC por ejemplo

ldquocommysqljdbcDriverrdquo que es el controlador utilizado cuando el motor de base de datos

que se utiliza es MySql

En el supuesto caso de que la base de datos soacutelo permitiera el acceso a traveacutes de controladores

ODBC como lo hace ACCESS siempre podemos usar el controlador puente JDBC-ODBC

incluido como parte del JDK ldquosunjdbcodbcJdbcOdbcDriverrdquo Este tipo de controladores

es decir los basados en ODBC (Open DataBase Connectivity) son bastante utilizados en

entornos Windows pues este SO incluye ODBC El apeacutendice A describe al final como

administrar los oriacutegenes de datos ODBC en Windows

Asiacute pues la mayor ventaja de los servlets con respecto a la conexioacuten con bases de datos viacutea

JDBC es que su ciclo de vida les permite mantener conexiones abiertas con las mismas a lo

largo de toda una sesioacuten Esto permite recortar tiempo con respecto a otras tecnologiacuteas como

la CGI Ademaacutes JDBC es una tecnologiacutea independiente de las bases de datos

Como ejemplo vamos a implementar una simple aplicacioacuten Web basada en servlets que

muestre una especie de directorio de personas La aplicacioacuten podraacute consultar insertar

modificar borrar o listar la informacioacuten de cada una de las personas almacenadas en la base

de datos a la que se hace acceso (que estaraacute en formato access)

La estructura de la Base de Datos es una tabla con los siguientes campos

DNI Nombre Apellido Edad

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

53023767A Pedro Rubio 18

77459822P Luis Tejedor 47

123456MRL Mario Rossainz 35

La estructura de la aplicacioacuten se muestra en la figura siguiente

lthtmlgt

ltbodygt

lttable border=1gtlttrgtlttdgt

ltform action=httplocalhost8080directorioTelservletSvAccesoBD

method=getgt

DNI ltinput type=text name=DNIgt ltbrgt

Nombre ltinput type=text name=Nombregt ltbrgt

Apellido ltinput type=text name=Apellidogt ltbrgt

Edad ltinput type=text name=Edadgt ltbrgtltbrgt

ltinput type=submit value=Consultar name=BotonConsultargt

ltinput type=submit value=Insertar name=BotonInsertargt

ltinput type=submit value=Modificar name=BotonModificargt

ltinput type=submit value=Borrar name=BotonBorrargt

ltinput type=submit value=Listar name=BotonListargt ltbrgt

ltcentergt

ltinput type=submit value= |lt name=BotonPrimerogt

ltinput type=submit value= -- name=BotonMenosCincogt

ltinput type=submit value= - name=BotonAnteriorgt

ltinput type=submit value= + name=BotonSiguientegt

ltinput type=submit value= ++ name=BotonMasCincogt

ltinput type=submit value= gt| name=BotonUltimogt

ltcentergt

lttdgt

lttdgt

lttextarea name=AreaDeListado rows=10 cols=35gtlttextareagt

SvAccesoBDhtml

SvAccesoBD

ObBorrado ObListado ObConsulta

ObInsercion

ObModificacion

ObPosicionamiento

ObRegistro

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lttdgt

lttrgt

ltformgt

lttablegt

ltbodygt

lthtmlgt

SvAccesoBDhtml

import javaio

import javaxservlet

import javaxservlethttp

public class SvAccesoBD extends HttpServlet

private int PosicionBuscada = 1

private String AreaDeListado=

PrintWriter out

public void doGet(HttpServletRequest request HttpServletResponse response)

throws IOException ServletException

String DNI = requestgetParameter(DNI)

String Nombre = requestgetParameter(Nombre)

String Apellido = requestgetParameter(Apellido)

String Edad = requestgetParameter(Edad)

String BotonConsultar = requestgetParameter(BotonConsultar)

String BotonInsertar = requestgetParameter(BotonInsertar)

String BotonModificar = requestgetParameter(BotonModificar)

String BotonBorrar = requestgetParameter(BotonBorrar)

String BotonListar = requestgetParameter(BotonListar)

String BotonPrimero = requestgetParameter(BotonPrimero)

String BotonMenosCinco = requestgetParameter(BotonMenosCinco)

String BotonAnterior = requestgetParameter(BotonAnterior)

String BotonSiguiente = requestgetParameter(BotonSiguiente)

String BotonMasCinco = requestgetParameter(BotonMasCinco)

String BotonUltimo = requestgetParameter(BotonUltimo)

AreaDeListado = requestgetParameter(AreaDeListado)

responsesetContentType(texthtml)

out = responsegetWriter()

outprintln(lthtmlgt)

outprintln(ltbodygt)

if (BotonConsultar=null) ConsultarDatos(DNI)

if (BotonInsertar=null) InsertarDatos(DNINombreApellidoEdad)

if (BotonModificar=null) ModificarDatos(DNINombreApellidoEdad)

if (BotonBorrar=null) BorrarDatos(DNI)

if (BotonListar=null) ListarDatos(DNI)

if (BotonPrimero=null) Controles(1)

if (BotonMenosCinco=null) Controles(2)

if (BotonAnterior=null) Controles(3)

if (BotonSiguiente=null) Controles(4)

if (BotonMasCinco=null) Controles(5)

if (BotonUltimo=null) Controles(0)

outprintln(ltbodygt)

outprintln(lthtmlgt)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

private void ConsultarDatos(String DNI)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObRegistro InstanciaFila = InstanciaConsultaDameDatos()

GenerarRespuesta(InstanciaFilaDameDNI()InstanciaFilaDameNombre()

InstanciaFilaDameApellido()

StringvalueOf(InstanciaFilaDameEdad()))

else

GenerarRespuesta(DNI------------)

PosicionBuscada = 1

public void ListarDatos(String DNI)

ObListado InstanciaListado = new ObListado()

AreaDeListado = InstanciaListadoDameResultado()

ConsultarDatos(DNI)

PosicionBuscada = 1

public void BorrarDatos(String DNI)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObBorrado InstanciaBorrado = new ObBorrado(PosicionBuscada)

GenerarRespuesta()

else

GenerarRespuesta(----------------)

PosicionBuscada = 1

public void ModificarDatos(String DNI String Nombre String Apellido

String Edad)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObRegistro InstanciaFila = new ObRegistro(DNI Nombre Apellido

IntegerparseInt(Edad))

ObModificacion InstanciaModificacion = new ObModificacion(PosicionBuscada

InstanciaFila)

GenerarRespuesta(DNINombreApellidoEdad)

else

GenerarRespuesta(----------------)

PosicionBuscada = 1

public void InsertarDatos(String DNI String Nombre String Apellido

String Edad)

ObRegistro InstanciaFila = new ObRegistro(DNI Nombre Apellido

IntegerparseInt(Edad))

ObInserccion InstanciaInserccion = new ObInserccion(InstanciaFila)

GenerarRespuesta()

PosicionBuscada=1

public void Controles(String Identificador)

ObPosicionamiento InstanciaPosicionamiento =

new ObPosicionamiento(IdentificadorPosicionBuscada)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ObRegistro InstanciaFila = InstanciaPosicionamientoDameDatos()

GenerarRespuesta(InstanciaFilaDameDNI()InstanciaFilaDameNombre()

InstanciaFilaDameApellido()

StringvalueOf(InstanciaFilaDameEdad()))

PosicionBuscada = InstanciaPosicionamientoPosicion()

private void GenerarRespuesta(String DNI String Nombre String Apellido

String Edad)

outprintln(lttable border=1gt)

outprintln(lttrgt)

outprintln(lttdgt)

outprintln(ltform

action=httplocalhost8080directorioTelservletSvAccesoBD

method=getgt)

outprintln( DNI ltinput type=text name=DNI value=+DNI+gtltbrgt)

outprintln( Nombre ltinput type=text name=Nombre

value=+Nombre+gtltbrgt)

outprintln( Apellido ltinput type=text name=Apellido

value=+Apellido+gtltbrgt)

outprintln( Edad ltinput type=text name=Edad

value=+Edad+gtltbrgtltbrgt)

outprintln( ltinput type=submit value=Consultar

name=BotonConsultargt)

outprintln( ltinput type=submit value=Insertar

name=BotonInsertargt)

outprintln( ltinput type=submit value=Modificar

name=BotonModificargt)

outprintln( ltinput type=submit value=Borrar name=BotonBorrargt)

outprintln( ltinput type=submit value=Listar name=BotonListargt

ltbrgt)

outprintln( ltcentergt)

outprintln( ltinput type=submit value= |lt name=BotonPrimerogt)

outprintln( ltinput type=submit value= --

name=BotonMenosCincogt)

outprintln( ltinput type=submit value= - name=BotonAnteriorgt)

outprintln( ltinput type=submit value= +

name=BotonSiguientegt)

outprintln( ltinput type=submit value= ++

name=BotonMasCincogt)

outprintln( ltinput type=submit value= gt| name=BotonUltimogt)

outprintln( ltcentergt)

outprintln( lttdgt)

outprintln( lttdgt)

outprintln( lttextarea name=AreaDeListado rows=10

cols=35gt+AreaDeListado+lttextareagt)

outprintln( lttdgt)

outprintln( lttrgt)

outprintln( ltformgt)

outprintln( lttablegt)

SvAccesoBDjava

import javasql

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

public class ObBorrado

ObBorrado(int PosicionBuscada)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

Personasabsolute(PosicionBuscada)

PersonasdeleteRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

ObBorradojava

import javasql

import javaawtTextArea

public class ObListado

private String Resultado=

ObListado()

String DNI Nombre Apellido Linea

int Edad Posicion

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement()

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

while (Personasnext())

DNI = PersonasgetString(DNI)

Nombre = PersonasgetString(Nombre)

Apellido = PersonasgetString(Apellido)

Edad = PersonasgetInt(Edad)

Posicion = PersonasgetRow()

Linea = DNI+ +Nombre+ +Apellido+ +StringvalueOf(Edad)

Resultado=Resultado+StringvalueOf(Posicion)+ +Linea+n

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public String DameResultado()

return Resultado

ObListadojava

public class ObRegistro

private String DNI Nombre Apellido

private int Edad

ObRegistro (String DNI String Nombre String Apellido int Edad)

thisDNI = DNI

thisNombre = Nombre

thisApellido = Apellido

thisEdad = Edad

String DameDNI()

return DNI

String DameNombre()

return Nombre

String DameApellido()

return Apellido

int DameEdad()

return Edad

ObRegistrojava

import javasql

public class ObConsulta

private int Posicion = 0

private ObRegistro DatosPersona

ObConsulta(String DNIPedido)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement()

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

while (Personasnext())

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

String DNI = PersonasgetString(DNI)

if (DNIequalsIgnoreCase(DNIPedido))

Posicion = PersonasgetRow()

String Nombre = PersonasgetString(Nombre)

String Apellido = PersonasgetString(Apellido)

int Edad = PersonasgetInt(Edad)

DatosPersona = new ObRegistro(DNINombreApellidoEdad)

break

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public int PosicionEncontrada()

return Posicion

public ObRegistro DameDatos()

return DatosPersona

ObConsultajava

import javasql

public class ObInserccion

ObInserccion(ObRegistro Datos)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

PersonasmoveToInsertRow()

PersonasupdateString(DNI DatosDameDNI())

PersonasupdateString(NombreDatosDameNombre())

PersonasupdateString(Apellido DatosDameApellido())

PersonasupdateInt(EdadDatosDameEdad())

PersonasinsertRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

catch (SQLException e)

Systemoutprintln(e)

ObInsercionjava

import javasql

public class ObModificacion

ObModificacion(int PosicionBuscada ObRegistro Datos)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

Personasabsolute(PosicionBuscada)

PersonasupdateString(DNIDatosDameDNI())

PersonasupdateString(NombreDatosDameNombre())

PersonasupdateString(ApellidoDatosDameApellido())

PersonasupdateInt(EdadDatosDameEdad())

PersonasupdateRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

ObModificacionjava

import javasql

public class ObPosicionamiento

private ObRegistro DatosPersona

private int Posicion

ObPosicionamiento(String Accion int Posicion)

int IDAccionEdad

String DNINombreApellido

boolean PosicionCorrecta=false

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

FROM DatosPersonales)

Personasabsolute(Posicion)

IDAccion = IntegerparseInt(Accion)

switch (IDAccion)

case 0

PosicionCorrecta = Personaslast()

break

case 1

PosicionCorrecta = Personasfirst()

break

case 2

PosicionCorrecta = Personasrelative(-5)

break

case 3

PosicionCorrecta = Personasprevious()

break

case 4

PosicionCorrecta = Personasnext()

break

case 5

PosicionCorrecta = Personasrelative(+5)

break

if (PosicionCorrecta)

thisPosicion = PersonasgetRow()

DNI = PersonasgetString(DNI)

Nombre = PersonasgetString(Nombre)

Apellido = PersonasgetString(Apellido)

Edad = PersonasgetInt(Edad)

else

thisPosicion = Posicion

DNI = ----

Nombre = ----

Apellido = ----

Edad = 0

DatosPersona = new ObRegistro(DNINombreApellidoEdad)

Personasclose()

Conexionclose()

SentenciaSQLclose()

Systemoutprintln(StringvalueOf(Posicion)++StringvalueOf(thisPosicion))

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public int Posicion()

return Posicion

public ObRegistro DameDatos() return DatosPersona

ObPosicionamientojava

En este ejemplo se emplean servlets y paacuteginas Web Los clientes habitualmente trabajan en

una computadora remota y los programas se ejecutan en un servidor El mecanismo de

comunicaciones que soporta el protocolo http nos permite consultar en el servidor los datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

que ha seleccionado o escrito el usuario de esta manera se puede observar una disociacioacuten

entre la interfaz graacutefica de usuario (que se ejecuta en los equipos de los clientes) y el

programa que recoge los datos y ejecuta las acciones pertinentes (que se ejecuta en el

servidor)

Como puede observarse el coacutedigo SvAccessoBD es un servlet que lleva a cabo las siguientes

operaciones

1 Recoge los valores provenientes del usuario

2 Determina la naturaleza de la accioacuten a realizar

3 Realiza su cometido con la base de datos

4 Genera la respuesta que recibiraacute el usuario

32 JSP

JSP significa Java Server Pages que traducido quiere decir Paacuteginas de Servidor Java y es

por tanto una tecnologiacutea orientada a crear paacuteginas Web con programacioacuten en JAVA es decir

permite mezclar HTML estaacutendar y estaacutetico con un contenido dinaacutemico etiquetas especiales

(oacuterdenes) y trozos de coacutedigo JAVA (scriptlets o secuencias de oacuterdenes) o contenido dinaacutemico

generado por servlets Eacuteste contenido dinaacutemico se encuentra encerrado en etiquetas

especiales muchas de las cuales inician con lt y finalizan con gt El motor de las paacuteginas

JSP esta basado en los servlets de JAVA

En la tecnologiacutea JSP se crean paacuteginas parecidas a las paacuteginas que se crean en ASP (Active

Server Page de Microsoft) o PHP (Personal Home Page) que son dos tecnologiacuteas de paacuteginas

ejecutadas en el servidor Sin embargo JSP no se cintildee a un sistema operativo o servidor Web

en particular ademaacutes de que proporciona acceso a la tecnologiacutea de Servlets y a JAVA en la

parte dinaacutemica

El proceso para generar paacuteginas JSP accesibles en Web es mucho maacutes simple que en los

servlets Dando por hecho que se tiene un servidor Web que permite usar JSP el coacutedigo se

almacenaraacute en archivos con extensioacuten jsp que incluyen dentro de la estructuras de etiquetas

HTML las sentencias JAVA a ejecutar y tan soacutelo se colocaraacuten en cualquier lugar en donde

se pusiera una paacutegina Web normal sin compilacioacuten sin paquetes y sin configuracioacuten aunque

el servidor tendraacute que ser configurado para acceder a los archivos de clases Servlets y de

JSPs

Aunque lo que se escriba con frecuencia luciraacute como un archivo HTML estaacutendar detraacutes de

ello la paacutegina JSP se convierte automaacuteticamente en un servlet normal donde el HTML

estaacutetico tan soacutelo es enviado al flujo de salida asociado con el meacutetodo service del servlet Esta

traduccioacuten se realiza la primera vez que se solicita la paacutegina De acuerdo como este

configurado el servidor es posible ver el coacutedigo fuente de los servlets generados a partir de

sus paacuteginas JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Por ejemplo supongamos que se ha escrito el siguiente coacutedigo en el archivo Saludojsp

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtEjemplo JSPlttitlegtltheadgt

ltbody bgcolor=ffffccgt

ltcentergt

lth2gtHola mundolth2gt

ltjavautilDate hoy = new javautilDate()gt

La fecha de hoy es lt=hoygt

ltcentergt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional y un fragmento de un scriptlet de JAVA La etiqueta

lt identifica el comienzo del scriptlet y gt el final Una expresioacuten de la forma =variable

es sustituida por el valor de esa variable Para ejecutar esta paacutegina o cualquier otra paacutegina

JSP desde un navegador hay que instalarla en el servidor de aplicaciones de la misma manera

en como se hizo con los servlets Suponiendo entonces que se tiene instalado el Tomcat 5

siga los siguientes pasos

1 Antildeadir en el servidor la carpeta digamos JSP2 dentro de la carpeta webapps del Tomcat

y construir sobre ella la jerarquiacutea de clases ya conocida de los servlets

webappsrarrJSP2rarrWEB-INFrarrclasses

WEB-INFrarrlib

WEB-INFrarrtags

2 Editar en la carpeta WEB-INF el descriptor de despliegue webxml que se indica a

continuacioacuten Este archivo XML indica doacutende se localiza el esquema XML para la

especificacioacuten Servlet 24 que a suvez utiliza el esquema XML para la especificacioacuten

Java Server Page 20 que son las especificaciones que soporta en servidor Tomcat

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=

httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

3 Crear en JSP2 la carpeta saludo que contendraacute la aplicacioacuten y copiar en ella la paacutegina

Saludojsp

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

4 Arrancar el servidor Si el servidor ya estaba arrancado detenerlo y volverlo a arrancar o

bien abrir el explorador escribir el URL httplocalhost8080managerhtml e instalar

la aplicacioacuten

5 Una vez arrancado el servidor verificar si estaacute funcionando correctamente escribiendo

el URL siguiente en el explorador httplocalhost8080 El explorador debe mostrar la

paacutegina del Tomcat

6 Ejecutar la paacutegina JSP iniciando el explorador y escribiendo el URL siguiente

httplocalhost8080JSP2saludoSaludojsp donde la sintaxis geneacuterica es

httpservidor[puerto]MiCarpetapaginajsp

Cuando esta paacutegina (Saludojsp) es invocada por primera vez el motor JSP lleva a cabo una

fase de traduccioacuten de la misma en un servlet y el motor Servlet es el que ejecutaraacute eacuteste uacuteltimo

para generar el HTML dinaacutemico que seraacute enviado al explorador cliente seguacuten puede

deducirse de la figura siguiente La proacutexima vez que la paacutegina sea solicitada el motor JSP

ejecutaraacute el servlet que fue caragado la primera vez a no ser que la paacutegina haya cambiado

en cuyo caso seraacute compilada automaacuteticamente en un nuevo servlet y ejecutada

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Regresando al ejemplo el archivo java generado por el Tomcat a partir del archivo

Saludojsp se localiza en la carpeta workCatalinalocalhost de la instalacioacuten de Tomcat

321 ELEMENTOS PARA SECUENCIAS DE COMANDOS

Los elementos para secuencias de comandos permiten insertar coacutedigo en el servlet que seraacute

generado a partir de la paacutegina JSP Existen tres formas

1 Expresiones del tipo lt= expresioacuten gt que se evaluacutean e insertan en el resultado del

servlet

2 Los scriptlets del tipo lt codigo gt que se insertan en el meacutetodo _jspService del

servlet (ejecutado por service)

3 Las declaraciones del tipo lt Codigo gt que se insertan en el cuerpo de la clase del

servlet fuera de cualquier meacutetodo existente

NOTA Los comentarios en JSP se escriben lt-- Comentario JSP --gt en tanto que los

comentarios en HTML son de la forma lt--Comentario HTML --gt La diferencia

semaacutentica radica en que los comentarios HTML cuando se insertan en la respuesta enviada

por el servidor al cliente no se muestran cuando se visualiza el documento HTML pero si

Servidor Maacutequina Cliente

Explorador Web

Contenedor Web

Motor Servlet

Motor JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

los podemos ver cuando se visualiza el coacutedigo fuente en tanto que los comentarios JSP

aunque se inserten en la respuesta enviada por el servidor al cliente no son enviados al

explorador de forma que tampoco se muestran ni se ven cuando se visualiza el coacutedigo fuente

HTML desde el explorador

3211 EXPRESIONES

Se utiliza una expresioacuten JSP para insertar valores directamente en el resultado La sintaxis es

lt= expresioacuten gt Por ejemplo

lt= requestgetParameter(ldquoparNombre) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt lt= s gt

La fecha y hora actual es lt= new javautilDate() gt

La expresioacuten se evaluacutea se convierte a cadena y se inserta en la paacutegina Esta evaluacioacuten se

realiza durante la ejecucioacuten

32111 VARIABLES PREDEFINIDAS

Para simplificar estas expresiones se pueden utilizar cierta cantidad de variables

predefinidas Estos objetos impliacutecitos como tambieacuten se les llama estaacuten disponibles para su

uso durante la implementacioacuten de una paacutegina Web

bull pageContext Es un objeto de la clase PageContext que proporciona acceso a objetos

relacionados con los servlets

bull request Es un objeto de la clase HttpServletRequest que se puede obtener a traveacutes del

meacutetodo getRequest que encapsula los datos enviados por el cliente al servidor

bull response Es un objeto de la clase HttpServletResponse que puede obtenerse a traveacutes

del meacutetodo getResponse que encapsula los datos que el servidor enviaraacute al cliente

bull application Es un objeto de la clase ServletContext que se obtiene a traveacutes del meacutetodo

getServletContext que define un conjunto de meacutetodos que todo servlet utiliza para

comunicar con el contenedor de servlets

bull config Es un objeto de la clase ServletConfig que se obtiene a traveacutes del meacutetodo

getServletConfig y que se utiliza por el contenedor de servlets para pasar informacioacuten

al servlet durante la iniciacioacuten

bull session Es un objeto de la clase HttpSession que se obtiene a traveacutes del meacutetodo

getSession que proporciona una forma de identificar a un usuario que visita las paacuteginas

de un sitio Web

bull out Es un objeto de la clase JspWriter que se obtiene a traveacutes del meacutetodo getOut que

se utiliza para almacenar la respuesta que seraacute enviada al cliente que hizo la peticioacuten de

la paacutegina

bull page Es un objeto geneacuterico de la clase Object que se obtiene a traveacutes del meacutetodo

getPage y que representa al servlet obtenido a partir de la paacutegina JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

bull exception Es un objeto de la clase Exception que se obtiene a traveacutes del meacutetodo

getException que contendraacute informacioacuten a cerca de cualquier excepcioacuten que se lance

desde la paacutegina JSP

Un ejemplo del uso de uno de estos objetos impliacutecitos seriacutea el siguiente

El nombre de tu host es lt= requestgetRemoteHost() gt

El listado siguiente da un ejemplo de una paacutegina JSP que utiliza algunas variables

predefinidas como uso de expresiones JSP

ltDOCTYPE HTML PUBLIC -W3CDTD HTML 40 Transitional ENgt

lthtmlgt

ltheadgt

lttitlegt Expresiones JSP lttitlegt

ltheadgt

ltbodygt

lth2gt Expresiones JSP lth2gt

ltULgt

ltligt Fecha y hora en curso lt= new javautilDate() gt ltligt

ltligt Nombre de su host lt= requestgetRemoteHost() gt ltligt

ltligt Identificador de su sesioacuten lt= sessiongetId() gt ltligt

ltligt El paraacutemetro ltcodegt paramPrueba ltcodegt del formulario

lt= requestgetParameter(paramPrueba) gt ltligt

ltULgt

ltbodygt

lthtmlgt

Cuya salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3212 LOS SCRIPTLETS JSP

Si se desea hacer algo maacutes complejo que una simple expresioacuten los scriptlets permiten insertar

coacutedigo JAVA en el meacutetodo _jspService del servlet (que es ejecutado por service) La sintaxis

utilizada por los scriptlets es lt coacutedigo java gt Los escriptlets tienen acceso a las

mismas variables definidas de forma automaacutetica como expresiones A manera de ejemplo si

se desea que el resultado aparezca en la paacutegina generada deberiacutea de utilizarse la variable out

como en la siguiente instruccioacuten

lt String datosConsultados= requestgetQueryString()

outprintln(ldquoDatos GET adjuntos ldquo+datosConsultados)

gt

En este ejemplo podriacutea haberse obtenido el mismo resultado utilizando la siguiente expresioacuten

JSP

Datos GET adjuntos lt=requestgetQueryString() gt

En general los scriptlets pueden ejecutar varias tareas que no podriacutean realizarse con las

expresiones Tales tareas incluyen

bull La determinacioacuten de encabezados de respuesta

bull Actualizacioacuten de Bases de Datos

bull Ejecucioacuten de bucles condiciones y otras estructuras complejas

lt for (int i=1 ilt=6 i++)

gt

lth lt=i gtgt Hola Mundo lthlt=i gtgt

lt gt

Como un ejemplo concreto se muestra la siguiente paacutegina JSP llamada Cuentajsp en donde

se observa coacutemo se hace un seguimiento del nuacutemero de veces que un cliente accede a esta

paacutegina a traveacutes de distintas sesiones Para ello supondremos que dicha cuenta es el valor del

atributo atrCuenta del objeto impliacutecito application ya citado La primera vez que el cliente

accede a la paacutegina el valor de atrCuenta seraacute null debido a que auacuten no ha sido fijado este

atributo en este caso se fijaraacute con el valor 1 En los siguientes accesos se leeraacute el valor del

atributo atrCuenta se incrementaraacute en una unidad y se volveraacute a fijar Finalmente se enviacutea

la respuesta al cliente para que se muestre al usuario el valor del contador

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en el objeto impliacutecito application con el nombre

atrCuenta

--gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt

Integer cuenta = (Integer)applicationgetAttribute(atrCuenta)

String s = vez

if (cuenta == null)

cuenta = new Integer(1)

else

cuenta = new Integer(cuentaintValue() + 1)

s = veces

applicationsetAttribute(atrCuenta cuenta)

gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

Has visitado esta paacutegina lt= cuenta gt lt= s gt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional un fragmento de coacutedigo JAVA o scriptlet

expresiones y comentarioshellip

Aquiacute otro ejemplo de la ejecucioacuten de un coacutedigo demasiado complejo para una expresioacuten JSP

Este listado presenta una paacutegina JSP que utiliza el paraacutemetro de peticioacuten colorFondo para

establecer el color de fondo de la paacutegina

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgt

lttitlegt Prueba de Color lttitlegt

ltheadgt

lt

String colorFondo=requestgetParameter(colorFondo)

boolean tieneColorExplicito

if (colorFondo =null)

tieneColorExplicito=true

else

tieneColorExplicito=false

colorFondo=WHITE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt

ltbody bgcolor=lt= colorFondo gtgt

lth2 align=centergt Prueba de color lth2gt

lt

if (tieneColorExplicito)

outprintln(Ha indicado un color de fondo expliacutecito +

colorFondo +)

else

outprintln(Usareacute el color de fondo predeterminado WHITE +

Indique el atributo de peticioacuten

ltigtcolorFondoltigt+

para intentar un color estaacutendar un +

valor RRGGBB o para ver si el navegador Web +

permite el uso de nombres de color X11)

gt

ltbodygt

lthtmlgt

Cuyas posibles salidas son

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3213 DECLARACIONES JSP

Una declaracioacuten JSP permite definir meacutetodos o campos que seraacuten insertados en el cuerpo

principal de la clase del servlet (fuera del meacutetodo _jspService) Una declaracioacuten tiene la

sintaxis lt Coacutedigo Java gt Por ejemplo

lt int i=0 gt

lt

Public void jspinit()

coacutedigo de iniciacioacuten

gt

Una declaracioacuten no genera ninguacuten resultado y se usan junto con las expresiones JSP o los

scriptlets A continuacioacuten se muestra una paacutegina JSP que despliega la cantidad de veces que

se ha solicitado esta paacutegina desde que se arrancoacute el servidor haciendo uso de las

declaraciones JSP

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtDeclaraciones JSPlttitlegtltheadgt

ltbodygt

lth1gtDeclaraciones JSPlth1gt

lt-- Esto es un comentario en JSP --gt

lt private int recuentoAccesos=0 gt

lth2gt Accesos a la paacutegina desde el reinicio del servidor

lt= ++recuentoAccesos gt lth2gt

ltbodygt

lthtmlgt

La salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

322 EL LENGUAJE DE EXPRESION EN JSP 20

Anteriormente se ha visto la necesidad de utilizar fragmentos de coacutedigo java en el desarrollo

de paacuteginas JSP pero con la aparicioacuten de la especificacioacuten JSP 20 ya no hay necesidad de

utilizar fragmentos de coacutedigo Java para nada gracias al nuevo lenguaje de expresioacuten EL

(Expresioacuten Language) a la biblioteca de etiquetas estandar JSTL (JSP Standar Tag Library)

y a las nuevas formas para desarrollar etiquetas personalizadas

El lenguaje de expresioacuten JSP es maacutes un lenguaje de acceso a datos que un lenguaje de

programacioacuten Ya se ha visto que para pasar informacioacuten de un cliente a una paacutegina JSP se

utilizan paraacutemetros en la peticioacuten y atributos en la paacutegina El lenguaje de expresioacuten lo hace

posible sin tener que utilizar scriptlets o expresiones (lt= expresioacuten gt) Por ejemplo las

liacuteneas JSP 12 siguientes escritas utilizando coacutedigo Java

lt= requestgetParameter(ldquoparNombrerdquo) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt veces

bajo la especificacioacuten JSP 20 se pueden escribir de una forma maacutes sencilla como sigue

(ahora no se trata de coacutedigo JAVA)

$paramparNombre has visitado esta paacutegina

$atrCuenta veces

La sintaxis de JSP es sensible a mayuacutesculas y minuacutesculas pero un par de comillas simples es

equivalente a un par de comillas dobles

3221 VARIABLES PREDEFINIDAS (Objetos Impliacutecitos)

El lenguaje de expresioacuten JSP 20 soporta los objetos impliacutecitos siguientes

pageContext Objeto de javaxservletjspPageContext que proporciona acceso a los

datos de una peticioacuten

param Coleccioacuten (objeto de tipo javautilMap) de todos los valores de los paraacutemetros

enviados en una peticioacuten un String por paraacutemetro

paramValues Coleccioacuten de todos los valores de los paraacutemetros enviados en una

peticioacuten una matriz de tipo String por paraacutemetro

header Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten un

String por cabecera

headerValues Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten

una matriz de tipo String por cabecera

cookie Coleccioacuten de todos los valores de las cookies un objeto javaxservlethttpCookie

por cookie

initParam Coleccioacuten de todos los valores de los paraacutemetros de iniciacioacuten de la

aplicacioacuten un String por paraacutemetro

Tambieacuten hay objetos que permiten acceder a variables definidas en diferentes aacutembitos lo que

posibilita compartir informacioacuten

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

pageScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de paacutegina

requestScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

peticioacuten

sessionScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de sesioacuten

applicationScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

aplicacioacuten

3222 DIRECTRICES

Las directrices page incluye y taglib son mensajes para el motor JSP y son siempre incluidas

entre los siacutembolos lt y gt

32221 LA DIRECTRIZ PAGE

Define atributos que se aplican a toda la paacutegina JSP donde es incluida

lt page lista_de_atributos gt

Donde la lista_de_atributos puede contener algunos de los siguientes (aquellos que estaacuten

escritos en negrita son los tomados por omisioacuten)

language= ldquoscriptingLanguagerdquo

extends= rdquoclassNamerdquo

import= ldquoimportListrdquo

session= ldquotrue|falserdquo

buffer= ldquonone|sizeKb

autoflush= ldquotrue|falserdquo

isThreadSafe= rdquotrue|falserdquo

info= rdquoinfo_textrdquo

errorPage= ldquoerror_urlrdquo

isErrorPage= rdquotrue|falserdquo

contentType= rdquoctinfordquo

pageEncoding= rdquopeinfordquo

isELIgnored= ldquotrue|falserdquo

Tiacutepicamente se localiza al principio de la paacutegina JSP y puede haber cualquier nuacutemero de

ellas El lenguaje por omisioacuten es Java Ejemplos

lt page contentType=rdquotexthtmlrdquo language=rdquojavardquo gt

lt page import=rdquojavautil javalangrdquo gt

lt page buffer=rdquo5kbrdquo autoflush=rdquofalserdquo gt

32222 LA DIRECTRIZ INCLUDE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

La directriz include incluye un archivo (html jsp xml o de texto) en una paacutegina JSP Esto

permite dividir el contenido de la paacutegina en trozos maacutes manejables

lt incluye file=rdquoURL_relativordquo gt

El ejemplo siguiente muestra dos archivos el primero incluye al segundo para mostrar la

fecha y hora actuales

lt-- fichero mostrarFechaHorajsp --gt

lthtmlgt

ltheadgtlttitlegtIncluir un ficherolttitlegtltheadgt

ltbody bgcolor=whitegt

ltfont color=bluegt

La fecha y hora actuales son

lt include file=fechaHorajsp gt

ltfontgt

ltbodygt

lthtmlgt

lt-- fichero fechaHorajsp --gt

lt page import=javautil gt

lt= (new javautilDate())toLocaleString() gt

32223 LA DIRECTRIZ TAGLIB

La directriz taglib indica la biblioteca de acciones personalizadas que podremos utilizar en

la codificacioacuten de la paacutegina JSP Para distinguir esas acciones entre otras existentes se utiliza

un prefijo (prefix) Su sintaxis es

lt taglib (uri=rdquoURI_bibliotecardquo|tagdir=rdquoDir_biblioteca_tagrdquo)

prefix=rdquoprefijordquo gt

Cuando se trata de una biblioteca definida mediante una clase Java y un descriptor (archivo

tld) eacutesta se identifica mediante un URI (Uniform Resource Identifier- URL relativos) Por

ejemplo

lt taglib uri=rdquohttpMarioRossainzLopezmiBibliotecardquo

prefix=rdquofunrdquo gt

ltpgtltfunaccion01 gt

La uacuteltima liacutenea del ejemplo tiene dos etiquetas una etiqueta p HTML y otra accion01

perteneciente a la biblioteca miBiblioteca En cambio si la biblioteca se define mediante un

archivo tag entonces se identifica mediante su ruta relativa en el sistema de archivos

lt taglib tagdir=rdquoWEB-INFtagsrdquo prefix=rdquofunrdquo gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpgtltfunaccion01 gt

La directriz taglib debe colocarse antes de utilizar en la paacutegina JSP las acciones

personalizadas definidas por la misma Se puede utilizar maacutes de una directriz pero el prefijo

utilizado debe ser uacutenico para cada una de ellas

3223 ACTIVACION DEL LENGUAJE DE EXPRESION (LE)

La especificacioacuten JSP 20 define un lenguaje de expresioacuten como alternativa a elementos de

programacioacuten escritos con coacutedigo Java y especificaciones anteriores a la JSP 20 Para que

este lenguaje pueda ser interpretado tienen que cumplirse 2 requisitos

1 Que la propiedad isELIgnored de la directriz page valga false

lt page isELIgnored= ldquofalserdquo gt

2 Que el descriptor de despliegue webxml en la carpeta WEB-INF indique doacutende se

localiza el esquema XML para la especificacioacuten Servlet 24 que a su vez utiliza el

esquema XML para la especificacioacuten Java Server Page 20

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

Utilizando el lenguaje de expresioacuten se podriacutea modificar la paacutegina Cuentajsp de la seccioacuten

3212 de este documento como se muestra a continuacioacuten Esta nueva paacutegina

1 Especifica que utilizaraacute la biblioteca core de etiquetas estandar (de la que se hablaraacute maacutes

adelante)

2 La primera vez que sea accedida definiraacute la variable atrCuenta en el aacutembito de la

aplicacioacuten con un valor inicial nulo y la incrementaraacute en una unidad cuando sea accedida

sucesivas veces simplemente incrementaraacute esta variable en una unidad

3 Finalmente mostraraacute una paacutegina con un contenido anaacutelogo al siguiente Esta formado

por una cabecera y una segunda liacutenea compuesta por el valor del paraacutemetro parNombre

enviado con la peticioacuten un texto fijo el valor de la variable atrCuenta y otro texto fijo

dependiente del valor de esta variable

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

El coacutedigo completo es el siguiente

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

3224 VARIABLES Y EXPRESIONES

Para acceder a una simple variable se puede escribir algo como lo siguiente $nombre y

para acceder a una propiedad de un objeto podemos escribir algo como

$paramparNombre

$applicationScopeatrCuenta

$pageContextrequestrequestURI

La primera liacutenea del ejemplo anterior obtiene el valor de la propiedad parNombre del objeto

param la segunda el valor del atributo atrCuenta del objeto applicationScope y la tercera

el URL relativo de la paacutegina JSP solicitada

El lenguaje de expresioacuten es maacutes tolerante con respecto a las variables con valor null y ejecuta

muchas maacutes conversiones de forma automaacutetica sobre el tipo de los datos cuando la expresioacuten

a evaluar asiacute lo requiere Por ejemplo la etiqueta condicional siguiente incluye una expresioacuten

que compara el valor del atributo atrCuenta con aacutembito de aplicacioacuten con 10 (convirtiendo

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

impliacutecitamente el valor del atributo al tipo de la constante para poder realizar la comparacioacuten

El resultado seraacute un valor de tipo boolean

ltcif test=rdquo$applicationScopeatrCuenta gt 10rdquogt

ltcifgt

o bien

ltcif test=rdquo$atrCuenta gt 10rdquogt

ltcifgt

Para que una literal pueda incluir un caracter significativo para el lenguaje dicho caracter

debe ser especificado como una secuencia de escape (caracter) Por ejemplo la siguiente

expresioacuten da lugar al literal ldquovezrdquo o ldquovecesrdquo entre comillas dobles

$(atrCuenta gt 1) iquest ldquordquovecesrdquordquo ldquordquovezrdquordquo

Cualquier objeto o atributo de un objeto definido en algunos de los aacutembitos de una paacutegina

puede ser utilizado como una variable Por ejemplo $atrCuenta+1 es una expresioacuten que

realiza la suma de la variable atrCuenta con 1

Cuando se trate de una propiedad de un objeto para acceder a ella se utilizaraacute el operador

punto o bien la notacioacuten empleada para acceder a un elemento de una matriz Por ejemplo

$paramparNombre

$param[ldquoparNombrerdquo]

Una expresioacuten LE puede aparecer en cualquier lugar donde pueda aparecer un texto fijo Por

tanto para informar al contenedor JSP que se trata de una expresioacuten y no de un texto fijo se

utilizan los delimitadores $ al principio y al final

3225 OPERADORES

OPERADOR DESCRIPCIOacuteN Acceso a la propiedad de un objeto o a un elemento de un Map

[] Acceso al elemento de una matriz o de un objeto List

() Pareacutentesis para alterar la prioridad en la evaluacioacuten de una expresioacuten

If ternario condicion expresion1 expresioacuten 2

+ Suma

- Resta

Producto

oacute div Divisioacuten

oacute mod Moacutedulo o resto de una divisioacuten

== oacute eq Igualdad

= oacute ne Diferente

lt oacute lt Menor que

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt oacute gt Mayor que

lt= oacute le Menor o igual que

gt= oacute ge Mayor o igual que

ampamp oacute and Operacioacuten Loacutegica AND

|| oacute or Operacioacuten Loacutegica OR

oacute not Operacioacuten Loacutegica NOT

empty Verifica si el valor de una variable es null si un String esta vaciacuteo o si una matriz Map

o Collection no tienen elementos

func(args) Llamada a una funcioacuten donde func es el nombre de la funcioacuten y arg representa cero o

maacutes argumentos separados por comas

El ejemplo siguiente muestra una paacutegina JSP compuesta por elementos HTML expresiones

LE y objetos impliacutecitos

lthtmlgt

ltheadgtlttitlegtJSP 20lttitlegtltheadgt

ltbodygt

lth3gtLenguaje de expresioacuten (LE)lth3gt

ltpgtLa siguiente tabla ilustra algunas expresiones LE

ltbrgtltbrgtlttable border=1gt

lttrgt

ltthgtltbgtExpresioacutenltbgtltthgt

ltthgtltbgtValorltbgtltthgt

lttrgt

lttrgt

lttdgt$3 + 6lttdgt

lttdgt$3 + 6lttdgt

lttdgt

lttrgt

lttdgt$(7 gt 4) 7 4lttdgt

lttdgt$(7 gt 4) 7 4lttdgt

lttrgt

lttrgt

lttdgt$header[host]lttdgt

lttdgt$header[host]lttdgt

lttrgt

lttablegt

ltbodygt

lthtmlgt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

323 BIBLIOTECA ESTANDAR DE ETIQUETAS

La biblioteca estaacutendar de etiquetas JSP (JSTL ndash Java Server Page Estaacutendar Tag Library)

incluye una cantidad amplia de etiquetas para diferentes aacutereas de trabajo

Aacuterea baacutesica (su prefijo es c ndash core) y contiene

o Soporte de variables (remove y set)

o Control del flujo (choose when otherwise forEach forTokens if)

o Manejo de URL (import param redirect param y url param)

o Operaciones varias (match y out)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlcore

Aacuterea XML (su prefijo es x) y contiene

o Sentencias baacutesicas (out parse y set)

o Control del flujo (choosehellip whenhellip otherwise forEach e if)

o Transformacioacuten de Documentos (transformhellipparam)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlxml

Aacuterea Internacionalizacioacuten (su prefijo es fmt) Contiene

o Localidad (setLocale y requestEncoding)

o Mensajes (bundle message param y setBundle)

o Formateo de Fechas y nuacutemeros (formatNumber formateacuteate parseDate

parseNumber setTimeZone timeZone)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlfmt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Aacuterea SQL (su prefijo es sql) es el lenguaje estandar para interactuar con bases de datos

relacionales y contiene setDataSource Quero dateParam param transaction y

update dateParam param) El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlsql

Aacuterea Funciones (su prefijo es fn) y contiene

o Longitud de una coleccioacuten (length)

o Manipulacioacuten de String (toUpperCase toLowerCase substring

substringAfter substringBefore trim replace indexOf startsWith

endsWith contains containsIgnoreCase split join y escapeXml)

o El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlfunctions

3231 OPERACIONES CON ETIQUETAS BAacuteSICAS

En un ejemplo pasado teniacuteamos el siguiente coacutedigo

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

En este ejemplo se hace referencia al aacuterea baacutesica de JSTL con el prefijo c y se utiliza la

etiqueta cset para definir la variable atrCuenta Si la variable ya esta definida simplemente

se le asigna el valor especificado

La uacuteltima parte del ejemplo anterior podriacutea haberse escrito de esta otra forma

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcif test=rdquo$atrCuenta gt 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcifgt

$atrCuenta $str

La etiqueta cif permite la ejecucioacuten condicional de su cuerpo en funcioacuten del valor del

atributo de test

La etiqueta cchoose permite la ejecucioacuten del cuerpo de la primera etiqueta cwhen cuyo

atributo test sea evaluado a true Si ninguna de las condiciones se evaluacutea a true entonces se

evaluacutea el cuerpo de la etiqueta cotherwise si estaacute presente El siguiente coacutedigo muestra otra

manera de escribir el ejemplo anterior utilizando estas uacuteltimas etiquetas

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcchoosegt

ltcwhen test=rdquo$atrCuenta == 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcwhengt

ltcotherwisegt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcotherwisegt

ltcchoosegt

$atrCuenta $str

La etiqueta cforEach permite iterar sobre una coleccioacuten de objetos La coleccioacuten se

especifica por medio del atributo iacutetems y el elemento actual de la coleccioacuten estaacute disponible a

traveacutes de la variable establecida por el atributo var Por ejemplo el siguiente fragmento de

coacutedigo visualiza una tabla con las variables definidas a nivel de aacutembito de paacutegina

lttable border=rdquo1rdquogt

ltcforEach var=rdquoitemrdquo iacutetems=rdquo$pageScoperdquogt

lttrgt

lttdgt $item lttdgt

lttrgt

ltcforEachgt

lttablegt

La etiqueta ccatch atrapa una excepcioacuten que ocurra en el cuerpo de la misma Por ejemplo

el siguiente segmento de coacutedigo lanzaraacute una excepcioacuten si el paraacutemetro mes se escribe con

letras en vez de con nuacutemeros

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltbodygt

lthtmlgt

Un URL anaacutelogo al siguiente daraacute lugar a que la excepcioacuten sea lanzada cuando se ejecute la

expresioacuten $nMes 3 de la paacutegina anterior

httplocalhost8080JSP2exceppruebajspmes=marzo

La excepcioacuten indica que ha ocurrido un error al tratar de convertir ldquomarzordquo a un entero de

tipo Long Para cachar esta excepcioacuten y darle un tratamiento adecuado habraacute que modificar

la paacutegina JSP anterior como se indica a continuacioacuten

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltccatch var=rdquoerrorOcurridordquogt

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltccatchgt

ltcif test=rdquo$not empty errorOcurridordquogt

Error el paraacutemetro mes debe ser un nuacutemero ltbgt

ltbrgt Informacioacuten del error dada por el sistema

ltbrgt ltfont color=rdquoFF0000rdquogt $errorOcurrido ltfontgt

ltcifgt

ltbodygt

lthtmlgt

3232 ACCESO A BASES DE DATOS CON JSP

Las etiquetas que proporciona el aacuterea SQL permiten realizar

Conexioacuten con una base de datos

Realizacioacuten de consultas a la base de datos

Acceso al conjunto de resultados

Ejecucioacuten de actualizaciones y transacciones

Todas las etiquetas SQL actuacutean sobre una base de datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

32321 CONEXIOacuteN CON LA BASE DE DATOS

La conexioacuten con la base de datos puede realizarse con la etiqueta sqlsetDataSource Por

ejemplo si se esta utilizando el administrador de bases de datos MySql con el controlador

JDBC se puede realizar una conexioacuten con una base de datos digamos bd_tutorias de la

manera siguiente

ltsqlsetDataSource var=rdquobdrdquo

driver=rdquocommysqljdbcDriverrdquo

url=rdquojdbcmysqllocalhost3306bd_tutoriasrdquo

user=rdquoadminrdquo

password=rdquoadminadminrdquo gt

32322 CONSULTA A LA BASE DE DATOS

La etiqueta sqlQuero permite realizar una consulta a una base de datos Por ejemplo el

siguiente fragmento de coacutedigo realiza una consulta a la base de datos representada por bd y

obtiene un conjunto de resultados representado por cdr

ltsqlquery var=rdquocdrrdquo dataSource=rdquo$bdrdquogt

SELECT professor dia hora alumno

FROM profesores tutorias citas

WHERE profesoresid_profesor=tutoriasid_profesor

AND tutoriasid_tutoria=citasid_tutoria

ltsqlquerygt

32323 MODIFICACIONES SOBRE LA BASE DE DATOS

La etiqueta sqlupdate permite ejecutar una sentencia SQL INSERT UPDATE o DELETE

y cualquier otra sentencia SQL que no retorne ninguacuten valor Por ejemplo

ltsqlupdate var=rdquocontrdquo dataSource=rdquo$bdrdquo gt

UPDATE profesores

SET profesor=

WHERE profesor=

ltsqlparam value=rdquo$paramProfesorrdquo gt

ltsqlparam value=rdquo$paramIDrdquo gt

ltsqlupdategt

Una operacioacuten UPDATE puede utilizar el siacutembolo para indicar que el valor que tendriacutea que

evaluarse en esa posicioacuten seraacute suministrado por una etiqueta sqlparam como por ejemplo

httplocalhost8080JSP2sqlpruebajspProfesor=Mario+Rossainz+LopezampID=514

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

53023767A Pedro Rubio 18

77459822P Luis Tejedor 47

123456MRL Mario Rossainz 35

La estructura de la aplicacioacuten se muestra en la figura siguiente

lthtmlgt

ltbodygt

lttable border=1gtlttrgtlttdgt

ltform action=httplocalhost8080directorioTelservletSvAccesoBD

method=getgt

DNI ltinput type=text name=DNIgt ltbrgt

Nombre ltinput type=text name=Nombregt ltbrgt

Apellido ltinput type=text name=Apellidogt ltbrgt

Edad ltinput type=text name=Edadgt ltbrgtltbrgt

ltinput type=submit value=Consultar name=BotonConsultargt

ltinput type=submit value=Insertar name=BotonInsertargt

ltinput type=submit value=Modificar name=BotonModificargt

ltinput type=submit value=Borrar name=BotonBorrargt

ltinput type=submit value=Listar name=BotonListargt ltbrgt

ltcentergt

ltinput type=submit value= |lt name=BotonPrimerogt

ltinput type=submit value= -- name=BotonMenosCincogt

ltinput type=submit value= - name=BotonAnteriorgt

ltinput type=submit value= + name=BotonSiguientegt

ltinput type=submit value= ++ name=BotonMasCincogt

ltinput type=submit value= gt| name=BotonUltimogt

ltcentergt

lttdgt

lttdgt

lttextarea name=AreaDeListado rows=10 cols=35gtlttextareagt

SvAccesoBDhtml

SvAccesoBD

ObBorrado ObListado ObConsulta

ObInsercion

ObModificacion

ObPosicionamiento

ObRegistro

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lttdgt

lttrgt

ltformgt

lttablegt

ltbodygt

lthtmlgt

SvAccesoBDhtml

import javaio

import javaxservlet

import javaxservlethttp

public class SvAccesoBD extends HttpServlet

private int PosicionBuscada = 1

private String AreaDeListado=

PrintWriter out

public void doGet(HttpServletRequest request HttpServletResponse response)

throws IOException ServletException

String DNI = requestgetParameter(DNI)

String Nombre = requestgetParameter(Nombre)

String Apellido = requestgetParameter(Apellido)

String Edad = requestgetParameter(Edad)

String BotonConsultar = requestgetParameter(BotonConsultar)

String BotonInsertar = requestgetParameter(BotonInsertar)

String BotonModificar = requestgetParameter(BotonModificar)

String BotonBorrar = requestgetParameter(BotonBorrar)

String BotonListar = requestgetParameter(BotonListar)

String BotonPrimero = requestgetParameter(BotonPrimero)

String BotonMenosCinco = requestgetParameter(BotonMenosCinco)

String BotonAnterior = requestgetParameter(BotonAnterior)

String BotonSiguiente = requestgetParameter(BotonSiguiente)

String BotonMasCinco = requestgetParameter(BotonMasCinco)

String BotonUltimo = requestgetParameter(BotonUltimo)

AreaDeListado = requestgetParameter(AreaDeListado)

responsesetContentType(texthtml)

out = responsegetWriter()

outprintln(lthtmlgt)

outprintln(ltbodygt)

if (BotonConsultar=null) ConsultarDatos(DNI)

if (BotonInsertar=null) InsertarDatos(DNINombreApellidoEdad)

if (BotonModificar=null) ModificarDatos(DNINombreApellidoEdad)

if (BotonBorrar=null) BorrarDatos(DNI)

if (BotonListar=null) ListarDatos(DNI)

if (BotonPrimero=null) Controles(1)

if (BotonMenosCinco=null) Controles(2)

if (BotonAnterior=null) Controles(3)

if (BotonSiguiente=null) Controles(4)

if (BotonMasCinco=null) Controles(5)

if (BotonUltimo=null) Controles(0)

outprintln(ltbodygt)

outprintln(lthtmlgt)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

private void ConsultarDatos(String DNI)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObRegistro InstanciaFila = InstanciaConsultaDameDatos()

GenerarRespuesta(InstanciaFilaDameDNI()InstanciaFilaDameNombre()

InstanciaFilaDameApellido()

StringvalueOf(InstanciaFilaDameEdad()))

else

GenerarRespuesta(DNI------------)

PosicionBuscada = 1

public void ListarDatos(String DNI)

ObListado InstanciaListado = new ObListado()

AreaDeListado = InstanciaListadoDameResultado()

ConsultarDatos(DNI)

PosicionBuscada = 1

public void BorrarDatos(String DNI)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObBorrado InstanciaBorrado = new ObBorrado(PosicionBuscada)

GenerarRespuesta()

else

GenerarRespuesta(----------------)

PosicionBuscada = 1

public void ModificarDatos(String DNI String Nombre String Apellido

String Edad)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObRegistro InstanciaFila = new ObRegistro(DNI Nombre Apellido

IntegerparseInt(Edad))

ObModificacion InstanciaModificacion = new ObModificacion(PosicionBuscada

InstanciaFila)

GenerarRespuesta(DNINombreApellidoEdad)

else

GenerarRespuesta(----------------)

PosicionBuscada = 1

public void InsertarDatos(String DNI String Nombre String Apellido

String Edad)

ObRegistro InstanciaFila = new ObRegistro(DNI Nombre Apellido

IntegerparseInt(Edad))

ObInserccion InstanciaInserccion = new ObInserccion(InstanciaFila)

GenerarRespuesta()

PosicionBuscada=1

public void Controles(String Identificador)

ObPosicionamiento InstanciaPosicionamiento =

new ObPosicionamiento(IdentificadorPosicionBuscada)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ObRegistro InstanciaFila = InstanciaPosicionamientoDameDatos()

GenerarRespuesta(InstanciaFilaDameDNI()InstanciaFilaDameNombre()

InstanciaFilaDameApellido()

StringvalueOf(InstanciaFilaDameEdad()))

PosicionBuscada = InstanciaPosicionamientoPosicion()

private void GenerarRespuesta(String DNI String Nombre String Apellido

String Edad)

outprintln(lttable border=1gt)

outprintln(lttrgt)

outprintln(lttdgt)

outprintln(ltform

action=httplocalhost8080directorioTelservletSvAccesoBD

method=getgt)

outprintln( DNI ltinput type=text name=DNI value=+DNI+gtltbrgt)

outprintln( Nombre ltinput type=text name=Nombre

value=+Nombre+gtltbrgt)

outprintln( Apellido ltinput type=text name=Apellido

value=+Apellido+gtltbrgt)

outprintln( Edad ltinput type=text name=Edad

value=+Edad+gtltbrgtltbrgt)

outprintln( ltinput type=submit value=Consultar

name=BotonConsultargt)

outprintln( ltinput type=submit value=Insertar

name=BotonInsertargt)

outprintln( ltinput type=submit value=Modificar

name=BotonModificargt)

outprintln( ltinput type=submit value=Borrar name=BotonBorrargt)

outprintln( ltinput type=submit value=Listar name=BotonListargt

ltbrgt)

outprintln( ltcentergt)

outprintln( ltinput type=submit value= |lt name=BotonPrimerogt)

outprintln( ltinput type=submit value= --

name=BotonMenosCincogt)

outprintln( ltinput type=submit value= - name=BotonAnteriorgt)

outprintln( ltinput type=submit value= +

name=BotonSiguientegt)

outprintln( ltinput type=submit value= ++

name=BotonMasCincogt)

outprintln( ltinput type=submit value= gt| name=BotonUltimogt)

outprintln( ltcentergt)

outprintln( lttdgt)

outprintln( lttdgt)

outprintln( lttextarea name=AreaDeListado rows=10

cols=35gt+AreaDeListado+lttextareagt)

outprintln( lttdgt)

outprintln( lttrgt)

outprintln( ltformgt)

outprintln( lttablegt)

SvAccesoBDjava

import javasql

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

public class ObBorrado

ObBorrado(int PosicionBuscada)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

Personasabsolute(PosicionBuscada)

PersonasdeleteRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

ObBorradojava

import javasql

import javaawtTextArea

public class ObListado

private String Resultado=

ObListado()

String DNI Nombre Apellido Linea

int Edad Posicion

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement()

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

while (Personasnext())

DNI = PersonasgetString(DNI)

Nombre = PersonasgetString(Nombre)

Apellido = PersonasgetString(Apellido)

Edad = PersonasgetInt(Edad)

Posicion = PersonasgetRow()

Linea = DNI+ +Nombre+ +Apellido+ +StringvalueOf(Edad)

Resultado=Resultado+StringvalueOf(Posicion)+ +Linea+n

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public String DameResultado()

return Resultado

ObListadojava

public class ObRegistro

private String DNI Nombre Apellido

private int Edad

ObRegistro (String DNI String Nombre String Apellido int Edad)

thisDNI = DNI

thisNombre = Nombre

thisApellido = Apellido

thisEdad = Edad

String DameDNI()

return DNI

String DameNombre()

return Nombre

String DameApellido()

return Apellido

int DameEdad()

return Edad

ObRegistrojava

import javasql

public class ObConsulta

private int Posicion = 0

private ObRegistro DatosPersona

ObConsulta(String DNIPedido)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement()

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

while (Personasnext())

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

String DNI = PersonasgetString(DNI)

if (DNIequalsIgnoreCase(DNIPedido))

Posicion = PersonasgetRow()

String Nombre = PersonasgetString(Nombre)

String Apellido = PersonasgetString(Apellido)

int Edad = PersonasgetInt(Edad)

DatosPersona = new ObRegistro(DNINombreApellidoEdad)

break

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public int PosicionEncontrada()

return Posicion

public ObRegistro DameDatos()

return DatosPersona

ObConsultajava

import javasql

public class ObInserccion

ObInserccion(ObRegistro Datos)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

PersonasmoveToInsertRow()

PersonasupdateString(DNI DatosDameDNI())

PersonasupdateString(NombreDatosDameNombre())

PersonasupdateString(Apellido DatosDameApellido())

PersonasupdateInt(EdadDatosDameEdad())

PersonasinsertRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

catch (SQLException e)

Systemoutprintln(e)

ObInsercionjava

import javasql

public class ObModificacion

ObModificacion(int PosicionBuscada ObRegistro Datos)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

Personasabsolute(PosicionBuscada)

PersonasupdateString(DNIDatosDameDNI())

PersonasupdateString(NombreDatosDameNombre())

PersonasupdateString(ApellidoDatosDameApellido())

PersonasupdateInt(EdadDatosDameEdad())

PersonasupdateRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

ObModificacionjava

import javasql

public class ObPosicionamiento

private ObRegistro DatosPersona

private int Posicion

ObPosicionamiento(String Accion int Posicion)

int IDAccionEdad

String DNINombreApellido

boolean PosicionCorrecta=false

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

FROM DatosPersonales)

Personasabsolute(Posicion)

IDAccion = IntegerparseInt(Accion)

switch (IDAccion)

case 0

PosicionCorrecta = Personaslast()

break

case 1

PosicionCorrecta = Personasfirst()

break

case 2

PosicionCorrecta = Personasrelative(-5)

break

case 3

PosicionCorrecta = Personasprevious()

break

case 4

PosicionCorrecta = Personasnext()

break

case 5

PosicionCorrecta = Personasrelative(+5)

break

if (PosicionCorrecta)

thisPosicion = PersonasgetRow()

DNI = PersonasgetString(DNI)

Nombre = PersonasgetString(Nombre)

Apellido = PersonasgetString(Apellido)

Edad = PersonasgetInt(Edad)

else

thisPosicion = Posicion

DNI = ----

Nombre = ----

Apellido = ----

Edad = 0

DatosPersona = new ObRegistro(DNINombreApellidoEdad)

Personasclose()

Conexionclose()

SentenciaSQLclose()

Systemoutprintln(StringvalueOf(Posicion)++StringvalueOf(thisPosicion))

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public int Posicion()

return Posicion

public ObRegistro DameDatos() return DatosPersona

ObPosicionamientojava

En este ejemplo se emplean servlets y paacuteginas Web Los clientes habitualmente trabajan en

una computadora remota y los programas se ejecutan en un servidor El mecanismo de

comunicaciones que soporta el protocolo http nos permite consultar en el servidor los datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

que ha seleccionado o escrito el usuario de esta manera se puede observar una disociacioacuten

entre la interfaz graacutefica de usuario (que se ejecuta en los equipos de los clientes) y el

programa que recoge los datos y ejecuta las acciones pertinentes (que se ejecuta en el

servidor)

Como puede observarse el coacutedigo SvAccessoBD es un servlet que lleva a cabo las siguientes

operaciones

1 Recoge los valores provenientes del usuario

2 Determina la naturaleza de la accioacuten a realizar

3 Realiza su cometido con la base de datos

4 Genera la respuesta que recibiraacute el usuario

32 JSP

JSP significa Java Server Pages que traducido quiere decir Paacuteginas de Servidor Java y es

por tanto una tecnologiacutea orientada a crear paacuteginas Web con programacioacuten en JAVA es decir

permite mezclar HTML estaacutendar y estaacutetico con un contenido dinaacutemico etiquetas especiales

(oacuterdenes) y trozos de coacutedigo JAVA (scriptlets o secuencias de oacuterdenes) o contenido dinaacutemico

generado por servlets Eacuteste contenido dinaacutemico se encuentra encerrado en etiquetas

especiales muchas de las cuales inician con lt y finalizan con gt El motor de las paacuteginas

JSP esta basado en los servlets de JAVA

En la tecnologiacutea JSP se crean paacuteginas parecidas a las paacuteginas que se crean en ASP (Active

Server Page de Microsoft) o PHP (Personal Home Page) que son dos tecnologiacuteas de paacuteginas

ejecutadas en el servidor Sin embargo JSP no se cintildee a un sistema operativo o servidor Web

en particular ademaacutes de que proporciona acceso a la tecnologiacutea de Servlets y a JAVA en la

parte dinaacutemica

El proceso para generar paacuteginas JSP accesibles en Web es mucho maacutes simple que en los

servlets Dando por hecho que se tiene un servidor Web que permite usar JSP el coacutedigo se

almacenaraacute en archivos con extensioacuten jsp que incluyen dentro de la estructuras de etiquetas

HTML las sentencias JAVA a ejecutar y tan soacutelo se colocaraacuten en cualquier lugar en donde

se pusiera una paacutegina Web normal sin compilacioacuten sin paquetes y sin configuracioacuten aunque

el servidor tendraacute que ser configurado para acceder a los archivos de clases Servlets y de

JSPs

Aunque lo que se escriba con frecuencia luciraacute como un archivo HTML estaacutendar detraacutes de

ello la paacutegina JSP se convierte automaacuteticamente en un servlet normal donde el HTML

estaacutetico tan soacutelo es enviado al flujo de salida asociado con el meacutetodo service del servlet Esta

traduccioacuten se realiza la primera vez que se solicita la paacutegina De acuerdo como este

configurado el servidor es posible ver el coacutedigo fuente de los servlets generados a partir de

sus paacuteginas JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Por ejemplo supongamos que se ha escrito el siguiente coacutedigo en el archivo Saludojsp

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtEjemplo JSPlttitlegtltheadgt

ltbody bgcolor=ffffccgt

ltcentergt

lth2gtHola mundolth2gt

ltjavautilDate hoy = new javautilDate()gt

La fecha de hoy es lt=hoygt

ltcentergt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional y un fragmento de un scriptlet de JAVA La etiqueta

lt identifica el comienzo del scriptlet y gt el final Una expresioacuten de la forma =variable

es sustituida por el valor de esa variable Para ejecutar esta paacutegina o cualquier otra paacutegina

JSP desde un navegador hay que instalarla en el servidor de aplicaciones de la misma manera

en como se hizo con los servlets Suponiendo entonces que se tiene instalado el Tomcat 5

siga los siguientes pasos

1 Antildeadir en el servidor la carpeta digamos JSP2 dentro de la carpeta webapps del Tomcat

y construir sobre ella la jerarquiacutea de clases ya conocida de los servlets

webappsrarrJSP2rarrWEB-INFrarrclasses

WEB-INFrarrlib

WEB-INFrarrtags

2 Editar en la carpeta WEB-INF el descriptor de despliegue webxml que se indica a

continuacioacuten Este archivo XML indica doacutende se localiza el esquema XML para la

especificacioacuten Servlet 24 que a suvez utiliza el esquema XML para la especificacioacuten

Java Server Page 20 que son las especificaciones que soporta en servidor Tomcat

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=

httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

3 Crear en JSP2 la carpeta saludo que contendraacute la aplicacioacuten y copiar en ella la paacutegina

Saludojsp

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

4 Arrancar el servidor Si el servidor ya estaba arrancado detenerlo y volverlo a arrancar o

bien abrir el explorador escribir el URL httplocalhost8080managerhtml e instalar

la aplicacioacuten

5 Una vez arrancado el servidor verificar si estaacute funcionando correctamente escribiendo

el URL siguiente en el explorador httplocalhost8080 El explorador debe mostrar la

paacutegina del Tomcat

6 Ejecutar la paacutegina JSP iniciando el explorador y escribiendo el URL siguiente

httplocalhost8080JSP2saludoSaludojsp donde la sintaxis geneacuterica es

httpservidor[puerto]MiCarpetapaginajsp

Cuando esta paacutegina (Saludojsp) es invocada por primera vez el motor JSP lleva a cabo una

fase de traduccioacuten de la misma en un servlet y el motor Servlet es el que ejecutaraacute eacuteste uacuteltimo

para generar el HTML dinaacutemico que seraacute enviado al explorador cliente seguacuten puede

deducirse de la figura siguiente La proacutexima vez que la paacutegina sea solicitada el motor JSP

ejecutaraacute el servlet que fue caragado la primera vez a no ser que la paacutegina haya cambiado

en cuyo caso seraacute compilada automaacuteticamente en un nuevo servlet y ejecutada

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Regresando al ejemplo el archivo java generado por el Tomcat a partir del archivo

Saludojsp se localiza en la carpeta workCatalinalocalhost de la instalacioacuten de Tomcat

321 ELEMENTOS PARA SECUENCIAS DE COMANDOS

Los elementos para secuencias de comandos permiten insertar coacutedigo en el servlet que seraacute

generado a partir de la paacutegina JSP Existen tres formas

1 Expresiones del tipo lt= expresioacuten gt que se evaluacutean e insertan en el resultado del

servlet

2 Los scriptlets del tipo lt codigo gt que se insertan en el meacutetodo _jspService del

servlet (ejecutado por service)

3 Las declaraciones del tipo lt Codigo gt que se insertan en el cuerpo de la clase del

servlet fuera de cualquier meacutetodo existente

NOTA Los comentarios en JSP se escriben lt-- Comentario JSP --gt en tanto que los

comentarios en HTML son de la forma lt--Comentario HTML --gt La diferencia

semaacutentica radica en que los comentarios HTML cuando se insertan en la respuesta enviada

por el servidor al cliente no se muestran cuando se visualiza el documento HTML pero si

Servidor Maacutequina Cliente

Explorador Web

Contenedor Web

Motor Servlet

Motor JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

los podemos ver cuando se visualiza el coacutedigo fuente en tanto que los comentarios JSP

aunque se inserten en la respuesta enviada por el servidor al cliente no son enviados al

explorador de forma que tampoco se muestran ni se ven cuando se visualiza el coacutedigo fuente

HTML desde el explorador

3211 EXPRESIONES

Se utiliza una expresioacuten JSP para insertar valores directamente en el resultado La sintaxis es

lt= expresioacuten gt Por ejemplo

lt= requestgetParameter(ldquoparNombre) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt lt= s gt

La fecha y hora actual es lt= new javautilDate() gt

La expresioacuten se evaluacutea se convierte a cadena y se inserta en la paacutegina Esta evaluacioacuten se

realiza durante la ejecucioacuten

32111 VARIABLES PREDEFINIDAS

Para simplificar estas expresiones se pueden utilizar cierta cantidad de variables

predefinidas Estos objetos impliacutecitos como tambieacuten se les llama estaacuten disponibles para su

uso durante la implementacioacuten de una paacutegina Web

bull pageContext Es un objeto de la clase PageContext que proporciona acceso a objetos

relacionados con los servlets

bull request Es un objeto de la clase HttpServletRequest que se puede obtener a traveacutes del

meacutetodo getRequest que encapsula los datos enviados por el cliente al servidor

bull response Es un objeto de la clase HttpServletResponse que puede obtenerse a traveacutes

del meacutetodo getResponse que encapsula los datos que el servidor enviaraacute al cliente

bull application Es un objeto de la clase ServletContext que se obtiene a traveacutes del meacutetodo

getServletContext que define un conjunto de meacutetodos que todo servlet utiliza para

comunicar con el contenedor de servlets

bull config Es un objeto de la clase ServletConfig que se obtiene a traveacutes del meacutetodo

getServletConfig y que se utiliza por el contenedor de servlets para pasar informacioacuten

al servlet durante la iniciacioacuten

bull session Es un objeto de la clase HttpSession que se obtiene a traveacutes del meacutetodo

getSession que proporciona una forma de identificar a un usuario que visita las paacuteginas

de un sitio Web

bull out Es un objeto de la clase JspWriter que se obtiene a traveacutes del meacutetodo getOut que

se utiliza para almacenar la respuesta que seraacute enviada al cliente que hizo la peticioacuten de

la paacutegina

bull page Es un objeto geneacuterico de la clase Object que se obtiene a traveacutes del meacutetodo

getPage y que representa al servlet obtenido a partir de la paacutegina JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

bull exception Es un objeto de la clase Exception que se obtiene a traveacutes del meacutetodo

getException que contendraacute informacioacuten a cerca de cualquier excepcioacuten que se lance

desde la paacutegina JSP

Un ejemplo del uso de uno de estos objetos impliacutecitos seriacutea el siguiente

El nombre de tu host es lt= requestgetRemoteHost() gt

El listado siguiente da un ejemplo de una paacutegina JSP que utiliza algunas variables

predefinidas como uso de expresiones JSP

ltDOCTYPE HTML PUBLIC -W3CDTD HTML 40 Transitional ENgt

lthtmlgt

ltheadgt

lttitlegt Expresiones JSP lttitlegt

ltheadgt

ltbodygt

lth2gt Expresiones JSP lth2gt

ltULgt

ltligt Fecha y hora en curso lt= new javautilDate() gt ltligt

ltligt Nombre de su host lt= requestgetRemoteHost() gt ltligt

ltligt Identificador de su sesioacuten lt= sessiongetId() gt ltligt

ltligt El paraacutemetro ltcodegt paramPrueba ltcodegt del formulario

lt= requestgetParameter(paramPrueba) gt ltligt

ltULgt

ltbodygt

lthtmlgt

Cuya salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3212 LOS SCRIPTLETS JSP

Si se desea hacer algo maacutes complejo que una simple expresioacuten los scriptlets permiten insertar

coacutedigo JAVA en el meacutetodo _jspService del servlet (que es ejecutado por service) La sintaxis

utilizada por los scriptlets es lt coacutedigo java gt Los escriptlets tienen acceso a las

mismas variables definidas de forma automaacutetica como expresiones A manera de ejemplo si

se desea que el resultado aparezca en la paacutegina generada deberiacutea de utilizarse la variable out

como en la siguiente instruccioacuten

lt String datosConsultados= requestgetQueryString()

outprintln(ldquoDatos GET adjuntos ldquo+datosConsultados)

gt

En este ejemplo podriacutea haberse obtenido el mismo resultado utilizando la siguiente expresioacuten

JSP

Datos GET adjuntos lt=requestgetQueryString() gt

En general los scriptlets pueden ejecutar varias tareas que no podriacutean realizarse con las

expresiones Tales tareas incluyen

bull La determinacioacuten de encabezados de respuesta

bull Actualizacioacuten de Bases de Datos

bull Ejecucioacuten de bucles condiciones y otras estructuras complejas

lt for (int i=1 ilt=6 i++)

gt

lth lt=i gtgt Hola Mundo lthlt=i gtgt

lt gt

Como un ejemplo concreto se muestra la siguiente paacutegina JSP llamada Cuentajsp en donde

se observa coacutemo se hace un seguimiento del nuacutemero de veces que un cliente accede a esta

paacutegina a traveacutes de distintas sesiones Para ello supondremos que dicha cuenta es el valor del

atributo atrCuenta del objeto impliacutecito application ya citado La primera vez que el cliente

accede a la paacutegina el valor de atrCuenta seraacute null debido a que auacuten no ha sido fijado este

atributo en este caso se fijaraacute con el valor 1 En los siguientes accesos se leeraacute el valor del

atributo atrCuenta se incrementaraacute en una unidad y se volveraacute a fijar Finalmente se enviacutea

la respuesta al cliente para que se muestre al usuario el valor del contador

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en el objeto impliacutecito application con el nombre

atrCuenta

--gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt

Integer cuenta = (Integer)applicationgetAttribute(atrCuenta)

String s = vez

if (cuenta == null)

cuenta = new Integer(1)

else

cuenta = new Integer(cuentaintValue() + 1)

s = veces

applicationsetAttribute(atrCuenta cuenta)

gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

Has visitado esta paacutegina lt= cuenta gt lt= s gt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional un fragmento de coacutedigo JAVA o scriptlet

expresiones y comentarioshellip

Aquiacute otro ejemplo de la ejecucioacuten de un coacutedigo demasiado complejo para una expresioacuten JSP

Este listado presenta una paacutegina JSP que utiliza el paraacutemetro de peticioacuten colorFondo para

establecer el color de fondo de la paacutegina

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgt

lttitlegt Prueba de Color lttitlegt

ltheadgt

lt

String colorFondo=requestgetParameter(colorFondo)

boolean tieneColorExplicito

if (colorFondo =null)

tieneColorExplicito=true

else

tieneColorExplicito=false

colorFondo=WHITE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt

ltbody bgcolor=lt= colorFondo gtgt

lth2 align=centergt Prueba de color lth2gt

lt

if (tieneColorExplicito)

outprintln(Ha indicado un color de fondo expliacutecito +

colorFondo +)

else

outprintln(Usareacute el color de fondo predeterminado WHITE +

Indique el atributo de peticioacuten

ltigtcolorFondoltigt+

para intentar un color estaacutendar un +

valor RRGGBB o para ver si el navegador Web +

permite el uso de nombres de color X11)

gt

ltbodygt

lthtmlgt

Cuyas posibles salidas son

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3213 DECLARACIONES JSP

Una declaracioacuten JSP permite definir meacutetodos o campos que seraacuten insertados en el cuerpo

principal de la clase del servlet (fuera del meacutetodo _jspService) Una declaracioacuten tiene la

sintaxis lt Coacutedigo Java gt Por ejemplo

lt int i=0 gt

lt

Public void jspinit()

coacutedigo de iniciacioacuten

gt

Una declaracioacuten no genera ninguacuten resultado y se usan junto con las expresiones JSP o los

scriptlets A continuacioacuten se muestra una paacutegina JSP que despliega la cantidad de veces que

se ha solicitado esta paacutegina desde que se arrancoacute el servidor haciendo uso de las

declaraciones JSP

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtDeclaraciones JSPlttitlegtltheadgt

ltbodygt

lth1gtDeclaraciones JSPlth1gt

lt-- Esto es un comentario en JSP --gt

lt private int recuentoAccesos=0 gt

lth2gt Accesos a la paacutegina desde el reinicio del servidor

lt= ++recuentoAccesos gt lth2gt

ltbodygt

lthtmlgt

La salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

322 EL LENGUAJE DE EXPRESION EN JSP 20

Anteriormente se ha visto la necesidad de utilizar fragmentos de coacutedigo java en el desarrollo

de paacuteginas JSP pero con la aparicioacuten de la especificacioacuten JSP 20 ya no hay necesidad de

utilizar fragmentos de coacutedigo Java para nada gracias al nuevo lenguaje de expresioacuten EL

(Expresioacuten Language) a la biblioteca de etiquetas estandar JSTL (JSP Standar Tag Library)

y a las nuevas formas para desarrollar etiquetas personalizadas

El lenguaje de expresioacuten JSP es maacutes un lenguaje de acceso a datos que un lenguaje de

programacioacuten Ya se ha visto que para pasar informacioacuten de un cliente a una paacutegina JSP se

utilizan paraacutemetros en la peticioacuten y atributos en la paacutegina El lenguaje de expresioacuten lo hace

posible sin tener que utilizar scriptlets o expresiones (lt= expresioacuten gt) Por ejemplo las

liacuteneas JSP 12 siguientes escritas utilizando coacutedigo Java

lt= requestgetParameter(ldquoparNombrerdquo) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt veces

bajo la especificacioacuten JSP 20 se pueden escribir de una forma maacutes sencilla como sigue

(ahora no se trata de coacutedigo JAVA)

$paramparNombre has visitado esta paacutegina

$atrCuenta veces

La sintaxis de JSP es sensible a mayuacutesculas y minuacutesculas pero un par de comillas simples es

equivalente a un par de comillas dobles

3221 VARIABLES PREDEFINIDAS (Objetos Impliacutecitos)

El lenguaje de expresioacuten JSP 20 soporta los objetos impliacutecitos siguientes

pageContext Objeto de javaxservletjspPageContext que proporciona acceso a los

datos de una peticioacuten

param Coleccioacuten (objeto de tipo javautilMap) de todos los valores de los paraacutemetros

enviados en una peticioacuten un String por paraacutemetro

paramValues Coleccioacuten de todos los valores de los paraacutemetros enviados en una

peticioacuten una matriz de tipo String por paraacutemetro

header Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten un

String por cabecera

headerValues Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten

una matriz de tipo String por cabecera

cookie Coleccioacuten de todos los valores de las cookies un objeto javaxservlethttpCookie

por cookie

initParam Coleccioacuten de todos los valores de los paraacutemetros de iniciacioacuten de la

aplicacioacuten un String por paraacutemetro

Tambieacuten hay objetos que permiten acceder a variables definidas en diferentes aacutembitos lo que

posibilita compartir informacioacuten

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

pageScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de paacutegina

requestScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

peticioacuten

sessionScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de sesioacuten

applicationScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

aplicacioacuten

3222 DIRECTRICES

Las directrices page incluye y taglib son mensajes para el motor JSP y son siempre incluidas

entre los siacutembolos lt y gt

32221 LA DIRECTRIZ PAGE

Define atributos que se aplican a toda la paacutegina JSP donde es incluida

lt page lista_de_atributos gt

Donde la lista_de_atributos puede contener algunos de los siguientes (aquellos que estaacuten

escritos en negrita son los tomados por omisioacuten)

language= ldquoscriptingLanguagerdquo

extends= rdquoclassNamerdquo

import= ldquoimportListrdquo

session= ldquotrue|falserdquo

buffer= ldquonone|sizeKb

autoflush= ldquotrue|falserdquo

isThreadSafe= rdquotrue|falserdquo

info= rdquoinfo_textrdquo

errorPage= ldquoerror_urlrdquo

isErrorPage= rdquotrue|falserdquo

contentType= rdquoctinfordquo

pageEncoding= rdquopeinfordquo

isELIgnored= ldquotrue|falserdquo

Tiacutepicamente se localiza al principio de la paacutegina JSP y puede haber cualquier nuacutemero de

ellas El lenguaje por omisioacuten es Java Ejemplos

lt page contentType=rdquotexthtmlrdquo language=rdquojavardquo gt

lt page import=rdquojavautil javalangrdquo gt

lt page buffer=rdquo5kbrdquo autoflush=rdquofalserdquo gt

32222 LA DIRECTRIZ INCLUDE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

La directriz include incluye un archivo (html jsp xml o de texto) en una paacutegina JSP Esto

permite dividir el contenido de la paacutegina en trozos maacutes manejables

lt incluye file=rdquoURL_relativordquo gt

El ejemplo siguiente muestra dos archivos el primero incluye al segundo para mostrar la

fecha y hora actuales

lt-- fichero mostrarFechaHorajsp --gt

lthtmlgt

ltheadgtlttitlegtIncluir un ficherolttitlegtltheadgt

ltbody bgcolor=whitegt

ltfont color=bluegt

La fecha y hora actuales son

lt include file=fechaHorajsp gt

ltfontgt

ltbodygt

lthtmlgt

lt-- fichero fechaHorajsp --gt

lt page import=javautil gt

lt= (new javautilDate())toLocaleString() gt

32223 LA DIRECTRIZ TAGLIB

La directriz taglib indica la biblioteca de acciones personalizadas que podremos utilizar en

la codificacioacuten de la paacutegina JSP Para distinguir esas acciones entre otras existentes se utiliza

un prefijo (prefix) Su sintaxis es

lt taglib (uri=rdquoURI_bibliotecardquo|tagdir=rdquoDir_biblioteca_tagrdquo)

prefix=rdquoprefijordquo gt

Cuando se trata de una biblioteca definida mediante una clase Java y un descriptor (archivo

tld) eacutesta se identifica mediante un URI (Uniform Resource Identifier- URL relativos) Por

ejemplo

lt taglib uri=rdquohttpMarioRossainzLopezmiBibliotecardquo

prefix=rdquofunrdquo gt

ltpgtltfunaccion01 gt

La uacuteltima liacutenea del ejemplo tiene dos etiquetas una etiqueta p HTML y otra accion01

perteneciente a la biblioteca miBiblioteca En cambio si la biblioteca se define mediante un

archivo tag entonces se identifica mediante su ruta relativa en el sistema de archivos

lt taglib tagdir=rdquoWEB-INFtagsrdquo prefix=rdquofunrdquo gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpgtltfunaccion01 gt

La directriz taglib debe colocarse antes de utilizar en la paacutegina JSP las acciones

personalizadas definidas por la misma Se puede utilizar maacutes de una directriz pero el prefijo

utilizado debe ser uacutenico para cada una de ellas

3223 ACTIVACION DEL LENGUAJE DE EXPRESION (LE)

La especificacioacuten JSP 20 define un lenguaje de expresioacuten como alternativa a elementos de

programacioacuten escritos con coacutedigo Java y especificaciones anteriores a la JSP 20 Para que

este lenguaje pueda ser interpretado tienen que cumplirse 2 requisitos

1 Que la propiedad isELIgnored de la directriz page valga false

lt page isELIgnored= ldquofalserdquo gt

2 Que el descriptor de despliegue webxml en la carpeta WEB-INF indique doacutende se

localiza el esquema XML para la especificacioacuten Servlet 24 que a su vez utiliza el

esquema XML para la especificacioacuten Java Server Page 20

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

Utilizando el lenguaje de expresioacuten se podriacutea modificar la paacutegina Cuentajsp de la seccioacuten

3212 de este documento como se muestra a continuacioacuten Esta nueva paacutegina

1 Especifica que utilizaraacute la biblioteca core de etiquetas estandar (de la que se hablaraacute maacutes

adelante)

2 La primera vez que sea accedida definiraacute la variable atrCuenta en el aacutembito de la

aplicacioacuten con un valor inicial nulo y la incrementaraacute en una unidad cuando sea accedida

sucesivas veces simplemente incrementaraacute esta variable en una unidad

3 Finalmente mostraraacute una paacutegina con un contenido anaacutelogo al siguiente Esta formado

por una cabecera y una segunda liacutenea compuesta por el valor del paraacutemetro parNombre

enviado con la peticioacuten un texto fijo el valor de la variable atrCuenta y otro texto fijo

dependiente del valor de esta variable

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

El coacutedigo completo es el siguiente

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

3224 VARIABLES Y EXPRESIONES

Para acceder a una simple variable se puede escribir algo como lo siguiente $nombre y

para acceder a una propiedad de un objeto podemos escribir algo como

$paramparNombre

$applicationScopeatrCuenta

$pageContextrequestrequestURI

La primera liacutenea del ejemplo anterior obtiene el valor de la propiedad parNombre del objeto

param la segunda el valor del atributo atrCuenta del objeto applicationScope y la tercera

el URL relativo de la paacutegina JSP solicitada

El lenguaje de expresioacuten es maacutes tolerante con respecto a las variables con valor null y ejecuta

muchas maacutes conversiones de forma automaacutetica sobre el tipo de los datos cuando la expresioacuten

a evaluar asiacute lo requiere Por ejemplo la etiqueta condicional siguiente incluye una expresioacuten

que compara el valor del atributo atrCuenta con aacutembito de aplicacioacuten con 10 (convirtiendo

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

impliacutecitamente el valor del atributo al tipo de la constante para poder realizar la comparacioacuten

El resultado seraacute un valor de tipo boolean

ltcif test=rdquo$applicationScopeatrCuenta gt 10rdquogt

ltcifgt

o bien

ltcif test=rdquo$atrCuenta gt 10rdquogt

ltcifgt

Para que una literal pueda incluir un caracter significativo para el lenguaje dicho caracter

debe ser especificado como una secuencia de escape (caracter) Por ejemplo la siguiente

expresioacuten da lugar al literal ldquovezrdquo o ldquovecesrdquo entre comillas dobles

$(atrCuenta gt 1) iquest ldquordquovecesrdquordquo ldquordquovezrdquordquo

Cualquier objeto o atributo de un objeto definido en algunos de los aacutembitos de una paacutegina

puede ser utilizado como una variable Por ejemplo $atrCuenta+1 es una expresioacuten que

realiza la suma de la variable atrCuenta con 1

Cuando se trate de una propiedad de un objeto para acceder a ella se utilizaraacute el operador

punto o bien la notacioacuten empleada para acceder a un elemento de una matriz Por ejemplo

$paramparNombre

$param[ldquoparNombrerdquo]

Una expresioacuten LE puede aparecer en cualquier lugar donde pueda aparecer un texto fijo Por

tanto para informar al contenedor JSP que se trata de una expresioacuten y no de un texto fijo se

utilizan los delimitadores $ al principio y al final

3225 OPERADORES

OPERADOR DESCRIPCIOacuteN Acceso a la propiedad de un objeto o a un elemento de un Map

[] Acceso al elemento de una matriz o de un objeto List

() Pareacutentesis para alterar la prioridad en la evaluacioacuten de una expresioacuten

If ternario condicion expresion1 expresioacuten 2

+ Suma

- Resta

Producto

oacute div Divisioacuten

oacute mod Moacutedulo o resto de una divisioacuten

== oacute eq Igualdad

= oacute ne Diferente

lt oacute lt Menor que

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt oacute gt Mayor que

lt= oacute le Menor o igual que

gt= oacute ge Mayor o igual que

ampamp oacute and Operacioacuten Loacutegica AND

|| oacute or Operacioacuten Loacutegica OR

oacute not Operacioacuten Loacutegica NOT

empty Verifica si el valor de una variable es null si un String esta vaciacuteo o si una matriz Map

o Collection no tienen elementos

func(args) Llamada a una funcioacuten donde func es el nombre de la funcioacuten y arg representa cero o

maacutes argumentos separados por comas

El ejemplo siguiente muestra una paacutegina JSP compuesta por elementos HTML expresiones

LE y objetos impliacutecitos

lthtmlgt

ltheadgtlttitlegtJSP 20lttitlegtltheadgt

ltbodygt

lth3gtLenguaje de expresioacuten (LE)lth3gt

ltpgtLa siguiente tabla ilustra algunas expresiones LE

ltbrgtltbrgtlttable border=1gt

lttrgt

ltthgtltbgtExpresioacutenltbgtltthgt

ltthgtltbgtValorltbgtltthgt

lttrgt

lttrgt

lttdgt$3 + 6lttdgt

lttdgt$3 + 6lttdgt

lttdgt

lttrgt

lttdgt$(7 gt 4) 7 4lttdgt

lttdgt$(7 gt 4) 7 4lttdgt

lttrgt

lttrgt

lttdgt$header[host]lttdgt

lttdgt$header[host]lttdgt

lttrgt

lttablegt

ltbodygt

lthtmlgt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

323 BIBLIOTECA ESTANDAR DE ETIQUETAS

La biblioteca estaacutendar de etiquetas JSP (JSTL ndash Java Server Page Estaacutendar Tag Library)

incluye una cantidad amplia de etiquetas para diferentes aacutereas de trabajo

Aacuterea baacutesica (su prefijo es c ndash core) y contiene

o Soporte de variables (remove y set)

o Control del flujo (choose when otherwise forEach forTokens if)

o Manejo de URL (import param redirect param y url param)

o Operaciones varias (match y out)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlcore

Aacuterea XML (su prefijo es x) y contiene

o Sentencias baacutesicas (out parse y set)

o Control del flujo (choosehellip whenhellip otherwise forEach e if)

o Transformacioacuten de Documentos (transformhellipparam)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlxml

Aacuterea Internacionalizacioacuten (su prefijo es fmt) Contiene

o Localidad (setLocale y requestEncoding)

o Mensajes (bundle message param y setBundle)

o Formateo de Fechas y nuacutemeros (formatNumber formateacuteate parseDate

parseNumber setTimeZone timeZone)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlfmt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Aacuterea SQL (su prefijo es sql) es el lenguaje estandar para interactuar con bases de datos

relacionales y contiene setDataSource Quero dateParam param transaction y

update dateParam param) El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlsql

Aacuterea Funciones (su prefijo es fn) y contiene

o Longitud de una coleccioacuten (length)

o Manipulacioacuten de String (toUpperCase toLowerCase substring

substringAfter substringBefore trim replace indexOf startsWith

endsWith contains containsIgnoreCase split join y escapeXml)

o El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlfunctions

3231 OPERACIONES CON ETIQUETAS BAacuteSICAS

En un ejemplo pasado teniacuteamos el siguiente coacutedigo

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

En este ejemplo se hace referencia al aacuterea baacutesica de JSTL con el prefijo c y se utiliza la

etiqueta cset para definir la variable atrCuenta Si la variable ya esta definida simplemente

se le asigna el valor especificado

La uacuteltima parte del ejemplo anterior podriacutea haberse escrito de esta otra forma

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcif test=rdquo$atrCuenta gt 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcifgt

$atrCuenta $str

La etiqueta cif permite la ejecucioacuten condicional de su cuerpo en funcioacuten del valor del

atributo de test

La etiqueta cchoose permite la ejecucioacuten del cuerpo de la primera etiqueta cwhen cuyo

atributo test sea evaluado a true Si ninguna de las condiciones se evaluacutea a true entonces se

evaluacutea el cuerpo de la etiqueta cotherwise si estaacute presente El siguiente coacutedigo muestra otra

manera de escribir el ejemplo anterior utilizando estas uacuteltimas etiquetas

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcchoosegt

ltcwhen test=rdquo$atrCuenta == 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcwhengt

ltcotherwisegt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcotherwisegt

ltcchoosegt

$atrCuenta $str

La etiqueta cforEach permite iterar sobre una coleccioacuten de objetos La coleccioacuten se

especifica por medio del atributo iacutetems y el elemento actual de la coleccioacuten estaacute disponible a

traveacutes de la variable establecida por el atributo var Por ejemplo el siguiente fragmento de

coacutedigo visualiza una tabla con las variables definidas a nivel de aacutembito de paacutegina

lttable border=rdquo1rdquogt

ltcforEach var=rdquoitemrdquo iacutetems=rdquo$pageScoperdquogt

lttrgt

lttdgt $item lttdgt

lttrgt

ltcforEachgt

lttablegt

La etiqueta ccatch atrapa una excepcioacuten que ocurra en el cuerpo de la misma Por ejemplo

el siguiente segmento de coacutedigo lanzaraacute una excepcioacuten si el paraacutemetro mes se escribe con

letras en vez de con nuacutemeros

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltbodygt

lthtmlgt

Un URL anaacutelogo al siguiente daraacute lugar a que la excepcioacuten sea lanzada cuando se ejecute la

expresioacuten $nMes 3 de la paacutegina anterior

httplocalhost8080JSP2exceppruebajspmes=marzo

La excepcioacuten indica que ha ocurrido un error al tratar de convertir ldquomarzordquo a un entero de

tipo Long Para cachar esta excepcioacuten y darle un tratamiento adecuado habraacute que modificar

la paacutegina JSP anterior como se indica a continuacioacuten

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltccatch var=rdquoerrorOcurridordquogt

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltccatchgt

ltcif test=rdquo$not empty errorOcurridordquogt

Error el paraacutemetro mes debe ser un nuacutemero ltbgt

ltbrgt Informacioacuten del error dada por el sistema

ltbrgt ltfont color=rdquoFF0000rdquogt $errorOcurrido ltfontgt

ltcifgt

ltbodygt

lthtmlgt

3232 ACCESO A BASES DE DATOS CON JSP

Las etiquetas que proporciona el aacuterea SQL permiten realizar

Conexioacuten con una base de datos

Realizacioacuten de consultas a la base de datos

Acceso al conjunto de resultados

Ejecucioacuten de actualizaciones y transacciones

Todas las etiquetas SQL actuacutean sobre una base de datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

32321 CONEXIOacuteN CON LA BASE DE DATOS

La conexioacuten con la base de datos puede realizarse con la etiqueta sqlsetDataSource Por

ejemplo si se esta utilizando el administrador de bases de datos MySql con el controlador

JDBC se puede realizar una conexioacuten con una base de datos digamos bd_tutorias de la

manera siguiente

ltsqlsetDataSource var=rdquobdrdquo

driver=rdquocommysqljdbcDriverrdquo

url=rdquojdbcmysqllocalhost3306bd_tutoriasrdquo

user=rdquoadminrdquo

password=rdquoadminadminrdquo gt

32322 CONSULTA A LA BASE DE DATOS

La etiqueta sqlQuero permite realizar una consulta a una base de datos Por ejemplo el

siguiente fragmento de coacutedigo realiza una consulta a la base de datos representada por bd y

obtiene un conjunto de resultados representado por cdr

ltsqlquery var=rdquocdrrdquo dataSource=rdquo$bdrdquogt

SELECT professor dia hora alumno

FROM profesores tutorias citas

WHERE profesoresid_profesor=tutoriasid_profesor

AND tutoriasid_tutoria=citasid_tutoria

ltsqlquerygt

32323 MODIFICACIONES SOBRE LA BASE DE DATOS

La etiqueta sqlupdate permite ejecutar una sentencia SQL INSERT UPDATE o DELETE

y cualquier otra sentencia SQL que no retorne ninguacuten valor Por ejemplo

ltsqlupdate var=rdquocontrdquo dataSource=rdquo$bdrdquo gt

UPDATE profesores

SET profesor=

WHERE profesor=

ltsqlparam value=rdquo$paramProfesorrdquo gt

ltsqlparam value=rdquo$paramIDrdquo gt

ltsqlupdategt

Una operacioacuten UPDATE puede utilizar el siacutembolo para indicar que el valor que tendriacutea que

evaluarse en esa posicioacuten seraacute suministrado por una etiqueta sqlparam como por ejemplo

httplocalhost8080JSP2sqlpruebajspProfesor=Mario+Rossainz+LopezampID=514

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lttdgt

lttrgt

ltformgt

lttablegt

ltbodygt

lthtmlgt

SvAccesoBDhtml

import javaio

import javaxservlet

import javaxservlethttp

public class SvAccesoBD extends HttpServlet

private int PosicionBuscada = 1

private String AreaDeListado=

PrintWriter out

public void doGet(HttpServletRequest request HttpServletResponse response)

throws IOException ServletException

String DNI = requestgetParameter(DNI)

String Nombre = requestgetParameter(Nombre)

String Apellido = requestgetParameter(Apellido)

String Edad = requestgetParameter(Edad)

String BotonConsultar = requestgetParameter(BotonConsultar)

String BotonInsertar = requestgetParameter(BotonInsertar)

String BotonModificar = requestgetParameter(BotonModificar)

String BotonBorrar = requestgetParameter(BotonBorrar)

String BotonListar = requestgetParameter(BotonListar)

String BotonPrimero = requestgetParameter(BotonPrimero)

String BotonMenosCinco = requestgetParameter(BotonMenosCinco)

String BotonAnterior = requestgetParameter(BotonAnterior)

String BotonSiguiente = requestgetParameter(BotonSiguiente)

String BotonMasCinco = requestgetParameter(BotonMasCinco)

String BotonUltimo = requestgetParameter(BotonUltimo)

AreaDeListado = requestgetParameter(AreaDeListado)

responsesetContentType(texthtml)

out = responsegetWriter()

outprintln(lthtmlgt)

outprintln(ltbodygt)

if (BotonConsultar=null) ConsultarDatos(DNI)

if (BotonInsertar=null) InsertarDatos(DNINombreApellidoEdad)

if (BotonModificar=null) ModificarDatos(DNINombreApellidoEdad)

if (BotonBorrar=null) BorrarDatos(DNI)

if (BotonListar=null) ListarDatos(DNI)

if (BotonPrimero=null) Controles(1)

if (BotonMenosCinco=null) Controles(2)

if (BotonAnterior=null) Controles(3)

if (BotonSiguiente=null) Controles(4)

if (BotonMasCinco=null) Controles(5)

if (BotonUltimo=null) Controles(0)

outprintln(ltbodygt)

outprintln(lthtmlgt)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

private void ConsultarDatos(String DNI)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObRegistro InstanciaFila = InstanciaConsultaDameDatos()

GenerarRespuesta(InstanciaFilaDameDNI()InstanciaFilaDameNombre()

InstanciaFilaDameApellido()

StringvalueOf(InstanciaFilaDameEdad()))

else

GenerarRespuesta(DNI------------)

PosicionBuscada = 1

public void ListarDatos(String DNI)

ObListado InstanciaListado = new ObListado()

AreaDeListado = InstanciaListadoDameResultado()

ConsultarDatos(DNI)

PosicionBuscada = 1

public void BorrarDatos(String DNI)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObBorrado InstanciaBorrado = new ObBorrado(PosicionBuscada)

GenerarRespuesta()

else

GenerarRespuesta(----------------)

PosicionBuscada = 1

public void ModificarDatos(String DNI String Nombre String Apellido

String Edad)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObRegistro InstanciaFila = new ObRegistro(DNI Nombre Apellido

IntegerparseInt(Edad))

ObModificacion InstanciaModificacion = new ObModificacion(PosicionBuscada

InstanciaFila)

GenerarRespuesta(DNINombreApellidoEdad)

else

GenerarRespuesta(----------------)

PosicionBuscada = 1

public void InsertarDatos(String DNI String Nombre String Apellido

String Edad)

ObRegistro InstanciaFila = new ObRegistro(DNI Nombre Apellido

IntegerparseInt(Edad))

ObInserccion InstanciaInserccion = new ObInserccion(InstanciaFila)

GenerarRespuesta()

PosicionBuscada=1

public void Controles(String Identificador)

ObPosicionamiento InstanciaPosicionamiento =

new ObPosicionamiento(IdentificadorPosicionBuscada)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ObRegistro InstanciaFila = InstanciaPosicionamientoDameDatos()

GenerarRespuesta(InstanciaFilaDameDNI()InstanciaFilaDameNombre()

InstanciaFilaDameApellido()

StringvalueOf(InstanciaFilaDameEdad()))

PosicionBuscada = InstanciaPosicionamientoPosicion()

private void GenerarRespuesta(String DNI String Nombre String Apellido

String Edad)

outprintln(lttable border=1gt)

outprintln(lttrgt)

outprintln(lttdgt)

outprintln(ltform

action=httplocalhost8080directorioTelservletSvAccesoBD

method=getgt)

outprintln( DNI ltinput type=text name=DNI value=+DNI+gtltbrgt)

outprintln( Nombre ltinput type=text name=Nombre

value=+Nombre+gtltbrgt)

outprintln( Apellido ltinput type=text name=Apellido

value=+Apellido+gtltbrgt)

outprintln( Edad ltinput type=text name=Edad

value=+Edad+gtltbrgtltbrgt)

outprintln( ltinput type=submit value=Consultar

name=BotonConsultargt)

outprintln( ltinput type=submit value=Insertar

name=BotonInsertargt)

outprintln( ltinput type=submit value=Modificar

name=BotonModificargt)

outprintln( ltinput type=submit value=Borrar name=BotonBorrargt)

outprintln( ltinput type=submit value=Listar name=BotonListargt

ltbrgt)

outprintln( ltcentergt)

outprintln( ltinput type=submit value= |lt name=BotonPrimerogt)

outprintln( ltinput type=submit value= --

name=BotonMenosCincogt)

outprintln( ltinput type=submit value= - name=BotonAnteriorgt)

outprintln( ltinput type=submit value= +

name=BotonSiguientegt)

outprintln( ltinput type=submit value= ++

name=BotonMasCincogt)

outprintln( ltinput type=submit value= gt| name=BotonUltimogt)

outprintln( ltcentergt)

outprintln( lttdgt)

outprintln( lttdgt)

outprintln( lttextarea name=AreaDeListado rows=10

cols=35gt+AreaDeListado+lttextareagt)

outprintln( lttdgt)

outprintln( lttrgt)

outprintln( ltformgt)

outprintln( lttablegt)

SvAccesoBDjava

import javasql

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

public class ObBorrado

ObBorrado(int PosicionBuscada)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

Personasabsolute(PosicionBuscada)

PersonasdeleteRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

ObBorradojava

import javasql

import javaawtTextArea

public class ObListado

private String Resultado=

ObListado()

String DNI Nombre Apellido Linea

int Edad Posicion

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement()

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

while (Personasnext())

DNI = PersonasgetString(DNI)

Nombre = PersonasgetString(Nombre)

Apellido = PersonasgetString(Apellido)

Edad = PersonasgetInt(Edad)

Posicion = PersonasgetRow()

Linea = DNI+ +Nombre+ +Apellido+ +StringvalueOf(Edad)

Resultado=Resultado+StringvalueOf(Posicion)+ +Linea+n

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public String DameResultado()

return Resultado

ObListadojava

public class ObRegistro

private String DNI Nombre Apellido

private int Edad

ObRegistro (String DNI String Nombre String Apellido int Edad)

thisDNI = DNI

thisNombre = Nombre

thisApellido = Apellido

thisEdad = Edad

String DameDNI()

return DNI

String DameNombre()

return Nombre

String DameApellido()

return Apellido

int DameEdad()

return Edad

ObRegistrojava

import javasql

public class ObConsulta

private int Posicion = 0

private ObRegistro DatosPersona

ObConsulta(String DNIPedido)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement()

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

while (Personasnext())

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

String DNI = PersonasgetString(DNI)

if (DNIequalsIgnoreCase(DNIPedido))

Posicion = PersonasgetRow()

String Nombre = PersonasgetString(Nombre)

String Apellido = PersonasgetString(Apellido)

int Edad = PersonasgetInt(Edad)

DatosPersona = new ObRegistro(DNINombreApellidoEdad)

break

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public int PosicionEncontrada()

return Posicion

public ObRegistro DameDatos()

return DatosPersona

ObConsultajava

import javasql

public class ObInserccion

ObInserccion(ObRegistro Datos)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

PersonasmoveToInsertRow()

PersonasupdateString(DNI DatosDameDNI())

PersonasupdateString(NombreDatosDameNombre())

PersonasupdateString(Apellido DatosDameApellido())

PersonasupdateInt(EdadDatosDameEdad())

PersonasinsertRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

catch (SQLException e)

Systemoutprintln(e)

ObInsercionjava

import javasql

public class ObModificacion

ObModificacion(int PosicionBuscada ObRegistro Datos)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

Personasabsolute(PosicionBuscada)

PersonasupdateString(DNIDatosDameDNI())

PersonasupdateString(NombreDatosDameNombre())

PersonasupdateString(ApellidoDatosDameApellido())

PersonasupdateInt(EdadDatosDameEdad())

PersonasupdateRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

ObModificacionjava

import javasql

public class ObPosicionamiento

private ObRegistro DatosPersona

private int Posicion

ObPosicionamiento(String Accion int Posicion)

int IDAccionEdad

String DNINombreApellido

boolean PosicionCorrecta=false

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

FROM DatosPersonales)

Personasabsolute(Posicion)

IDAccion = IntegerparseInt(Accion)

switch (IDAccion)

case 0

PosicionCorrecta = Personaslast()

break

case 1

PosicionCorrecta = Personasfirst()

break

case 2

PosicionCorrecta = Personasrelative(-5)

break

case 3

PosicionCorrecta = Personasprevious()

break

case 4

PosicionCorrecta = Personasnext()

break

case 5

PosicionCorrecta = Personasrelative(+5)

break

if (PosicionCorrecta)

thisPosicion = PersonasgetRow()

DNI = PersonasgetString(DNI)

Nombre = PersonasgetString(Nombre)

Apellido = PersonasgetString(Apellido)

Edad = PersonasgetInt(Edad)

else

thisPosicion = Posicion

DNI = ----

Nombre = ----

Apellido = ----

Edad = 0

DatosPersona = new ObRegistro(DNINombreApellidoEdad)

Personasclose()

Conexionclose()

SentenciaSQLclose()

Systemoutprintln(StringvalueOf(Posicion)++StringvalueOf(thisPosicion))

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public int Posicion()

return Posicion

public ObRegistro DameDatos() return DatosPersona

ObPosicionamientojava

En este ejemplo se emplean servlets y paacuteginas Web Los clientes habitualmente trabajan en

una computadora remota y los programas se ejecutan en un servidor El mecanismo de

comunicaciones que soporta el protocolo http nos permite consultar en el servidor los datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

que ha seleccionado o escrito el usuario de esta manera se puede observar una disociacioacuten

entre la interfaz graacutefica de usuario (que se ejecuta en los equipos de los clientes) y el

programa que recoge los datos y ejecuta las acciones pertinentes (que se ejecuta en el

servidor)

Como puede observarse el coacutedigo SvAccessoBD es un servlet que lleva a cabo las siguientes

operaciones

1 Recoge los valores provenientes del usuario

2 Determina la naturaleza de la accioacuten a realizar

3 Realiza su cometido con la base de datos

4 Genera la respuesta que recibiraacute el usuario

32 JSP

JSP significa Java Server Pages que traducido quiere decir Paacuteginas de Servidor Java y es

por tanto una tecnologiacutea orientada a crear paacuteginas Web con programacioacuten en JAVA es decir

permite mezclar HTML estaacutendar y estaacutetico con un contenido dinaacutemico etiquetas especiales

(oacuterdenes) y trozos de coacutedigo JAVA (scriptlets o secuencias de oacuterdenes) o contenido dinaacutemico

generado por servlets Eacuteste contenido dinaacutemico se encuentra encerrado en etiquetas

especiales muchas de las cuales inician con lt y finalizan con gt El motor de las paacuteginas

JSP esta basado en los servlets de JAVA

En la tecnologiacutea JSP se crean paacuteginas parecidas a las paacuteginas que se crean en ASP (Active

Server Page de Microsoft) o PHP (Personal Home Page) que son dos tecnologiacuteas de paacuteginas

ejecutadas en el servidor Sin embargo JSP no se cintildee a un sistema operativo o servidor Web

en particular ademaacutes de que proporciona acceso a la tecnologiacutea de Servlets y a JAVA en la

parte dinaacutemica

El proceso para generar paacuteginas JSP accesibles en Web es mucho maacutes simple que en los

servlets Dando por hecho que se tiene un servidor Web que permite usar JSP el coacutedigo se

almacenaraacute en archivos con extensioacuten jsp que incluyen dentro de la estructuras de etiquetas

HTML las sentencias JAVA a ejecutar y tan soacutelo se colocaraacuten en cualquier lugar en donde

se pusiera una paacutegina Web normal sin compilacioacuten sin paquetes y sin configuracioacuten aunque

el servidor tendraacute que ser configurado para acceder a los archivos de clases Servlets y de

JSPs

Aunque lo que se escriba con frecuencia luciraacute como un archivo HTML estaacutendar detraacutes de

ello la paacutegina JSP se convierte automaacuteticamente en un servlet normal donde el HTML

estaacutetico tan soacutelo es enviado al flujo de salida asociado con el meacutetodo service del servlet Esta

traduccioacuten se realiza la primera vez que se solicita la paacutegina De acuerdo como este

configurado el servidor es posible ver el coacutedigo fuente de los servlets generados a partir de

sus paacuteginas JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Por ejemplo supongamos que se ha escrito el siguiente coacutedigo en el archivo Saludojsp

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtEjemplo JSPlttitlegtltheadgt

ltbody bgcolor=ffffccgt

ltcentergt

lth2gtHola mundolth2gt

ltjavautilDate hoy = new javautilDate()gt

La fecha de hoy es lt=hoygt

ltcentergt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional y un fragmento de un scriptlet de JAVA La etiqueta

lt identifica el comienzo del scriptlet y gt el final Una expresioacuten de la forma =variable

es sustituida por el valor de esa variable Para ejecutar esta paacutegina o cualquier otra paacutegina

JSP desde un navegador hay que instalarla en el servidor de aplicaciones de la misma manera

en como se hizo con los servlets Suponiendo entonces que se tiene instalado el Tomcat 5

siga los siguientes pasos

1 Antildeadir en el servidor la carpeta digamos JSP2 dentro de la carpeta webapps del Tomcat

y construir sobre ella la jerarquiacutea de clases ya conocida de los servlets

webappsrarrJSP2rarrWEB-INFrarrclasses

WEB-INFrarrlib

WEB-INFrarrtags

2 Editar en la carpeta WEB-INF el descriptor de despliegue webxml que se indica a

continuacioacuten Este archivo XML indica doacutende se localiza el esquema XML para la

especificacioacuten Servlet 24 que a suvez utiliza el esquema XML para la especificacioacuten

Java Server Page 20 que son las especificaciones que soporta en servidor Tomcat

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=

httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

3 Crear en JSP2 la carpeta saludo que contendraacute la aplicacioacuten y copiar en ella la paacutegina

Saludojsp

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

4 Arrancar el servidor Si el servidor ya estaba arrancado detenerlo y volverlo a arrancar o

bien abrir el explorador escribir el URL httplocalhost8080managerhtml e instalar

la aplicacioacuten

5 Una vez arrancado el servidor verificar si estaacute funcionando correctamente escribiendo

el URL siguiente en el explorador httplocalhost8080 El explorador debe mostrar la

paacutegina del Tomcat

6 Ejecutar la paacutegina JSP iniciando el explorador y escribiendo el URL siguiente

httplocalhost8080JSP2saludoSaludojsp donde la sintaxis geneacuterica es

httpservidor[puerto]MiCarpetapaginajsp

Cuando esta paacutegina (Saludojsp) es invocada por primera vez el motor JSP lleva a cabo una

fase de traduccioacuten de la misma en un servlet y el motor Servlet es el que ejecutaraacute eacuteste uacuteltimo

para generar el HTML dinaacutemico que seraacute enviado al explorador cliente seguacuten puede

deducirse de la figura siguiente La proacutexima vez que la paacutegina sea solicitada el motor JSP

ejecutaraacute el servlet que fue caragado la primera vez a no ser que la paacutegina haya cambiado

en cuyo caso seraacute compilada automaacuteticamente en un nuevo servlet y ejecutada

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Regresando al ejemplo el archivo java generado por el Tomcat a partir del archivo

Saludojsp se localiza en la carpeta workCatalinalocalhost de la instalacioacuten de Tomcat

321 ELEMENTOS PARA SECUENCIAS DE COMANDOS

Los elementos para secuencias de comandos permiten insertar coacutedigo en el servlet que seraacute

generado a partir de la paacutegina JSP Existen tres formas

1 Expresiones del tipo lt= expresioacuten gt que se evaluacutean e insertan en el resultado del

servlet

2 Los scriptlets del tipo lt codigo gt que se insertan en el meacutetodo _jspService del

servlet (ejecutado por service)

3 Las declaraciones del tipo lt Codigo gt que se insertan en el cuerpo de la clase del

servlet fuera de cualquier meacutetodo existente

NOTA Los comentarios en JSP se escriben lt-- Comentario JSP --gt en tanto que los

comentarios en HTML son de la forma lt--Comentario HTML --gt La diferencia

semaacutentica radica en que los comentarios HTML cuando se insertan en la respuesta enviada

por el servidor al cliente no se muestran cuando se visualiza el documento HTML pero si

Servidor Maacutequina Cliente

Explorador Web

Contenedor Web

Motor Servlet

Motor JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

los podemos ver cuando se visualiza el coacutedigo fuente en tanto que los comentarios JSP

aunque se inserten en la respuesta enviada por el servidor al cliente no son enviados al

explorador de forma que tampoco se muestran ni se ven cuando se visualiza el coacutedigo fuente

HTML desde el explorador

3211 EXPRESIONES

Se utiliza una expresioacuten JSP para insertar valores directamente en el resultado La sintaxis es

lt= expresioacuten gt Por ejemplo

lt= requestgetParameter(ldquoparNombre) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt lt= s gt

La fecha y hora actual es lt= new javautilDate() gt

La expresioacuten se evaluacutea se convierte a cadena y se inserta en la paacutegina Esta evaluacioacuten se

realiza durante la ejecucioacuten

32111 VARIABLES PREDEFINIDAS

Para simplificar estas expresiones se pueden utilizar cierta cantidad de variables

predefinidas Estos objetos impliacutecitos como tambieacuten se les llama estaacuten disponibles para su

uso durante la implementacioacuten de una paacutegina Web

bull pageContext Es un objeto de la clase PageContext que proporciona acceso a objetos

relacionados con los servlets

bull request Es un objeto de la clase HttpServletRequest que se puede obtener a traveacutes del

meacutetodo getRequest que encapsula los datos enviados por el cliente al servidor

bull response Es un objeto de la clase HttpServletResponse que puede obtenerse a traveacutes

del meacutetodo getResponse que encapsula los datos que el servidor enviaraacute al cliente

bull application Es un objeto de la clase ServletContext que se obtiene a traveacutes del meacutetodo

getServletContext que define un conjunto de meacutetodos que todo servlet utiliza para

comunicar con el contenedor de servlets

bull config Es un objeto de la clase ServletConfig que se obtiene a traveacutes del meacutetodo

getServletConfig y que se utiliza por el contenedor de servlets para pasar informacioacuten

al servlet durante la iniciacioacuten

bull session Es un objeto de la clase HttpSession que se obtiene a traveacutes del meacutetodo

getSession que proporciona una forma de identificar a un usuario que visita las paacuteginas

de un sitio Web

bull out Es un objeto de la clase JspWriter que se obtiene a traveacutes del meacutetodo getOut que

se utiliza para almacenar la respuesta que seraacute enviada al cliente que hizo la peticioacuten de

la paacutegina

bull page Es un objeto geneacuterico de la clase Object que se obtiene a traveacutes del meacutetodo

getPage y que representa al servlet obtenido a partir de la paacutegina JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

bull exception Es un objeto de la clase Exception que se obtiene a traveacutes del meacutetodo

getException que contendraacute informacioacuten a cerca de cualquier excepcioacuten que se lance

desde la paacutegina JSP

Un ejemplo del uso de uno de estos objetos impliacutecitos seriacutea el siguiente

El nombre de tu host es lt= requestgetRemoteHost() gt

El listado siguiente da un ejemplo de una paacutegina JSP que utiliza algunas variables

predefinidas como uso de expresiones JSP

ltDOCTYPE HTML PUBLIC -W3CDTD HTML 40 Transitional ENgt

lthtmlgt

ltheadgt

lttitlegt Expresiones JSP lttitlegt

ltheadgt

ltbodygt

lth2gt Expresiones JSP lth2gt

ltULgt

ltligt Fecha y hora en curso lt= new javautilDate() gt ltligt

ltligt Nombre de su host lt= requestgetRemoteHost() gt ltligt

ltligt Identificador de su sesioacuten lt= sessiongetId() gt ltligt

ltligt El paraacutemetro ltcodegt paramPrueba ltcodegt del formulario

lt= requestgetParameter(paramPrueba) gt ltligt

ltULgt

ltbodygt

lthtmlgt

Cuya salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3212 LOS SCRIPTLETS JSP

Si se desea hacer algo maacutes complejo que una simple expresioacuten los scriptlets permiten insertar

coacutedigo JAVA en el meacutetodo _jspService del servlet (que es ejecutado por service) La sintaxis

utilizada por los scriptlets es lt coacutedigo java gt Los escriptlets tienen acceso a las

mismas variables definidas de forma automaacutetica como expresiones A manera de ejemplo si

se desea que el resultado aparezca en la paacutegina generada deberiacutea de utilizarse la variable out

como en la siguiente instruccioacuten

lt String datosConsultados= requestgetQueryString()

outprintln(ldquoDatos GET adjuntos ldquo+datosConsultados)

gt

En este ejemplo podriacutea haberse obtenido el mismo resultado utilizando la siguiente expresioacuten

JSP

Datos GET adjuntos lt=requestgetQueryString() gt

En general los scriptlets pueden ejecutar varias tareas que no podriacutean realizarse con las

expresiones Tales tareas incluyen

bull La determinacioacuten de encabezados de respuesta

bull Actualizacioacuten de Bases de Datos

bull Ejecucioacuten de bucles condiciones y otras estructuras complejas

lt for (int i=1 ilt=6 i++)

gt

lth lt=i gtgt Hola Mundo lthlt=i gtgt

lt gt

Como un ejemplo concreto se muestra la siguiente paacutegina JSP llamada Cuentajsp en donde

se observa coacutemo se hace un seguimiento del nuacutemero de veces que un cliente accede a esta

paacutegina a traveacutes de distintas sesiones Para ello supondremos que dicha cuenta es el valor del

atributo atrCuenta del objeto impliacutecito application ya citado La primera vez que el cliente

accede a la paacutegina el valor de atrCuenta seraacute null debido a que auacuten no ha sido fijado este

atributo en este caso se fijaraacute con el valor 1 En los siguientes accesos se leeraacute el valor del

atributo atrCuenta se incrementaraacute en una unidad y se volveraacute a fijar Finalmente se enviacutea

la respuesta al cliente para que se muestre al usuario el valor del contador

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en el objeto impliacutecito application con el nombre

atrCuenta

--gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt

Integer cuenta = (Integer)applicationgetAttribute(atrCuenta)

String s = vez

if (cuenta == null)

cuenta = new Integer(1)

else

cuenta = new Integer(cuentaintValue() + 1)

s = veces

applicationsetAttribute(atrCuenta cuenta)

gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

Has visitado esta paacutegina lt= cuenta gt lt= s gt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional un fragmento de coacutedigo JAVA o scriptlet

expresiones y comentarioshellip

Aquiacute otro ejemplo de la ejecucioacuten de un coacutedigo demasiado complejo para una expresioacuten JSP

Este listado presenta una paacutegina JSP que utiliza el paraacutemetro de peticioacuten colorFondo para

establecer el color de fondo de la paacutegina

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgt

lttitlegt Prueba de Color lttitlegt

ltheadgt

lt

String colorFondo=requestgetParameter(colorFondo)

boolean tieneColorExplicito

if (colorFondo =null)

tieneColorExplicito=true

else

tieneColorExplicito=false

colorFondo=WHITE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt

ltbody bgcolor=lt= colorFondo gtgt

lth2 align=centergt Prueba de color lth2gt

lt

if (tieneColorExplicito)

outprintln(Ha indicado un color de fondo expliacutecito +

colorFondo +)

else

outprintln(Usareacute el color de fondo predeterminado WHITE +

Indique el atributo de peticioacuten

ltigtcolorFondoltigt+

para intentar un color estaacutendar un +

valor RRGGBB o para ver si el navegador Web +

permite el uso de nombres de color X11)

gt

ltbodygt

lthtmlgt

Cuyas posibles salidas son

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3213 DECLARACIONES JSP

Una declaracioacuten JSP permite definir meacutetodos o campos que seraacuten insertados en el cuerpo

principal de la clase del servlet (fuera del meacutetodo _jspService) Una declaracioacuten tiene la

sintaxis lt Coacutedigo Java gt Por ejemplo

lt int i=0 gt

lt

Public void jspinit()

coacutedigo de iniciacioacuten

gt

Una declaracioacuten no genera ninguacuten resultado y se usan junto con las expresiones JSP o los

scriptlets A continuacioacuten se muestra una paacutegina JSP que despliega la cantidad de veces que

se ha solicitado esta paacutegina desde que se arrancoacute el servidor haciendo uso de las

declaraciones JSP

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtDeclaraciones JSPlttitlegtltheadgt

ltbodygt

lth1gtDeclaraciones JSPlth1gt

lt-- Esto es un comentario en JSP --gt

lt private int recuentoAccesos=0 gt

lth2gt Accesos a la paacutegina desde el reinicio del servidor

lt= ++recuentoAccesos gt lth2gt

ltbodygt

lthtmlgt

La salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

322 EL LENGUAJE DE EXPRESION EN JSP 20

Anteriormente se ha visto la necesidad de utilizar fragmentos de coacutedigo java en el desarrollo

de paacuteginas JSP pero con la aparicioacuten de la especificacioacuten JSP 20 ya no hay necesidad de

utilizar fragmentos de coacutedigo Java para nada gracias al nuevo lenguaje de expresioacuten EL

(Expresioacuten Language) a la biblioteca de etiquetas estandar JSTL (JSP Standar Tag Library)

y a las nuevas formas para desarrollar etiquetas personalizadas

El lenguaje de expresioacuten JSP es maacutes un lenguaje de acceso a datos que un lenguaje de

programacioacuten Ya se ha visto que para pasar informacioacuten de un cliente a una paacutegina JSP se

utilizan paraacutemetros en la peticioacuten y atributos en la paacutegina El lenguaje de expresioacuten lo hace

posible sin tener que utilizar scriptlets o expresiones (lt= expresioacuten gt) Por ejemplo las

liacuteneas JSP 12 siguientes escritas utilizando coacutedigo Java

lt= requestgetParameter(ldquoparNombrerdquo) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt veces

bajo la especificacioacuten JSP 20 se pueden escribir de una forma maacutes sencilla como sigue

(ahora no se trata de coacutedigo JAVA)

$paramparNombre has visitado esta paacutegina

$atrCuenta veces

La sintaxis de JSP es sensible a mayuacutesculas y minuacutesculas pero un par de comillas simples es

equivalente a un par de comillas dobles

3221 VARIABLES PREDEFINIDAS (Objetos Impliacutecitos)

El lenguaje de expresioacuten JSP 20 soporta los objetos impliacutecitos siguientes

pageContext Objeto de javaxservletjspPageContext que proporciona acceso a los

datos de una peticioacuten

param Coleccioacuten (objeto de tipo javautilMap) de todos los valores de los paraacutemetros

enviados en una peticioacuten un String por paraacutemetro

paramValues Coleccioacuten de todos los valores de los paraacutemetros enviados en una

peticioacuten una matriz de tipo String por paraacutemetro

header Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten un

String por cabecera

headerValues Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten

una matriz de tipo String por cabecera

cookie Coleccioacuten de todos los valores de las cookies un objeto javaxservlethttpCookie

por cookie

initParam Coleccioacuten de todos los valores de los paraacutemetros de iniciacioacuten de la

aplicacioacuten un String por paraacutemetro

Tambieacuten hay objetos que permiten acceder a variables definidas en diferentes aacutembitos lo que

posibilita compartir informacioacuten

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

pageScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de paacutegina

requestScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

peticioacuten

sessionScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de sesioacuten

applicationScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

aplicacioacuten

3222 DIRECTRICES

Las directrices page incluye y taglib son mensajes para el motor JSP y son siempre incluidas

entre los siacutembolos lt y gt

32221 LA DIRECTRIZ PAGE

Define atributos que se aplican a toda la paacutegina JSP donde es incluida

lt page lista_de_atributos gt

Donde la lista_de_atributos puede contener algunos de los siguientes (aquellos que estaacuten

escritos en negrita son los tomados por omisioacuten)

language= ldquoscriptingLanguagerdquo

extends= rdquoclassNamerdquo

import= ldquoimportListrdquo

session= ldquotrue|falserdquo

buffer= ldquonone|sizeKb

autoflush= ldquotrue|falserdquo

isThreadSafe= rdquotrue|falserdquo

info= rdquoinfo_textrdquo

errorPage= ldquoerror_urlrdquo

isErrorPage= rdquotrue|falserdquo

contentType= rdquoctinfordquo

pageEncoding= rdquopeinfordquo

isELIgnored= ldquotrue|falserdquo

Tiacutepicamente se localiza al principio de la paacutegina JSP y puede haber cualquier nuacutemero de

ellas El lenguaje por omisioacuten es Java Ejemplos

lt page contentType=rdquotexthtmlrdquo language=rdquojavardquo gt

lt page import=rdquojavautil javalangrdquo gt

lt page buffer=rdquo5kbrdquo autoflush=rdquofalserdquo gt

32222 LA DIRECTRIZ INCLUDE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

La directriz include incluye un archivo (html jsp xml o de texto) en una paacutegina JSP Esto

permite dividir el contenido de la paacutegina en trozos maacutes manejables

lt incluye file=rdquoURL_relativordquo gt

El ejemplo siguiente muestra dos archivos el primero incluye al segundo para mostrar la

fecha y hora actuales

lt-- fichero mostrarFechaHorajsp --gt

lthtmlgt

ltheadgtlttitlegtIncluir un ficherolttitlegtltheadgt

ltbody bgcolor=whitegt

ltfont color=bluegt

La fecha y hora actuales son

lt include file=fechaHorajsp gt

ltfontgt

ltbodygt

lthtmlgt

lt-- fichero fechaHorajsp --gt

lt page import=javautil gt

lt= (new javautilDate())toLocaleString() gt

32223 LA DIRECTRIZ TAGLIB

La directriz taglib indica la biblioteca de acciones personalizadas que podremos utilizar en

la codificacioacuten de la paacutegina JSP Para distinguir esas acciones entre otras existentes se utiliza

un prefijo (prefix) Su sintaxis es

lt taglib (uri=rdquoURI_bibliotecardquo|tagdir=rdquoDir_biblioteca_tagrdquo)

prefix=rdquoprefijordquo gt

Cuando se trata de una biblioteca definida mediante una clase Java y un descriptor (archivo

tld) eacutesta se identifica mediante un URI (Uniform Resource Identifier- URL relativos) Por

ejemplo

lt taglib uri=rdquohttpMarioRossainzLopezmiBibliotecardquo

prefix=rdquofunrdquo gt

ltpgtltfunaccion01 gt

La uacuteltima liacutenea del ejemplo tiene dos etiquetas una etiqueta p HTML y otra accion01

perteneciente a la biblioteca miBiblioteca En cambio si la biblioteca se define mediante un

archivo tag entonces se identifica mediante su ruta relativa en el sistema de archivos

lt taglib tagdir=rdquoWEB-INFtagsrdquo prefix=rdquofunrdquo gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpgtltfunaccion01 gt

La directriz taglib debe colocarse antes de utilizar en la paacutegina JSP las acciones

personalizadas definidas por la misma Se puede utilizar maacutes de una directriz pero el prefijo

utilizado debe ser uacutenico para cada una de ellas

3223 ACTIVACION DEL LENGUAJE DE EXPRESION (LE)

La especificacioacuten JSP 20 define un lenguaje de expresioacuten como alternativa a elementos de

programacioacuten escritos con coacutedigo Java y especificaciones anteriores a la JSP 20 Para que

este lenguaje pueda ser interpretado tienen que cumplirse 2 requisitos

1 Que la propiedad isELIgnored de la directriz page valga false

lt page isELIgnored= ldquofalserdquo gt

2 Que el descriptor de despliegue webxml en la carpeta WEB-INF indique doacutende se

localiza el esquema XML para la especificacioacuten Servlet 24 que a su vez utiliza el

esquema XML para la especificacioacuten Java Server Page 20

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

Utilizando el lenguaje de expresioacuten se podriacutea modificar la paacutegina Cuentajsp de la seccioacuten

3212 de este documento como se muestra a continuacioacuten Esta nueva paacutegina

1 Especifica que utilizaraacute la biblioteca core de etiquetas estandar (de la que se hablaraacute maacutes

adelante)

2 La primera vez que sea accedida definiraacute la variable atrCuenta en el aacutembito de la

aplicacioacuten con un valor inicial nulo y la incrementaraacute en una unidad cuando sea accedida

sucesivas veces simplemente incrementaraacute esta variable en una unidad

3 Finalmente mostraraacute una paacutegina con un contenido anaacutelogo al siguiente Esta formado

por una cabecera y una segunda liacutenea compuesta por el valor del paraacutemetro parNombre

enviado con la peticioacuten un texto fijo el valor de la variable atrCuenta y otro texto fijo

dependiente del valor de esta variable

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

El coacutedigo completo es el siguiente

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

3224 VARIABLES Y EXPRESIONES

Para acceder a una simple variable se puede escribir algo como lo siguiente $nombre y

para acceder a una propiedad de un objeto podemos escribir algo como

$paramparNombre

$applicationScopeatrCuenta

$pageContextrequestrequestURI

La primera liacutenea del ejemplo anterior obtiene el valor de la propiedad parNombre del objeto

param la segunda el valor del atributo atrCuenta del objeto applicationScope y la tercera

el URL relativo de la paacutegina JSP solicitada

El lenguaje de expresioacuten es maacutes tolerante con respecto a las variables con valor null y ejecuta

muchas maacutes conversiones de forma automaacutetica sobre el tipo de los datos cuando la expresioacuten

a evaluar asiacute lo requiere Por ejemplo la etiqueta condicional siguiente incluye una expresioacuten

que compara el valor del atributo atrCuenta con aacutembito de aplicacioacuten con 10 (convirtiendo

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

impliacutecitamente el valor del atributo al tipo de la constante para poder realizar la comparacioacuten

El resultado seraacute un valor de tipo boolean

ltcif test=rdquo$applicationScopeatrCuenta gt 10rdquogt

ltcifgt

o bien

ltcif test=rdquo$atrCuenta gt 10rdquogt

ltcifgt

Para que una literal pueda incluir un caracter significativo para el lenguaje dicho caracter

debe ser especificado como una secuencia de escape (caracter) Por ejemplo la siguiente

expresioacuten da lugar al literal ldquovezrdquo o ldquovecesrdquo entre comillas dobles

$(atrCuenta gt 1) iquest ldquordquovecesrdquordquo ldquordquovezrdquordquo

Cualquier objeto o atributo de un objeto definido en algunos de los aacutembitos de una paacutegina

puede ser utilizado como una variable Por ejemplo $atrCuenta+1 es una expresioacuten que

realiza la suma de la variable atrCuenta con 1

Cuando se trate de una propiedad de un objeto para acceder a ella se utilizaraacute el operador

punto o bien la notacioacuten empleada para acceder a un elemento de una matriz Por ejemplo

$paramparNombre

$param[ldquoparNombrerdquo]

Una expresioacuten LE puede aparecer en cualquier lugar donde pueda aparecer un texto fijo Por

tanto para informar al contenedor JSP que se trata de una expresioacuten y no de un texto fijo se

utilizan los delimitadores $ al principio y al final

3225 OPERADORES

OPERADOR DESCRIPCIOacuteN Acceso a la propiedad de un objeto o a un elemento de un Map

[] Acceso al elemento de una matriz o de un objeto List

() Pareacutentesis para alterar la prioridad en la evaluacioacuten de una expresioacuten

If ternario condicion expresion1 expresioacuten 2

+ Suma

- Resta

Producto

oacute div Divisioacuten

oacute mod Moacutedulo o resto de una divisioacuten

== oacute eq Igualdad

= oacute ne Diferente

lt oacute lt Menor que

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt oacute gt Mayor que

lt= oacute le Menor o igual que

gt= oacute ge Mayor o igual que

ampamp oacute and Operacioacuten Loacutegica AND

|| oacute or Operacioacuten Loacutegica OR

oacute not Operacioacuten Loacutegica NOT

empty Verifica si el valor de una variable es null si un String esta vaciacuteo o si una matriz Map

o Collection no tienen elementos

func(args) Llamada a una funcioacuten donde func es el nombre de la funcioacuten y arg representa cero o

maacutes argumentos separados por comas

El ejemplo siguiente muestra una paacutegina JSP compuesta por elementos HTML expresiones

LE y objetos impliacutecitos

lthtmlgt

ltheadgtlttitlegtJSP 20lttitlegtltheadgt

ltbodygt

lth3gtLenguaje de expresioacuten (LE)lth3gt

ltpgtLa siguiente tabla ilustra algunas expresiones LE

ltbrgtltbrgtlttable border=1gt

lttrgt

ltthgtltbgtExpresioacutenltbgtltthgt

ltthgtltbgtValorltbgtltthgt

lttrgt

lttrgt

lttdgt$3 + 6lttdgt

lttdgt$3 + 6lttdgt

lttdgt

lttrgt

lttdgt$(7 gt 4) 7 4lttdgt

lttdgt$(7 gt 4) 7 4lttdgt

lttrgt

lttrgt

lttdgt$header[host]lttdgt

lttdgt$header[host]lttdgt

lttrgt

lttablegt

ltbodygt

lthtmlgt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

323 BIBLIOTECA ESTANDAR DE ETIQUETAS

La biblioteca estaacutendar de etiquetas JSP (JSTL ndash Java Server Page Estaacutendar Tag Library)

incluye una cantidad amplia de etiquetas para diferentes aacutereas de trabajo

Aacuterea baacutesica (su prefijo es c ndash core) y contiene

o Soporte de variables (remove y set)

o Control del flujo (choose when otherwise forEach forTokens if)

o Manejo de URL (import param redirect param y url param)

o Operaciones varias (match y out)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlcore

Aacuterea XML (su prefijo es x) y contiene

o Sentencias baacutesicas (out parse y set)

o Control del flujo (choosehellip whenhellip otherwise forEach e if)

o Transformacioacuten de Documentos (transformhellipparam)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlxml

Aacuterea Internacionalizacioacuten (su prefijo es fmt) Contiene

o Localidad (setLocale y requestEncoding)

o Mensajes (bundle message param y setBundle)

o Formateo de Fechas y nuacutemeros (formatNumber formateacuteate parseDate

parseNumber setTimeZone timeZone)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlfmt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Aacuterea SQL (su prefijo es sql) es el lenguaje estandar para interactuar con bases de datos

relacionales y contiene setDataSource Quero dateParam param transaction y

update dateParam param) El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlsql

Aacuterea Funciones (su prefijo es fn) y contiene

o Longitud de una coleccioacuten (length)

o Manipulacioacuten de String (toUpperCase toLowerCase substring

substringAfter substringBefore trim replace indexOf startsWith

endsWith contains containsIgnoreCase split join y escapeXml)

o El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlfunctions

3231 OPERACIONES CON ETIQUETAS BAacuteSICAS

En un ejemplo pasado teniacuteamos el siguiente coacutedigo

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

En este ejemplo se hace referencia al aacuterea baacutesica de JSTL con el prefijo c y se utiliza la

etiqueta cset para definir la variable atrCuenta Si la variable ya esta definida simplemente

se le asigna el valor especificado

La uacuteltima parte del ejemplo anterior podriacutea haberse escrito de esta otra forma

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcif test=rdquo$atrCuenta gt 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcifgt

$atrCuenta $str

La etiqueta cif permite la ejecucioacuten condicional de su cuerpo en funcioacuten del valor del

atributo de test

La etiqueta cchoose permite la ejecucioacuten del cuerpo de la primera etiqueta cwhen cuyo

atributo test sea evaluado a true Si ninguna de las condiciones se evaluacutea a true entonces se

evaluacutea el cuerpo de la etiqueta cotherwise si estaacute presente El siguiente coacutedigo muestra otra

manera de escribir el ejemplo anterior utilizando estas uacuteltimas etiquetas

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcchoosegt

ltcwhen test=rdquo$atrCuenta == 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcwhengt

ltcotherwisegt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcotherwisegt

ltcchoosegt

$atrCuenta $str

La etiqueta cforEach permite iterar sobre una coleccioacuten de objetos La coleccioacuten se

especifica por medio del atributo iacutetems y el elemento actual de la coleccioacuten estaacute disponible a

traveacutes de la variable establecida por el atributo var Por ejemplo el siguiente fragmento de

coacutedigo visualiza una tabla con las variables definidas a nivel de aacutembito de paacutegina

lttable border=rdquo1rdquogt

ltcforEach var=rdquoitemrdquo iacutetems=rdquo$pageScoperdquogt

lttrgt

lttdgt $item lttdgt

lttrgt

ltcforEachgt

lttablegt

La etiqueta ccatch atrapa una excepcioacuten que ocurra en el cuerpo de la misma Por ejemplo

el siguiente segmento de coacutedigo lanzaraacute una excepcioacuten si el paraacutemetro mes se escribe con

letras en vez de con nuacutemeros

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltbodygt

lthtmlgt

Un URL anaacutelogo al siguiente daraacute lugar a que la excepcioacuten sea lanzada cuando se ejecute la

expresioacuten $nMes 3 de la paacutegina anterior

httplocalhost8080JSP2exceppruebajspmes=marzo

La excepcioacuten indica que ha ocurrido un error al tratar de convertir ldquomarzordquo a un entero de

tipo Long Para cachar esta excepcioacuten y darle un tratamiento adecuado habraacute que modificar

la paacutegina JSP anterior como se indica a continuacioacuten

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltccatch var=rdquoerrorOcurridordquogt

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltccatchgt

ltcif test=rdquo$not empty errorOcurridordquogt

Error el paraacutemetro mes debe ser un nuacutemero ltbgt

ltbrgt Informacioacuten del error dada por el sistema

ltbrgt ltfont color=rdquoFF0000rdquogt $errorOcurrido ltfontgt

ltcifgt

ltbodygt

lthtmlgt

3232 ACCESO A BASES DE DATOS CON JSP

Las etiquetas que proporciona el aacuterea SQL permiten realizar

Conexioacuten con una base de datos

Realizacioacuten de consultas a la base de datos

Acceso al conjunto de resultados

Ejecucioacuten de actualizaciones y transacciones

Todas las etiquetas SQL actuacutean sobre una base de datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

32321 CONEXIOacuteN CON LA BASE DE DATOS

La conexioacuten con la base de datos puede realizarse con la etiqueta sqlsetDataSource Por

ejemplo si se esta utilizando el administrador de bases de datos MySql con el controlador

JDBC se puede realizar una conexioacuten con una base de datos digamos bd_tutorias de la

manera siguiente

ltsqlsetDataSource var=rdquobdrdquo

driver=rdquocommysqljdbcDriverrdquo

url=rdquojdbcmysqllocalhost3306bd_tutoriasrdquo

user=rdquoadminrdquo

password=rdquoadminadminrdquo gt

32322 CONSULTA A LA BASE DE DATOS

La etiqueta sqlQuero permite realizar una consulta a una base de datos Por ejemplo el

siguiente fragmento de coacutedigo realiza una consulta a la base de datos representada por bd y

obtiene un conjunto de resultados representado por cdr

ltsqlquery var=rdquocdrrdquo dataSource=rdquo$bdrdquogt

SELECT professor dia hora alumno

FROM profesores tutorias citas

WHERE profesoresid_profesor=tutoriasid_profesor

AND tutoriasid_tutoria=citasid_tutoria

ltsqlquerygt

32323 MODIFICACIONES SOBRE LA BASE DE DATOS

La etiqueta sqlupdate permite ejecutar una sentencia SQL INSERT UPDATE o DELETE

y cualquier otra sentencia SQL que no retorne ninguacuten valor Por ejemplo

ltsqlupdate var=rdquocontrdquo dataSource=rdquo$bdrdquo gt

UPDATE profesores

SET profesor=

WHERE profesor=

ltsqlparam value=rdquo$paramProfesorrdquo gt

ltsqlparam value=rdquo$paramIDrdquo gt

ltsqlupdategt

Una operacioacuten UPDATE puede utilizar el siacutembolo para indicar que el valor que tendriacutea que

evaluarse en esa posicioacuten seraacute suministrado por una etiqueta sqlparam como por ejemplo

httplocalhost8080JSP2sqlpruebajspProfesor=Mario+Rossainz+LopezampID=514

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

private void ConsultarDatos(String DNI)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObRegistro InstanciaFila = InstanciaConsultaDameDatos()

GenerarRespuesta(InstanciaFilaDameDNI()InstanciaFilaDameNombre()

InstanciaFilaDameApellido()

StringvalueOf(InstanciaFilaDameEdad()))

else

GenerarRespuesta(DNI------------)

PosicionBuscada = 1

public void ListarDatos(String DNI)

ObListado InstanciaListado = new ObListado()

AreaDeListado = InstanciaListadoDameResultado()

ConsultarDatos(DNI)

PosicionBuscada = 1

public void BorrarDatos(String DNI)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObBorrado InstanciaBorrado = new ObBorrado(PosicionBuscada)

GenerarRespuesta()

else

GenerarRespuesta(----------------)

PosicionBuscada = 1

public void ModificarDatos(String DNI String Nombre String Apellido

String Edad)

ObConsulta InstanciaConsulta = new ObConsulta(DNI)

PosicionBuscada = InstanciaConsultaPosicionEncontrada()

if (PosicionBuscada=0)

ObRegistro InstanciaFila = new ObRegistro(DNI Nombre Apellido

IntegerparseInt(Edad))

ObModificacion InstanciaModificacion = new ObModificacion(PosicionBuscada

InstanciaFila)

GenerarRespuesta(DNINombreApellidoEdad)

else

GenerarRespuesta(----------------)

PosicionBuscada = 1

public void InsertarDatos(String DNI String Nombre String Apellido

String Edad)

ObRegistro InstanciaFila = new ObRegistro(DNI Nombre Apellido

IntegerparseInt(Edad))

ObInserccion InstanciaInserccion = new ObInserccion(InstanciaFila)

GenerarRespuesta()

PosicionBuscada=1

public void Controles(String Identificador)

ObPosicionamiento InstanciaPosicionamiento =

new ObPosicionamiento(IdentificadorPosicionBuscada)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ObRegistro InstanciaFila = InstanciaPosicionamientoDameDatos()

GenerarRespuesta(InstanciaFilaDameDNI()InstanciaFilaDameNombre()

InstanciaFilaDameApellido()

StringvalueOf(InstanciaFilaDameEdad()))

PosicionBuscada = InstanciaPosicionamientoPosicion()

private void GenerarRespuesta(String DNI String Nombre String Apellido

String Edad)

outprintln(lttable border=1gt)

outprintln(lttrgt)

outprintln(lttdgt)

outprintln(ltform

action=httplocalhost8080directorioTelservletSvAccesoBD

method=getgt)

outprintln( DNI ltinput type=text name=DNI value=+DNI+gtltbrgt)

outprintln( Nombre ltinput type=text name=Nombre

value=+Nombre+gtltbrgt)

outprintln( Apellido ltinput type=text name=Apellido

value=+Apellido+gtltbrgt)

outprintln( Edad ltinput type=text name=Edad

value=+Edad+gtltbrgtltbrgt)

outprintln( ltinput type=submit value=Consultar

name=BotonConsultargt)

outprintln( ltinput type=submit value=Insertar

name=BotonInsertargt)

outprintln( ltinput type=submit value=Modificar

name=BotonModificargt)

outprintln( ltinput type=submit value=Borrar name=BotonBorrargt)

outprintln( ltinput type=submit value=Listar name=BotonListargt

ltbrgt)

outprintln( ltcentergt)

outprintln( ltinput type=submit value= |lt name=BotonPrimerogt)

outprintln( ltinput type=submit value= --

name=BotonMenosCincogt)

outprintln( ltinput type=submit value= - name=BotonAnteriorgt)

outprintln( ltinput type=submit value= +

name=BotonSiguientegt)

outprintln( ltinput type=submit value= ++

name=BotonMasCincogt)

outprintln( ltinput type=submit value= gt| name=BotonUltimogt)

outprintln( ltcentergt)

outprintln( lttdgt)

outprintln( lttdgt)

outprintln( lttextarea name=AreaDeListado rows=10

cols=35gt+AreaDeListado+lttextareagt)

outprintln( lttdgt)

outprintln( lttrgt)

outprintln( ltformgt)

outprintln( lttablegt)

SvAccesoBDjava

import javasql

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

public class ObBorrado

ObBorrado(int PosicionBuscada)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

Personasabsolute(PosicionBuscada)

PersonasdeleteRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

ObBorradojava

import javasql

import javaawtTextArea

public class ObListado

private String Resultado=

ObListado()

String DNI Nombre Apellido Linea

int Edad Posicion

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement()

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

while (Personasnext())

DNI = PersonasgetString(DNI)

Nombre = PersonasgetString(Nombre)

Apellido = PersonasgetString(Apellido)

Edad = PersonasgetInt(Edad)

Posicion = PersonasgetRow()

Linea = DNI+ +Nombre+ +Apellido+ +StringvalueOf(Edad)

Resultado=Resultado+StringvalueOf(Posicion)+ +Linea+n

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public String DameResultado()

return Resultado

ObListadojava

public class ObRegistro

private String DNI Nombre Apellido

private int Edad

ObRegistro (String DNI String Nombre String Apellido int Edad)

thisDNI = DNI

thisNombre = Nombre

thisApellido = Apellido

thisEdad = Edad

String DameDNI()

return DNI

String DameNombre()

return Nombre

String DameApellido()

return Apellido

int DameEdad()

return Edad

ObRegistrojava

import javasql

public class ObConsulta

private int Posicion = 0

private ObRegistro DatosPersona

ObConsulta(String DNIPedido)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement()

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

while (Personasnext())

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

String DNI = PersonasgetString(DNI)

if (DNIequalsIgnoreCase(DNIPedido))

Posicion = PersonasgetRow()

String Nombre = PersonasgetString(Nombre)

String Apellido = PersonasgetString(Apellido)

int Edad = PersonasgetInt(Edad)

DatosPersona = new ObRegistro(DNINombreApellidoEdad)

break

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public int PosicionEncontrada()

return Posicion

public ObRegistro DameDatos()

return DatosPersona

ObConsultajava

import javasql

public class ObInserccion

ObInserccion(ObRegistro Datos)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

PersonasmoveToInsertRow()

PersonasupdateString(DNI DatosDameDNI())

PersonasupdateString(NombreDatosDameNombre())

PersonasupdateString(Apellido DatosDameApellido())

PersonasupdateInt(EdadDatosDameEdad())

PersonasinsertRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

catch (SQLException e)

Systemoutprintln(e)

ObInsercionjava

import javasql

public class ObModificacion

ObModificacion(int PosicionBuscada ObRegistro Datos)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

Personasabsolute(PosicionBuscada)

PersonasupdateString(DNIDatosDameDNI())

PersonasupdateString(NombreDatosDameNombre())

PersonasupdateString(ApellidoDatosDameApellido())

PersonasupdateInt(EdadDatosDameEdad())

PersonasupdateRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

ObModificacionjava

import javasql

public class ObPosicionamiento

private ObRegistro DatosPersona

private int Posicion

ObPosicionamiento(String Accion int Posicion)

int IDAccionEdad

String DNINombreApellido

boolean PosicionCorrecta=false

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

FROM DatosPersonales)

Personasabsolute(Posicion)

IDAccion = IntegerparseInt(Accion)

switch (IDAccion)

case 0

PosicionCorrecta = Personaslast()

break

case 1

PosicionCorrecta = Personasfirst()

break

case 2

PosicionCorrecta = Personasrelative(-5)

break

case 3

PosicionCorrecta = Personasprevious()

break

case 4

PosicionCorrecta = Personasnext()

break

case 5

PosicionCorrecta = Personasrelative(+5)

break

if (PosicionCorrecta)

thisPosicion = PersonasgetRow()

DNI = PersonasgetString(DNI)

Nombre = PersonasgetString(Nombre)

Apellido = PersonasgetString(Apellido)

Edad = PersonasgetInt(Edad)

else

thisPosicion = Posicion

DNI = ----

Nombre = ----

Apellido = ----

Edad = 0

DatosPersona = new ObRegistro(DNINombreApellidoEdad)

Personasclose()

Conexionclose()

SentenciaSQLclose()

Systemoutprintln(StringvalueOf(Posicion)++StringvalueOf(thisPosicion))

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public int Posicion()

return Posicion

public ObRegistro DameDatos() return DatosPersona

ObPosicionamientojava

En este ejemplo se emplean servlets y paacuteginas Web Los clientes habitualmente trabajan en

una computadora remota y los programas se ejecutan en un servidor El mecanismo de

comunicaciones que soporta el protocolo http nos permite consultar en el servidor los datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

que ha seleccionado o escrito el usuario de esta manera se puede observar una disociacioacuten

entre la interfaz graacutefica de usuario (que se ejecuta en los equipos de los clientes) y el

programa que recoge los datos y ejecuta las acciones pertinentes (que se ejecuta en el

servidor)

Como puede observarse el coacutedigo SvAccessoBD es un servlet que lleva a cabo las siguientes

operaciones

1 Recoge los valores provenientes del usuario

2 Determina la naturaleza de la accioacuten a realizar

3 Realiza su cometido con la base de datos

4 Genera la respuesta que recibiraacute el usuario

32 JSP

JSP significa Java Server Pages que traducido quiere decir Paacuteginas de Servidor Java y es

por tanto una tecnologiacutea orientada a crear paacuteginas Web con programacioacuten en JAVA es decir

permite mezclar HTML estaacutendar y estaacutetico con un contenido dinaacutemico etiquetas especiales

(oacuterdenes) y trozos de coacutedigo JAVA (scriptlets o secuencias de oacuterdenes) o contenido dinaacutemico

generado por servlets Eacuteste contenido dinaacutemico se encuentra encerrado en etiquetas

especiales muchas de las cuales inician con lt y finalizan con gt El motor de las paacuteginas

JSP esta basado en los servlets de JAVA

En la tecnologiacutea JSP se crean paacuteginas parecidas a las paacuteginas que se crean en ASP (Active

Server Page de Microsoft) o PHP (Personal Home Page) que son dos tecnologiacuteas de paacuteginas

ejecutadas en el servidor Sin embargo JSP no se cintildee a un sistema operativo o servidor Web

en particular ademaacutes de que proporciona acceso a la tecnologiacutea de Servlets y a JAVA en la

parte dinaacutemica

El proceso para generar paacuteginas JSP accesibles en Web es mucho maacutes simple que en los

servlets Dando por hecho que se tiene un servidor Web que permite usar JSP el coacutedigo se

almacenaraacute en archivos con extensioacuten jsp que incluyen dentro de la estructuras de etiquetas

HTML las sentencias JAVA a ejecutar y tan soacutelo se colocaraacuten en cualquier lugar en donde

se pusiera una paacutegina Web normal sin compilacioacuten sin paquetes y sin configuracioacuten aunque

el servidor tendraacute que ser configurado para acceder a los archivos de clases Servlets y de

JSPs

Aunque lo que se escriba con frecuencia luciraacute como un archivo HTML estaacutendar detraacutes de

ello la paacutegina JSP se convierte automaacuteticamente en un servlet normal donde el HTML

estaacutetico tan soacutelo es enviado al flujo de salida asociado con el meacutetodo service del servlet Esta

traduccioacuten se realiza la primera vez que se solicita la paacutegina De acuerdo como este

configurado el servidor es posible ver el coacutedigo fuente de los servlets generados a partir de

sus paacuteginas JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Por ejemplo supongamos que se ha escrito el siguiente coacutedigo en el archivo Saludojsp

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtEjemplo JSPlttitlegtltheadgt

ltbody bgcolor=ffffccgt

ltcentergt

lth2gtHola mundolth2gt

ltjavautilDate hoy = new javautilDate()gt

La fecha de hoy es lt=hoygt

ltcentergt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional y un fragmento de un scriptlet de JAVA La etiqueta

lt identifica el comienzo del scriptlet y gt el final Una expresioacuten de la forma =variable

es sustituida por el valor de esa variable Para ejecutar esta paacutegina o cualquier otra paacutegina

JSP desde un navegador hay que instalarla en el servidor de aplicaciones de la misma manera

en como se hizo con los servlets Suponiendo entonces que se tiene instalado el Tomcat 5

siga los siguientes pasos

1 Antildeadir en el servidor la carpeta digamos JSP2 dentro de la carpeta webapps del Tomcat

y construir sobre ella la jerarquiacutea de clases ya conocida de los servlets

webappsrarrJSP2rarrWEB-INFrarrclasses

WEB-INFrarrlib

WEB-INFrarrtags

2 Editar en la carpeta WEB-INF el descriptor de despliegue webxml que se indica a

continuacioacuten Este archivo XML indica doacutende se localiza el esquema XML para la

especificacioacuten Servlet 24 que a suvez utiliza el esquema XML para la especificacioacuten

Java Server Page 20 que son las especificaciones que soporta en servidor Tomcat

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=

httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

3 Crear en JSP2 la carpeta saludo que contendraacute la aplicacioacuten y copiar en ella la paacutegina

Saludojsp

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

4 Arrancar el servidor Si el servidor ya estaba arrancado detenerlo y volverlo a arrancar o

bien abrir el explorador escribir el URL httplocalhost8080managerhtml e instalar

la aplicacioacuten

5 Una vez arrancado el servidor verificar si estaacute funcionando correctamente escribiendo

el URL siguiente en el explorador httplocalhost8080 El explorador debe mostrar la

paacutegina del Tomcat

6 Ejecutar la paacutegina JSP iniciando el explorador y escribiendo el URL siguiente

httplocalhost8080JSP2saludoSaludojsp donde la sintaxis geneacuterica es

httpservidor[puerto]MiCarpetapaginajsp

Cuando esta paacutegina (Saludojsp) es invocada por primera vez el motor JSP lleva a cabo una

fase de traduccioacuten de la misma en un servlet y el motor Servlet es el que ejecutaraacute eacuteste uacuteltimo

para generar el HTML dinaacutemico que seraacute enviado al explorador cliente seguacuten puede

deducirse de la figura siguiente La proacutexima vez que la paacutegina sea solicitada el motor JSP

ejecutaraacute el servlet que fue caragado la primera vez a no ser que la paacutegina haya cambiado

en cuyo caso seraacute compilada automaacuteticamente en un nuevo servlet y ejecutada

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Regresando al ejemplo el archivo java generado por el Tomcat a partir del archivo

Saludojsp se localiza en la carpeta workCatalinalocalhost de la instalacioacuten de Tomcat

321 ELEMENTOS PARA SECUENCIAS DE COMANDOS

Los elementos para secuencias de comandos permiten insertar coacutedigo en el servlet que seraacute

generado a partir de la paacutegina JSP Existen tres formas

1 Expresiones del tipo lt= expresioacuten gt que se evaluacutean e insertan en el resultado del

servlet

2 Los scriptlets del tipo lt codigo gt que se insertan en el meacutetodo _jspService del

servlet (ejecutado por service)

3 Las declaraciones del tipo lt Codigo gt que se insertan en el cuerpo de la clase del

servlet fuera de cualquier meacutetodo existente

NOTA Los comentarios en JSP se escriben lt-- Comentario JSP --gt en tanto que los

comentarios en HTML son de la forma lt--Comentario HTML --gt La diferencia

semaacutentica radica en que los comentarios HTML cuando se insertan en la respuesta enviada

por el servidor al cliente no se muestran cuando se visualiza el documento HTML pero si

Servidor Maacutequina Cliente

Explorador Web

Contenedor Web

Motor Servlet

Motor JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

los podemos ver cuando se visualiza el coacutedigo fuente en tanto que los comentarios JSP

aunque se inserten en la respuesta enviada por el servidor al cliente no son enviados al

explorador de forma que tampoco se muestran ni se ven cuando se visualiza el coacutedigo fuente

HTML desde el explorador

3211 EXPRESIONES

Se utiliza una expresioacuten JSP para insertar valores directamente en el resultado La sintaxis es

lt= expresioacuten gt Por ejemplo

lt= requestgetParameter(ldquoparNombre) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt lt= s gt

La fecha y hora actual es lt= new javautilDate() gt

La expresioacuten se evaluacutea se convierte a cadena y se inserta en la paacutegina Esta evaluacioacuten se

realiza durante la ejecucioacuten

32111 VARIABLES PREDEFINIDAS

Para simplificar estas expresiones se pueden utilizar cierta cantidad de variables

predefinidas Estos objetos impliacutecitos como tambieacuten se les llama estaacuten disponibles para su

uso durante la implementacioacuten de una paacutegina Web

bull pageContext Es un objeto de la clase PageContext que proporciona acceso a objetos

relacionados con los servlets

bull request Es un objeto de la clase HttpServletRequest que se puede obtener a traveacutes del

meacutetodo getRequest que encapsula los datos enviados por el cliente al servidor

bull response Es un objeto de la clase HttpServletResponse que puede obtenerse a traveacutes

del meacutetodo getResponse que encapsula los datos que el servidor enviaraacute al cliente

bull application Es un objeto de la clase ServletContext que se obtiene a traveacutes del meacutetodo

getServletContext que define un conjunto de meacutetodos que todo servlet utiliza para

comunicar con el contenedor de servlets

bull config Es un objeto de la clase ServletConfig que se obtiene a traveacutes del meacutetodo

getServletConfig y que se utiliza por el contenedor de servlets para pasar informacioacuten

al servlet durante la iniciacioacuten

bull session Es un objeto de la clase HttpSession que se obtiene a traveacutes del meacutetodo

getSession que proporciona una forma de identificar a un usuario que visita las paacuteginas

de un sitio Web

bull out Es un objeto de la clase JspWriter que se obtiene a traveacutes del meacutetodo getOut que

se utiliza para almacenar la respuesta que seraacute enviada al cliente que hizo la peticioacuten de

la paacutegina

bull page Es un objeto geneacuterico de la clase Object que se obtiene a traveacutes del meacutetodo

getPage y que representa al servlet obtenido a partir de la paacutegina JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

bull exception Es un objeto de la clase Exception que se obtiene a traveacutes del meacutetodo

getException que contendraacute informacioacuten a cerca de cualquier excepcioacuten que se lance

desde la paacutegina JSP

Un ejemplo del uso de uno de estos objetos impliacutecitos seriacutea el siguiente

El nombre de tu host es lt= requestgetRemoteHost() gt

El listado siguiente da un ejemplo de una paacutegina JSP que utiliza algunas variables

predefinidas como uso de expresiones JSP

ltDOCTYPE HTML PUBLIC -W3CDTD HTML 40 Transitional ENgt

lthtmlgt

ltheadgt

lttitlegt Expresiones JSP lttitlegt

ltheadgt

ltbodygt

lth2gt Expresiones JSP lth2gt

ltULgt

ltligt Fecha y hora en curso lt= new javautilDate() gt ltligt

ltligt Nombre de su host lt= requestgetRemoteHost() gt ltligt

ltligt Identificador de su sesioacuten lt= sessiongetId() gt ltligt

ltligt El paraacutemetro ltcodegt paramPrueba ltcodegt del formulario

lt= requestgetParameter(paramPrueba) gt ltligt

ltULgt

ltbodygt

lthtmlgt

Cuya salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3212 LOS SCRIPTLETS JSP

Si se desea hacer algo maacutes complejo que una simple expresioacuten los scriptlets permiten insertar

coacutedigo JAVA en el meacutetodo _jspService del servlet (que es ejecutado por service) La sintaxis

utilizada por los scriptlets es lt coacutedigo java gt Los escriptlets tienen acceso a las

mismas variables definidas de forma automaacutetica como expresiones A manera de ejemplo si

se desea que el resultado aparezca en la paacutegina generada deberiacutea de utilizarse la variable out

como en la siguiente instruccioacuten

lt String datosConsultados= requestgetQueryString()

outprintln(ldquoDatos GET adjuntos ldquo+datosConsultados)

gt

En este ejemplo podriacutea haberse obtenido el mismo resultado utilizando la siguiente expresioacuten

JSP

Datos GET adjuntos lt=requestgetQueryString() gt

En general los scriptlets pueden ejecutar varias tareas que no podriacutean realizarse con las

expresiones Tales tareas incluyen

bull La determinacioacuten de encabezados de respuesta

bull Actualizacioacuten de Bases de Datos

bull Ejecucioacuten de bucles condiciones y otras estructuras complejas

lt for (int i=1 ilt=6 i++)

gt

lth lt=i gtgt Hola Mundo lthlt=i gtgt

lt gt

Como un ejemplo concreto se muestra la siguiente paacutegina JSP llamada Cuentajsp en donde

se observa coacutemo se hace un seguimiento del nuacutemero de veces que un cliente accede a esta

paacutegina a traveacutes de distintas sesiones Para ello supondremos que dicha cuenta es el valor del

atributo atrCuenta del objeto impliacutecito application ya citado La primera vez que el cliente

accede a la paacutegina el valor de atrCuenta seraacute null debido a que auacuten no ha sido fijado este

atributo en este caso se fijaraacute con el valor 1 En los siguientes accesos se leeraacute el valor del

atributo atrCuenta se incrementaraacute en una unidad y se volveraacute a fijar Finalmente se enviacutea

la respuesta al cliente para que se muestre al usuario el valor del contador

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en el objeto impliacutecito application con el nombre

atrCuenta

--gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt

Integer cuenta = (Integer)applicationgetAttribute(atrCuenta)

String s = vez

if (cuenta == null)

cuenta = new Integer(1)

else

cuenta = new Integer(cuentaintValue() + 1)

s = veces

applicationsetAttribute(atrCuenta cuenta)

gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

Has visitado esta paacutegina lt= cuenta gt lt= s gt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional un fragmento de coacutedigo JAVA o scriptlet

expresiones y comentarioshellip

Aquiacute otro ejemplo de la ejecucioacuten de un coacutedigo demasiado complejo para una expresioacuten JSP

Este listado presenta una paacutegina JSP que utiliza el paraacutemetro de peticioacuten colorFondo para

establecer el color de fondo de la paacutegina

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgt

lttitlegt Prueba de Color lttitlegt

ltheadgt

lt

String colorFondo=requestgetParameter(colorFondo)

boolean tieneColorExplicito

if (colorFondo =null)

tieneColorExplicito=true

else

tieneColorExplicito=false

colorFondo=WHITE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt

ltbody bgcolor=lt= colorFondo gtgt

lth2 align=centergt Prueba de color lth2gt

lt

if (tieneColorExplicito)

outprintln(Ha indicado un color de fondo expliacutecito +

colorFondo +)

else

outprintln(Usareacute el color de fondo predeterminado WHITE +

Indique el atributo de peticioacuten

ltigtcolorFondoltigt+

para intentar un color estaacutendar un +

valor RRGGBB o para ver si el navegador Web +

permite el uso de nombres de color X11)

gt

ltbodygt

lthtmlgt

Cuyas posibles salidas son

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3213 DECLARACIONES JSP

Una declaracioacuten JSP permite definir meacutetodos o campos que seraacuten insertados en el cuerpo

principal de la clase del servlet (fuera del meacutetodo _jspService) Una declaracioacuten tiene la

sintaxis lt Coacutedigo Java gt Por ejemplo

lt int i=0 gt

lt

Public void jspinit()

coacutedigo de iniciacioacuten

gt

Una declaracioacuten no genera ninguacuten resultado y se usan junto con las expresiones JSP o los

scriptlets A continuacioacuten se muestra una paacutegina JSP que despliega la cantidad de veces que

se ha solicitado esta paacutegina desde que se arrancoacute el servidor haciendo uso de las

declaraciones JSP

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtDeclaraciones JSPlttitlegtltheadgt

ltbodygt

lth1gtDeclaraciones JSPlth1gt

lt-- Esto es un comentario en JSP --gt

lt private int recuentoAccesos=0 gt

lth2gt Accesos a la paacutegina desde el reinicio del servidor

lt= ++recuentoAccesos gt lth2gt

ltbodygt

lthtmlgt

La salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

322 EL LENGUAJE DE EXPRESION EN JSP 20

Anteriormente se ha visto la necesidad de utilizar fragmentos de coacutedigo java en el desarrollo

de paacuteginas JSP pero con la aparicioacuten de la especificacioacuten JSP 20 ya no hay necesidad de

utilizar fragmentos de coacutedigo Java para nada gracias al nuevo lenguaje de expresioacuten EL

(Expresioacuten Language) a la biblioteca de etiquetas estandar JSTL (JSP Standar Tag Library)

y a las nuevas formas para desarrollar etiquetas personalizadas

El lenguaje de expresioacuten JSP es maacutes un lenguaje de acceso a datos que un lenguaje de

programacioacuten Ya se ha visto que para pasar informacioacuten de un cliente a una paacutegina JSP se

utilizan paraacutemetros en la peticioacuten y atributos en la paacutegina El lenguaje de expresioacuten lo hace

posible sin tener que utilizar scriptlets o expresiones (lt= expresioacuten gt) Por ejemplo las

liacuteneas JSP 12 siguientes escritas utilizando coacutedigo Java

lt= requestgetParameter(ldquoparNombrerdquo) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt veces

bajo la especificacioacuten JSP 20 se pueden escribir de una forma maacutes sencilla como sigue

(ahora no se trata de coacutedigo JAVA)

$paramparNombre has visitado esta paacutegina

$atrCuenta veces

La sintaxis de JSP es sensible a mayuacutesculas y minuacutesculas pero un par de comillas simples es

equivalente a un par de comillas dobles

3221 VARIABLES PREDEFINIDAS (Objetos Impliacutecitos)

El lenguaje de expresioacuten JSP 20 soporta los objetos impliacutecitos siguientes

pageContext Objeto de javaxservletjspPageContext que proporciona acceso a los

datos de una peticioacuten

param Coleccioacuten (objeto de tipo javautilMap) de todos los valores de los paraacutemetros

enviados en una peticioacuten un String por paraacutemetro

paramValues Coleccioacuten de todos los valores de los paraacutemetros enviados en una

peticioacuten una matriz de tipo String por paraacutemetro

header Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten un

String por cabecera

headerValues Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten

una matriz de tipo String por cabecera

cookie Coleccioacuten de todos los valores de las cookies un objeto javaxservlethttpCookie

por cookie

initParam Coleccioacuten de todos los valores de los paraacutemetros de iniciacioacuten de la

aplicacioacuten un String por paraacutemetro

Tambieacuten hay objetos que permiten acceder a variables definidas en diferentes aacutembitos lo que

posibilita compartir informacioacuten

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

pageScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de paacutegina

requestScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

peticioacuten

sessionScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de sesioacuten

applicationScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

aplicacioacuten

3222 DIRECTRICES

Las directrices page incluye y taglib son mensajes para el motor JSP y son siempre incluidas

entre los siacutembolos lt y gt

32221 LA DIRECTRIZ PAGE

Define atributos que se aplican a toda la paacutegina JSP donde es incluida

lt page lista_de_atributos gt

Donde la lista_de_atributos puede contener algunos de los siguientes (aquellos que estaacuten

escritos en negrita son los tomados por omisioacuten)

language= ldquoscriptingLanguagerdquo

extends= rdquoclassNamerdquo

import= ldquoimportListrdquo

session= ldquotrue|falserdquo

buffer= ldquonone|sizeKb

autoflush= ldquotrue|falserdquo

isThreadSafe= rdquotrue|falserdquo

info= rdquoinfo_textrdquo

errorPage= ldquoerror_urlrdquo

isErrorPage= rdquotrue|falserdquo

contentType= rdquoctinfordquo

pageEncoding= rdquopeinfordquo

isELIgnored= ldquotrue|falserdquo

Tiacutepicamente se localiza al principio de la paacutegina JSP y puede haber cualquier nuacutemero de

ellas El lenguaje por omisioacuten es Java Ejemplos

lt page contentType=rdquotexthtmlrdquo language=rdquojavardquo gt

lt page import=rdquojavautil javalangrdquo gt

lt page buffer=rdquo5kbrdquo autoflush=rdquofalserdquo gt

32222 LA DIRECTRIZ INCLUDE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

La directriz include incluye un archivo (html jsp xml o de texto) en una paacutegina JSP Esto

permite dividir el contenido de la paacutegina en trozos maacutes manejables

lt incluye file=rdquoURL_relativordquo gt

El ejemplo siguiente muestra dos archivos el primero incluye al segundo para mostrar la

fecha y hora actuales

lt-- fichero mostrarFechaHorajsp --gt

lthtmlgt

ltheadgtlttitlegtIncluir un ficherolttitlegtltheadgt

ltbody bgcolor=whitegt

ltfont color=bluegt

La fecha y hora actuales son

lt include file=fechaHorajsp gt

ltfontgt

ltbodygt

lthtmlgt

lt-- fichero fechaHorajsp --gt

lt page import=javautil gt

lt= (new javautilDate())toLocaleString() gt

32223 LA DIRECTRIZ TAGLIB

La directriz taglib indica la biblioteca de acciones personalizadas que podremos utilizar en

la codificacioacuten de la paacutegina JSP Para distinguir esas acciones entre otras existentes se utiliza

un prefijo (prefix) Su sintaxis es

lt taglib (uri=rdquoURI_bibliotecardquo|tagdir=rdquoDir_biblioteca_tagrdquo)

prefix=rdquoprefijordquo gt

Cuando se trata de una biblioteca definida mediante una clase Java y un descriptor (archivo

tld) eacutesta se identifica mediante un URI (Uniform Resource Identifier- URL relativos) Por

ejemplo

lt taglib uri=rdquohttpMarioRossainzLopezmiBibliotecardquo

prefix=rdquofunrdquo gt

ltpgtltfunaccion01 gt

La uacuteltima liacutenea del ejemplo tiene dos etiquetas una etiqueta p HTML y otra accion01

perteneciente a la biblioteca miBiblioteca En cambio si la biblioteca se define mediante un

archivo tag entonces se identifica mediante su ruta relativa en el sistema de archivos

lt taglib tagdir=rdquoWEB-INFtagsrdquo prefix=rdquofunrdquo gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpgtltfunaccion01 gt

La directriz taglib debe colocarse antes de utilizar en la paacutegina JSP las acciones

personalizadas definidas por la misma Se puede utilizar maacutes de una directriz pero el prefijo

utilizado debe ser uacutenico para cada una de ellas

3223 ACTIVACION DEL LENGUAJE DE EXPRESION (LE)

La especificacioacuten JSP 20 define un lenguaje de expresioacuten como alternativa a elementos de

programacioacuten escritos con coacutedigo Java y especificaciones anteriores a la JSP 20 Para que

este lenguaje pueda ser interpretado tienen que cumplirse 2 requisitos

1 Que la propiedad isELIgnored de la directriz page valga false

lt page isELIgnored= ldquofalserdquo gt

2 Que el descriptor de despliegue webxml en la carpeta WEB-INF indique doacutende se

localiza el esquema XML para la especificacioacuten Servlet 24 que a su vez utiliza el

esquema XML para la especificacioacuten Java Server Page 20

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

Utilizando el lenguaje de expresioacuten se podriacutea modificar la paacutegina Cuentajsp de la seccioacuten

3212 de este documento como se muestra a continuacioacuten Esta nueva paacutegina

1 Especifica que utilizaraacute la biblioteca core de etiquetas estandar (de la que se hablaraacute maacutes

adelante)

2 La primera vez que sea accedida definiraacute la variable atrCuenta en el aacutembito de la

aplicacioacuten con un valor inicial nulo y la incrementaraacute en una unidad cuando sea accedida

sucesivas veces simplemente incrementaraacute esta variable en una unidad

3 Finalmente mostraraacute una paacutegina con un contenido anaacutelogo al siguiente Esta formado

por una cabecera y una segunda liacutenea compuesta por el valor del paraacutemetro parNombre

enviado con la peticioacuten un texto fijo el valor de la variable atrCuenta y otro texto fijo

dependiente del valor de esta variable

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

El coacutedigo completo es el siguiente

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

3224 VARIABLES Y EXPRESIONES

Para acceder a una simple variable se puede escribir algo como lo siguiente $nombre y

para acceder a una propiedad de un objeto podemos escribir algo como

$paramparNombre

$applicationScopeatrCuenta

$pageContextrequestrequestURI

La primera liacutenea del ejemplo anterior obtiene el valor de la propiedad parNombre del objeto

param la segunda el valor del atributo atrCuenta del objeto applicationScope y la tercera

el URL relativo de la paacutegina JSP solicitada

El lenguaje de expresioacuten es maacutes tolerante con respecto a las variables con valor null y ejecuta

muchas maacutes conversiones de forma automaacutetica sobre el tipo de los datos cuando la expresioacuten

a evaluar asiacute lo requiere Por ejemplo la etiqueta condicional siguiente incluye una expresioacuten

que compara el valor del atributo atrCuenta con aacutembito de aplicacioacuten con 10 (convirtiendo

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

impliacutecitamente el valor del atributo al tipo de la constante para poder realizar la comparacioacuten

El resultado seraacute un valor de tipo boolean

ltcif test=rdquo$applicationScopeatrCuenta gt 10rdquogt

ltcifgt

o bien

ltcif test=rdquo$atrCuenta gt 10rdquogt

ltcifgt

Para que una literal pueda incluir un caracter significativo para el lenguaje dicho caracter

debe ser especificado como una secuencia de escape (caracter) Por ejemplo la siguiente

expresioacuten da lugar al literal ldquovezrdquo o ldquovecesrdquo entre comillas dobles

$(atrCuenta gt 1) iquest ldquordquovecesrdquordquo ldquordquovezrdquordquo

Cualquier objeto o atributo de un objeto definido en algunos de los aacutembitos de una paacutegina

puede ser utilizado como una variable Por ejemplo $atrCuenta+1 es una expresioacuten que

realiza la suma de la variable atrCuenta con 1

Cuando se trate de una propiedad de un objeto para acceder a ella se utilizaraacute el operador

punto o bien la notacioacuten empleada para acceder a un elemento de una matriz Por ejemplo

$paramparNombre

$param[ldquoparNombrerdquo]

Una expresioacuten LE puede aparecer en cualquier lugar donde pueda aparecer un texto fijo Por

tanto para informar al contenedor JSP que se trata de una expresioacuten y no de un texto fijo se

utilizan los delimitadores $ al principio y al final

3225 OPERADORES

OPERADOR DESCRIPCIOacuteN Acceso a la propiedad de un objeto o a un elemento de un Map

[] Acceso al elemento de una matriz o de un objeto List

() Pareacutentesis para alterar la prioridad en la evaluacioacuten de una expresioacuten

If ternario condicion expresion1 expresioacuten 2

+ Suma

- Resta

Producto

oacute div Divisioacuten

oacute mod Moacutedulo o resto de una divisioacuten

== oacute eq Igualdad

= oacute ne Diferente

lt oacute lt Menor que

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt oacute gt Mayor que

lt= oacute le Menor o igual que

gt= oacute ge Mayor o igual que

ampamp oacute and Operacioacuten Loacutegica AND

|| oacute or Operacioacuten Loacutegica OR

oacute not Operacioacuten Loacutegica NOT

empty Verifica si el valor de una variable es null si un String esta vaciacuteo o si una matriz Map

o Collection no tienen elementos

func(args) Llamada a una funcioacuten donde func es el nombre de la funcioacuten y arg representa cero o

maacutes argumentos separados por comas

El ejemplo siguiente muestra una paacutegina JSP compuesta por elementos HTML expresiones

LE y objetos impliacutecitos

lthtmlgt

ltheadgtlttitlegtJSP 20lttitlegtltheadgt

ltbodygt

lth3gtLenguaje de expresioacuten (LE)lth3gt

ltpgtLa siguiente tabla ilustra algunas expresiones LE

ltbrgtltbrgtlttable border=1gt

lttrgt

ltthgtltbgtExpresioacutenltbgtltthgt

ltthgtltbgtValorltbgtltthgt

lttrgt

lttrgt

lttdgt$3 + 6lttdgt

lttdgt$3 + 6lttdgt

lttdgt

lttrgt

lttdgt$(7 gt 4) 7 4lttdgt

lttdgt$(7 gt 4) 7 4lttdgt

lttrgt

lttrgt

lttdgt$header[host]lttdgt

lttdgt$header[host]lttdgt

lttrgt

lttablegt

ltbodygt

lthtmlgt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

323 BIBLIOTECA ESTANDAR DE ETIQUETAS

La biblioteca estaacutendar de etiquetas JSP (JSTL ndash Java Server Page Estaacutendar Tag Library)

incluye una cantidad amplia de etiquetas para diferentes aacutereas de trabajo

Aacuterea baacutesica (su prefijo es c ndash core) y contiene

o Soporte de variables (remove y set)

o Control del flujo (choose when otherwise forEach forTokens if)

o Manejo de URL (import param redirect param y url param)

o Operaciones varias (match y out)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlcore

Aacuterea XML (su prefijo es x) y contiene

o Sentencias baacutesicas (out parse y set)

o Control del flujo (choosehellip whenhellip otherwise forEach e if)

o Transformacioacuten de Documentos (transformhellipparam)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlxml

Aacuterea Internacionalizacioacuten (su prefijo es fmt) Contiene

o Localidad (setLocale y requestEncoding)

o Mensajes (bundle message param y setBundle)

o Formateo de Fechas y nuacutemeros (formatNumber formateacuteate parseDate

parseNumber setTimeZone timeZone)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlfmt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Aacuterea SQL (su prefijo es sql) es el lenguaje estandar para interactuar con bases de datos

relacionales y contiene setDataSource Quero dateParam param transaction y

update dateParam param) El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlsql

Aacuterea Funciones (su prefijo es fn) y contiene

o Longitud de una coleccioacuten (length)

o Manipulacioacuten de String (toUpperCase toLowerCase substring

substringAfter substringBefore trim replace indexOf startsWith

endsWith contains containsIgnoreCase split join y escapeXml)

o El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlfunctions

3231 OPERACIONES CON ETIQUETAS BAacuteSICAS

En un ejemplo pasado teniacuteamos el siguiente coacutedigo

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

En este ejemplo se hace referencia al aacuterea baacutesica de JSTL con el prefijo c y se utiliza la

etiqueta cset para definir la variable atrCuenta Si la variable ya esta definida simplemente

se le asigna el valor especificado

La uacuteltima parte del ejemplo anterior podriacutea haberse escrito de esta otra forma

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcif test=rdquo$atrCuenta gt 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcifgt

$atrCuenta $str

La etiqueta cif permite la ejecucioacuten condicional de su cuerpo en funcioacuten del valor del

atributo de test

La etiqueta cchoose permite la ejecucioacuten del cuerpo de la primera etiqueta cwhen cuyo

atributo test sea evaluado a true Si ninguna de las condiciones se evaluacutea a true entonces se

evaluacutea el cuerpo de la etiqueta cotherwise si estaacute presente El siguiente coacutedigo muestra otra

manera de escribir el ejemplo anterior utilizando estas uacuteltimas etiquetas

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcchoosegt

ltcwhen test=rdquo$atrCuenta == 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcwhengt

ltcotherwisegt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcotherwisegt

ltcchoosegt

$atrCuenta $str

La etiqueta cforEach permite iterar sobre una coleccioacuten de objetos La coleccioacuten se

especifica por medio del atributo iacutetems y el elemento actual de la coleccioacuten estaacute disponible a

traveacutes de la variable establecida por el atributo var Por ejemplo el siguiente fragmento de

coacutedigo visualiza una tabla con las variables definidas a nivel de aacutembito de paacutegina

lttable border=rdquo1rdquogt

ltcforEach var=rdquoitemrdquo iacutetems=rdquo$pageScoperdquogt

lttrgt

lttdgt $item lttdgt

lttrgt

ltcforEachgt

lttablegt

La etiqueta ccatch atrapa una excepcioacuten que ocurra en el cuerpo de la misma Por ejemplo

el siguiente segmento de coacutedigo lanzaraacute una excepcioacuten si el paraacutemetro mes se escribe con

letras en vez de con nuacutemeros

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltbodygt

lthtmlgt

Un URL anaacutelogo al siguiente daraacute lugar a que la excepcioacuten sea lanzada cuando se ejecute la

expresioacuten $nMes 3 de la paacutegina anterior

httplocalhost8080JSP2exceppruebajspmes=marzo

La excepcioacuten indica que ha ocurrido un error al tratar de convertir ldquomarzordquo a un entero de

tipo Long Para cachar esta excepcioacuten y darle un tratamiento adecuado habraacute que modificar

la paacutegina JSP anterior como se indica a continuacioacuten

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltccatch var=rdquoerrorOcurridordquogt

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltccatchgt

ltcif test=rdquo$not empty errorOcurridordquogt

Error el paraacutemetro mes debe ser un nuacutemero ltbgt

ltbrgt Informacioacuten del error dada por el sistema

ltbrgt ltfont color=rdquoFF0000rdquogt $errorOcurrido ltfontgt

ltcifgt

ltbodygt

lthtmlgt

3232 ACCESO A BASES DE DATOS CON JSP

Las etiquetas que proporciona el aacuterea SQL permiten realizar

Conexioacuten con una base de datos

Realizacioacuten de consultas a la base de datos

Acceso al conjunto de resultados

Ejecucioacuten de actualizaciones y transacciones

Todas las etiquetas SQL actuacutean sobre una base de datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

32321 CONEXIOacuteN CON LA BASE DE DATOS

La conexioacuten con la base de datos puede realizarse con la etiqueta sqlsetDataSource Por

ejemplo si se esta utilizando el administrador de bases de datos MySql con el controlador

JDBC se puede realizar una conexioacuten con una base de datos digamos bd_tutorias de la

manera siguiente

ltsqlsetDataSource var=rdquobdrdquo

driver=rdquocommysqljdbcDriverrdquo

url=rdquojdbcmysqllocalhost3306bd_tutoriasrdquo

user=rdquoadminrdquo

password=rdquoadminadminrdquo gt

32322 CONSULTA A LA BASE DE DATOS

La etiqueta sqlQuero permite realizar una consulta a una base de datos Por ejemplo el

siguiente fragmento de coacutedigo realiza una consulta a la base de datos representada por bd y

obtiene un conjunto de resultados representado por cdr

ltsqlquery var=rdquocdrrdquo dataSource=rdquo$bdrdquogt

SELECT professor dia hora alumno

FROM profesores tutorias citas

WHERE profesoresid_profesor=tutoriasid_profesor

AND tutoriasid_tutoria=citasid_tutoria

ltsqlquerygt

32323 MODIFICACIONES SOBRE LA BASE DE DATOS

La etiqueta sqlupdate permite ejecutar una sentencia SQL INSERT UPDATE o DELETE

y cualquier otra sentencia SQL que no retorne ninguacuten valor Por ejemplo

ltsqlupdate var=rdquocontrdquo dataSource=rdquo$bdrdquo gt

UPDATE profesores

SET profesor=

WHERE profesor=

ltsqlparam value=rdquo$paramProfesorrdquo gt

ltsqlparam value=rdquo$paramIDrdquo gt

ltsqlupdategt

Una operacioacuten UPDATE puede utilizar el siacutembolo para indicar que el valor que tendriacutea que

evaluarse en esa posicioacuten seraacute suministrado por una etiqueta sqlparam como por ejemplo

httplocalhost8080JSP2sqlpruebajspProfesor=Mario+Rossainz+LopezampID=514

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ObRegistro InstanciaFila = InstanciaPosicionamientoDameDatos()

GenerarRespuesta(InstanciaFilaDameDNI()InstanciaFilaDameNombre()

InstanciaFilaDameApellido()

StringvalueOf(InstanciaFilaDameEdad()))

PosicionBuscada = InstanciaPosicionamientoPosicion()

private void GenerarRespuesta(String DNI String Nombre String Apellido

String Edad)

outprintln(lttable border=1gt)

outprintln(lttrgt)

outprintln(lttdgt)

outprintln(ltform

action=httplocalhost8080directorioTelservletSvAccesoBD

method=getgt)

outprintln( DNI ltinput type=text name=DNI value=+DNI+gtltbrgt)

outprintln( Nombre ltinput type=text name=Nombre

value=+Nombre+gtltbrgt)

outprintln( Apellido ltinput type=text name=Apellido

value=+Apellido+gtltbrgt)

outprintln( Edad ltinput type=text name=Edad

value=+Edad+gtltbrgtltbrgt)

outprintln( ltinput type=submit value=Consultar

name=BotonConsultargt)

outprintln( ltinput type=submit value=Insertar

name=BotonInsertargt)

outprintln( ltinput type=submit value=Modificar

name=BotonModificargt)

outprintln( ltinput type=submit value=Borrar name=BotonBorrargt)

outprintln( ltinput type=submit value=Listar name=BotonListargt

ltbrgt)

outprintln( ltcentergt)

outprintln( ltinput type=submit value= |lt name=BotonPrimerogt)

outprintln( ltinput type=submit value= --

name=BotonMenosCincogt)

outprintln( ltinput type=submit value= - name=BotonAnteriorgt)

outprintln( ltinput type=submit value= +

name=BotonSiguientegt)

outprintln( ltinput type=submit value= ++

name=BotonMasCincogt)

outprintln( ltinput type=submit value= gt| name=BotonUltimogt)

outprintln( ltcentergt)

outprintln( lttdgt)

outprintln( lttdgt)

outprintln( lttextarea name=AreaDeListado rows=10

cols=35gt+AreaDeListado+lttextareagt)

outprintln( lttdgt)

outprintln( lttrgt)

outprintln( ltformgt)

outprintln( lttablegt)

SvAccesoBDjava

import javasql

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

public class ObBorrado

ObBorrado(int PosicionBuscada)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

Personasabsolute(PosicionBuscada)

PersonasdeleteRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

ObBorradojava

import javasql

import javaawtTextArea

public class ObListado

private String Resultado=

ObListado()

String DNI Nombre Apellido Linea

int Edad Posicion

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement()

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

while (Personasnext())

DNI = PersonasgetString(DNI)

Nombre = PersonasgetString(Nombre)

Apellido = PersonasgetString(Apellido)

Edad = PersonasgetInt(Edad)

Posicion = PersonasgetRow()

Linea = DNI+ +Nombre+ +Apellido+ +StringvalueOf(Edad)

Resultado=Resultado+StringvalueOf(Posicion)+ +Linea+n

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public String DameResultado()

return Resultado

ObListadojava

public class ObRegistro

private String DNI Nombre Apellido

private int Edad

ObRegistro (String DNI String Nombre String Apellido int Edad)

thisDNI = DNI

thisNombre = Nombre

thisApellido = Apellido

thisEdad = Edad

String DameDNI()

return DNI

String DameNombre()

return Nombre

String DameApellido()

return Apellido

int DameEdad()

return Edad

ObRegistrojava

import javasql

public class ObConsulta

private int Posicion = 0

private ObRegistro DatosPersona

ObConsulta(String DNIPedido)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement()

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

while (Personasnext())

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

String DNI = PersonasgetString(DNI)

if (DNIequalsIgnoreCase(DNIPedido))

Posicion = PersonasgetRow()

String Nombre = PersonasgetString(Nombre)

String Apellido = PersonasgetString(Apellido)

int Edad = PersonasgetInt(Edad)

DatosPersona = new ObRegistro(DNINombreApellidoEdad)

break

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public int PosicionEncontrada()

return Posicion

public ObRegistro DameDatos()

return DatosPersona

ObConsultajava

import javasql

public class ObInserccion

ObInserccion(ObRegistro Datos)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

PersonasmoveToInsertRow()

PersonasupdateString(DNI DatosDameDNI())

PersonasupdateString(NombreDatosDameNombre())

PersonasupdateString(Apellido DatosDameApellido())

PersonasupdateInt(EdadDatosDameEdad())

PersonasinsertRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

catch (SQLException e)

Systemoutprintln(e)

ObInsercionjava

import javasql

public class ObModificacion

ObModificacion(int PosicionBuscada ObRegistro Datos)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

Personasabsolute(PosicionBuscada)

PersonasupdateString(DNIDatosDameDNI())

PersonasupdateString(NombreDatosDameNombre())

PersonasupdateString(ApellidoDatosDameApellido())

PersonasupdateInt(EdadDatosDameEdad())

PersonasupdateRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

ObModificacionjava

import javasql

public class ObPosicionamiento

private ObRegistro DatosPersona

private int Posicion

ObPosicionamiento(String Accion int Posicion)

int IDAccionEdad

String DNINombreApellido

boolean PosicionCorrecta=false

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

FROM DatosPersonales)

Personasabsolute(Posicion)

IDAccion = IntegerparseInt(Accion)

switch (IDAccion)

case 0

PosicionCorrecta = Personaslast()

break

case 1

PosicionCorrecta = Personasfirst()

break

case 2

PosicionCorrecta = Personasrelative(-5)

break

case 3

PosicionCorrecta = Personasprevious()

break

case 4

PosicionCorrecta = Personasnext()

break

case 5

PosicionCorrecta = Personasrelative(+5)

break

if (PosicionCorrecta)

thisPosicion = PersonasgetRow()

DNI = PersonasgetString(DNI)

Nombre = PersonasgetString(Nombre)

Apellido = PersonasgetString(Apellido)

Edad = PersonasgetInt(Edad)

else

thisPosicion = Posicion

DNI = ----

Nombre = ----

Apellido = ----

Edad = 0

DatosPersona = new ObRegistro(DNINombreApellidoEdad)

Personasclose()

Conexionclose()

SentenciaSQLclose()

Systemoutprintln(StringvalueOf(Posicion)++StringvalueOf(thisPosicion))

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public int Posicion()

return Posicion

public ObRegistro DameDatos() return DatosPersona

ObPosicionamientojava

En este ejemplo se emplean servlets y paacuteginas Web Los clientes habitualmente trabajan en

una computadora remota y los programas se ejecutan en un servidor El mecanismo de

comunicaciones que soporta el protocolo http nos permite consultar en el servidor los datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

que ha seleccionado o escrito el usuario de esta manera se puede observar una disociacioacuten

entre la interfaz graacutefica de usuario (que se ejecuta en los equipos de los clientes) y el

programa que recoge los datos y ejecuta las acciones pertinentes (que se ejecuta en el

servidor)

Como puede observarse el coacutedigo SvAccessoBD es un servlet que lleva a cabo las siguientes

operaciones

1 Recoge los valores provenientes del usuario

2 Determina la naturaleza de la accioacuten a realizar

3 Realiza su cometido con la base de datos

4 Genera la respuesta que recibiraacute el usuario

32 JSP

JSP significa Java Server Pages que traducido quiere decir Paacuteginas de Servidor Java y es

por tanto una tecnologiacutea orientada a crear paacuteginas Web con programacioacuten en JAVA es decir

permite mezclar HTML estaacutendar y estaacutetico con un contenido dinaacutemico etiquetas especiales

(oacuterdenes) y trozos de coacutedigo JAVA (scriptlets o secuencias de oacuterdenes) o contenido dinaacutemico

generado por servlets Eacuteste contenido dinaacutemico se encuentra encerrado en etiquetas

especiales muchas de las cuales inician con lt y finalizan con gt El motor de las paacuteginas

JSP esta basado en los servlets de JAVA

En la tecnologiacutea JSP se crean paacuteginas parecidas a las paacuteginas que se crean en ASP (Active

Server Page de Microsoft) o PHP (Personal Home Page) que son dos tecnologiacuteas de paacuteginas

ejecutadas en el servidor Sin embargo JSP no se cintildee a un sistema operativo o servidor Web

en particular ademaacutes de que proporciona acceso a la tecnologiacutea de Servlets y a JAVA en la

parte dinaacutemica

El proceso para generar paacuteginas JSP accesibles en Web es mucho maacutes simple que en los

servlets Dando por hecho que se tiene un servidor Web que permite usar JSP el coacutedigo se

almacenaraacute en archivos con extensioacuten jsp que incluyen dentro de la estructuras de etiquetas

HTML las sentencias JAVA a ejecutar y tan soacutelo se colocaraacuten en cualquier lugar en donde

se pusiera una paacutegina Web normal sin compilacioacuten sin paquetes y sin configuracioacuten aunque

el servidor tendraacute que ser configurado para acceder a los archivos de clases Servlets y de

JSPs

Aunque lo que se escriba con frecuencia luciraacute como un archivo HTML estaacutendar detraacutes de

ello la paacutegina JSP se convierte automaacuteticamente en un servlet normal donde el HTML

estaacutetico tan soacutelo es enviado al flujo de salida asociado con el meacutetodo service del servlet Esta

traduccioacuten se realiza la primera vez que se solicita la paacutegina De acuerdo como este

configurado el servidor es posible ver el coacutedigo fuente de los servlets generados a partir de

sus paacuteginas JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Por ejemplo supongamos que se ha escrito el siguiente coacutedigo en el archivo Saludojsp

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtEjemplo JSPlttitlegtltheadgt

ltbody bgcolor=ffffccgt

ltcentergt

lth2gtHola mundolth2gt

ltjavautilDate hoy = new javautilDate()gt

La fecha de hoy es lt=hoygt

ltcentergt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional y un fragmento de un scriptlet de JAVA La etiqueta

lt identifica el comienzo del scriptlet y gt el final Una expresioacuten de la forma =variable

es sustituida por el valor de esa variable Para ejecutar esta paacutegina o cualquier otra paacutegina

JSP desde un navegador hay que instalarla en el servidor de aplicaciones de la misma manera

en como se hizo con los servlets Suponiendo entonces que se tiene instalado el Tomcat 5

siga los siguientes pasos

1 Antildeadir en el servidor la carpeta digamos JSP2 dentro de la carpeta webapps del Tomcat

y construir sobre ella la jerarquiacutea de clases ya conocida de los servlets

webappsrarrJSP2rarrWEB-INFrarrclasses

WEB-INFrarrlib

WEB-INFrarrtags

2 Editar en la carpeta WEB-INF el descriptor de despliegue webxml que se indica a

continuacioacuten Este archivo XML indica doacutende se localiza el esquema XML para la

especificacioacuten Servlet 24 que a suvez utiliza el esquema XML para la especificacioacuten

Java Server Page 20 que son las especificaciones que soporta en servidor Tomcat

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=

httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

3 Crear en JSP2 la carpeta saludo que contendraacute la aplicacioacuten y copiar en ella la paacutegina

Saludojsp

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

4 Arrancar el servidor Si el servidor ya estaba arrancado detenerlo y volverlo a arrancar o

bien abrir el explorador escribir el URL httplocalhost8080managerhtml e instalar

la aplicacioacuten

5 Una vez arrancado el servidor verificar si estaacute funcionando correctamente escribiendo

el URL siguiente en el explorador httplocalhost8080 El explorador debe mostrar la

paacutegina del Tomcat

6 Ejecutar la paacutegina JSP iniciando el explorador y escribiendo el URL siguiente

httplocalhost8080JSP2saludoSaludojsp donde la sintaxis geneacuterica es

httpservidor[puerto]MiCarpetapaginajsp

Cuando esta paacutegina (Saludojsp) es invocada por primera vez el motor JSP lleva a cabo una

fase de traduccioacuten de la misma en un servlet y el motor Servlet es el que ejecutaraacute eacuteste uacuteltimo

para generar el HTML dinaacutemico que seraacute enviado al explorador cliente seguacuten puede

deducirse de la figura siguiente La proacutexima vez que la paacutegina sea solicitada el motor JSP

ejecutaraacute el servlet que fue caragado la primera vez a no ser que la paacutegina haya cambiado

en cuyo caso seraacute compilada automaacuteticamente en un nuevo servlet y ejecutada

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Regresando al ejemplo el archivo java generado por el Tomcat a partir del archivo

Saludojsp se localiza en la carpeta workCatalinalocalhost de la instalacioacuten de Tomcat

321 ELEMENTOS PARA SECUENCIAS DE COMANDOS

Los elementos para secuencias de comandos permiten insertar coacutedigo en el servlet que seraacute

generado a partir de la paacutegina JSP Existen tres formas

1 Expresiones del tipo lt= expresioacuten gt que se evaluacutean e insertan en el resultado del

servlet

2 Los scriptlets del tipo lt codigo gt que se insertan en el meacutetodo _jspService del

servlet (ejecutado por service)

3 Las declaraciones del tipo lt Codigo gt que se insertan en el cuerpo de la clase del

servlet fuera de cualquier meacutetodo existente

NOTA Los comentarios en JSP se escriben lt-- Comentario JSP --gt en tanto que los

comentarios en HTML son de la forma lt--Comentario HTML --gt La diferencia

semaacutentica radica en que los comentarios HTML cuando se insertan en la respuesta enviada

por el servidor al cliente no se muestran cuando se visualiza el documento HTML pero si

Servidor Maacutequina Cliente

Explorador Web

Contenedor Web

Motor Servlet

Motor JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

los podemos ver cuando se visualiza el coacutedigo fuente en tanto que los comentarios JSP

aunque se inserten en la respuesta enviada por el servidor al cliente no son enviados al

explorador de forma que tampoco se muestran ni se ven cuando se visualiza el coacutedigo fuente

HTML desde el explorador

3211 EXPRESIONES

Se utiliza una expresioacuten JSP para insertar valores directamente en el resultado La sintaxis es

lt= expresioacuten gt Por ejemplo

lt= requestgetParameter(ldquoparNombre) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt lt= s gt

La fecha y hora actual es lt= new javautilDate() gt

La expresioacuten se evaluacutea se convierte a cadena y se inserta en la paacutegina Esta evaluacioacuten se

realiza durante la ejecucioacuten

32111 VARIABLES PREDEFINIDAS

Para simplificar estas expresiones se pueden utilizar cierta cantidad de variables

predefinidas Estos objetos impliacutecitos como tambieacuten se les llama estaacuten disponibles para su

uso durante la implementacioacuten de una paacutegina Web

bull pageContext Es un objeto de la clase PageContext que proporciona acceso a objetos

relacionados con los servlets

bull request Es un objeto de la clase HttpServletRequest que se puede obtener a traveacutes del

meacutetodo getRequest que encapsula los datos enviados por el cliente al servidor

bull response Es un objeto de la clase HttpServletResponse que puede obtenerse a traveacutes

del meacutetodo getResponse que encapsula los datos que el servidor enviaraacute al cliente

bull application Es un objeto de la clase ServletContext que se obtiene a traveacutes del meacutetodo

getServletContext que define un conjunto de meacutetodos que todo servlet utiliza para

comunicar con el contenedor de servlets

bull config Es un objeto de la clase ServletConfig que se obtiene a traveacutes del meacutetodo

getServletConfig y que se utiliza por el contenedor de servlets para pasar informacioacuten

al servlet durante la iniciacioacuten

bull session Es un objeto de la clase HttpSession que se obtiene a traveacutes del meacutetodo

getSession que proporciona una forma de identificar a un usuario que visita las paacuteginas

de un sitio Web

bull out Es un objeto de la clase JspWriter que se obtiene a traveacutes del meacutetodo getOut que

se utiliza para almacenar la respuesta que seraacute enviada al cliente que hizo la peticioacuten de

la paacutegina

bull page Es un objeto geneacuterico de la clase Object que se obtiene a traveacutes del meacutetodo

getPage y que representa al servlet obtenido a partir de la paacutegina JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

bull exception Es un objeto de la clase Exception que se obtiene a traveacutes del meacutetodo

getException que contendraacute informacioacuten a cerca de cualquier excepcioacuten que se lance

desde la paacutegina JSP

Un ejemplo del uso de uno de estos objetos impliacutecitos seriacutea el siguiente

El nombre de tu host es lt= requestgetRemoteHost() gt

El listado siguiente da un ejemplo de una paacutegina JSP que utiliza algunas variables

predefinidas como uso de expresiones JSP

ltDOCTYPE HTML PUBLIC -W3CDTD HTML 40 Transitional ENgt

lthtmlgt

ltheadgt

lttitlegt Expresiones JSP lttitlegt

ltheadgt

ltbodygt

lth2gt Expresiones JSP lth2gt

ltULgt

ltligt Fecha y hora en curso lt= new javautilDate() gt ltligt

ltligt Nombre de su host lt= requestgetRemoteHost() gt ltligt

ltligt Identificador de su sesioacuten lt= sessiongetId() gt ltligt

ltligt El paraacutemetro ltcodegt paramPrueba ltcodegt del formulario

lt= requestgetParameter(paramPrueba) gt ltligt

ltULgt

ltbodygt

lthtmlgt

Cuya salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3212 LOS SCRIPTLETS JSP

Si se desea hacer algo maacutes complejo que una simple expresioacuten los scriptlets permiten insertar

coacutedigo JAVA en el meacutetodo _jspService del servlet (que es ejecutado por service) La sintaxis

utilizada por los scriptlets es lt coacutedigo java gt Los escriptlets tienen acceso a las

mismas variables definidas de forma automaacutetica como expresiones A manera de ejemplo si

se desea que el resultado aparezca en la paacutegina generada deberiacutea de utilizarse la variable out

como en la siguiente instruccioacuten

lt String datosConsultados= requestgetQueryString()

outprintln(ldquoDatos GET adjuntos ldquo+datosConsultados)

gt

En este ejemplo podriacutea haberse obtenido el mismo resultado utilizando la siguiente expresioacuten

JSP

Datos GET adjuntos lt=requestgetQueryString() gt

En general los scriptlets pueden ejecutar varias tareas que no podriacutean realizarse con las

expresiones Tales tareas incluyen

bull La determinacioacuten de encabezados de respuesta

bull Actualizacioacuten de Bases de Datos

bull Ejecucioacuten de bucles condiciones y otras estructuras complejas

lt for (int i=1 ilt=6 i++)

gt

lth lt=i gtgt Hola Mundo lthlt=i gtgt

lt gt

Como un ejemplo concreto se muestra la siguiente paacutegina JSP llamada Cuentajsp en donde

se observa coacutemo se hace un seguimiento del nuacutemero de veces que un cliente accede a esta

paacutegina a traveacutes de distintas sesiones Para ello supondremos que dicha cuenta es el valor del

atributo atrCuenta del objeto impliacutecito application ya citado La primera vez que el cliente

accede a la paacutegina el valor de atrCuenta seraacute null debido a que auacuten no ha sido fijado este

atributo en este caso se fijaraacute con el valor 1 En los siguientes accesos se leeraacute el valor del

atributo atrCuenta se incrementaraacute en una unidad y se volveraacute a fijar Finalmente se enviacutea

la respuesta al cliente para que se muestre al usuario el valor del contador

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en el objeto impliacutecito application con el nombre

atrCuenta

--gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt

Integer cuenta = (Integer)applicationgetAttribute(atrCuenta)

String s = vez

if (cuenta == null)

cuenta = new Integer(1)

else

cuenta = new Integer(cuentaintValue() + 1)

s = veces

applicationsetAttribute(atrCuenta cuenta)

gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

Has visitado esta paacutegina lt= cuenta gt lt= s gt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional un fragmento de coacutedigo JAVA o scriptlet

expresiones y comentarioshellip

Aquiacute otro ejemplo de la ejecucioacuten de un coacutedigo demasiado complejo para una expresioacuten JSP

Este listado presenta una paacutegina JSP que utiliza el paraacutemetro de peticioacuten colorFondo para

establecer el color de fondo de la paacutegina

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgt

lttitlegt Prueba de Color lttitlegt

ltheadgt

lt

String colorFondo=requestgetParameter(colorFondo)

boolean tieneColorExplicito

if (colorFondo =null)

tieneColorExplicito=true

else

tieneColorExplicito=false

colorFondo=WHITE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt

ltbody bgcolor=lt= colorFondo gtgt

lth2 align=centergt Prueba de color lth2gt

lt

if (tieneColorExplicito)

outprintln(Ha indicado un color de fondo expliacutecito +

colorFondo +)

else

outprintln(Usareacute el color de fondo predeterminado WHITE +

Indique el atributo de peticioacuten

ltigtcolorFondoltigt+

para intentar un color estaacutendar un +

valor RRGGBB o para ver si el navegador Web +

permite el uso de nombres de color X11)

gt

ltbodygt

lthtmlgt

Cuyas posibles salidas son

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3213 DECLARACIONES JSP

Una declaracioacuten JSP permite definir meacutetodos o campos que seraacuten insertados en el cuerpo

principal de la clase del servlet (fuera del meacutetodo _jspService) Una declaracioacuten tiene la

sintaxis lt Coacutedigo Java gt Por ejemplo

lt int i=0 gt

lt

Public void jspinit()

coacutedigo de iniciacioacuten

gt

Una declaracioacuten no genera ninguacuten resultado y se usan junto con las expresiones JSP o los

scriptlets A continuacioacuten se muestra una paacutegina JSP que despliega la cantidad de veces que

se ha solicitado esta paacutegina desde que se arrancoacute el servidor haciendo uso de las

declaraciones JSP

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtDeclaraciones JSPlttitlegtltheadgt

ltbodygt

lth1gtDeclaraciones JSPlth1gt

lt-- Esto es un comentario en JSP --gt

lt private int recuentoAccesos=0 gt

lth2gt Accesos a la paacutegina desde el reinicio del servidor

lt= ++recuentoAccesos gt lth2gt

ltbodygt

lthtmlgt

La salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

322 EL LENGUAJE DE EXPRESION EN JSP 20

Anteriormente se ha visto la necesidad de utilizar fragmentos de coacutedigo java en el desarrollo

de paacuteginas JSP pero con la aparicioacuten de la especificacioacuten JSP 20 ya no hay necesidad de

utilizar fragmentos de coacutedigo Java para nada gracias al nuevo lenguaje de expresioacuten EL

(Expresioacuten Language) a la biblioteca de etiquetas estandar JSTL (JSP Standar Tag Library)

y a las nuevas formas para desarrollar etiquetas personalizadas

El lenguaje de expresioacuten JSP es maacutes un lenguaje de acceso a datos que un lenguaje de

programacioacuten Ya se ha visto que para pasar informacioacuten de un cliente a una paacutegina JSP se

utilizan paraacutemetros en la peticioacuten y atributos en la paacutegina El lenguaje de expresioacuten lo hace

posible sin tener que utilizar scriptlets o expresiones (lt= expresioacuten gt) Por ejemplo las

liacuteneas JSP 12 siguientes escritas utilizando coacutedigo Java

lt= requestgetParameter(ldquoparNombrerdquo) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt veces

bajo la especificacioacuten JSP 20 se pueden escribir de una forma maacutes sencilla como sigue

(ahora no se trata de coacutedigo JAVA)

$paramparNombre has visitado esta paacutegina

$atrCuenta veces

La sintaxis de JSP es sensible a mayuacutesculas y minuacutesculas pero un par de comillas simples es

equivalente a un par de comillas dobles

3221 VARIABLES PREDEFINIDAS (Objetos Impliacutecitos)

El lenguaje de expresioacuten JSP 20 soporta los objetos impliacutecitos siguientes

pageContext Objeto de javaxservletjspPageContext que proporciona acceso a los

datos de una peticioacuten

param Coleccioacuten (objeto de tipo javautilMap) de todos los valores de los paraacutemetros

enviados en una peticioacuten un String por paraacutemetro

paramValues Coleccioacuten de todos los valores de los paraacutemetros enviados en una

peticioacuten una matriz de tipo String por paraacutemetro

header Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten un

String por cabecera

headerValues Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten

una matriz de tipo String por cabecera

cookie Coleccioacuten de todos los valores de las cookies un objeto javaxservlethttpCookie

por cookie

initParam Coleccioacuten de todos los valores de los paraacutemetros de iniciacioacuten de la

aplicacioacuten un String por paraacutemetro

Tambieacuten hay objetos que permiten acceder a variables definidas en diferentes aacutembitos lo que

posibilita compartir informacioacuten

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

pageScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de paacutegina

requestScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

peticioacuten

sessionScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de sesioacuten

applicationScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

aplicacioacuten

3222 DIRECTRICES

Las directrices page incluye y taglib son mensajes para el motor JSP y son siempre incluidas

entre los siacutembolos lt y gt

32221 LA DIRECTRIZ PAGE

Define atributos que se aplican a toda la paacutegina JSP donde es incluida

lt page lista_de_atributos gt

Donde la lista_de_atributos puede contener algunos de los siguientes (aquellos que estaacuten

escritos en negrita son los tomados por omisioacuten)

language= ldquoscriptingLanguagerdquo

extends= rdquoclassNamerdquo

import= ldquoimportListrdquo

session= ldquotrue|falserdquo

buffer= ldquonone|sizeKb

autoflush= ldquotrue|falserdquo

isThreadSafe= rdquotrue|falserdquo

info= rdquoinfo_textrdquo

errorPage= ldquoerror_urlrdquo

isErrorPage= rdquotrue|falserdquo

contentType= rdquoctinfordquo

pageEncoding= rdquopeinfordquo

isELIgnored= ldquotrue|falserdquo

Tiacutepicamente se localiza al principio de la paacutegina JSP y puede haber cualquier nuacutemero de

ellas El lenguaje por omisioacuten es Java Ejemplos

lt page contentType=rdquotexthtmlrdquo language=rdquojavardquo gt

lt page import=rdquojavautil javalangrdquo gt

lt page buffer=rdquo5kbrdquo autoflush=rdquofalserdquo gt

32222 LA DIRECTRIZ INCLUDE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

La directriz include incluye un archivo (html jsp xml o de texto) en una paacutegina JSP Esto

permite dividir el contenido de la paacutegina en trozos maacutes manejables

lt incluye file=rdquoURL_relativordquo gt

El ejemplo siguiente muestra dos archivos el primero incluye al segundo para mostrar la

fecha y hora actuales

lt-- fichero mostrarFechaHorajsp --gt

lthtmlgt

ltheadgtlttitlegtIncluir un ficherolttitlegtltheadgt

ltbody bgcolor=whitegt

ltfont color=bluegt

La fecha y hora actuales son

lt include file=fechaHorajsp gt

ltfontgt

ltbodygt

lthtmlgt

lt-- fichero fechaHorajsp --gt

lt page import=javautil gt

lt= (new javautilDate())toLocaleString() gt

32223 LA DIRECTRIZ TAGLIB

La directriz taglib indica la biblioteca de acciones personalizadas que podremos utilizar en

la codificacioacuten de la paacutegina JSP Para distinguir esas acciones entre otras existentes se utiliza

un prefijo (prefix) Su sintaxis es

lt taglib (uri=rdquoURI_bibliotecardquo|tagdir=rdquoDir_biblioteca_tagrdquo)

prefix=rdquoprefijordquo gt

Cuando se trata de una biblioteca definida mediante una clase Java y un descriptor (archivo

tld) eacutesta se identifica mediante un URI (Uniform Resource Identifier- URL relativos) Por

ejemplo

lt taglib uri=rdquohttpMarioRossainzLopezmiBibliotecardquo

prefix=rdquofunrdquo gt

ltpgtltfunaccion01 gt

La uacuteltima liacutenea del ejemplo tiene dos etiquetas una etiqueta p HTML y otra accion01

perteneciente a la biblioteca miBiblioteca En cambio si la biblioteca se define mediante un

archivo tag entonces se identifica mediante su ruta relativa en el sistema de archivos

lt taglib tagdir=rdquoWEB-INFtagsrdquo prefix=rdquofunrdquo gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpgtltfunaccion01 gt

La directriz taglib debe colocarse antes de utilizar en la paacutegina JSP las acciones

personalizadas definidas por la misma Se puede utilizar maacutes de una directriz pero el prefijo

utilizado debe ser uacutenico para cada una de ellas

3223 ACTIVACION DEL LENGUAJE DE EXPRESION (LE)

La especificacioacuten JSP 20 define un lenguaje de expresioacuten como alternativa a elementos de

programacioacuten escritos con coacutedigo Java y especificaciones anteriores a la JSP 20 Para que

este lenguaje pueda ser interpretado tienen que cumplirse 2 requisitos

1 Que la propiedad isELIgnored de la directriz page valga false

lt page isELIgnored= ldquofalserdquo gt

2 Que el descriptor de despliegue webxml en la carpeta WEB-INF indique doacutende se

localiza el esquema XML para la especificacioacuten Servlet 24 que a su vez utiliza el

esquema XML para la especificacioacuten Java Server Page 20

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

Utilizando el lenguaje de expresioacuten se podriacutea modificar la paacutegina Cuentajsp de la seccioacuten

3212 de este documento como se muestra a continuacioacuten Esta nueva paacutegina

1 Especifica que utilizaraacute la biblioteca core de etiquetas estandar (de la que se hablaraacute maacutes

adelante)

2 La primera vez que sea accedida definiraacute la variable atrCuenta en el aacutembito de la

aplicacioacuten con un valor inicial nulo y la incrementaraacute en una unidad cuando sea accedida

sucesivas veces simplemente incrementaraacute esta variable en una unidad

3 Finalmente mostraraacute una paacutegina con un contenido anaacutelogo al siguiente Esta formado

por una cabecera y una segunda liacutenea compuesta por el valor del paraacutemetro parNombre

enviado con la peticioacuten un texto fijo el valor de la variable atrCuenta y otro texto fijo

dependiente del valor de esta variable

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

El coacutedigo completo es el siguiente

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

3224 VARIABLES Y EXPRESIONES

Para acceder a una simple variable se puede escribir algo como lo siguiente $nombre y

para acceder a una propiedad de un objeto podemos escribir algo como

$paramparNombre

$applicationScopeatrCuenta

$pageContextrequestrequestURI

La primera liacutenea del ejemplo anterior obtiene el valor de la propiedad parNombre del objeto

param la segunda el valor del atributo atrCuenta del objeto applicationScope y la tercera

el URL relativo de la paacutegina JSP solicitada

El lenguaje de expresioacuten es maacutes tolerante con respecto a las variables con valor null y ejecuta

muchas maacutes conversiones de forma automaacutetica sobre el tipo de los datos cuando la expresioacuten

a evaluar asiacute lo requiere Por ejemplo la etiqueta condicional siguiente incluye una expresioacuten

que compara el valor del atributo atrCuenta con aacutembito de aplicacioacuten con 10 (convirtiendo

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

impliacutecitamente el valor del atributo al tipo de la constante para poder realizar la comparacioacuten

El resultado seraacute un valor de tipo boolean

ltcif test=rdquo$applicationScopeatrCuenta gt 10rdquogt

ltcifgt

o bien

ltcif test=rdquo$atrCuenta gt 10rdquogt

ltcifgt

Para que una literal pueda incluir un caracter significativo para el lenguaje dicho caracter

debe ser especificado como una secuencia de escape (caracter) Por ejemplo la siguiente

expresioacuten da lugar al literal ldquovezrdquo o ldquovecesrdquo entre comillas dobles

$(atrCuenta gt 1) iquest ldquordquovecesrdquordquo ldquordquovezrdquordquo

Cualquier objeto o atributo de un objeto definido en algunos de los aacutembitos de una paacutegina

puede ser utilizado como una variable Por ejemplo $atrCuenta+1 es una expresioacuten que

realiza la suma de la variable atrCuenta con 1

Cuando se trate de una propiedad de un objeto para acceder a ella se utilizaraacute el operador

punto o bien la notacioacuten empleada para acceder a un elemento de una matriz Por ejemplo

$paramparNombre

$param[ldquoparNombrerdquo]

Una expresioacuten LE puede aparecer en cualquier lugar donde pueda aparecer un texto fijo Por

tanto para informar al contenedor JSP que se trata de una expresioacuten y no de un texto fijo se

utilizan los delimitadores $ al principio y al final

3225 OPERADORES

OPERADOR DESCRIPCIOacuteN Acceso a la propiedad de un objeto o a un elemento de un Map

[] Acceso al elemento de una matriz o de un objeto List

() Pareacutentesis para alterar la prioridad en la evaluacioacuten de una expresioacuten

If ternario condicion expresion1 expresioacuten 2

+ Suma

- Resta

Producto

oacute div Divisioacuten

oacute mod Moacutedulo o resto de una divisioacuten

== oacute eq Igualdad

= oacute ne Diferente

lt oacute lt Menor que

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt oacute gt Mayor que

lt= oacute le Menor o igual que

gt= oacute ge Mayor o igual que

ampamp oacute and Operacioacuten Loacutegica AND

|| oacute or Operacioacuten Loacutegica OR

oacute not Operacioacuten Loacutegica NOT

empty Verifica si el valor de una variable es null si un String esta vaciacuteo o si una matriz Map

o Collection no tienen elementos

func(args) Llamada a una funcioacuten donde func es el nombre de la funcioacuten y arg representa cero o

maacutes argumentos separados por comas

El ejemplo siguiente muestra una paacutegina JSP compuesta por elementos HTML expresiones

LE y objetos impliacutecitos

lthtmlgt

ltheadgtlttitlegtJSP 20lttitlegtltheadgt

ltbodygt

lth3gtLenguaje de expresioacuten (LE)lth3gt

ltpgtLa siguiente tabla ilustra algunas expresiones LE

ltbrgtltbrgtlttable border=1gt

lttrgt

ltthgtltbgtExpresioacutenltbgtltthgt

ltthgtltbgtValorltbgtltthgt

lttrgt

lttrgt

lttdgt$3 + 6lttdgt

lttdgt$3 + 6lttdgt

lttdgt

lttrgt

lttdgt$(7 gt 4) 7 4lttdgt

lttdgt$(7 gt 4) 7 4lttdgt

lttrgt

lttrgt

lttdgt$header[host]lttdgt

lttdgt$header[host]lttdgt

lttrgt

lttablegt

ltbodygt

lthtmlgt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

323 BIBLIOTECA ESTANDAR DE ETIQUETAS

La biblioteca estaacutendar de etiquetas JSP (JSTL ndash Java Server Page Estaacutendar Tag Library)

incluye una cantidad amplia de etiquetas para diferentes aacutereas de trabajo

Aacuterea baacutesica (su prefijo es c ndash core) y contiene

o Soporte de variables (remove y set)

o Control del flujo (choose when otherwise forEach forTokens if)

o Manejo de URL (import param redirect param y url param)

o Operaciones varias (match y out)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlcore

Aacuterea XML (su prefijo es x) y contiene

o Sentencias baacutesicas (out parse y set)

o Control del flujo (choosehellip whenhellip otherwise forEach e if)

o Transformacioacuten de Documentos (transformhellipparam)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlxml

Aacuterea Internacionalizacioacuten (su prefijo es fmt) Contiene

o Localidad (setLocale y requestEncoding)

o Mensajes (bundle message param y setBundle)

o Formateo de Fechas y nuacutemeros (formatNumber formateacuteate parseDate

parseNumber setTimeZone timeZone)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlfmt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Aacuterea SQL (su prefijo es sql) es el lenguaje estandar para interactuar con bases de datos

relacionales y contiene setDataSource Quero dateParam param transaction y

update dateParam param) El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlsql

Aacuterea Funciones (su prefijo es fn) y contiene

o Longitud de una coleccioacuten (length)

o Manipulacioacuten de String (toUpperCase toLowerCase substring

substringAfter substringBefore trim replace indexOf startsWith

endsWith contains containsIgnoreCase split join y escapeXml)

o El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlfunctions

3231 OPERACIONES CON ETIQUETAS BAacuteSICAS

En un ejemplo pasado teniacuteamos el siguiente coacutedigo

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

En este ejemplo se hace referencia al aacuterea baacutesica de JSTL con el prefijo c y se utiliza la

etiqueta cset para definir la variable atrCuenta Si la variable ya esta definida simplemente

se le asigna el valor especificado

La uacuteltima parte del ejemplo anterior podriacutea haberse escrito de esta otra forma

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcif test=rdquo$atrCuenta gt 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcifgt

$atrCuenta $str

La etiqueta cif permite la ejecucioacuten condicional de su cuerpo en funcioacuten del valor del

atributo de test

La etiqueta cchoose permite la ejecucioacuten del cuerpo de la primera etiqueta cwhen cuyo

atributo test sea evaluado a true Si ninguna de las condiciones se evaluacutea a true entonces se

evaluacutea el cuerpo de la etiqueta cotherwise si estaacute presente El siguiente coacutedigo muestra otra

manera de escribir el ejemplo anterior utilizando estas uacuteltimas etiquetas

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcchoosegt

ltcwhen test=rdquo$atrCuenta == 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcwhengt

ltcotherwisegt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcotherwisegt

ltcchoosegt

$atrCuenta $str

La etiqueta cforEach permite iterar sobre una coleccioacuten de objetos La coleccioacuten se

especifica por medio del atributo iacutetems y el elemento actual de la coleccioacuten estaacute disponible a

traveacutes de la variable establecida por el atributo var Por ejemplo el siguiente fragmento de

coacutedigo visualiza una tabla con las variables definidas a nivel de aacutembito de paacutegina

lttable border=rdquo1rdquogt

ltcforEach var=rdquoitemrdquo iacutetems=rdquo$pageScoperdquogt

lttrgt

lttdgt $item lttdgt

lttrgt

ltcforEachgt

lttablegt

La etiqueta ccatch atrapa una excepcioacuten que ocurra en el cuerpo de la misma Por ejemplo

el siguiente segmento de coacutedigo lanzaraacute una excepcioacuten si el paraacutemetro mes se escribe con

letras en vez de con nuacutemeros

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltbodygt

lthtmlgt

Un URL anaacutelogo al siguiente daraacute lugar a que la excepcioacuten sea lanzada cuando se ejecute la

expresioacuten $nMes 3 de la paacutegina anterior

httplocalhost8080JSP2exceppruebajspmes=marzo

La excepcioacuten indica que ha ocurrido un error al tratar de convertir ldquomarzordquo a un entero de

tipo Long Para cachar esta excepcioacuten y darle un tratamiento adecuado habraacute que modificar

la paacutegina JSP anterior como se indica a continuacioacuten

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltccatch var=rdquoerrorOcurridordquogt

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltccatchgt

ltcif test=rdquo$not empty errorOcurridordquogt

Error el paraacutemetro mes debe ser un nuacutemero ltbgt

ltbrgt Informacioacuten del error dada por el sistema

ltbrgt ltfont color=rdquoFF0000rdquogt $errorOcurrido ltfontgt

ltcifgt

ltbodygt

lthtmlgt

3232 ACCESO A BASES DE DATOS CON JSP

Las etiquetas que proporciona el aacuterea SQL permiten realizar

Conexioacuten con una base de datos

Realizacioacuten de consultas a la base de datos

Acceso al conjunto de resultados

Ejecucioacuten de actualizaciones y transacciones

Todas las etiquetas SQL actuacutean sobre una base de datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

32321 CONEXIOacuteN CON LA BASE DE DATOS

La conexioacuten con la base de datos puede realizarse con la etiqueta sqlsetDataSource Por

ejemplo si se esta utilizando el administrador de bases de datos MySql con el controlador

JDBC se puede realizar una conexioacuten con una base de datos digamos bd_tutorias de la

manera siguiente

ltsqlsetDataSource var=rdquobdrdquo

driver=rdquocommysqljdbcDriverrdquo

url=rdquojdbcmysqllocalhost3306bd_tutoriasrdquo

user=rdquoadminrdquo

password=rdquoadminadminrdquo gt

32322 CONSULTA A LA BASE DE DATOS

La etiqueta sqlQuero permite realizar una consulta a una base de datos Por ejemplo el

siguiente fragmento de coacutedigo realiza una consulta a la base de datos representada por bd y

obtiene un conjunto de resultados representado por cdr

ltsqlquery var=rdquocdrrdquo dataSource=rdquo$bdrdquogt

SELECT professor dia hora alumno

FROM profesores tutorias citas

WHERE profesoresid_profesor=tutoriasid_profesor

AND tutoriasid_tutoria=citasid_tutoria

ltsqlquerygt

32323 MODIFICACIONES SOBRE LA BASE DE DATOS

La etiqueta sqlupdate permite ejecutar una sentencia SQL INSERT UPDATE o DELETE

y cualquier otra sentencia SQL que no retorne ninguacuten valor Por ejemplo

ltsqlupdate var=rdquocontrdquo dataSource=rdquo$bdrdquo gt

UPDATE profesores

SET profesor=

WHERE profesor=

ltsqlparam value=rdquo$paramProfesorrdquo gt

ltsqlparam value=rdquo$paramIDrdquo gt

ltsqlupdategt

Una operacioacuten UPDATE puede utilizar el siacutembolo para indicar que el valor que tendriacutea que

evaluarse en esa posicioacuten seraacute suministrado por una etiqueta sqlparam como por ejemplo

httplocalhost8080JSP2sqlpruebajspProfesor=Mario+Rossainz+LopezampID=514

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

public class ObBorrado

ObBorrado(int PosicionBuscada)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

Personasabsolute(PosicionBuscada)

PersonasdeleteRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

ObBorradojava

import javasql

import javaawtTextArea

public class ObListado

private String Resultado=

ObListado()

String DNI Nombre Apellido Linea

int Edad Posicion

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement()

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

while (Personasnext())

DNI = PersonasgetString(DNI)

Nombre = PersonasgetString(Nombre)

Apellido = PersonasgetString(Apellido)

Edad = PersonasgetInt(Edad)

Posicion = PersonasgetRow()

Linea = DNI+ +Nombre+ +Apellido+ +StringvalueOf(Edad)

Resultado=Resultado+StringvalueOf(Posicion)+ +Linea+n

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public String DameResultado()

return Resultado

ObListadojava

public class ObRegistro

private String DNI Nombre Apellido

private int Edad

ObRegistro (String DNI String Nombre String Apellido int Edad)

thisDNI = DNI

thisNombre = Nombre

thisApellido = Apellido

thisEdad = Edad

String DameDNI()

return DNI

String DameNombre()

return Nombre

String DameApellido()

return Apellido

int DameEdad()

return Edad

ObRegistrojava

import javasql

public class ObConsulta

private int Posicion = 0

private ObRegistro DatosPersona

ObConsulta(String DNIPedido)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement()

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

while (Personasnext())

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

String DNI = PersonasgetString(DNI)

if (DNIequalsIgnoreCase(DNIPedido))

Posicion = PersonasgetRow()

String Nombre = PersonasgetString(Nombre)

String Apellido = PersonasgetString(Apellido)

int Edad = PersonasgetInt(Edad)

DatosPersona = new ObRegistro(DNINombreApellidoEdad)

break

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public int PosicionEncontrada()

return Posicion

public ObRegistro DameDatos()

return DatosPersona

ObConsultajava

import javasql

public class ObInserccion

ObInserccion(ObRegistro Datos)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

PersonasmoveToInsertRow()

PersonasupdateString(DNI DatosDameDNI())

PersonasupdateString(NombreDatosDameNombre())

PersonasupdateString(Apellido DatosDameApellido())

PersonasupdateInt(EdadDatosDameEdad())

PersonasinsertRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

catch (SQLException e)

Systemoutprintln(e)

ObInsercionjava

import javasql

public class ObModificacion

ObModificacion(int PosicionBuscada ObRegistro Datos)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

Personasabsolute(PosicionBuscada)

PersonasupdateString(DNIDatosDameDNI())

PersonasupdateString(NombreDatosDameNombre())

PersonasupdateString(ApellidoDatosDameApellido())

PersonasupdateInt(EdadDatosDameEdad())

PersonasupdateRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

ObModificacionjava

import javasql

public class ObPosicionamiento

private ObRegistro DatosPersona

private int Posicion

ObPosicionamiento(String Accion int Posicion)

int IDAccionEdad

String DNINombreApellido

boolean PosicionCorrecta=false

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

FROM DatosPersonales)

Personasabsolute(Posicion)

IDAccion = IntegerparseInt(Accion)

switch (IDAccion)

case 0

PosicionCorrecta = Personaslast()

break

case 1

PosicionCorrecta = Personasfirst()

break

case 2

PosicionCorrecta = Personasrelative(-5)

break

case 3

PosicionCorrecta = Personasprevious()

break

case 4

PosicionCorrecta = Personasnext()

break

case 5

PosicionCorrecta = Personasrelative(+5)

break

if (PosicionCorrecta)

thisPosicion = PersonasgetRow()

DNI = PersonasgetString(DNI)

Nombre = PersonasgetString(Nombre)

Apellido = PersonasgetString(Apellido)

Edad = PersonasgetInt(Edad)

else

thisPosicion = Posicion

DNI = ----

Nombre = ----

Apellido = ----

Edad = 0

DatosPersona = new ObRegistro(DNINombreApellidoEdad)

Personasclose()

Conexionclose()

SentenciaSQLclose()

Systemoutprintln(StringvalueOf(Posicion)++StringvalueOf(thisPosicion))

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public int Posicion()

return Posicion

public ObRegistro DameDatos() return DatosPersona

ObPosicionamientojava

En este ejemplo se emplean servlets y paacuteginas Web Los clientes habitualmente trabajan en

una computadora remota y los programas se ejecutan en un servidor El mecanismo de

comunicaciones que soporta el protocolo http nos permite consultar en el servidor los datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

que ha seleccionado o escrito el usuario de esta manera se puede observar una disociacioacuten

entre la interfaz graacutefica de usuario (que se ejecuta en los equipos de los clientes) y el

programa que recoge los datos y ejecuta las acciones pertinentes (que se ejecuta en el

servidor)

Como puede observarse el coacutedigo SvAccessoBD es un servlet que lleva a cabo las siguientes

operaciones

1 Recoge los valores provenientes del usuario

2 Determina la naturaleza de la accioacuten a realizar

3 Realiza su cometido con la base de datos

4 Genera la respuesta que recibiraacute el usuario

32 JSP

JSP significa Java Server Pages que traducido quiere decir Paacuteginas de Servidor Java y es

por tanto una tecnologiacutea orientada a crear paacuteginas Web con programacioacuten en JAVA es decir

permite mezclar HTML estaacutendar y estaacutetico con un contenido dinaacutemico etiquetas especiales

(oacuterdenes) y trozos de coacutedigo JAVA (scriptlets o secuencias de oacuterdenes) o contenido dinaacutemico

generado por servlets Eacuteste contenido dinaacutemico se encuentra encerrado en etiquetas

especiales muchas de las cuales inician con lt y finalizan con gt El motor de las paacuteginas

JSP esta basado en los servlets de JAVA

En la tecnologiacutea JSP se crean paacuteginas parecidas a las paacuteginas que se crean en ASP (Active

Server Page de Microsoft) o PHP (Personal Home Page) que son dos tecnologiacuteas de paacuteginas

ejecutadas en el servidor Sin embargo JSP no se cintildee a un sistema operativo o servidor Web

en particular ademaacutes de que proporciona acceso a la tecnologiacutea de Servlets y a JAVA en la

parte dinaacutemica

El proceso para generar paacuteginas JSP accesibles en Web es mucho maacutes simple que en los

servlets Dando por hecho que se tiene un servidor Web que permite usar JSP el coacutedigo se

almacenaraacute en archivos con extensioacuten jsp que incluyen dentro de la estructuras de etiquetas

HTML las sentencias JAVA a ejecutar y tan soacutelo se colocaraacuten en cualquier lugar en donde

se pusiera una paacutegina Web normal sin compilacioacuten sin paquetes y sin configuracioacuten aunque

el servidor tendraacute que ser configurado para acceder a los archivos de clases Servlets y de

JSPs

Aunque lo que se escriba con frecuencia luciraacute como un archivo HTML estaacutendar detraacutes de

ello la paacutegina JSP se convierte automaacuteticamente en un servlet normal donde el HTML

estaacutetico tan soacutelo es enviado al flujo de salida asociado con el meacutetodo service del servlet Esta

traduccioacuten se realiza la primera vez que se solicita la paacutegina De acuerdo como este

configurado el servidor es posible ver el coacutedigo fuente de los servlets generados a partir de

sus paacuteginas JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Por ejemplo supongamos que se ha escrito el siguiente coacutedigo en el archivo Saludojsp

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtEjemplo JSPlttitlegtltheadgt

ltbody bgcolor=ffffccgt

ltcentergt

lth2gtHola mundolth2gt

ltjavautilDate hoy = new javautilDate()gt

La fecha de hoy es lt=hoygt

ltcentergt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional y un fragmento de un scriptlet de JAVA La etiqueta

lt identifica el comienzo del scriptlet y gt el final Una expresioacuten de la forma =variable

es sustituida por el valor de esa variable Para ejecutar esta paacutegina o cualquier otra paacutegina

JSP desde un navegador hay que instalarla en el servidor de aplicaciones de la misma manera

en como se hizo con los servlets Suponiendo entonces que se tiene instalado el Tomcat 5

siga los siguientes pasos

1 Antildeadir en el servidor la carpeta digamos JSP2 dentro de la carpeta webapps del Tomcat

y construir sobre ella la jerarquiacutea de clases ya conocida de los servlets

webappsrarrJSP2rarrWEB-INFrarrclasses

WEB-INFrarrlib

WEB-INFrarrtags

2 Editar en la carpeta WEB-INF el descriptor de despliegue webxml que se indica a

continuacioacuten Este archivo XML indica doacutende se localiza el esquema XML para la

especificacioacuten Servlet 24 que a suvez utiliza el esquema XML para la especificacioacuten

Java Server Page 20 que son las especificaciones que soporta en servidor Tomcat

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=

httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

3 Crear en JSP2 la carpeta saludo que contendraacute la aplicacioacuten y copiar en ella la paacutegina

Saludojsp

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

4 Arrancar el servidor Si el servidor ya estaba arrancado detenerlo y volverlo a arrancar o

bien abrir el explorador escribir el URL httplocalhost8080managerhtml e instalar

la aplicacioacuten

5 Una vez arrancado el servidor verificar si estaacute funcionando correctamente escribiendo

el URL siguiente en el explorador httplocalhost8080 El explorador debe mostrar la

paacutegina del Tomcat

6 Ejecutar la paacutegina JSP iniciando el explorador y escribiendo el URL siguiente

httplocalhost8080JSP2saludoSaludojsp donde la sintaxis geneacuterica es

httpservidor[puerto]MiCarpetapaginajsp

Cuando esta paacutegina (Saludojsp) es invocada por primera vez el motor JSP lleva a cabo una

fase de traduccioacuten de la misma en un servlet y el motor Servlet es el que ejecutaraacute eacuteste uacuteltimo

para generar el HTML dinaacutemico que seraacute enviado al explorador cliente seguacuten puede

deducirse de la figura siguiente La proacutexima vez que la paacutegina sea solicitada el motor JSP

ejecutaraacute el servlet que fue caragado la primera vez a no ser que la paacutegina haya cambiado

en cuyo caso seraacute compilada automaacuteticamente en un nuevo servlet y ejecutada

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Regresando al ejemplo el archivo java generado por el Tomcat a partir del archivo

Saludojsp se localiza en la carpeta workCatalinalocalhost de la instalacioacuten de Tomcat

321 ELEMENTOS PARA SECUENCIAS DE COMANDOS

Los elementos para secuencias de comandos permiten insertar coacutedigo en el servlet que seraacute

generado a partir de la paacutegina JSP Existen tres formas

1 Expresiones del tipo lt= expresioacuten gt que se evaluacutean e insertan en el resultado del

servlet

2 Los scriptlets del tipo lt codigo gt que se insertan en el meacutetodo _jspService del

servlet (ejecutado por service)

3 Las declaraciones del tipo lt Codigo gt que se insertan en el cuerpo de la clase del

servlet fuera de cualquier meacutetodo existente

NOTA Los comentarios en JSP se escriben lt-- Comentario JSP --gt en tanto que los

comentarios en HTML son de la forma lt--Comentario HTML --gt La diferencia

semaacutentica radica en que los comentarios HTML cuando se insertan en la respuesta enviada

por el servidor al cliente no se muestran cuando se visualiza el documento HTML pero si

Servidor Maacutequina Cliente

Explorador Web

Contenedor Web

Motor Servlet

Motor JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

los podemos ver cuando se visualiza el coacutedigo fuente en tanto que los comentarios JSP

aunque se inserten en la respuesta enviada por el servidor al cliente no son enviados al

explorador de forma que tampoco se muestran ni se ven cuando se visualiza el coacutedigo fuente

HTML desde el explorador

3211 EXPRESIONES

Se utiliza una expresioacuten JSP para insertar valores directamente en el resultado La sintaxis es

lt= expresioacuten gt Por ejemplo

lt= requestgetParameter(ldquoparNombre) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt lt= s gt

La fecha y hora actual es lt= new javautilDate() gt

La expresioacuten se evaluacutea se convierte a cadena y se inserta en la paacutegina Esta evaluacioacuten se

realiza durante la ejecucioacuten

32111 VARIABLES PREDEFINIDAS

Para simplificar estas expresiones se pueden utilizar cierta cantidad de variables

predefinidas Estos objetos impliacutecitos como tambieacuten se les llama estaacuten disponibles para su

uso durante la implementacioacuten de una paacutegina Web

bull pageContext Es un objeto de la clase PageContext que proporciona acceso a objetos

relacionados con los servlets

bull request Es un objeto de la clase HttpServletRequest que se puede obtener a traveacutes del

meacutetodo getRequest que encapsula los datos enviados por el cliente al servidor

bull response Es un objeto de la clase HttpServletResponse que puede obtenerse a traveacutes

del meacutetodo getResponse que encapsula los datos que el servidor enviaraacute al cliente

bull application Es un objeto de la clase ServletContext que se obtiene a traveacutes del meacutetodo

getServletContext que define un conjunto de meacutetodos que todo servlet utiliza para

comunicar con el contenedor de servlets

bull config Es un objeto de la clase ServletConfig que se obtiene a traveacutes del meacutetodo

getServletConfig y que se utiliza por el contenedor de servlets para pasar informacioacuten

al servlet durante la iniciacioacuten

bull session Es un objeto de la clase HttpSession que se obtiene a traveacutes del meacutetodo

getSession que proporciona una forma de identificar a un usuario que visita las paacuteginas

de un sitio Web

bull out Es un objeto de la clase JspWriter que se obtiene a traveacutes del meacutetodo getOut que

se utiliza para almacenar la respuesta que seraacute enviada al cliente que hizo la peticioacuten de

la paacutegina

bull page Es un objeto geneacuterico de la clase Object que se obtiene a traveacutes del meacutetodo

getPage y que representa al servlet obtenido a partir de la paacutegina JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

bull exception Es un objeto de la clase Exception que se obtiene a traveacutes del meacutetodo

getException que contendraacute informacioacuten a cerca de cualquier excepcioacuten que se lance

desde la paacutegina JSP

Un ejemplo del uso de uno de estos objetos impliacutecitos seriacutea el siguiente

El nombre de tu host es lt= requestgetRemoteHost() gt

El listado siguiente da un ejemplo de una paacutegina JSP que utiliza algunas variables

predefinidas como uso de expresiones JSP

ltDOCTYPE HTML PUBLIC -W3CDTD HTML 40 Transitional ENgt

lthtmlgt

ltheadgt

lttitlegt Expresiones JSP lttitlegt

ltheadgt

ltbodygt

lth2gt Expresiones JSP lth2gt

ltULgt

ltligt Fecha y hora en curso lt= new javautilDate() gt ltligt

ltligt Nombre de su host lt= requestgetRemoteHost() gt ltligt

ltligt Identificador de su sesioacuten lt= sessiongetId() gt ltligt

ltligt El paraacutemetro ltcodegt paramPrueba ltcodegt del formulario

lt= requestgetParameter(paramPrueba) gt ltligt

ltULgt

ltbodygt

lthtmlgt

Cuya salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3212 LOS SCRIPTLETS JSP

Si se desea hacer algo maacutes complejo que una simple expresioacuten los scriptlets permiten insertar

coacutedigo JAVA en el meacutetodo _jspService del servlet (que es ejecutado por service) La sintaxis

utilizada por los scriptlets es lt coacutedigo java gt Los escriptlets tienen acceso a las

mismas variables definidas de forma automaacutetica como expresiones A manera de ejemplo si

se desea que el resultado aparezca en la paacutegina generada deberiacutea de utilizarse la variable out

como en la siguiente instruccioacuten

lt String datosConsultados= requestgetQueryString()

outprintln(ldquoDatos GET adjuntos ldquo+datosConsultados)

gt

En este ejemplo podriacutea haberse obtenido el mismo resultado utilizando la siguiente expresioacuten

JSP

Datos GET adjuntos lt=requestgetQueryString() gt

En general los scriptlets pueden ejecutar varias tareas que no podriacutean realizarse con las

expresiones Tales tareas incluyen

bull La determinacioacuten de encabezados de respuesta

bull Actualizacioacuten de Bases de Datos

bull Ejecucioacuten de bucles condiciones y otras estructuras complejas

lt for (int i=1 ilt=6 i++)

gt

lth lt=i gtgt Hola Mundo lthlt=i gtgt

lt gt

Como un ejemplo concreto se muestra la siguiente paacutegina JSP llamada Cuentajsp en donde

se observa coacutemo se hace un seguimiento del nuacutemero de veces que un cliente accede a esta

paacutegina a traveacutes de distintas sesiones Para ello supondremos que dicha cuenta es el valor del

atributo atrCuenta del objeto impliacutecito application ya citado La primera vez que el cliente

accede a la paacutegina el valor de atrCuenta seraacute null debido a que auacuten no ha sido fijado este

atributo en este caso se fijaraacute con el valor 1 En los siguientes accesos se leeraacute el valor del

atributo atrCuenta se incrementaraacute en una unidad y se volveraacute a fijar Finalmente se enviacutea

la respuesta al cliente para que se muestre al usuario el valor del contador

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en el objeto impliacutecito application con el nombre

atrCuenta

--gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt

Integer cuenta = (Integer)applicationgetAttribute(atrCuenta)

String s = vez

if (cuenta == null)

cuenta = new Integer(1)

else

cuenta = new Integer(cuentaintValue() + 1)

s = veces

applicationsetAttribute(atrCuenta cuenta)

gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

Has visitado esta paacutegina lt= cuenta gt lt= s gt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional un fragmento de coacutedigo JAVA o scriptlet

expresiones y comentarioshellip

Aquiacute otro ejemplo de la ejecucioacuten de un coacutedigo demasiado complejo para una expresioacuten JSP

Este listado presenta una paacutegina JSP que utiliza el paraacutemetro de peticioacuten colorFondo para

establecer el color de fondo de la paacutegina

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgt

lttitlegt Prueba de Color lttitlegt

ltheadgt

lt

String colorFondo=requestgetParameter(colorFondo)

boolean tieneColorExplicito

if (colorFondo =null)

tieneColorExplicito=true

else

tieneColorExplicito=false

colorFondo=WHITE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt

ltbody bgcolor=lt= colorFondo gtgt

lth2 align=centergt Prueba de color lth2gt

lt

if (tieneColorExplicito)

outprintln(Ha indicado un color de fondo expliacutecito +

colorFondo +)

else

outprintln(Usareacute el color de fondo predeterminado WHITE +

Indique el atributo de peticioacuten

ltigtcolorFondoltigt+

para intentar un color estaacutendar un +

valor RRGGBB o para ver si el navegador Web +

permite el uso de nombres de color X11)

gt

ltbodygt

lthtmlgt

Cuyas posibles salidas son

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3213 DECLARACIONES JSP

Una declaracioacuten JSP permite definir meacutetodos o campos que seraacuten insertados en el cuerpo

principal de la clase del servlet (fuera del meacutetodo _jspService) Una declaracioacuten tiene la

sintaxis lt Coacutedigo Java gt Por ejemplo

lt int i=0 gt

lt

Public void jspinit()

coacutedigo de iniciacioacuten

gt

Una declaracioacuten no genera ninguacuten resultado y se usan junto con las expresiones JSP o los

scriptlets A continuacioacuten se muestra una paacutegina JSP que despliega la cantidad de veces que

se ha solicitado esta paacutegina desde que se arrancoacute el servidor haciendo uso de las

declaraciones JSP

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtDeclaraciones JSPlttitlegtltheadgt

ltbodygt

lth1gtDeclaraciones JSPlth1gt

lt-- Esto es un comentario en JSP --gt

lt private int recuentoAccesos=0 gt

lth2gt Accesos a la paacutegina desde el reinicio del servidor

lt= ++recuentoAccesos gt lth2gt

ltbodygt

lthtmlgt

La salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

322 EL LENGUAJE DE EXPRESION EN JSP 20

Anteriormente se ha visto la necesidad de utilizar fragmentos de coacutedigo java en el desarrollo

de paacuteginas JSP pero con la aparicioacuten de la especificacioacuten JSP 20 ya no hay necesidad de

utilizar fragmentos de coacutedigo Java para nada gracias al nuevo lenguaje de expresioacuten EL

(Expresioacuten Language) a la biblioteca de etiquetas estandar JSTL (JSP Standar Tag Library)

y a las nuevas formas para desarrollar etiquetas personalizadas

El lenguaje de expresioacuten JSP es maacutes un lenguaje de acceso a datos que un lenguaje de

programacioacuten Ya se ha visto que para pasar informacioacuten de un cliente a una paacutegina JSP se

utilizan paraacutemetros en la peticioacuten y atributos en la paacutegina El lenguaje de expresioacuten lo hace

posible sin tener que utilizar scriptlets o expresiones (lt= expresioacuten gt) Por ejemplo las

liacuteneas JSP 12 siguientes escritas utilizando coacutedigo Java

lt= requestgetParameter(ldquoparNombrerdquo) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt veces

bajo la especificacioacuten JSP 20 se pueden escribir de una forma maacutes sencilla como sigue

(ahora no se trata de coacutedigo JAVA)

$paramparNombre has visitado esta paacutegina

$atrCuenta veces

La sintaxis de JSP es sensible a mayuacutesculas y minuacutesculas pero un par de comillas simples es

equivalente a un par de comillas dobles

3221 VARIABLES PREDEFINIDAS (Objetos Impliacutecitos)

El lenguaje de expresioacuten JSP 20 soporta los objetos impliacutecitos siguientes

pageContext Objeto de javaxservletjspPageContext que proporciona acceso a los

datos de una peticioacuten

param Coleccioacuten (objeto de tipo javautilMap) de todos los valores de los paraacutemetros

enviados en una peticioacuten un String por paraacutemetro

paramValues Coleccioacuten de todos los valores de los paraacutemetros enviados en una

peticioacuten una matriz de tipo String por paraacutemetro

header Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten un

String por cabecera

headerValues Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten

una matriz de tipo String por cabecera

cookie Coleccioacuten de todos los valores de las cookies un objeto javaxservlethttpCookie

por cookie

initParam Coleccioacuten de todos los valores de los paraacutemetros de iniciacioacuten de la

aplicacioacuten un String por paraacutemetro

Tambieacuten hay objetos que permiten acceder a variables definidas en diferentes aacutembitos lo que

posibilita compartir informacioacuten

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

pageScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de paacutegina

requestScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

peticioacuten

sessionScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de sesioacuten

applicationScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

aplicacioacuten

3222 DIRECTRICES

Las directrices page incluye y taglib son mensajes para el motor JSP y son siempre incluidas

entre los siacutembolos lt y gt

32221 LA DIRECTRIZ PAGE

Define atributos que se aplican a toda la paacutegina JSP donde es incluida

lt page lista_de_atributos gt

Donde la lista_de_atributos puede contener algunos de los siguientes (aquellos que estaacuten

escritos en negrita son los tomados por omisioacuten)

language= ldquoscriptingLanguagerdquo

extends= rdquoclassNamerdquo

import= ldquoimportListrdquo

session= ldquotrue|falserdquo

buffer= ldquonone|sizeKb

autoflush= ldquotrue|falserdquo

isThreadSafe= rdquotrue|falserdquo

info= rdquoinfo_textrdquo

errorPage= ldquoerror_urlrdquo

isErrorPage= rdquotrue|falserdquo

contentType= rdquoctinfordquo

pageEncoding= rdquopeinfordquo

isELIgnored= ldquotrue|falserdquo

Tiacutepicamente se localiza al principio de la paacutegina JSP y puede haber cualquier nuacutemero de

ellas El lenguaje por omisioacuten es Java Ejemplos

lt page contentType=rdquotexthtmlrdquo language=rdquojavardquo gt

lt page import=rdquojavautil javalangrdquo gt

lt page buffer=rdquo5kbrdquo autoflush=rdquofalserdquo gt

32222 LA DIRECTRIZ INCLUDE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

La directriz include incluye un archivo (html jsp xml o de texto) en una paacutegina JSP Esto

permite dividir el contenido de la paacutegina en trozos maacutes manejables

lt incluye file=rdquoURL_relativordquo gt

El ejemplo siguiente muestra dos archivos el primero incluye al segundo para mostrar la

fecha y hora actuales

lt-- fichero mostrarFechaHorajsp --gt

lthtmlgt

ltheadgtlttitlegtIncluir un ficherolttitlegtltheadgt

ltbody bgcolor=whitegt

ltfont color=bluegt

La fecha y hora actuales son

lt include file=fechaHorajsp gt

ltfontgt

ltbodygt

lthtmlgt

lt-- fichero fechaHorajsp --gt

lt page import=javautil gt

lt= (new javautilDate())toLocaleString() gt

32223 LA DIRECTRIZ TAGLIB

La directriz taglib indica la biblioteca de acciones personalizadas que podremos utilizar en

la codificacioacuten de la paacutegina JSP Para distinguir esas acciones entre otras existentes se utiliza

un prefijo (prefix) Su sintaxis es

lt taglib (uri=rdquoURI_bibliotecardquo|tagdir=rdquoDir_biblioteca_tagrdquo)

prefix=rdquoprefijordquo gt

Cuando se trata de una biblioteca definida mediante una clase Java y un descriptor (archivo

tld) eacutesta se identifica mediante un URI (Uniform Resource Identifier- URL relativos) Por

ejemplo

lt taglib uri=rdquohttpMarioRossainzLopezmiBibliotecardquo

prefix=rdquofunrdquo gt

ltpgtltfunaccion01 gt

La uacuteltima liacutenea del ejemplo tiene dos etiquetas una etiqueta p HTML y otra accion01

perteneciente a la biblioteca miBiblioteca En cambio si la biblioteca se define mediante un

archivo tag entonces se identifica mediante su ruta relativa en el sistema de archivos

lt taglib tagdir=rdquoWEB-INFtagsrdquo prefix=rdquofunrdquo gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpgtltfunaccion01 gt

La directriz taglib debe colocarse antes de utilizar en la paacutegina JSP las acciones

personalizadas definidas por la misma Se puede utilizar maacutes de una directriz pero el prefijo

utilizado debe ser uacutenico para cada una de ellas

3223 ACTIVACION DEL LENGUAJE DE EXPRESION (LE)

La especificacioacuten JSP 20 define un lenguaje de expresioacuten como alternativa a elementos de

programacioacuten escritos con coacutedigo Java y especificaciones anteriores a la JSP 20 Para que

este lenguaje pueda ser interpretado tienen que cumplirse 2 requisitos

1 Que la propiedad isELIgnored de la directriz page valga false

lt page isELIgnored= ldquofalserdquo gt

2 Que el descriptor de despliegue webxml en la carpeta WEB-INF indique doacutende se

localiza el esquema XML para la especificacioacuten Servlet 24 que a su vez utiliza el

esquema XML para la especificacioacuten Java Server Page 20

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

Utilizando el lenguaje de expresioacuten se podriacutea modificar la paacutegina Cuentajsp de la seccioacuten

3212 de este documento como se muestra a continuacioacuten Esta nueva paacutegina

1 Especifica que utilizaraacute la biblioteca core de etiquetas estandar (de la que se hablaraacute maacutes

adelante)

2 La primera vez que sea accedida definiraacute la variable atrCuenta en el aacutembito de la

aplicacioacuten con un valor inicial nulo y la incrementaraacute en una unidad cuando sea accedida

sucesivas veces simplemente incrementaraacute esta variable en una unidad

3 Finalmente mostraraacute una paacutegina con un contenido anaacutelogo al siguiente Esta formado

por una cabecera y una segunda liacutenea compuesta por el valor del paraacutemetro parNombre

enviado con la peticioacuten un texto fijo el valor de la variable atrCuenta y otro texto fijo

dependiente del valor de esta variable

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

El coacutedigo completo es el siguiente

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

3224 VARIABLES Y EXPRESIONES

Para acceder a una simple variable se puede escribir algo como lo siguiente $nombre y

para acceder a una propiedad de un objeto podemos escribir algo como

$paramparNombre

$applicationScopeatrCuenta

$pageContextrequestrequestURI

La primera liacutenea del ejemplo anterior obtiene el valor de la propiedad parNombre del objeto

param la segunda el valor del atributo atrCuenta del objeto applicationScope y la tercera

el URL relativo de la paacutegina JSP solicitada

El lenguaje de expresioacuten es maacutes tolerante con respecto a las variables con valor null y ejecuta

muchas maacutes conversiones de forma automaacutetica sobre el tipo de los datos cuando la expresioacuten

a evaluar asiacute lo requiere Por ejemplo la etiqueta condicional siguiente incluye una expresioacuten

que compara el valor del atributo atrCuenta con aacutembito de aplicacioacuten con 10 (convirtiendo

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

impliacutecitamente el valor del atributo al tipo de la constante para poder realizar la comparacioacuten

El resultado seraacute un valor de tipo boolean

ltcif test=rdquo$applicationScopeatrCuenta gt 10rdquogt

ltcifgt

o bien

ltcif test=rdquo$atrCuenta gt 10rdquogt

ltcifgt

Para que una literal pueda incluir un caracter significativo para el lenguaje dicho caracter

debe ser especificado como una secuencia de escape (caracter) Por ejemplo la siguiente

expresioacuten da lugar al literal ldquovezrdquo o ldquovecesrdquo entre comillas dobles

$(atrCuenta gt 1) iquest ldquordquovecesrdquordquo ldquordquovezrdquordquo

Cualquier objeto o atributo de un objeto definido en algunos de los aacutembitos de una paacutegina

puede ser utilizado como una variable Por ejemplo $atrCuenta+1 es una expresioacuten que

realiza la suma de la variable atrCuenta con 1

Cuando se trate de una propiedad de un objeto para acceder a ella se utilizaraacute el operador

punto o bien la notacioacuten empleada para acceder a un elemento de una matriz Por ejemplo

$paramparNombre

$param[ldquoparNombrerdquo]

Una expresioacuten LE puede aparecer en cualquier lugar donde pueda aparecer un texto fijo Por

tanto para informar al contenedor JSP que se trata de una expresioacuten y no de un texto fijo se

utilizan los delimitadores $ al principio y al final

3225 OPERADORES

OPERADOR DESCRIPCIOacuteN Acceso a la propiedad de un objeto o a un elemento de un Map

[] Acceso al elemento de una matriz o de un objeto List

() Pareacutentesis para alterar la prioridad en la evaluacioacuten de una expresioacuten

If ternario condicion expresion1 expresioacuten 2

+ Suma

- Resta

Producto

oacute div Divisioacuten

oacute mod Moacutedulo o resto de una divisioacuten

== oacute eq Igualdad

= oacute ne Diferente

lt oacute lt Menor que

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt oacute gt Mayor que

lt= oacute le Menor o igual que

gt= oacute ge Mayor o igual que

ampamp oacute and Operacioacuten Loacutegica AND

|| oacute or Operacioacuten Loacutegica OR

oacute not Operacioacuten Loacutegica NOT

empty Verifica si el valor de una variable es null si un String esta vaciacuteo o si una matriz Map

o Collection no tienen elementos

func(args) Llamada a una funcioacuten donde func es el nombre de la funcioacuten y arg representa cero o

maacutes argumentos separados por comas

El ejemplo siguiente muestra una paacutegina JSP compuesta por elementos HTML expresiones

LE y objetos impliacutecitos

lthtmlgt

ltheadgtlttitlegtJSP 20lttitlegtltheadgt

ltbodygt

lth3gtLenguaje de expresioacuten (LE)lth3gt

ltpgtLa siguiente tabla ilustra algunas expresiones LE

ltbrgtltbrgtlttable border=1gt

lttrgt

ltthgtltbgtExpresioacutenltbgtltthgt

ltthgtltbgtValorltbgtltthgt

lttrgt

lttrgt

lttdgt$3 + 6lttdgt

lttdgt$3 + 6lttdgt

lttdgt

lttrgt

lttdgt$(7 gt 4) 7 4lttdgt

lttdgt$(7 gt 4) 7 4lttdgt

lttrgt

lttrgt

lttdgt$header[host]lttdgt

lttdgt$header[host]lttdgt

lttrgt

lttablegt

ltbodygt

lthtmlgt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

323 BIBLIOTECA ESTANDAR DE ETIQUETAS

La biblioteca estaacutendar de etiquetas JSP (JSTL ndash Java Server Page Estaacutendar Tag Library)

incluye una cantidad amplia de etiquetas para diferentes aacutereas de trabajo

Aacuterea baacutesica (su prefijo es c ndash core) y contiene

o Soporte de variables (remove y set)

o Control del flujo (choose when otherwise forEach forTokens if)

o Manejo de URL (import param redirect param y url param)

o Operaciones varias (match y out)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlcore

Aacuterea XML (su prefijo es x) y contiene

o Sentencias baacutesicas (out parse y set)

o Control del flujo (choosehellip whenhellip otherwise forEach e if)

o Transformacioacuten de Documentos (transformhellipparam)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlxml

Aacuterea Internacionalizacioacuten (su prefijo es fmt) Contiene

o Localidad (setLocale y requestEncoding)

o Mensajes (bundle message param y setBundle)

o Formateo de Fechas y nuacutemeros (formatNumber formateacuteate parseDate

parseNumber setTimeZone timeZone)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlfmt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Aacuterea SQL (su prefijo es sql) es el lenguaje estandar para interactuar con bases de datos

relacionales y contiene setDataSource Quero dateParam param transaction y

update dateParam param) El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlsql

Aacuterea Funciones (su prefijo es fn) y contiene

o Longitud de una coleccioacuten (length)

o Manipulacioacuten de String (toUpperCase toLowerCase substring

substringAfter substringBefore trim replace indexOf startsWith

endsWith contains containsIgnoreCase split join y escapeXml)

o El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlfunctions

3231 OPERACIONES CON ETIQUETAS BAacuteSICAS

En un ejemplo pasado teniacuteamos el siguiente coacutedigo

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

En este ejemplo se hace referencia al aacuterea baacutesica de JSTL con el prefijo c y se utiliza la

etiqueta cset para definir la variable atrCuenta Si la variable ya esta definida simplemente

se le asigna el valor especificado

La uacuteltima parte del ejemplo anterior podriacutea haberse escrito de esta otra forma

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcif test=rdquo$atrCuenta gt 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcifgt

$atrCuenta $str

La etiqueta cif permite la ejecucioacuten condicional de su cuerpo en funcioacuten del valor del

atributo de test

La etiqueta cchoose permite la ejecucioacuten del cuerpo de la primera etiqueta cwhen cuyo

atributo test sea evaluado a true Si ninguna de las condiciones se evaluacutea a true entonces se

evaluacutea el cuerpo de la etiqueta cotherwise si estaacute presente El siguiente coacutedigo muestra otra

manera de escribir el ejemplo anterior utilizando estas uacuteltimas etiquetas

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcchoosegt

ltcwhen test=rdquo$atrCuenta == 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcwhengt

ltcotherwisegt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcotherwisegt

ltcchoosegt

$atrCuenta $str

La etiqueta cforEach permite iterar sobre una coleccioacuten de objetos La coleccioacuten se

especifica por medio del atributo iacutetems y el elemento actual de la coleccioacuten estaacute disponible a

traveacutes de la variable establecida por el atributo var Por ejemplo el siguiente fragmento de

coacutedigo visualiza una tabla con las variables definidas a nivel de aacutembito de paacutegina

lttable border=rdquo1rdquogt

ltcforEach var=rdquoitemrdquo iacutetems=rdquo$pageScoperdquogt

lttrgt

lttdgt $item lttdgt

lttrgt

ltcforEachgt

lttablegt

La etiqueta ccatch atrapa una excepcioacuten que ocurra en el cuerpo de la misma Por ejemplo

el siguiente segmento de coacutedigo lanzaraacute una excepcioacuten si el paraacutemetro mes se escribe con

letras en vez de con nuacutemeros

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltbodygt

lthtmlgt

Un URL anaacutelogo al siguiente daraacute lugar a que la excepcioacuten sea lanzada cuando se ejecute la

expresioacuten $nMes 3 de la paacutegina anterior

httplocalhost8080JSP2exceppruebajspmes=marzo

La excepcioacuten indica que ha ocurrido un error al tratar de convertir ldquomarzordquo a un entero de

tipo Long Para cachar esta excepcioacuten y darle un tratamiento adecuado habraacute que modificar

la paacutegina JSP anterior como se indica a continuacioacuten

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltccatch var=rdquoerrorOcurridordquogt

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltccatchgt

ltcif test=rdquo$not empty errorOcurridordquogt

Error el paraacutemetro mes debe ser un nuacutemero ltbgt

ltbrgt Informacioacuten del error dada por el sistema

ltbrgt ltfont color=rdquoFF0000rdquogt $errorOcurrido ltfontgt

ltcifgt

ltbodygt

lthtmlgt

3232 ACCESO A BASES DE DATOS CON JSP

Las etiquetas que proporciona el aacuterea SQL permiten realizar

Conexioacuten con una base de datos

Realizacioacuten de consultas a la base de datos

Acceso al conjunto de resultados

Ejecucioacuten de actualizaciones y transacciones

Todas las etiquetas SQL actuacutean sobre una base de datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

32321 CONEXIOacuteN CON LA BASE DE DATOS

La conexioacuten con la base de datos puede realizarse con la etiqueta sqlsetDataSource Por

ejemplo si se esta utilizando el administrador de bases de datos MySql con el controlador

JDBC se puede realizar una conexioacuten con una base de datos digamos bd_tutorias de la

manera siguiente

ltsqlsetDataSource var=rdquobdrdquo

driver=rdquocommysqljdbcDriverrdquo

url=rdquojdbcmysqllocalhost3306bd_tutoriasrdquo

user=rdquoadminrdquo

password=rdquoadminadminrdquo gt

32322 CONSULTA A LA BASE DE DATOS

La etiqueta sqlQuero permite realizar una consulta a una base de datos Por ejemplo el

siguiente fragmento de coacutedigo realiza una consulta a la base de datos representada por bd y

obtiene un conjunto de resultados representado por cdr

ltsqlquery var=rdquocdrrdquo dataSource=rdquo$bdrdquogt

SELECT professor dia hora alumno

FROM profesores tutorias citas

WHERE profesoresid_profesor=tutoriasid_profesor

AND tutoriasid_tutoria=citasid_tutoria

ltsqlquerygt

32323 MODIFICACIONES SOBRE LA BASE DE DATOS

La etiqueta sqlupdate permite ejecutar una sentencia SQL INSERT UPDATE o DELETE

y cualquier otra sentencia SQL que no retorne ninguacuten valor Por ejemplo

ltsqlupdate var=rdquocontrdquo dataSource=rdquo$bdrdquo gt

UPDATE profesores

SET profesor=

WHERE profesor=

ltsqlparam value=rdquo$paramProfesorrdquo gt

ltsqlparam value=rdquo$paramIDrdquo gt

ltsqlupdategt

Una operacioacuten UPDATE puede utilizar el siacutembolo para indicar que el valor que tendriacutea que

evaluarse en esa posicioacuten seraacute suministrado por una etiqueta sqlparam como por ejemplo

httplocalhost8080JSP2sqlpruebajspProfesor=Mario+Rossainz+LopezampID=514

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public String DameResultado()

return Resultado

ObListadojava

public class ObRegistro

private String DNI Nombre Apellido

private int Edad

ObRegistro (String DNI String Nombre String Apellido int Edad)

thisDNI = DNI

thisNombre = Nombre

thisApellido = Apellido

thisEdad = Edad

String DameDNI()

return DNI

String DameNombre()

return Nombre

String DameApellido()

return Apellido

int DameEdad()

return Edad

ObRegistrojava

import javasql

public class ObConsulta

private int Posicion = 0

private ObRegistro DatosPersona

ObConsulta(String DNIPedido)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement()

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

while (Personasnext())

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

String DNI = PersonasgetString(DNI)

if (DNIequalsIgnoreCase(DNIPedido))

Posicion = PersonasgetRow()

String Nombre = PersonasgetString(Nombre)

String Apellido = PersonasgetString(Apellido)

int Edad = PersonasgetInt(Edad)

DatosPersona = new ObRegistro(DNINombreApellidoEdad)

break

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public int PosicionEncontrada()

return Posicion

public ObRegistro DameDatos()

return DatosPersona

ObConsultajava

import javasql

public class ObInserccion

ObInserccion(ObRegistro Datos)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

PersonasmoveToInsertRow()

PersonasupdateString(DNI DatosDameDNI())

PersonasupdateString(NombreDatosDameNombre())

PersonasupdateString(Apellido DatosDameApellido())

PersonasupdateInt(EdadDatosDameEdad())

PersonasinsertRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

catch (SQLException e)

Systemoutprintln(e)

ObInsercionjava

import javasql

public class ObModificacion

ObModificacion(int PosicionBuscada ObRegistro Datos)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

Personasabsolute(PosicionBuscada)

PersonasupdateString(DNIDatosDameDNI())

PersonasupdateString(NombreDatosDameNombre())

PersonasupdateString(ApellidoDatosDameApellido())

PersonasupdateInt(EdadDatosDameEdad())

PersonasupdateRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

ObModificacionjava

import javasql

public class ObPosicionamiento

private ObRegistro DatosPersona

private int Posicion

ObPosicionamiento(String Accion int Posicion)

int IDAccionEdad

String DNINombreApellido

boolean PosicionCorrecta=false

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

FROM DatosPersonales)

Personasabsolute(Posicion)

IDAccion = IntegerparseInt(Accion)

switch (IDAccion)

case 0

PosicionCorrecta = Personaslast()

break

case 1

PosicionCorrecta = Personasfirst()

break

case 2

PosicionCorrecta = Personasrelative(-5)

break

case 3

PosicionCorrecta = Personasprevious()

break

case 4

PosicionCorrecta = Personasnext()

break

case 5

PosicionCorrecta = Personasrelative(+5)

break

if (PosicionCorrecta)

thisPosicion = PersonasgetRow()

DNI = PersonasgetString(DNI)

Nombre = PersonasgetString(Nombre)

Apellido = PersonasgetString(Apellido)

Edad = PersonasgetInt(Edad)

else

thisPosicion = Posicion

DNI = ----

Nombre = ----

Apellido = ----

Edad = 0

DatosPersona = new ObRegistro(DNINombreApellidoEdad)

Personasclose()

Conexionclose()

SentenciaSQLclose()

Systemoutprintln(StringvalueOf(Posicion)++StringvalueOf(thisPosicion))

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public int Posicion()

return Posicion

public ObRegistro DameDatos() return DatosPersona

ObPosicionamientojava

En este ejemplo se emplean servlets y paacuteginas Web Los clientes habitualmente trabajan en

una computadora remota y los programas se ejecutan en un servidor El mecanismo de

comunicaciones que soporta el protocolo http nos permite consultar en el servidor los datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

que ha seleccionado o escrito el usuario de esta manera se puede observar una disociacioacuten

entre la interfaz graacutefica de usuario (que se ejecuta en los equipos de los clientes) y el

programa que recoge los datos y ejecuta las acciones pertinentes (que se ejecuta en el

servidor)

Como puede observarse el coacutedigo SvAccessoBD es un servlet que lleva a cabo las siguientes

operaciones

1 Recoge los valores provenientes del usuario

2 Determina la naturaleza de la accioacuten a realizar

3 Realiza su cometido con la base de datos

4 Genera la respuesta que recibiraacute el usuario

32 JSP

JSP significa Java Server Pages que traducido quiere decir Paacuteginas de Servidor Java y es

por tanto una tecnologiacutea orientada a crear paacuteginas Web con programacioacuten en JAVA es decir

permite mezclar HTML estaacutendar y estaacutetico con un contenido dinaacutemico etiquetas especiales

(oacuterdenes) y trozos de coacutedigo JAVA (scriptlets o secuencias de oacuterdenes) o contenido dinaacutemico

generado por servlets Eacuteste contenido dinaacutemico se encuentra encerrado en etiquetas

especiales muchas de las cuales inician con lt y finalizan con gt El motor de las paacuteginas

JSP esta basado en los servlets de JAVA

En la tecnologiacutea JSP se crean paacuteginas parecidas a las paacuteginas que se crean en ASP (Active

Server Page de Microsoft) o PHP (Personal Home Page) que son dos tecnologiacuteas de paacuteginas

ejecutadas en el servidor Sin embargo JSP no se cintildee a un sistema operativo o servidor Web

en particular ademaacutes de que proporciona acceso a la tecnologiacutea de Servlets y a JAVA en la

parte dinaacutemica

El proceso para generar paacuteginas JSP accesibles en Web es mucho maacutes simple que en los

servlets Dando por hecho que se tiene un servidor Web que permite usar JSP el coacutedigo se

almacenaraacute en archivos con extensioacuten jsp que incluyen dentro de la estructuras de etiquetas

HTML las sentencias JAVA a ejecutar y tan soacutelo se colocaraacuten en cualquier lugar en donde

se pusiera una paacutegina Web normal sin compilacioacuten sin paquetes y sin configuracioacuten aunque

el servidor tendraacute que ser configurado para acceder a los archivos de clases Servlets y de

JSPs

Aunque lo que se escriba con frecuencia luciraacute como un archivo HTML estaacutendar detraacutes de

ello la paacutegina JSP se convierte automaacuteticamente en un servlet normal donde el HTML

estaacutetico tan soacutelo es enviado al flujo de salida asociado con el meacutetodo service del servlet Esta

traduccioacuten se realiza la primera vez que se solicita la paacutegina De acuerdo como este

configurado el servidor es posible ver el coacutedigo fuente de los servlets generados a partir de

sus paacuteginas JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Por ejemplo supongamos que se ha escrito el siguiente coacutedigo en el archivo Saludojsp

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtEjemplo JSPlttitlegtltheadgt

ltbody bgcolor=ffffccgt

ltcentergt

lth2gtHola mundolth2gt

ltjavautilDate hoy = new javautilDate()gt

La fecha de hoy es lt=hoygt

ltcentergt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional y un fragmento de un scriptlet de JAVA La etiqueta

lt identifica el comienzo del scriptlet y gt el final Una expresioacuten de la forma =variable

es sustituida por el valor de esa variable Para ejecutar esta paacutegina o cualquier otra paacutegina

JSP desde un navegador hay que instalarla en el servidor de aplicaciones de la misma manera

en como se hizo con los servlets Suponiendo entonces que se tiene instalado el Tomcat 5

siga los siguientes pasos

1 Antildeadir en el servidor la carpeta digamos JSP2 dentro de la carpeta webapps del Tomcat

y construir sobre ella la jerarquiacutea de clases ya conocida de los servlets

webappsrarrJSP2rarrWEB-INFrarrclasses

WEB-INFrarrlib

WEB-INFrarrtags

2 Editar en la carpeta WEB-INF el descriptor de despliegue webxml que se indica a

continuacioacuten Este archivo XML indica doacutende se localiza el esquema XML para la

especificacioacuten Servlet 24 que a suvez utiliza el esquema XML para la especificacioacuten

Java Server Page 20 que son las especificaciones que soporta en servidor Tomcat

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=

httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

3 Crear en JSP2 la carpeta saludo que contendraacute la aplicacioacuten y copiar en ella la paacutegina

Saludojsp

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

4 Arrancar el servidor Si el servidor ya estaba arrancado detenerlo y volverlo a arrancar o

bien abrir el explorador escribir el URL httplocalhost8080managerhtml e instalar

la aplicacioacuten

5 Una vez arrancado el servidor verificar si estaacute funcionando correctamente escribiendo

el URL siguiente en el explorador httplocalhost8080 El explorador debe mostrar la

paacutegina del Tomcat

6 Ejecutar la paacutegina JSP iniciando el explorador y escribiendo el URL siguiente

httplocalhost8080JSP2saludoSaludojsp donde la sintaxis geneacuterica es

httpservidor[puerto]MiCarpetapaginajsp

Cuando esta paacutegina (Saludojsp) es invocada por primera vez el motor JSP lleva a cabo una

fase de traduccioacuten de la misma en un servlet y el motor Servlet es el que ejecutaraacute eacuteste uacuteltimo

para generar el HTML dinaacutemico que seraacute enviado al explorador cliente seguacuten puede

deducirse de la figura siguiente La proacutexima vez que la paacutegina sea solicitada el motor JSP

ejecutaraacute el servlet que fue caragado la primera vez a no ser que la paacutegina haya cambiado

en cuyo caso seraacute compilada automaacuteticamente en un nuevo servlet y ejecutada

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Regresando al ejemplo el archivo java generado por el Tomcat a partir del archivo

Saludojsp se localiza en la carpeta workCatalinalocalhost de la instalacioacuten de Tomcat

321 ELEMENTOS PARA SECUENCIAS DE COMANDOS

Los elementos para secuencias de comandos permiten insertar coacutedigo en el servlet que seraacute

generado a partir de la paacutegina JSP Existen tres formas

1 Expresiones del tipo lt= expresioacuten gt que se evaluacutean e insertan en el resultado del

servlet

2 Los scriptlets del tipo lt codigo gt que se insertan en el meacutetodo _jspService del

servlet (ejecutado por service)

3 Las declaraciones del tipo lt Codigo gt que se insertan en el cuerpo de la clase del

servlet fuera de cualquier meacutetodo existente

NOTA Los comentarios en JSP se escriben lt-- Comentario JSP --gt en tanto que los

comentarios en HTML son de la forma lt--Comentario HTML --gt La diferencia

semaacutentica radica en que los comentarios HTML cuando se insertan en la respuesta enviada

por el servidor al cliente no se muestran cuando se visualiza el documento HTML pero si

Servidor Maacutequina Cliente

Explorador Web

Contenedor Web

Motor Servlet

Motor JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

los podemos ver cuando se visualiza el coacutedigo fuente en tanto que los comentarios JSP

aunque se inserten en la respuesta enviada por el servidor al cliente no son enviados al

explorador de forma que tampoco se muestran ni se ven cuando se visualiza el coacutedigo fuente

HTML desde el explorador

3211 EXPRESIONES

Se utiliza una expresioacuten JSP para insertar valores directamente en el resultado La sintaxis es

lt= expresioacuten gt Por ejemplo

lt= requestgetParameter(ldquoparNombre) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt lt= s gt

La fecha y hora actual es lt= new javautilDate() gt

La expresioacuten se evaluacutea se convierte a cadena y se inserta en la paacutegina Esta evaluacioacuten se

realiza durante la ejecucioacuten

32111 VARIABLES PREDEFINIDAS

Para simplificar estas expresiones se pueden utilizar cierta cantidad de variables

predefinidas Estos objetos impliacutecitos como tambieacuten se les llama estaacuten disponibles para su

uso durante la implementacioacuten de una paacutegina Web

bull pageContext Es un objeto de la clase PageContext que proporciona acceso a objetos

relacionados con los servlets

bull request Es un objeto de la clase HttpServletRequest que se puede obtener a traveacutes del

meacutetodo getRequest que encapsula los datos enviados por el cliente al servidor

bull response Es un objeto de la clase HttpServletResponse que puede obtenerse a traveacutes

del meacutetodo getResponse que encapsula los datos que el servidor enviaraacute al cliente

bull application Es un objeto de la clase ServletContext que se obtiene a traveacutes del meacutetodo

getServletContext que define un conjunto de meacutetodos que todo servlet utiliza para

comunicar con el contenedor de servlets

bull config Es un objeto de la clase ServletConfig que se obtiene a traveacutes del meacutetodo

getServletConfig y que se utiliza por el contenedor de servlets para pasar informacioacuten

al servlet durante la iniciacioacuten

bull session Es un objeto de la clase HttpSession que se obtiene a traveacutes del meacutetodo

getSession que proporciona una forma de identificar a un usuario que visita las paacuteginas

de un sitio Web

bull out Es un objeto de la clase JspWriter que se obtiene a traveacutes del meacutetodo getOut que

se utiliza para almacenar la respuesta que seraacute enviada al cliente que hizo la peticioacuten de

la paacutegina

bull page Es un objeto geneacuterico de la clase Object que se obtiene a traveacutes del meacutetodo

getPage y que representa al servlet obtenido a partir de la paacutegina JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

bull exception Es un objeto de la clase Exception que se obtiene a traveacutes del meacutetodo

getException que contendraacute informacioacuten a cerca de cualquier excepcioacuten que se lance

desde la paacutegina JSP

Un ejemplo del uso de uno de estos objetos impliacutecitos seriacutea el siguiente

El nombre de tu host es lt= requestgetRemoteHost() gt

El listado siguiente da un ejemplo de una paacutegina JSP que utiliza algunas variables

predefinidas como uso de expresiones JSP

ltDOCTYPE HTML PUBLIC -W3CDTD HTML 40 Transitional ENgt

lthtmlgt

ltheadgt

lttitlegt Expresiones JSP lttitlegt

ltheadgt

ltbodygt

lth2gt Expresiones JSP lth2gt

ltULgt

ltligt Fecha y hora en curso lt= new javautilDate() gt ltligt

ltligt Nombre de su host lt= requestgetRemoteHost() gt ltligt

ltligt Identificador de su sesioacuten lt= sessiongetId() gt ltligt

ltligt El paraacutemetro ltcodegt paramPrueba ltcodegt del formulario

lt= requestgetParameter(paramPrueba) gt ltligt

ltULgt

ltbodygt

lthtmlgt

Cuya salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3212 LOS SCRIPTLETS JSP

Si se desea hacer algo maacutes complejo que una simple expresioacuten los scriptlets permiten insertar

coacutedigo JAVA en el meacutetodo _jspService del servlet (que es ejecutado por service) La sintaxis

utilizada por los scriptlets es lt coacutedigo java gt Los escriptlets tienen acceso a las

mismas variables definidas de forma automaacutetica como expresiones A manera de ejemplo si

se desea que el resultado aparezca en la paacutegina generada deberiacutea de utilizarse la variable out

como en la siguiente instruccioacuten

lt String datosConsultados= requestgetQueryString()

outprintln(ldquoDatos GET adjuntos ldquo+datosConsultados)

gt

En este ejemplo podriacutea haberse obtenido el mismo resultado utilizando la siguiente expresioacuten

JSP

Datos GET adjuntos lt=requestgetQueryString() gt

En general los scriptlets pueden ejecutar varias tareas que no podriacutean realizarse con las

expresiones Tales tareas incluyen

bull La determinacioacuten de encabezados de respuesta

bull Actualizacioacuten de Bases de Datos

bull Ejecucioacuten de bucles condiciones y otras estructuras complejas

lt for (int i=1 ilt=6 i++)

gt

lth lt=i gtgt Hola Mundo lthlt=i gtgt

lt gt

Como un ejemplo concreto se muestra la siguiente paacutegina JSP llamada Cuentajsp en donde

se observa coacutemo se hace un seguimiento del nuacutemero de veces que un cliente accede a esta

paacutegina a traveacutes de distintas sesiones Para ello supondremos que dicha cuenta es el valor del

atributo atrCuenta del objeto impliacutecito application ya citado La primera vez que el cliente

accede a la paacutegina el valor de atrCuenta seraacute null debido a que auacuten no ha sido fijado este

atributo en este caso se fijaraacute con el valor 1 En los siguientes accesos se leeraacute el valor del

atributo atrCuenta se incrementaraacute en una unidad y se volveraacute a fijar Finalmente se enviacutea

la respuesta al cliente para que se muestre al usuario el valor del contador

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en el objeto impliacutecito application con el nombre

atrCuenta

--gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt

Integer cuenta = (Integer)applicationgetAttribute(atrCuenta)

String s = vez

if (cuenta == null)

cuenta = new Integer(1)

else

cuenta = new Integer(cuentaintValue() + 1)

s = veces

applicationsetAttribute(atrCuenta cuenta)

gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

Has visitado esta paacutegina lt= cuenta gt lt= s gt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional un fragmento de coacutedigo JAVA o scriptlet

expresiones y comentarioshellip

Aquiacute otro ejemplo de la ejecucioacuten de un coacutedigo demasiado complejo para una expresioacuten JSP

Este listado presenta una paacutegina JSP que utiliza el paraacutemetro de peticioacuten colorFondo para

establecer el color de fondo de la paacutegina

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgt

lttitlegt Prueba de Color lttitlegt

ltheadgt

lt

String colorFondo=requestgetParameter(colorFondo)

boolean tieneColorExplicito

if (colorFondo =null)

tieneColorExplicito=true

else

tieneColorExplicito=false

colorFondo=WHITE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt

ltbody bgcolor=lt= colorFondo gtgt

lth2 align=centergt Prueba de color lth2gt

lt

if (tieneColorExplicito)

outprintln(Ha indicado un color de fondo expliacutecito +

colorFondo +)

else

outprintln(Usareacute el color de fondo predeterminado WHITE +

Indique el atributo de peticioacuten

ltigtcolorFondoltigt+

para intentar un color estaacutendar un +

valor RRGGBB o para ver si el navegador Web +

permite el uso de nombres de color X11)

gt

ltbodygt

lthtmlgt

Cuyas posibles salidas son

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3213 DECLARACIONES JSP

Una declaracioacuten JSP permite definir meacutetodos o campos que seraacuten insertados en el cuerpo

principal de la clase del servlet (fuera del meacutetodo _jspService) Una declaracioacuten tiene la

sintaxis lt Coacutedigo Java gt Por ejemplo

lt int i=0 gt

lt

Public void jspinit()

coacutedigo de iniciacioacuten

gt

Una declaracioacuten no genera ninguacuten resultado y se usan junto con las expresiones JSP o los

scriptlets A continuacioacuten se muestra una paacutegina JSP que despliega la cantidad de veces que

se ha solicitado esta paacutegina desde que se arrancoacute el servidor haciendo uso de las

declaraciones JSP

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtDeclaraciones JSPlttitlegtltheadgt

ltbodygt

lth1gtDeclaraciones JSPlth1gt

lt-- Esto es un comentario en JSP --gt

lt private int recuentoAccesos=0 gt

lth2gt Accesos a la paacutegina desde el reinicio del servidor

lt= ++recuentoAccesos gt lth2gt

ltbodygt

lthtmlgt

La salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

322 EL LENGUAJE DE EXPRESION EN JSP 20

Anteriormente se ha visto la necesidad de utilizar fragmentos de coacutedigo java en el desarrollo

de paacuteginas JSP pero con la aparicioacuten de la especificacioacuten JSP 20 ya no hay necesidad de

utilizar fragmentos de coacutedigo Java para nada gracias al nuevo lenguaje de expresioacuten EL

(Expresioacuten Language) a la biblioteca de etiquetas estandar JSTL (JSP Standar Tag Library)

y a las nuevas formas para desarrollar etiquetas personalizadas

El lenguaje de expresioacuten JSP es maacutes un lenguaje de acceso a datos que un lenguaje de

programacioacuten Ya se ha visto que para pasar informacioacuten de un cliente a una paacutegina JSP se

utilizan paraacutemetros en la peticioacuten y atributos en la paacutegina El lenguaje de expresioacuten lo hace

posible sin tener que utilizar scriptlets o expresiones (lt= expresioacuten gt) Por ejemplo las

liacuteneas JSP 12 siguientes escritas utilizando coacutedigo Java

lt= requestgetParameter(ldquoparNombrerdquo) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt veces

bajo la especificacioacuten JSP 20 se pueden escribir de una forma maacutes sencilla como sigue

(ahora no se trata de coacutedigo JAVA)

$paramparNombre has visitado esta paacutegina

$atrCuenta veces

La sintaxis de JSP es sensible a mayuacutesculas y minuacutesculas pero un par de comillas simples es

equivalente a un par de comillas dobles

3221 VARIABLES PREDEFINIDAS (Objetos Impliacutecitos)

El lenguaje de expresioacuten JSP 20 soporta los objetos impliacutecitos siguientes

pageContext Objeto de javaxservletjspPageContext que proporciona acceso a los

datos de una peticioacuten

param Coleccioacuten (objeto de tipo javautilMap) de todos los valores de los paraacutemetros

enviados en una peticioacuten un String por paraacutemetro

paramValues Coleccioacuten de todos los valores de los paraacutemetros enviados en una

peticioacuten una matriz de tipo String por paraacutemetro

header Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten un

String por cabecera

headerValues Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten

una matriz de tipo String por cabecera

cookie Coleccioacuten de todos los valores de las cookies un objeto javaxservlethttpCookie

por cookie

initParam Coleccioacuten de todos los valores de los paraacutemetros de iniciacioacuten de la

aplicacioacuten un String por paraacutemetro

Tambieacuten hay objetos que permiten acceder a variables definidas en diferentes aacutembitos lo que

posibilita compartir informacioacuten

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

pageScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de paacutegina

requestScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

peticioacuten

sessionScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de sesioacuten

applicationScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

aplicacioacuten

3222 DIRECTRICES

Las directrices page incluye y taglib son mensajes para el motor JSP y son siempre incluidas

entre los siacutembolos lt y gt

32221 LA DIRECTRIZ PAGE

Define atributos que se aplican a toda la paacutegina JSP donde es incluida

lt page lista_de_atributos gt

Donde la lista_de_atributos puede contener algunos de los siguientes (aquellos que estaacuten

escritos en negrita son los tomados por omisioacuten)

language= ldquoscriptingLanguagerdquo

extends= rdquoclassNamerdquo

import= ldquoimportListrdquo

session= ldquotrue|falserdquo

buffer= ldquonone|sizeKb

autoflush= ldquotrue|falserdquo

isThreadSafe= rdquotrue|falserdquo

info= rdquoinfo_textrdquo

errorPage= ldquoerror_urlrdquo

isErrorPage= rdquotrue|falserdquo

contentType= rdquoctinfordquo

pageEncoding= rdquopeinfordquo

isELIgnored= ldquotrue|falserdquo

Tiacutepicamente se localiza al principio de la paacutegina JSP y puede haber cualquier nuacutemero de

ellas El lenguaje por omisioacuten es Java Ejemplos

lt page contentType=rdquotexthtmlrdquo language=rdquojavardquo gt

lt page import=rdquojavautil javalangrdquo gt

lt page buffer=rdquo5kbrdquo autoflush=rdquofalserdquo gt

32222 LA DIRECTRIZ INCLUDE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

La directriz include incluye un archivo (html jsp xml o de texto) en una paacutegina JSP Esto

permite dividir el contenido de la paacutegina en trozos maacutes manejables

lt incluye file=rdquoURL_relativordquo gt

El ejemplo siguiente muestra dos archivos el primero incluye al segundo para mostrar la

fecha y hora actuales

lt-- fichero mostrarFechaHorajsp --gt

lthtmlgt

ltheadgtlttitlegtIncluir un ficherolttitlegtltheadgt

ltbody bgcolor=whitegt

ltfont color=bluegt

La fecha y hora actuales son

lt include file=fechaHorajsp gt

ltfontgt

ltbodygt

lthtmlgt

lt-- fichero fechaHorajsp --gt

lt page import=javautil gt

lt= (new javautilDate())toLocaleString() gt

32223 LA DIRECTRIZ TAGLIB

La directriz taglib indica la biblioteca de acciones personalizadas que podremos utilizar en

la codificacioacuten de la paacutegina JSP Para distinguir esas acciones entre otras existentes se utiliza

un prefijo (prefix) Su sintaxis es

lt taglib (uri=rdquoURI_bibliotecardquo|tagdir=rdquoDir_biblioteca_tagrdquo)

prefix=rdquoprefijordquo gt

Cuando se trata de una biblioteca definida mediante una clase Java y un descriptor (archivo

tld) eacutesta se identifica mediante un URI (Uniform Resource Identifier- URL relativos) Por

ejemplo

lt taglib uri=rdquohttpMarioRossainzLopezmiBibliotecardquo

prefix=rdquofunrdquo gt

ltpgtltfunaccion01 gt

La uacuteltima liacutenea del ejemplo tiene dos etiquetas una etiqueta p HTML y otra accion01

perteneciente a la biblioteca miBiblioteca En cambio si la biblioteca se define mediante un

archivo tag entonces se identifica mediante su ruta relativa en el sistema de archivos

lt taglib tagdir=rdquoWEB-INFtagsrdquo prefix=rdquofunrdquo gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpgtltfunaccion01 gt

La directriz taglib debe colocarse antes de utilizar en la paacutegina JSP las acciones

personalizadas definidas por la misma Se puede utilizar maacutes de una directriz pero el prefijo

utilizado debe ser uacutenico para cada una de ellas

3223 ACTIVACION DEL LENGUAJE DE EXPRESION (LE)

La especificacioacuten JSP 20 define un lenguaje de expresioacuten como alternativa a elementos de

programacioacuten escritos con coacutedigo Java y especificaciones anteriores a la JSP 20 Para que

este lenguaje pueda ser interpretado tienen que cumplirse 2 requisitos

1 Que la propiedad isELIgnored de la directriz page valga false

lt page isELIgnored= ldquofalserdquo gt

2 Que el descriptor de despliegue webxml en la carpeta WEB-INF indique doacutende se

localiza el esquema XML para la especificacioacuten Servlet 24 que a su vez utiliza el

esquema XML para la especificacioacuten Java Server Page 20

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

Utilizando el lenguaje de expresioacuten se podriacutea modificar la paacutegina Cuentajsp de la seccioacuten

3212 de este documento como se muestra a continuacioacuten Esta nueva paacutegina

1 Especifica que utilizaraacute la biblioteca core de etiquetas estandar (de la que se hablaraacute maacutes

adelante)

2 La primera vez que sea accedida definiraacute la variable atrCuenta en el aacutembito de la

aplicacioacuten con un valor inicial nulo y la incrementaraacute en una unidad cuando sea accedida

sucesivas veces simplemente incrementaraacute esta variable en una unidad

3 Finalmente mostraraacute una paacutegina con un contenido anaacutelogo al siguiente Esta formado

por una cabecera y una segunda liacutenea compuesta por el valor del paraacutemetro parNombre

enviado con la peticioacuten un texto fijo el valor de la variable atrCuenta y otro texto fijo

dependiente del valor de esta variable

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

El coacutedigo completo es el siguiente

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

3224 VARIABLES Y EXPRESIONES

Para acceder a una simple variable se puede escribir algo como lo siguiente $nombre y

para acceder a una propiedad de un objeto podemos escribir algo como

$paramparNombre

$applicationScopeatrCuenta

$pageContextrequestrequestURI

La primera liacutenea del ejemplo anterior obtiene el valor de la propiedad parNombre del objeto

param la segunda el valor del atributo atrCuenta del objeto applicationScope y la tercera

el URL relativo de la paacutegina JSP solicitada

El lenguaje de expresioacuten es maacutes tolerante con respecto a las variables con valor null y ejecuta

muchas maacutes conversiones de forma automaacutetica sobre el tipo de los datos cuando la expresioacuten

a evaluar asiacute lo requiere Por ejemplo la etiqueta condicional siguiente incluye una expresioacuten

que compara el valor del atributo atrCuenta con aacutembito de aplicacioacuten con 10 (convirtiendo

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

impliacutecitamente el valor del atributo al tipo de la constante para poder realizar la comparacioacuten

El resultado seraacute un valor de tipo boolean

ltcif test=rdquo$applicationScopeatrCuenta gt 10rdquogt

ltcifgt

o bien

ltcif test=rdquo$atrCuenta gt 10rdquogt

ltcifgt

Para que una literal pueda incluir un caracter significativo para el lenguaje dicho caracter

debe ser especificado como una secuencia de escape (caracter) Por ejemplo la siguiente

expresioacuten da lugar al literal ldquovezrdquo o ldquovecesrdquo entre comillas dobles

$(atrCuenta gt 1) iquest ldquordquovecesrdquordquo ldquordquovezrdquordquo

Cualquier objeto o atributo de un objeto definido en algunos de los aacutembitos de una paacutegina

puede ser utilizado como una variable Por ejemplo $atrCuenta+1 es una expresioacuten que

realiza la suma de la variable atrCuenta con 1

Cuando se trate de una propiedad de un objeto para acceder a ella se utilizaraacute el operador

punto o bien la notacioacuten empleada para acceder a un elemento de una matriz Por ejemplo

$paramparNombre

$param[ldquoparNombrerdquo]

Una expresioacuten LE puede aparecer en cualquier lugar donde pueda aparecer un texto fijo Por

tanto para informar al contenedor JSP que se trata de una expresioacuten y no de un texto fijo se

utilizan los delimitadores $ al principio y al final

3225 OPERADORES

OPERADOR DESCRIPCIOacuteN Acceso a la propiedad de un objeto o a un elemento de un Map

[] Acceso al elemento de una matriz o de un objeto List

() Pareacutentesis para alterar la prioridad en la evaluacioacuten de una expresioacuten

If ternario condicion expresion1 expresioacuten 2

+ Suma

- Resta

Producto

oacute div Divisioacuten

oacute mod Moacutedulo o resto de una divisioacuten

== oacute eq Igualdad

= oacute ne Diferente

lt oacute lt Menor que

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt oacute gt Mayor que

lt= oacute le Menor o igual que

gt= oacute ge Mayor o igual que

ampamp oacute and Operacioacuten Loacutegica AND

|| oacute or Operacioacuten Loacutegica OR

oacute not Operacioacuten Loacutegica NOT

empty Verifica si el valor de una variable es null si un String esta vaciacuteo o si una matriz Map

o Collection no tienen elementos

func(args) Llamada a una funcioacuten donde func es el nombre de la funcioacuten y arg representa cero o

maacutes argumentos separados por comas

El ejemplo siguiente muestra una paacutegina JSP compuesta por elementos HTML expresiones

LE y objetos impliacutecitos

lthtmlgt

ltheadgtlttitlegtJSP 20lttitlegtltheadgt

ltbodygt

lth3gtLenguaje de expresioacuten (LE)lth3gt

ltpgtLa siguiente tabla ilustra algunas expresiones LE

ltbrgtltbrgtlttable border=1gt

lttrgt

ltthgtltbgtExpresioacutenltbgtltthgt

ltthgtltbgtValorltbgtltthgt

lttrgt

lttrgt

lttdgt$3 + 6lttdgt

lttdgt$3 + 6lttdgt

lttdgt

lttrgt

lttdgt$(7 gt 4) 7 4lttdgt

lttdgt$(7 gt 4) 7 4lttdgt

lttrgt

lttrgt

lttdgt$header[host]lttdgt

lttdgt$header[host]lttdgt

lttrgt

lttablegt

ltbodygt

lthtmlgt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

323 BIBLIOTECA ESTANDAR DE ETIQUETAS

La biblioteca estaacutendar de etiquetas JSP (JSTL ndash Java Server Page Estaacutendar Tag Library)

incluye una cantidad amplia de etiquetas para diferentes aacutereas de trabajo

Aacuterea baacutesica (su prefijo es c ndash core) y contiene

o Soporte de variables (remove y set)

o Control del flujo (choose when otherwise forEach forTokens if)

o Manejo de URL (import param redirect param y url param)

o Operaciones varias (match y out)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlcore

Aacuterea XML (su prefijo es x) y contiene

o Sentencias baacutesicas (out parse y set)

o Control del flujo (choosehellip whenhellip otherwise forEach e if)

o Transformacioacuten de Documentos (transformhellipparam)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlxml

Aacuterea Internacionalizacioacuten (su prefijo es fmt) Contiene

o Localidad (setLocale y requestEncoding)

o Mensajes (bundle message param y setBundle)

o Formateo de Fechas y nuacutemeros (formatNumber formateacuteate parseDate

parseNumber setTimeZone timeZone)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlfmt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Aacuterea SQL (su prefijo es sql) es el lenguaje estandar para interactuar con bases de datos

relacionales y contiene setDataSource Quero dateParam param transaction y

update dateParam param) El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlsql

Aacuterea Funciones (su prefijo es fn) y contiene

o Longitud de una coleccioacuten (length)

o Manipulacioacuten de String (toUpperCase toLowerCase substring

substringAfter substringBefore trim replace indexOf startsWith

endsWith contains containsIgnoreCase split join y escapeXml)

o El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlfunctions

3231 OPERACIONES CON ETIQUETAS BAacuteSICAS

En un ejemplo pasado teniacuteamos el siguiente coacutedigo

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

En este ejemplo se hace referencia al aacuterea baacutesica de JSTL con el prefijo c y se utiliza la

etiqueta cset para definir la variable atrCuenta Si la variable ya esta definida simplemente

se le asigna el valor especificado

La uacuteltima parte del ejemplo anterior podriacutea haberse escrito de esta otra forma

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcif test=rdquo$atrCuenta gt 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcifgt

$atrCuenta $str

La etiqueta cif permite la ejecucioacuten condicional de su cuerpo en funcioacuten del valor del

atributo de test

La etiqueta cchoose permite la ejecucioacuten del cuerpo de la primera etiqueta cwhen cuyo

atributo test sea evaluado a true Si ninguna de las condiciones se evaluacutea a true entonces se

evaluacutea el cuerpo de la etiqueta cotherwise si estaacute presente El siguiente coacutedigo muestra otra

manera de escribir el ejemplo anterior utilizando estas uacuteltimas etiquetas

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcchoosegt

ltcwhen test=rdquo$atrCuenta == 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcwhengt

ltcotherwisegt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcotherwisegt

ltcchoosegt

$atrCuenta $str

La etiqueta cforEach permite iterar sobre una coleccioacuten de objetos La coleccioacuten se

especifica por medio del atributo iacutetems y el elemento actual de la coleccioacuten estaacute disponible a

traveacutes de la variable establecida por el atributo var Por ejemplo el siguiente fragmento de

coacutedigo visualiza una tabla con las variables definidas a nivel de aacutembito de paacutegina

lttable border=rdquo1rdquogt

ltcforEach var=rdquoitemrdquo iacutetems=rdquo$pageScoperdquogt

lttrgt

lttdgt $item lttdgt

lttrgt

ltcforEachgt

lttablegt

La etiqueta ccatch atrapa una excepcioacuten que ocurra en el cuerpo de la misma Por ejemplo

el siguiente segmento de coacutedigo lanzaraacute una excepcioacuten si el paraacutemetro mes se escribe con

letras en vez de con nuacutemeros

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltbodygt

lthtmlgt

Un URL anaacutelogo al siguiente daraacute lugar a que la excepcioacuten sea lanzada cuando se ejecute la

expresioacuten $nMes 3 de la paacutegina anterior

httplocalhost8080JSP2exceppruebajspmes=marzo

La excepcioacuten indica que ha ocurrido un error al tratar de convertir ldquomarzordquo a un entero de

tipo Long Para cachar esta excepcioacuten y darle un tratamiento adecuado habraacute que modificar

la paacutegina JSP anterior como se indica a continuacioacuten

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltccatch var=rdquoerrorOcurridordquogt

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltccatchgt

ltcif test=rdquo$not empty errorOcurridordquogt

Error el paraacutemetro mes debe ser un nuacutemero ltbgt

ltbrgt Informacioacuten del error dada por el sistema

ltbrgt ltfont color=rdquoFF0000rdquogt $errorOcurrido ltfontgt

ltcifgt

ltbodygt

lthtmlgt

3232 ACCESO A BASES DE DATOS CON JSP

Las etiquetas que proporciona el aacuterea SQL permiten realizar

Conexioacuten con una base de datos

Realizacioacuten de consultas a la base de datos

Acceso al conjunto de resultados

Ejecucioacuten de actualizaciones y transacciones

Todas las etiquetas SQL actuacutean sobre una base de datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

32321 CONEXIOacuteN CON LA BASE DE DATOS

La conexioacuten con la base de datos puede realizarse con la etiqueta sqlsetDataSource Por

ejemplo si se esta utilizando el administrador de bases de datos MySql con el controlador

JDBC se puede realizar una conexioacuten con una base de datos digamos bd_tutorias de la

manera siguiente

ltsqlsetDataSource var=rdquobdrdquo

driver=rdquocommysqljdbcDriverrdquo

url=rdquojdbcmysqllocalhost3306bd_tutoriasrdquo

user=rdquoadminrdquo

password=rdquoadminadminrdquo gt

32322 CONSULTA A LA BASE DE DATOS

La etiqueta sqlQuero permite realizar una consulta a una base de datos Por ejemplo el

siguiente fragmento de coacutedigo realiza una consulta a la base de datos representada por bd y

obtiene un conjunto de resultados representado por cdr

ltsqlquery var=rdquocdrrdquo dataSource=rdquo$bdrdquogt

SELECT professor dia hora alumno

FROM profesores tutorias citas

WHERE profesoresid_profesor=tutoriasid_profesor

AND tutoriasid_tutoria=citasid_tutoria

ltsqlquerygt

32323 MODIFICACIONES SOBRE LA BASE DE DATOS

La etiqueta sqlupdate permite ejecutar una sentencia SQL INSERT UPDATE o DELETE

y cualquier otra sentencia SQL que no retorne ninguacuten valor Por ejemplo

ltsqlupdate var=rdquocontrdquo dataSource=rdquo$bdrdquo gt

UPDATE profesores

SET profesor=

WHERE profesor=

ltsqlparam value=rdquo$paramProfesorrdquo gt

ltsqlparam value=rdquo$paramIDrdquo gt

ltsqlupdategt

Una operacioacuten UPDATE puede utilizar el siacutembolo para indicar que el valor que tendriacutea que

evaluarse en esa posicioacuten seraacute suministrado por una etiqueta sqlparam como por ejemplo

httplocalhost8080JSP2sqlpruebajspProfesor=Mario+Rossainz+LopezampID=514

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

String DNI = PersonasgetString(DNI)

if (DNIequalsIgnoreCase(DNIPedido))

Posicion = PersonasgetRow()

String Nombre = PersonasgetString(Nombre)

String Apellido = PersonasgetString(Apellido)

int Edad = PersonasgetInt(Edad)

DatosPersona = new ObRegistro(DNINombreApellidoEdad)

break

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public int PosicionEncontrada()

return Posicion

public ObRegistro DameDatos()

return DatosPersona

ObConsultajava

import javasql

public class ObInserccion

ObInserccion(ObRegistro Datos)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

PersonasmoveToInsertRow()

PersonasupdateString(DNI DatosDameDNI())

PersonasupdateString(NombreDatosDameNombre())

PersonasupdateString(Apellido DatosDameApellido())

PersonasupdateInt(EdadDatosDameEdad())

PersonasinsertRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

catch (SQLException e)

Systemoutprintln(e)

ObInsercionjava

import javasql

public class ObModificacion

ObModificacion(int PosicionBuscada ObRegistro Datos)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

Personasabsolute(PosicionBuscada)

PersonasupdateString(DNIDatosDameDNI())

PersonasupdateString(NombreDatosDameNombre())

PersonasupdateString(ApellidoDatosDameApellido())

PersonasupdateInt(EdadDatosDameEdad())

PersonasupdateRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

ObModificacionjava

import javasql

public class ObPosicionamiento

private ObRegistro DatosPersona

private int Posicion

ObPosicionamiento(String Accion int Posicion)

int IDAccionEdad

String DNINombreApellido

boolean PosicionCorrecta=false

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

FROM DatosPersonales)

Personasabsolute(Posicion)

IDAccion = IntegerparseInt(Accion)

switch (IDAccion)

case 0

PosicionCorrecta = Personaslast()

break

case 1

PosicionCorrecta = Personasfirst()

break

case 2

PosicionCorrecta = Personasrelative(-5)

break

case 3

PosicionCorrecta = Personasprevious()

break

case 4

PosicionCorrecta = Personasnext()

break

case 5

PosicionCorrecta = Personasrelative(+5)

break

if (PosicionCorrecta)

thisPosicion = PersonasgetRow()

DNI = PersonasgetString(DNI)

Nombre = PersonasgetString(Nombre)

Apellido = PersonasgetString(Apellido)

Edad = PersonasgetInt(Edad)

else

thisPosicion = Posicion

DNI = ----

Nombre = ----

Apellido = ----

Edad = 0

DatosPersona = new ObRegistro(DNINombreApellidoEdad)

Personasclose()

Conexionclose()

SentenciaSQLclose()

Systemoutprintln(StringvalueOf(Posicion)++StringvalueOf(thisPosicion))

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public int Posicion()

return Posicion

public ObRegistro DameDatos() return DatosPersona

ObPosicionamientojava

En este ejemplo se emplean servlets y paacuteginas Web Los clientes habitualmente trabajan en

una computadora remota y los programas se ejecutan en un servidor El mecanismo de

comunicaciones que soporta el protocolo http nos permite consultar en el servidor los datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

que ha seleccionado o escrito el usuario de esta manera se puede observar una disociacioacuten

entre la interfaz graacutefica de usuario (que se ejecuta en los equipos de los clientes) y el

programa que recoge los datos y ejecuta las acciones pertinentes (que se ejecuta en el

servidor)

Como puede observarse el coacutedigo SvAccessoBD es un servlet que lleva a cabo las siguientes

operaciones

1 Recoge los valores provenientes del usuario

2 Determina la naturaleza de la accioacuten a realizar

3 Realiza su cometido con la base de datos

4 Genera la respuesta que recibiraacute el usuario

32 JSP

JSP significa Java Server Pages que traducido quiere decir Paacuteginas de Servidor Java y es

por tanto una tecnologiacutea orientada a crear paacuteginas Web con programacioacuten en JAVA es decir

permite mezclar HTML estaacutendar y estaacutetico con un contenido dinaacutemico etiquetas especiales

(oacuterdenes) y trozos de coacutedigo JAVA (scriptlets o secuencias de oacuterdenes) o contenido dinaacutemico

generado por servlets Eacuteste contenido dinaacutemico se encuentra encerrado en etiquetas

especiales muchas de las cuales inician con lt y finalizan con gt El motor de las paacuteginas

JSP esta basado en los servlets de JAVA

En la tecnologiacutea JSP se crean paacuteginas parecidas a las paacuteginas que se crean en ASP (Active

Server Page de Microsoft) o PHP (Personal Home Page) que son dos tecnologiacuteas de paacuteginas

ejecutadas en el servidor Sin embargo JSP no se cintildee a un sistema operativo o servidor Web

en particular ademaacutes de que proporciona acceso a la tecnologiacutea de Servlets y a JAVA en la

parte dinaacutemica

El proceso para generar paacuteginas JSP accesibles en Web es mucho maacutes simple que en los

servlets Dando por hecho que se tiene un servidor Web que permite usar JSP el coacutedigo se

almacenaraacute en archivos con extensioacuten jsp que incluyen dentro de la estructuras de etiquetas

HTML las sentencias JAVA a ejecutar y tan soacutelo se colocaraacuten en cualquier lugar en donde

se pusiera una paacutegina Web normal sin compilacioacuten sin paquetes y sin configuracioacuten aunque

el servidor tendraacute que ser configurado para acceder a los archivos de clases Servlets y de

JSPs

Aunque lo que se escriba con frecuencia luciraacute como un archivo HTML estaacutendar detraacutes de

ello la paacutegina JSP se convierte automaacuteticamente en un servlet normal donde el HTML

estaacutetico tan soacutelo es enviado al flujo de salida asociado con el meacutetodo service del servlet Esta

traduccioacuten se realiza la primera vez que se solicita la paacutegina De acuerdo como este

configurado el servidor es posible ver el coacutedigo fuente de los servlets generados a partir de

sus paacuteginas JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Por ejemplo supongamos que se ha escrito el siguiente coacutedigo en el archivo Saludojsp

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtEjemplo JSPlttitlegtltheadgt

ltbody bgcolor=ffffccgt

ltcentergt

lth2gtHola mundolth2gt

ltjavautilDate hoy = new javautilDate()gt

La fecha de hoy es lt=hoygt

ltcentergt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional y un fragmento de un scriptlet de JAVA La etiqueta

lt identifica el comienzo del scriptlet y gt el final Una expresioacuten de la forma =variable

es sustituida por el valor de esa variable Para ejecutar esta paacutegina o cualquier otra paacutegina

JSP desde un navegador hay que instalarla en el servidor de aplicaciones de la misma manera

en como se hizo con los servlets Suponiendo entonces que se tiene instalado el Tomcat 5

siga los siguientes pasos

1 Antildeadir en el servidor la carpeta digamos JSP2 dentro de la carpeta webapps del Tomcat

y construir sobre ella la jerarquiacutea de clases ya conocida de los servlets

webappsrarrJSP2rarrWEB-INFrarrclasses

WEB-INFrarrlib

WEB-INFrarrtags

2 Editar en la carpeta WEB-INF el descriptor de despliegue webxml que se indica a

continuacioacuten Este archivo XML indica doacutende se localiza el esquema XML para la

especificacioacuten Servlet 24 que a suvez utiliza el esquema XML para la especificacioacuten

Java Server Page 20 que son las especificaciones que soporta en servidor Tomcat

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=

httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

3 Crear en JSP2 la carpeta saludo que contendraacute la aplicacioacuten y copiar en ella la paacutegina

Saludojsp

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

4 Arrancar el servidor Si el servidor ya estaba arrancado detenerlo y volverlo a arrancar o

bien abrir el explorador escribir el URL httplocalhost8080managerhtml e instalar

la aplicacioacuten

5 Una vez arrancado el servidor verificar si estaacute funcionando correctamente escribiendo

el URL siguiente en el explorador httplocalhost8080 El explorador debe mostrar la

paacutegina del Tomcat

6 Ejecutar la paacutegina JSP iniciando el explorador y escribiendo el URL siguiente

httplocalhost8080JSP2saludoSaludojsp donde la sintaxis geneacuterica es

httpservidor[puerto]MiCarpetapaginajsp

Cuando esta paacutegina (Saludojsp) es invocada por primera vez el motor JSP lleva a cabo una

fase de traduccioacuten de la misma en un servlet y el motor Servlet es el que ejecutaraacute eacuteste uacuteltimo

para generar el HTML dinaacutemico que seraacute enviado al explorador cliente seguacuten puede

deducirse de la figura siguiente La proacutexima vez que la paacutegina sea solicitada el motor JSP

ejecutaraacute el servlet que fue caragado la primera vez a no ser que la paacutegina haya cambiado

en cuyo caso seraacute compilada automaacuteticamente en un nuevo servlet y ejecutada

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Regresando al ejemplo el archivo java generado por el Tomcat a partir del archivo

Saludojsp se localiza en la carpeta workCatalinalocalhost de la instalacioacuten de Tomcat

321 ELEMENTOS PARA SECUENCIAS DE COMANDOS

Los elementos para secuencias de comandos permiten insertar coacutedigo en el servlet que seraacute

generado a partir de la paacutegina JSP Existen tres formas

1 Expresiones del tipo lt= expresioacuten gt que se evaluacutean e insertan en el resultado del

servlet

2 Los scriptlets del tipo lt codigo gt que se insertan en el meacutetodo _jspService del

servlet (ejecutado por service)

3 Las declaraciones del tipo lt Codigo gt que se insertan en el cuerpo de la clase del

servlet fuera de cualquier meacutetodo existente

NOTA Los comentarios en JSP se escriben lt-- Comentario JSP --gt en tanto que los

comentarios en HTML son de la forma lt--Comentario HTML --gt La diferencia

semaacutentica radica en que los comentarios HTML cuando se insertan en la respuesta enviada

por el servidor al cliente no se muestran cuando se visualiza el documento HTML pero si

Servidor Maacutequina Cliente

Explorador Web

Contenedor Web

Motor Servlet

Motor JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

los podemos ver cuando se visualiza el coacutedigo fuente en tanto que los comentarios JSP

aunque se inserten en la respuesta enviada por el servidor al cliente no son enviados al

explorador de forma que tampoco se muestran ni se ven cuando se visualiza el coacutedigo fuente

HTML desde el explorador

3211 EXPRESIONES

Se utiliza una expresioacuten JSP para insertar valores directamente en el resultado La sintaxis es

lt= expresioacuten gt Por ejemplo

lt= requestgetParameter(ldquoparNombre) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt lt= s gt

La fecha y hora actual es lt= new javautilDate() gt

La expresioacuten se evaluacutea se convierte a cadena y se inserta en la paacutegina Esta evaluacioacuten se

realiza durante la ejecucioacuten

32111 VARIABLES PREDEFINIDAS

Para simplificar estas expresiones se pueden utilizar cierta cantidad de variables

predefinidas Estos objetos impliacutecitos como tambieacuten se les llama estaacuten disponibles para su

uso durante la implementacioacuten de una paacutegina Web

bull pageContext Es un objeto de la clase PageContext que proporciona acceso a objetos

relacionados con los servlets

bull request Es un objeto de la clase HttpServletRequest que se puede obtener a traveacutes del

meacutetodo getRequest que encapsula los datos enviados por el cliente al servidor

bull response Es un objeto de la clase HttpServletResponse que puede obtenerse a traveacutes

del meacutetodo getResponse que encapsula los datos que el servidor enviaraacute al cliente

bull application Es un objeto de la clase ServletContext que se obtiene a traveacutes del meacutetodo

getServletContext que define un conjunto de meacutetodos que todo servlet utiliza para

comunicar con el contenedor de servlets

bull config Es un objeto de la clase ServletConfig que se obtiene a traveacutes del meacutetodo

getServletConfig y que se utiliza por el contenedor de servlets para pasar informacioacuten

al servlet durante la iniciacioacuten

bull session Es un objeto de la clase HttpSession que se obtiene a traveacutes del meacutetodo

getSession que proporciona una forma de identificar a un usuario que visita las paacuteginas

de un sitio Web

bull out Es un objeto de la clase JspWriter que se obtiene a traveacutes del meacutetodo getOut que

se utiliza para almacenar la respuesta que seraacute enviada al cliente que hizo la peticioacuten de

la paacutegina

bull page Es un objeto geneacuterico de la clase Object que se obtiene a traveacutes del meacutetodo

getPage y que representa al servlet obtenido a partir de la paacutegina JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

bull exception Es un objeto de la clase Exception que se obtiene a traveacutes del meacutetodo

getException que contendraacute informacioacuten a cerca de cualquier excepcioacuten que se lance

desde la paacutegina JSP

Un ejemplo del uso de uno de estos objetos impliacutecitos seriacutea el siguiente

El nombre de tu host es lt= requestgetRemoteHost() gt

El listado siguiente da un ejemplo de una paacutegina JSP que utiliza algunas variables

predefinidas como uso de expresiones JSP

ltDOCTYPE HTML PUBLIC -W3CDTD HTML 40 Transitional ENgt

lthtmlgt

ltheadgt

lttitlegt Expresiones JSP lttitlegt

ltheadgt

ltbodygt

lth2gt Expresiones JSP lth2gt

ltULgt

ltligt Fecha y hora en curso lt= new javautilDate() gt ltligt

ltligt Nombre de su host lt= requestgetRemoteHost() gt ltligt

ltligt Identificador de su sesioacuten lt= sessiongetId() gt ltligt

ltligt El paraacutemetro ltcodegt paramPrueba ltcodegt del formulario

lt= requestgetParameter(paramPrueba) gt ltligt

ltULgt

ltbodygt

lthtmlgt

Cuya salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3212 LOS SCRIPTLETS JSP

Si se desea hacer algo maacutes complejo que una simple expresioacuten los scriptlets permiten insertar

coacutedigo JAVA en el meacutetodo _jspService del servlet (que es ejecutado por service) La sintaxis

utilizada por los scriptlets es lt coacutedigo java gt Los escriptlets tienen acceso a las

mismas variables definidas de forma automaacutetica como expresiones A manera de ejemplo si

se desea que el resultado aparezca en la paacutegina generada deberiacutea de utilizarse la variable out

como en la siguiente instruccioacuten

lt String datosConsultados= requestgetQueryString()

outprintln(ldquoDatos GET adjuntos ldquo+datosConsultados)

gt

En este ejemplo podriacutea haberse obtenido el mismo resultado utilizando la siguiente expresioacuten

JSP

Datos GET adjuntos lt=requestgetQueryString() gt

En general los scriptlets pueden ejecutar varias tareas que no podriacutean realizarse con las

expresiones Tales tareas incluyen

bull La determinacioacuten de encabezados de respuesta

bull Actualizacioacuten de Bases de Datos

bull Ejecucioacuten de bucles condiciones y otras estructuras complejas

lt for (int i=1 ilt=6 i++)

gt

lth lt=i gtgt Hola Mundo lthlt=i gtgt

lt gt

Como un ejemplo concreto se muestra la siguiente paacutegina JSP llamada Cuentajsp en donde

se observa coacutemo se hace un seguimiento del nuacutemero de veces que un cliente accede a esta

paacutegina a traveacutes de distintas sesiones Para ello supondremos que dicha cuenta es el valor del

atributo atrCuenta del objeto impliacutecito application ya citado La primera vez que el cliente

accede a la paacutegina el valor de atrCuenta seraacute null debido a que auacuten no ha sido fijado este

atributo en este caso se fijaraacute con el valor 1 En los siguientes accesos se leeraacute el valor del

atributo atrCuenta se incrementaraacute en una unidad y se volveraacute a fijar Finalmente se enviacutea

la respuesta al cliente para que se muestre al usuario el valor del contador

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en el objeto impliacutecito application con el nombre

atrCuenta

--gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt

Integer cuenta = (Integer)applicationgetAttribute(atrCuenta)

String s = vez

if (cuenta == null)

cuenta = new Integer(1)

else

cuenta = new Integer(cuentaintValue() + 1)

s = veces

applicationsetAttribute(atrCuenta cuenta)

gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

Has visitado esta paacutegina lt= cuenta gt lt= s gt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional un fragmento de coacutedigo JAVA o scriptlet

expresiones y comentarioshellip

Aquiacute otro ejemplo de la ejecucioacuten de un coacutedigo demasiado complejo para una expresioacuten JSP

Este listado presenta una paacutegina JSP que utiliza el paraacutemetro de peticioacuten colorFondo para

establecer el color de fondo de la paacutegina

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgt

lttitlegt Prueba de Color lttitlegt

ltheadgt

lt

String colorFondo=requestgetParameter(colorFondo)

boolean tieneColorExplicito

if (colorFondo =null)

tieneColorExplicito=true

else

tieneColorExplicito=false

colorFondo=WHITE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt

ltbody bgcolor=lt= colorFondo gtgt

lth2 align=centergt Prueba de color lth2gt

lt

if (tieneColorExplicito)

outprintln(Ha indicado un color de fondo expliacutecito +

colorFondo +)

else

outprintln(Usareacute el color de fondo predeterminado WHITE +

Indique el atributo de peticioacuten

ltigtcolorFondoltigt+

para intentar un color estaacutendar un +

valor RRGGBB o para ver si el navegador Web +

permite el uso de nombres de color X11)

gt

ltbodygt

lthtmlgt

Cuyas posibles salidas son

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3213 DECLARACIONES JSP

Una declaracioacuten JSP permite definir meacutetodos o campos que seraacuten insertados en el cuerpo

principal de la clase del servlet (fuera del meacutetodo _jspService) Una declaracioacuten tiene la

sintaxis lt Coacutedigo Java gt Por ejemplo

lt int i=0 gt

lt

Public void jspinit()

coacutedigo de iniciacioacuten

gt

Una declaracioacuten no genera ninguacuten resultado y se usan junto con las expresiones JSP o los

scriptlets A continuacioacuten se muestra una paacutegina JSP que despliega la cantidad de veces que

se ha solicitado esta paacutegina desde que se arrancoacute el servidor haciendo uso de las

declaraciones JSP

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtDeclaraciones JSPlttitlegtltheadgt

ltbodygt

lth1gtDeclaraciones JSPlth1gt

lt-- Esto es un comentario en JSP --gt

lt private int recuentoAccesos=0 gt

lth2gt Accesos a la paacutegina desde el reinicio del servidor

lt= ++recuentoAccesos gt lth2gt

ltbodygt

lthtmlgt

La salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

322 EL LENGUAJE DE EXPRESION EN JSP 20

Anteriormente se ha visto la necesidad de utilizar fragmentos de coacutedigo java en el desarrollo

de paacuteginas JSP pero con la aparicioacuten de la especificacioacuten JSP 20 ya no hay necesidad de

utilizar fragmentos de coacutedigo Java para nada gracias al nuevo lenguaje de expresioacuten EL

(Expresioacuten Language) a la biblioteca de etiquetas estandar JSTL (JSP Standar Tag Library)

y a las nuevas formas para desarrollar etiquetas personalizadas

El lenguaje de expresioacuten JSP es maacutes un lenguaje de acceso a datos que un lenguaje de

programacioacuten Ya se ha visto que para pasar informacioacuten de un cliente a una paacutegina JSP se

utilizan paraacutemetros en la peticioacuten y atributos en la paacutegina El lenguaje de expresioacuten lo hace

posible sin tener que utilizar scriptlets o expresiones (lt= expresioacuten gt) Por ejemplo las

liacuteneas JSP 12 siguientes escritas utilizando coacutedigo Java

lt= requestgetParameter(ldquoparNombrerdquo) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt veces

bajo la especificacioacuten JSP 20 se pueden escribir de una forma maacutes sencilla como sigue

(ahora no se trata de coacutedigo JAVA)

$paramparNombre has visitado esta paacutegina

$atrCuenta veces

La sintaxis de JSP es sensible a mayuacutesculas y minuacutesculas pero un par de comillas simples es

equivalente a un par de comillas dobles

3221 VARIABLES PREDEFINIDAS (Objetos Impliacutecitos)

El lenguaje de expresioacuten JSP 20 soporta los objetos impliacutecitos siguientes

pageContext Objeto de javaxservletjspPageContext que proporciona acceso a los

datos de una peticioacuten

param Coleccioacuten (objeto de tipo javautilMap) de todos los valores de los paraacutemetros

enviados en una peticioacuten un String por paraacutemetro

paramValues Coleccioacuten de todos los valores de los paraacutemetros enviados en una

peticioacuten una matriz de tipo String por paraacutemetro

header Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten un

String por cabecera

headerValues Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten

una matriz de tipo String por cabecera

cookie Coleccioacuten de todos los valores de las cookies un objeto javaxservlethttpCookie

por cookie

initParam Coleccioacuten de todos los valores de los paraacutemetros de iniciacioacuten de la

aplicacioacuten un String por paraacutemetro

Tambieacuten hay objetos que permiten acceder a variables definidas en diferentes aacutembitos lo que

posibilita compartir informacioacuten

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

pageScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de paacutegina

requestScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

peticioacuten

sessionScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de sesioacuten

applicationScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

aplicacioacuten

3222 DIRECTRICES

Las directrices page incluye y taglib son mensajes para el motor JSP y son siempre incluidas

entre los siacutembolos lt y gt

32221 LA DIRECTRIZ PAGE

Define atributos que se aplican a toda la paacutegina JSP donde es incluida

lt page lista_de_atributos gt

Donde la lista_de_atributos puede contener algunos de los siguientes (aquellos que estaacuten

escritos en negrita son los tomados por omisioacuten)

language= ldquoscriptingLanguagerdquo

extends= rdquoclassNamerdquo

import= ldquoimportListrdquo

session= ldquotrue|falserdquo

buffer= ldquonone|sizeKb

autoflush= ldquotrue|falserdquo

isThreadSafe= rdquotrue|falserdquo

info= rdquoinfo_textrdquo

errorPage= ldquoerror_urlrdquo

isErrorPage= rdquotrue|falserdquo

contentType= rdquoctinfordquo

pageEncoding= rdquopeinfordquo

isELIgnored= ldquotrue|falserdquo

Tiacutepicamente se localiza al principio de la paacutegina JSP y puede haber cualquier nuacutemero de

ellas El lenguaje por omisioacuten es Java Ejemplos

lt page contentType=rdquotexthtmlrdquo language=rdquojavardquo gt

lt page import=rdquojavautil javalangrdquo gt

lt page buffer=rdquo5kbrdquo autoflush=rdquofalserdquo gt

32222 LA DIRECTRIZ INCLUDE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

La directriz include incluye un archivo (html jsp xml o de texto) en una paacutegina JSP Esto

permite dividir el contenido de la paacutegina en trozos maacutes manejables

lt incluye file=rdquoURL_relativordquo gt

El ejemplo siguiente muestra dos archivos el primero incluye al segundo para mostrar la

fecha y hora actuales

lt-- fichero mostrarFechaHorajsp --gt

lthtmlgt

ltheadgtlttitlegtIncluir un ficherolttitlegtltheadgt

ltbody bgcolor=whitegt

ltfont color=bluegt

La fecha y hora actuales son

lt include file=fechaHorajsp gt

ltfontgt

ltbodygt

lthtmlgt

lt-- fichero fechaHorajsp --gt

lt page import=javautil gt

lt= (new javautilDate())toLocaleString() gt

32223 LA DIRECTRIZ TAGLIB

La directriz taglib indica la biblioteca de acciones personalizadas que podremos utilizar en

la codificacioacuten de la paacutegina JSP Para distinguir esas acciones entre otras existentes se utiliza

un prefijo (prefix) Su sintaxis es

lt taglib (uri=rdquoURI_bibliotecardquo|tagdir=rdquoDir_biblioteca_tagrdquo)

prefix=rdquoprefijordquo gt

Cuando se trata de una biblioteca definida mediante una clase Java y un descriptor (archivo

tld) eacutesta se identifica mediante un URI (Uniform Resource Identifier- URL relativos) Por

ejemplo

lt taglib uri=rdquohttpMarioRossainzLopezmiBibliotecardquo

prefix=rdquofunrdquo gt

ltpgtltfunaccion01 gt

La uacuteltima liacutenea del ejemplo tiene dos etiquetas una etiqueta p HTML y otra accion01

perteneciente a la biblioteca miBiblioteca En cambio si la biblioteca se define mediante un

archivo tag entonces se identifica mediante su ruta relativa en el sistema de archivos

lt taglib tagdir=rdquoWEB-INFtagsrdquo prefix=rdquofunrdquo gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpgtltfunaccion01 gt

La directriz taglib debe colocarse antes de utilizar en la paacutegina JSP las acciones

personalizadas definidas por la misma Se puede utilizar maacutes de una directriz pero el prefijo

utilizado debe ser uacutenico para cada una de ellas

3223 ACTIVACION DEL LENGUAJE DE EXPRESION (LE)

La especificacioacuten JSP 20 define un lenguaje de expresioacuten como alternativa a elementos de

programacioacuten escritos con coacutedigo Java y especificaciones anteriores a la JSP 20 Para que

este lenguaje pueda ser interpretado tienen que cumplirse 2 requisitos

1 Que la propiedad isELIgnored de la directriz page valga false

lt page isELIgnored= ldquofalserdquo gt

2 Que el descriptor de despliegue webxml en la carpeta WEB-INF indique doacutende se

localiza el esquema XML para la especificacioacuten Servlet 24 que a su vez utiliza el

esquema XML para la especificacioacuten Java Server Page 20

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

Utilizando el lenguaje de expresioacuten se podriacutea modificar la paacutegina Cuentajsp de la seccioacuten

3212 de este documento como se muestra a continuacioacuten Esta nueva paacutegina

1 Especifica que utilizaraacute la biblioteca core de etiquetas estandar (de la que se hablaraacute maacutes

adelante)

2 La primera vez que sea accedida definiraacute la variable atrCuenta en el aacutembito de la

aplicacioacuten con un valor inicial nulo y la incrementaraacute en una unidad cuando sea accedida

sucesivas veces simplemente incrementaraacute esta variable en una unidad

3 Finalmente mostraraacute una paacutegina con un contenido anaacutelogo al siguiente Esta formado

por una cabecera y una segunda liacutenea compuesta por el valor del paraacutemetro parNombre

enviado con la peticioacuten un texto fijo el valor de la variable atrCuenta y otro texto fijo

dependiente del valor de esta variable

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

El coacutedigo completo es el siguiente

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

3224 VARIABLES Y EXPRESIONES

Para acceder a una simple variable se puede escribir algo como lo siguiente $nombre y

para acceder a una propiedad de un objeto podemos escribir algo como

$paramparNombre

$applicationScopeatrCuenta

$pageContextrequestrequestURI

La primera liacutenea del ejemplo anterior obtiene el valor de la propiedad parNombre del objeto

param la segunda el valor del atributo atrCuenta del objeto applicationScope y la tercera

el URL relativo de la paacutegina JSP solicitada

El lenguaje de expresioacuten es maacutes tolerante con respecto a las variables con valor null y ejecuta

muchas maacutes conversiones de forma automaacutetica sobre el tipo de los datos cuando la expresioacuten

a evaluar asiacute lo requiere Por ejemplo la etiqueta condicional siguiente incluye una expresioacuten

que compara el valor del atributo atrCuenta con aacutembito de aplicacioacuten con 10 (convirtiendo

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

impliacutecitamente el valor del atributo al tipo de la constante para poder realizar la comparacioacuten

El resultado seraacute un valor de tipo boolean

ltcif test=rdquo$applicationScopeatrCuenta gt 10rdquogt

ltcifgt

o bien

ltcif test=rdquo$atrCuenta gt 10rdquogt

ltcifgt

Para que una literal pueda incluir un caracter significativo para el lenguaje dicho caracter

debe ser especificado como una secuencia de escape (caracter) Por ejemplo la siguiente

expresioacuten da lugar al literal ldquovezrdquo o ldquovecesrdquo entre comillas dobles

$(atrCuenta gt 1) iquest ldquordquovecesrdquordquo ldquordquovezrdquordquo

Cualquier objeto o atributo de un objeto definido en algunos de los aacutembitos de una paacutegina

puede ser utilizado como una variable Por ejemplo $atrCuenta+1 es una expresioacuten que

realiza la suma de la variable atrCuenta con 1

Cuando se trate de una propiedad de un objeto para acceder a ella se utilizaraacute el operador

punto o bien la notacioacuten empleada para acceder a un elemento de una matriz Por ejemplo

$paramparNombre

$param[ldquoparNombrerdquo]

Una expresioacuten LE puede aparecer en cualquier lugar donde pueda aparecer un texto fijo Por

tanto para informar al contenedor JSP que se trata de una expresioacuten y no de un texto fijo se

utilizan los delimitadores $ al principio y al final

3225 OPERADORES

OPERADOR DESCRIPCIOacuteN Acceso a la propiedad de un objeto o a un elemento de un Map

[] Acceso al elemento de una matriz o de un objeto List

() Pareacutentesis para alterar la prioridad en la evaluacioacuten de una expresioacuten

If ternario condicion expresion1 expresioacuten 2

+ Suma

- Resta

Producto

oacute div Divisioacuten

oacute mod Moacutedulo o resto de una divisioacuten

== oacute eq Igualdad

= oacute ne Diferente

lt oacute lt Menor que

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt oacute gt Mayor que

lt= oacute le Menor o igual que

gt= oacute ge Mayor o igual que

ampamp oacute and Operacioacuten Loacutegica AND

|| oacute or Operacioacuten Loacutegica OR

oacute not Operacioacuten Loacutegica NOT

empty Verifica si el valor de una variable es null si un String esta vaciacuteo o si una matriz Map

o Collection no tienen elementos

func(args) Llamada a una funcioacuten donde func es el nombre de la funcioacuten y arg representa cero o

maacutes argumentos separados por comas

El ejemplo siguiente muestra una paacutegina JSP compuesta por elementos HTML expresiones

LE y objetos impliacutecitos

lthtmlgt

ltheadgtlttitlegtJSP 20lttitlegtltheadgt

ltbodygt

lth3gtLenguaje de expresioacuten (LE)lth3gt

ltpgtLa siguiente tabla ilustra algunas expresiones LE

ltbrgtltbrgtlttable border=1gt

lttrgt

ltthgtltbgtExpresioacutenltbgtltthgt

ltthgtltbgtValorltbgtltthgt

lttrgt

lttrgt

lttdgt$3 + 6lttdgt

lttdgt$3 + 6lttdgt

lttdgt

lttrgt

lttdgt$(7 gt 4) 7 4lttdgt

lttdgt$(7 gt 4) 7 4lttdgt

lttrgt

lttrgt

lttdgt$header[host]lttdgt

lttdgt$header[host]lttdgt

lttrgt

lttablegt

ltbodygt

lthtmlgt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

323 BIBLIOTECA ESTANDAR DE ETIQUETAS

La biblioteca estaacutendar de etiquetas JSP (JSTL ndash Java Server Page Estaacutendar Tag Library)

incluye una cantidad amplia de etiquetas para diferentes aacutereas de trabajo

Aacuterea baacutesica (su prefijo es c ndash core) y contiene

o Soporte de variables (remove y set)

o Control del flujo (choose when otherwise forEach forTokens if)

o Manejo de URL (import param redirect param y url param)

o Operaciones varias (match y out)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlcore

Aacuterea XML (su prefijo es x) y contiene

o Sentencias baacutesicas (out parse y set)

o Control del flujo (choosehellip whenhellip otherwise forEach e if)

o Transformacioacuten de Documentos (transformhellipparam)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlxml

Aacuterea Internacionalizacioacuten (su prefijo es fmt) Contiene

o Localidad (setLocale y requestEncoding)

o Mensajes (bundle message param y setBundle)

o Formateo de Fechas y nuacutemeros (formatNumber formateacuteate parseDate

parseNumber setTimeZone timeZone)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlfmt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Aacuterea SQL (su prefijo es sql) es el lenguaje estandar para interactuar con bases de datos

relacionales y contiene setDataSource Quero dateParam param transaction y

update dateParam param) El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlsql

Aacuterea Funciones (su prefijo es fn) y contiene

o Longitud de una coleccioacuten (length)

o Manipulacioacuten de String (toUpperCase toLowerCase substring

substringAfter substringBefore trim replace indexOf startsWith

endsWith contains containsIgnoreCase split join y escapeXml)

o El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlfunctions

3231 OPERACIONES CON ETIQUETAS BAacuteSICAS

En un ejemplo pasado teniacuteamos el siguiente coacutedigo

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

En este ejemplo se hace referencia al aacuterea baacutesica de JSTL con el prefijo c y se utiliza la

etiqueta cset para definir la variable atrCuenta Si la variable ya esta definida simplemente

se le asigna el valor especificado

La uacuteltima parte del ejemplo anterior podriacutea haberse escrito de esta otra forma

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcif test=rdquo$atrCuenta gt 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcifgt

$atrCuenta $str

La etiqueta cif permite la ejecucioacuten condicional de su cuerpo en funcioacuten del valor del

atributo de test

La etiqueta cchoose permite la ejecucioacuten del cuerpo de la primera etiqueta cwhen cuyo

atributo test sea evaluado a true Si ninguna de las condiciones se evaluacutea a true entonces se

evaluacutea el cuerpo de la etiqueta cotherwise si estaacute presente El siguiente coacutedigo muestra otra

manera de escribir el ejemplo anterior utilizando estas uacuteltimas etiquetas

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcchoosegt

ltcwhen test=rdquo$atrCuenta == 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcwhengt

ltcotherwisegt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcotherwisegt

ltcchoosegt

$atrCuenta $str

La etiqueta cforEach permite iterar sobre una coleccioacuten de objetos La coleccioacuten se

especifica por medio del atributo iacutetems y el elemento actual de la coleccioacuten estaacute disponible a

traveacutes de la variable establecida por el atributo var Por ejemplo el siguiente fragmento de

coacutedigo visualiza una tabla con las variables definidas a nivel de aacutembito de paacutegina

lttable border=rdquo1rdquogt

ltcforEach var=rdquoitemrdquo iacutetems=rdquo$pageScoperdquogt

lttrgt

lttdgt $item lttdgt

lttrgt

ltcforEachgt

lttablegt

La etiqueta ccatch atrapa una excepcioacuten que ocurra en el cuerpo de la misma Por ejemplo

el siguiente segmento de coacutedigo lanzaraacute una excepcioacuten si el paraacutemetro mes se escribe con

letras en vez de con nuacutemeros

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltbodygt

lthtmlgt

Un URL anaacutelogo al siguiente daraacute lugar a que la excepcioacuten sea lanzada cuando se ejecute la

expresioacuten $nMes 3 de la paacutegina anterior

httplocalhost8080JSP2exceppruebajspmes=marzo

La excepcioacuten indica que ha ocurrido un error al tratar de convertir ldquomarzordquo a un entero de

tipo Long Para cachar esta excepcioacuten y darle un tratamiento adecuado habraacute que modificar

la paacutegina JSP anterior como se indica a continuacioacuten

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltccatch var=rdquoerrorOcurridordquogt

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltccatchgt

ltcif test=rdquo$not empty errorOcurridordquogt

Error el paraacutemetro mes debe ser un nuacutemero ltbgt

ltbrgt Informacioacuten del error dada por el sistema

ltbrgt ltfont color=rdquoFF0000rdquogt $errorOcurrido ltfontgt

ltcifgt

ltbodygt

lthtmlgt

3232 ACCESO A BASES DE DATOS CON JSP

Las etiquetas que proporciona el aacuterea SQL permiten realizar

Conexioacuten con una base de datos

Realizacioacuten de consultas a la base de datos

Acceso al conjunto de resultados

Ejecucioacuten de actualizaciones y transacciones

Todas las etiquetas SQL actuacutean sobre una base de datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

32321 CONEXIOacuteN CON LA BASE DE DATOS

La conexioacuten con la base de datos puede realizarse con la etiqueta sqlsetDataSource Por

ejemplo si se esta utilizando el administrador de bases de datos MySql con el controlador

JDBC se puede realizar una conexioacuten con una base de datos digamos bd_tutorias de la

manera siguiente

ltsqlsetDataSource var=rdquobdrdquo

driver=rdquocommysqljdbcDriverrdquo

url=rdquojdbcmysqllocalhost3306bd_tutoriasrdquo

user=rdquoadminrdquo

password=rdquoadminadminrdquo gt

32322 CONSULTA A LA BASE DE DATOS

La etiqueta sqlQuero permite realizar una consulta a una base de datos Por ejemplo el

siguiente fragmento de coacutedigo realiza una consulta a la base de datos representada por bd y

obtiene un conjunto de resultados representado por cdr

ltsqlquery var=rdquocdrrdquo dataSource=rdquo$bdrdquogt

SELECT professor dia hora alumno

FROM profesores tutorias citas

WHERE profesoresid_profesor=tutoriasid_profesor

AND tutoriasid_tutoria=citasid_tutoria

ltsqlquerygt

32323 MODIFICACIONES SOBRE LA BASE DE DATOS

La etiqueta sqlupdate permite ejecutar una sentencia SQL INSERT UPDATE o DELETE

y cualquier otra sentencia SQL que no retorne ninguacuten valor Por ejemplo

ltsqlupdate var=rdquocontrdquo dataSource=rdquo$bdrdquo gt

UPDATE profesores

SET profesor=

WHERE profesor=

ltsqlparam value=rdquo$paramProfesorrdquo gt

ltsqlparam value=rdquo$paramIDrdquo gt

ltsqlupdategt

Una operacioacuten UPDATE puede utilizar el siacutembolo para indicar que el valor que tendriacutea que

evaluarse en esa posicioacuten seraacute suministrado por una etiqueta sqlparam como por ejemplo

httplocalhost8080JSP2sqlpruebajspProfesor=Mario+Rossainz+LopezampID=514

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

catch (SQLException e)

Systemoutprintln(e)

ObInsercionjava

import javasql

public class ObModificacion

ObModificacion(int PosicionBuscada ObRegistro Datos)

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

FROM DatosPersonales)

Personasabsolute(PosicionBuscada)

PersonasupdateString(DNIDatosDameDNI())

PersonasupdateString(NombreDatosDameNombre())

PersonasupdateString(ApellidoDatosDameApellido())

PersonasupdateInt(EdadDatosDameEdad())

PersonasupdateRow()

Personasclose()

Conexionclose()

SentenciaSQLclose()

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

ObModificacionjava

import javasql

public class ObPosicionamiento

private ObRegistro DatosPersona

private int Posicion

ObPosicionamiento(String Accion int Posicion)

int IDAccionEdad

String DNINombreApellido

boolean PosicionCorrecta=false

try

ClassforName(sunjdbcodbcJdbcOdbcDriver)

String BaseDeDatos = jdbcodbcNombreLogico

Connection Conexion = DriverManagergetConnection(BaseDeDatos)

Statement SentenciaSQL = ConexioncreateStatement(

ResultSetTYPE_SCROLL_INSENSITIVE ResultSetCONCUR_UPDATABLE)

ResultSet Personas = SentenciaSQLexecuteQuery(SELECT

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

FROM DatosPersonales)

Personasabsolute(Posicion)

IDAccion = IntegerparseInt(Accion)

switch (IDAccion)

case 0

PosicionCorrecta = Personaslast()

break

case 1

PosicionCorrecta = Personasfirst()

break

case 2

PosicionCorrecta = Personasrelative(-5)

break

case 3

PosicionCorrecta = Personasprevious()

break

case 4

PosicionCorrecta = Personasnext()

break

case 5

PosicionCorrecta = Personasrelative(+5)

break

if (PosicionCorrecta)

thisPosicion = PersonasgetRow()

DNI = PersonasgetString(DNI)

Nombre = PersonasgetString(Nombre)

Apellido = PersonasgetString(Apellido)

Edad = PersonasgetInt(Edad)

else

thisPosicion = Posicion

DNI = ----

Nombre = ----

Apellido = ----

Edad = 0

DatosPersona = new ObRegistro(DNINombreApellidoEdad)

Personasclose()

Conexionclose()

SentenciaSQLclose()

Systemoutprintln(StringvalueOf(Posicion)++StringvalueOf(thisPosicion))

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public int Posicion()

return Posicion

public ObRegistro DameDatos() return DatosPersona

ObPosicionamientojava

En este ejemplo se emplean servlets y paacuteginas Web Los clientes habitualmente trabajan en

una computadora remota y los programas se ejecutan en un servidor El mecanismo de

comunicaciones que soporta el protocolo http nos permite consultar en el servidor los datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

que ha seleccionado o escrito el usuario de esta manera se puede observar una disociacioacuten

entre la interfaz graacutefica de usuario (que se ejecuta en los equipos de los clientes) y el

programa que recoge los datos y ejecuta las acciones pertinentes (que se ejecuta en el

servidor)

Como puede observarse el coacutedigo SvAccessoBD es un servlet que lleva a cabo las siguientes

operaciones

1 Recoge los valores provenientes del usuario

2 Determina la naturaleza de la accioacuten a realizar

3 Realiza su cometido con la base de datos

4 Genera la respuesta que recibiraacute el usuario

32 JSP

JSP significa Java Server Pages que traducido quiere decir Paacuteginas de Servidor Java y es

por tanto una tecnologiacutea orientada a crear paacuteginas Web con programacioacuten en JAVA es decir

permite mezclar HTML estaacutendar y estaacutetico con un contenido dinaacutemico etiquetas especiales

(oacuterdenes) y trozos de coacutedigo JAVA (scriptlets o secuencias de oacuterdenes) o contenido dinaacutemico

generado por servlets Eacuteste contenido dinaacutemico se encuentra encerrado en etiquetas

especiales muchas de las cuales inician con lt y finalizan con gt El motor de las paacuteginas

JSP esta basado en los servlets de JAVA

En la tecnologiacutea JSP se crean paacuteginas parecidas a las paacuteginas que se crean en ASP (Active

Server Page de Microsoft) o PHP (Personal Home Page) que son dos tecnologiacuteas de paacuteginas

ejecutadas en el servidor Sin embargo JSP no se cintildee a un sistema operativo o servidor Web

en particular ademaacutes de que proporciona acceso a la tecnologiacutea de Servlets y a JAVA en la

parte dinaacutemica

El proceso para generar paacuteginas JSP accesibles en Web es mucho maacutes simple que en los

servlets Dando por hecho que se tiene un servidor Web que permite usar JSP el coacutedigo se

almacenaraacute en archivos con extensioacuten jsp que incluyen dentro de la estructuras de etiquetas

HTML las sentencias JAVA a ejecutar y tan soacutelo se colocaraacuten en cualquier lugar en donde

se pusiera una paacutegina Web normal sin compilacioacuten sin paquetes y sin configuracioacuten aunque

el servidor tendraacute que ser configurado para acceder a los archivos de clases Servlets y de

JSPs

Aunque lo que se escriba con frecuencia luciraacute como un archivo HTML estaacutendar detraacutes de

ello la paacutegina JSP se convierte automaacuteticamente en un servlet normal donde el HTML

estaacutetico tan soacutelo es enviado al flujo de salida asociado con el meacutetodo service del servlet Esta

traduccioacuten se realiza la primera vez que se solicita la paacutegina De acuerdo como este

configurado el servidor es posible ver el coacutedigo fuente de los servlets generados a partir de

sus paacuteginas JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Por ejemplo supongamos que se ha escrito el siguiente coacutedigo en el archivo Saludojsp

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtEjemplo JSPlttitlegtltheadgt

ltbody bgcolor=ffffccgt

ltcentergt

lth2gtHola mundolth2gt

ltjavautilDate hoy = new javautilDate()gt

La fecha de hoy es lt=hoygt

ltcentergt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional y un fragmento de un scriptlet de JAVA La etiqueta

lt identifica el comienzo del scriptlet y gt el final Una expresioacuten de la forma =variable

es sustituida por el valor de esa variable Para ejecutar esta paacutegina o cualquier otra paacutegina

JSP desde un navegador hay que instalarla en el servidor de aplicaciones de la misma manera

en como se hizo con los servlets Suponiendo entonces que se tiene instalado el Tomcat 5

siga los siguientes pasos

1 Antildeadir en el servidor la carpeta digamos JSP2 dentro de la carpeta webapps del Tomcat

y construir sobre ella la jerarquiacutea de clases ya conocida de los servlets

webappsrarrJSP2rarrWEB-INFrarrclasses

WEB-INFrarrlib

WEB-INFrarrtags

2 Editar en la carpeta WEB-INF el descriptor de despliegue webxml que se indica a

continuacioacuten Este archivo XML indica doacutende se localiza el esquema XML para la

especificacioacuten Servlet 24 que a suvez utiliza el esquema XML para la especificacioacuten

Java Server Page 20 que son las especificaciones que soporta en servidor Tomcat

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=

httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

3 Crear en JSP2 la carpeta saludo que contendraacute la aplicacioacuten y copiar en ella la paacutegina

Saludojsp

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

4 Arrancar el servidor Si el servidor ya estaba arrancado detenerlo y volverlo a arrancar o

bien abrir el explorador escribir el URL httplocalhost8080managerhtml e instalar

la aplicacioacuten

5 Una vez arrancado el servidor verificar si estaacute funcionando correctamente escribiendo

el URL siguiente en el explorador httplocalhost8080 El explorador debe mostrar la

paacutegina del Tomcat

6 Ejecutar la paacutegina JSP iniciando el explorador y escribiendo el URL siguiente

httplocalhost8080JSP2saludoSaludojsp donde la sintaxis geneacuterica es

httpservidor[puerto]MiCarpetapaginajsp

Cuando esta paacutegina (Saludojsp) es invocada por primera vez el motor JSP lleva a cabo una

fase de traduccioacuten de la misma en un servlet y el motor Servlet es el que ejecutaraacute eacuteste uacuteltimo

para generar el HTML dinaacutemico que seraacute enviado al explorador cliente seguacuten puede

deducirse de la figura siguiente La proacutexima vez que la paacutegina sea solicitada el motor JSP

ejecutaraacute el servlet que fue caragado la primera vez a no ser que la paacutegina haya cambiado

en cuyo caso seraacute compilada automaacuteticamente en un nuevo servlet y ejecutada

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Regresando al ejemplo el archivo java generado por el Tomcat a partir del archivo

Saludojsp se localiza en la carpeta workCatalinalocalhost de la instalacioacuten de Tomcat

321 ELEMENTOS PARA SECUENCIAS DE COMANDOS

Los elementos para secuencias de comandos permiten insertar coacutedigo en el servlet que seraacute

generado a partir de la paacutegina JSP Existen tres formas

1 Expresiones del tipo lt= expresioacuten gt que se evaluacutean e insertan en el resultado del

servlet

2 Los scriptlets del tipo lt codigo gt que se insertan en el meacutetodo _jspService del

servlet (ejecutado por service)

3 Las declaraciones del tipo lt Codigo gt que se insertan en el cuerpo de la clase del

servlet fuera de cualquier meacutetodo existente

NOTA Los comentarios en JSP se escriben lt-- Comentario JSP --gt en tanto que los

comentarios en HTML son de la forma lt--Comentario HTML --gt La diferencia

semaacutentica radica en que los comentarios HTML cuando se insertan en la respuesta enviada

por el servidor al cliente no se muestran cuando se visualiza el documento HTML pero si

Servidor Maacutequina Cliente

Explorador Web

Contenedor Web

Motor Servlet

Motor JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

los podemos ver cuando se visualiza el coacutedigo fuente en tanto que los comentarios JSP

aunque se inserten en la respuesta enviada por el servidor al cliente no son enviados al

explorador de forma que tampoco se muestran ni se ven cuando se visualiza el coacutedigo fuente

HTML desde el explorador

3211 EXPRESIONES

Se utiliza una expresioacuten JSP para insertar valores directamente en el resultado La sintaxis es

lt= expresioacuten gt Por ejemplo

lt= requestgetParameter(ldquoparNombre) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt lt= s gt

La fecha y hora actual es lt= new javautilDate() gt

La expresioacuten se evaluacutea se convierte a cadena y se inserta en la paacutegina Esta evaluacioacuten se

realiza durante la ejecucioacuten

32111 VARIABLES PREDEFINIDAS

Para simplificar estas expresiones se pueden utilizar cierta cantidad de variables

predefinidas Estos objetos impliacutecitos como tambieacuten se les llama estaacuten disponibles para su

uso durante la implementacioacuten de una paacutegina Web

bull pageContext Es un objeto de la clase PageContext que proporciona acceso a objetos

relacionados con los servlets

bull request Es un objeto de la clase HttpServletRequest que se puede obtener a traveacutes del

meacutetodo getRequest que encapsula los datos enviados por el cliente al servidor

bull response Es un objeto de la clase HttpServletResponse que puede obtenerse a traveacutes

del meacutetodo getResponse que encapsula los datos que el servidor enviaraacute al cliente

bull application Es un objeto de la clase ServletContext que se obtiene a traveacutes del meacutetodo

getServletContext que define un conjunto de meacutetodos que todo servlet utiliza para

comunicar con el contenedor de servlets

bull config Es un objeto de la clase ServletConfig que se obtiene a traveacutes del meacutetodo

getServletConfig y que se utiliza por el contenedor de servlets para pasar informacioacuten

al servlet durante la iniciacioacuten

bull session Es un objeto de la clase HttpSession que se obtiene a traveacutes del meacutetodo

getSession que proporciona una forma de identificar a un usuario que visita las paacuteginas

de un sitio Web

bull out Es un objeto de la clase JspWriter que se obtiene a traveacutes del meacutetodo getOut que

se utiliza para almacenar la respuesta que seraacute enviada al cliente que hizo la peticioacuten de

la paacutegina

bull page Es un objeto geneacuterico de la clase Object que se obtiene a traveacutes del meacutetodo

getPage y que representa al servlet obtenido a partir de la paacutegina JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

bull exception Es un objeto de la clase Exception que se obtiene a traveacutes del meacutetodo

getException que contendraacute informacioacuten a cerca de cualquier excepcioacuten que se lance

desde la paacutegina JSP

Un ejemplo del uso de uno de estos objetos impliacutecitos seriacutea el siguiente

El nombre de tu host es lt= requestgetRemoteHost() gt

El listado siguiente da un ejemplo de una paacutegina JSP que utiliza algunas variables

predefinidas como uso de expresiones JSP

ltDOCTYPE HTML PUBLIC -W3CDTD HTML 40 Transitional ENgt

lthtmlgt

ltheadgt

lttitlegt Expresiones JSP lttitlegt

ltheadgt

ltbodygt

lth2gt Expresiones JSP lth2gt

ltULgt

ltligt Fecha y hora en curso lt= new javautilDate() gt ltligt

ltligt Nombre de su host lt= requestgetRemoteHost() gt ltligt

ltligt Identificador de su sesioacuten lt= sessiongetId() gt ltligt

ltligt El paraacutemetro ltcodegt paramPrueba ltcodegt del formulario

lt= requestgetParameter(paramPrueba) gt ltligt

ltULgt

ltbodygt

lthtmlgt

Cuya salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3212 LOS SCRIPTLETS JSP

Si se desea hacer algo maacutes complejo que una simple expresioacuten los scriptlets permiten insertar

coacutedigo JAVA en el meacutetodo _jspService del servlet (que es ejecutado por service) La sintaxis

utilizada por los scriptlets es lt coacutedigo java gt Los escriptlets tienen acceso a las

mismas variables definidas de forma automaacutetica como expresiones A manera de ejemplo si

se desea que el resultado aparezca en la paacutegina generada deberiacutea de utilizarse la variable out

como en la siguiente instruccioacuten

lt String datosConsultados= requestgetQueryString()

outprintln(ldquoDatos GET adjuntos ldquo+datosConsultados)

gt

En este ejemplo podriacutea haberse obtenido el mismo resultado utilizando la siguiente expresioacuten

JSP

Datos GET adjuntos lt=requestgetQueryString() gt

En general los scriptlets pueden ejecutar varias tareas que no podriacutean realizarse con las

expresiones Tales tareas incluyen

bull La determinacioacuten de encabezados de respuesta

bull Actualizacioacuten de Bases de Datos

bull Ejecucioacuten de bucles condiciones y otras estructuras complejas

lt for (int i=1 ilt=6 i++)

gt

lth lt=i gtgt Hola Mundo lthlt=i gtgt

lt gt

Como un ejemplo concreto se muestra la siguiente paacutegina JSP llamada Cuentajsp en donde

se observa coacutemo se hace un seguimiento del nuacutemero de veces que un cliente accede a esta

paacutegina a traveacutes de distintas sesiones Para ello supondremos que dicha cuenta es el valor del

atributo atrCuenta del objeto impliacutecito application ya citado La primera vez que el cliente

accede a la paacutegina el valor de atrCuenta seraacute null debido a que auacuten no ha sido fijado este

atributo en este caso se fijaraacute con el valor 1 En los siguientes accesos se leeraacute el valor del

atributo atrCuenta se incrementaraacute en una unidad y se volveraacute a fijar Finalmente se enviacutea

la respuesta al cliente para que se muestre al usuario el valor del contador

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en el objeto impliacutecito application con el nombre

atrCuenta

--gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt

Integer cuenta = (Integer)applicationgetAttribute(atrCuenta)

String s = vez

if (cuenta == null)

cuenta = new Integer(1)

else

cuenta = new Integer(cuentaintValue() + 1)

s = veces

applicationsetAttribute(atrCuenta cuenta)

gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

Has visitado esta paacutegina lt= cuenta gt lt= s gt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional un fragmento de coacutedigo JAVA o scriptlet

expresiones y comentarioshellip

Aquiacute otro ejemplo de la ejecucioacuten de un coacutedigo demasiado complejo para una expresioacuten JSP

Este listado presenta una paacutegina JSP que utiliza el paraacutemetro de peticioacuten colorFondo para

establecer el color de fondo de la paacutegina

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgt

lttitlegt Prueba de Color lttitlegt

ltheadgt

lt

String colorFondo=requestgetParameter(colorFondo)

boolean tieneColorExplicito

if (colorFondo =null)

tieneColorExplicito=true

else

tieneColorExplicito=false

colorFondo=WHITE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt

ltbody bgcolor=lt= colorFondo gtgt

lth2 align=centergt Prueba de color lth2gt

lt

if (tieneColorExplicito)

outprintln(Ha indicado un color de fondo expliacutecito +

colorFondo +)

else

outprintln(Usareacute el color de fondo predeterminado WHITE +

Indique el atributo de peticioacuten

ltigtcolorFondoltigt+

para intentar un color estaacutendar un +

valor RRGGBB o para ver si el navegador Web +

permite el uso de nombres de color X11)

gt

ltbodygt

lthtmlgt

Cuyas posibles salidas son

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3213 DECLARACIONES JSP

Una declaracioacuten JSP permite definir meacutetodos o campos que seraacuten insertados en el cuerpo

principal de la clase del servlet (fuera del meacutetodo _jspService) Una declaracioacuten tiene la

sintaxis lt Coacutedigo Java gt Por ejemplo

lt int i=0 gt

lt

Public void jspinit()

coacutedigo de iniciacioacuten

gt

Una declaracioacuten no genera ninguacuten resultado y se usan junto con las expresiones JSP o los

scriptlets A continuacioacuten se muestra una paacutegina JSP que despliega la cantidad de veces que

se ha solicitado esta paacutegina desde que se arrancoacute el servidor haciendo uso de las

declaraciones JSP

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtDeclaraciones JSPlttitlegtltheadgt

ltbodygt

lth1gtDeclaraciones JSPlth1gt

lt-- Esto es un comentario en JSP --gt

lt private int recuentoAccesos=0 gt

lth2gt Accesos a la paacutegina desde el reinicio del servidor

lt= ++recuentoAccesos gt lth2gt

ltbodygt

lthtmlgt

La salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

322 EL LENGUAJE DE EXPRESION EN JSP 20

Anteriormente se ha visto la necesidad de utilizar fragmentos de coacutedigo java en el desarrollo

de paacuteginas JSP pero con la aparicioacuten de la especificacioacuten JSP 20 ya no hay necesidad de

utilizar fragmentos de coacutedigo Java para nada gracias al nuevo lenguaje de expresioacuten EL

(Expresioacuten Language) a la biblioteca de etiquetas estandar JSTL (JSP Standar Tag Library)

y a las nuevas formas para desarrollar etiquetas personalizadas

El lenguaje de expresioacuten JSP es maacutes un lenguaje de acceso a datos que un lenguaje de

programacioacuten Ya se ha visto que para pasar informacioacuten de un cliente a una paacutegina JSP se

utilizan paraacutemetros en la peticioacuten y atributos en la paacutegina El lenguaje de expresioacuten lo hace

posible sin tener que utilizar scriptlets o expresiones (lt= expresioacuten gt) Por ejemplo las

liacuteneas JSP 12 siguientes escritas utilizando coacutedigo Java

lt= requestgetParameter(ldquoparNombrerdquo) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt veces

bajo la especificacioacuten JSP 20 se pueden escribir de una forma maacutes sencilla como sigue

(ahora no se trata de coacutedigo JAVA)

$paramparNombre has visitado esta paacutegina

$atrCuenta veces

La sintaxis de JSP es sensible a mayuacutesculas y minuacutesculas pero un par de comillas simples es

equivalente a un par de comillas dobles

3221 VARIABLES PREDEFINIDAS (Objetos Impliacutecitos)

El lenguaje de expresioacuten JSP 20 soporta los objetos impliacutecitos siguientes

pageContext Objeto de javaxservletjspPageContext que proporciona acceso a los

datos de una peticioacuten

param Coleccioacuten (objeto de tipo javautilMap) de todos los valores de los paraacutemetros

enviados en una peticioacuten un String por paraacutemetro

paramValues Coleccioacuten de todos los valores de los paraacutemetros enviados en una

peticioacuten una matriz de tipo String por paraacutemetro

header Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten un

String por cabecera

headerValues Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten

una matriz de tipo String por cabecera

cookie Coleccioacuten de todos los valores de las cookies un objeto javaxservlethttpCookie

por cookie

initParam Coleccioacuten de todos los valores de los paraacutemetros de iniciacioacuten de la

aplicacioacuten un String por paraacutemetro

Tambieacuten hay objetos que permiten acceder a variables definidas en diferentes aacutembitos lo que

posibilita compartir informacioacuten

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

pageScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de paacutegina

requestScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

peticioacuten

sessionScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de sesioacuten

applicationScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

aplicacioacuten

3222 DIRECTRICES

Las directrices page incluye y taglib son mensajes para el motor JSP y son siempre incluidas

entre los siacutembolos lt y gt

32221 LA DIRECTRIZ PAGE

Define atributos que se aplican a toda la paacutegina JSP donde es incluida

lt page lista_de_atributos gt

Donde la lista_de_atributos puede contener algunos de los siguientes (aquellos que estaacuten

escritos en negrita son los tomados por omisioacuten)

language= ldquoscriptingLanguagerdquo

extends= rdquoclassNamerdquo

import= ldquoimportListrdquo

session= ldquotrue|falserdquo

buffer= ldquonone|sizeKb

autoflush= ldquotrue|falserdquo

isThreadSafe= rdquotrue|falserdquo

info= rdquoinfo_textrdquo

errorPage= ldquoerror_urlrdquo

isErrorPage= rdquotrue|falserdquo

contentType= rdquoctinfordquo

pageEncoding= rdquopeinfordquo

isELIgnored= ldquotrue|falserdquo

Tiacutepicamente se localiza al principio de la paacutegina JSP y puede haber cualquier nuacutemero de

ellas El lenguaje por omisioacuten es Java Ejemplos

lt page contentType=rdquotexthtmlrdquo language=rdquojavardquo gt

lt page import=rdquojavautil javalangrdquo gt

lt page buffer=rdquo5kbrdquo autoflush=rdquofalserdquo gt

32222 LA DIRECTRIZ INCLUDE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

La directriz include incluye un archivo (html jsp xml o de texto) en una paacutegina JSP Esto

permite dividir el contenido de la paacutegina en trozos maacutes manejables

lt incluye file=rdquoURL_relativordquo gt

El ejemplo siguiente muestra dos archivos el primero incluye al segundo para mostrar la

fecha y hora actuales

lt-- fichero mostrarFechaHorajsp --gt

lthtmlgt

ltheadgtlttitlegtIncluir un ficherolttitlegtltheadgt

ltbody bgcolor=whitegt

ltfont color=bluegt

La fecha y hora actuales son

lt include file=fechaHorajsp gt

ltfontgt

ltbodygt

lthtmlgt

lt-- fichero fechaHorajsp --gt

lt page import=javautil gt

lt= (new javautilDate())toLocaleString() gt

32223 LA DIRECTRIZ TAGLIB

La directriz taglib indica la biblioteca de acciones personalizadas que podremos utilizar en

la codificacioacuten de la paacutegina JSP Para distinguir esas acciones entre otras existentes se utiliza

un prefijo (prefix) Su sintaxis es

lt taglib (uri=rdquoURI_bibliotecardquo|tagdir=rdquoDir_biblioteca_tagrdquo)

prefix=rdquoprefijordquo gt

Cuando se trata de una biblioteca definida mediante una clase Java y un descriptor (archivo

tld) eacutesta se identifica mediante un URI (Uniform Resource Identifier- URL relativos) Por

ejemplo

lt taglib uri=rdquohttpMarioRossainzLopezmiBibliotecardquo

prefix=rdquofunrdquo gt

ltpgtltfunaccion01 gt

La uacuteltima liacutenea del ejemplo tiene dos etiquetas una etiqueta p HTML y otra accion01

perteneciente a la biblioteca miBiblioteca En cambio si la biblioteca se define mediante un

archivo tag entonces se identifica mediante su ruta relativa en el sistema de archivos

lt taglib tagdir=rdquoWEB-INFtagsrdquo prefix=rdquofunrdquo gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpgtltfunaccion01 gt

La directriz taglib debe colocarse antes de utilizar en la paacutegina JSP las acciones

personalizadas definidas por la misma Se puede utilizar maacutes de una directriz pero el prefijo

utilizado debe ser uacutenico para cada una de ellas

3223 ACTIVACION DEL LENGUAJE DE EXPRESION (LE)

La especificacioacuten JSP 20 define un lenguaje de expresioacuten como alternativa a elementos de

programacioacuten escritos con coacutedigo Java y especificaciones anteriores a la JSP 20 Para que

este lenguaje pueda ser interpretado tienen que cumplirse 2 requisitos

1 Que la propiedad isELIgnored de la directriz page valga false

lt page isELIgnored= ldquofalserdquo gt

2 Que el descriptor de despliegue webxml en la carpeta WEB-INF indique doacutende se

localiza el esquema XML para la especificacioacuten Servlet 24 que a su vez utiliza el

esquema XML para la especificacioacuten Java Server Page 20

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

Utilizando el lenguaje de expresioacuten se podriacutea modificar la paacutegina Cuentajsp de la seccioacuten

3212 de este documento como se muestra a continuacioacuten Esta nueva paacutegina

1 Especifica que utilizaraacute la biblioteca core de etiquetas estandar (de la que se hablaraacute maacutes

adelante)

2 La primera vez que sea accedida definiraacute la variable atrCuenta en el aacutembito de la

aplicacioacuten con un valor inicial nulo y la incrementaraacute en una unidad cuando sea accedida

sucesivas veces simplemente incrementaraacute esta variable en una unidad

3 Finalmente mostraraacute una paacutegina con un contenido anaacutelogo al siguiente Esta formado

por una cabecera y una segunda liacutenea compuesta por el valor del paraacutemetro parNombre

enviado con la peticioacuten un texto fijo el valor de la variable atrCuenta y otro texto fijo

dependiente del valor de esta variable

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

El coacutedigo completo es el siguiente

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

3224 VARIABLES Y EXPRESIONES

Para acceder a una simple variable se puede escribir algo como lo siguiente $nombre y

para acceder a una propiedad de un objeto podemos escribir algo como

$paramparNombre

$applicationScopeatrCuenta

$pageContextrequestrequestURI

La primera liacutenea del ejemplo anterior obtiene el valor de la propiedad parNombre del objeto

param la segunda el valor del atributo atrCuenta del objeto applicationScope y la tercera

el URL relativo de la paacutegina JSP solicitada

El lenguaje de expresioacuten es maacutes tolerante con respecto a las variables con valor null y ejecuta

muchas maacutes conversiones de forma automaacutetica sobre el tipo de los datos cuando la expresioacuten

a evaluar asiacute lo requiere Por ejemplo la etiqueta condicional siguiente incluye una expresioacuten

que compara el valor del atributo atrCuenta con aacutembito de aplicacioacuten con 10 (convirtiendo

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

impliacutecitamente el valor del atributo al tipo de la constante para poder realizar la comparacioacuten

El resultado seraacute un valor de tipo boolean

ltcif test=rdquo$applicationScopeatrCuenta gt 10rdquogt

ltcifgt

o bien

ltcif test=rdquo$atrCuenta gt 10rdquogt

ltcifgt

Para que una literal pueda incluir un caracter significativo para el lenguaje dicho caracter

debe ser especificado como una secuencia de escape (caracter) Por ejemplo la siguiente

expresioacuten da lugar al literal ldquovezrdquo o ldquovecesrdquo entre comillas dobles

$(atrCuenta gt 1) iquest ldquordquovecesrdquordquo ldquordquovezrdquordquo

Cualquier objeto o atributo de un objeto definido en algunos de los aacutembitos de una paacutegina

puede ser utilizado como una variable Por ejemplo $atrCuenta+1 es una expresioacuten que

realiza la suma de la variable atrCuenta con 1

Cuando se trate de una propiedad de un objeto para acceder a ella se utilizaraacute el operador

punto o bien la notacioacuten empleada para acceder a un elemento de una matriz Por ejemplo

$paramparNombre

$param[ldquoparNombrerdquo]

Una expresioacuten LE puede aparecer en cualquier lugar donde pueda aparecer un texto fijo Por

tanto para informar al contenedor JSP que se trata de una expresioacuten y no de un texto fijo se

utilizan los delimitadores $ al principio y al final

3225 OPERADORES

OPERADOR DESCRIPCIOacuteN Acceso a la propiedad de un objeto o a un elemento de un Map

[] Acceso al elemento de una matriz o de un objeto List

() Pareacutentesis para alterar la prioridad en la evaluacioacuten de una expresioacuten

If ternario condicion expresion1 expresioacuten 2

+ Suma

- Resta

Producto

oacute div Divisioacuten

oacute mod Moacutedulo o resto de una divisioacuten

== oacute eq Igualdad

= oacute ne Diferente

lt oacute lt Menor que

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt oacute gt Mayor que

lt= oacute le Menor o igual que

gt= oacute ge Mayor o igual que

ampamp oacute and Operacioacuten Loacutegica AND

|| oacute or Operacioacuten Loacutegica OR

oacute not Operacioacuten Loacutegica NOT

empty Verifica si el valor de una variable es null si un String esta vaciacuteo o si una matriz Map

o Collection no tienen elementos

func(args) Llamada a una funcioacuten donde func es el nombre de la funcioacuten y arg representa cero o

maacutes argumentos separados por comas

El ejemplo siguiente muestra una paacutegina JSP compuesta por elementos HTML expresiones

LE y objetos impliacutecitos

lthtmlgt

ltheadgtlttitlegtJSP 20lttitlegtltheadgt

ltbodygt

lth3gtLenguaje de expresioacuten (LE)lth3gt

ltpgtLa siguiente tabla ilustra algunas expresiones LE

ltbrgtltbrgtlttable border=1gt

lttrgt

ltthgtltbgtExpresioacutenltbgtltthgt

ltthgtltbgtValorltbgtltthgt

lttrgt

lttrgt

lttdgt$3 + 6lttdgt

lttdgt$3 + 6lttdgt

lttdgt

lttrgt

lttdgt$(7 gt 4) 7 4lttdgt

lttdgt$(7 gt 4) 7 4lttdgt

lttrgt

lttrgt

lttdgt$header[host]lttdgt

lttdgt$header[host]lttdgt

lttrgt

lttablegt

ltbodygt

lthtmlgt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

323 BIBLIOTECA ESTANDAR DE ETIQUETAS

La biblioteca estaacutendar de etiquetas JSP (JSTL ndash Java Server Page Estaacutendar Tag Library)

incluye una cantidad amplia de etiquetas para diferentes aacutereas de trabajo

Aacuterea baacutesica (su prefijo es c ndash core) y contiene

o Soporte de variables (remove y set)

o Control del flujo (choose when otherwise forEach forTokens if)

o Manejo de URL (import param redirect param y url param)

o Operaciones varias (match y out)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlcore

Aacuterea XML (su prefijo es x) y contiene

o Sentencias baacutesicas (out parse y set)

o Control del flujo (choosehellip whenhellip otherwise forEach e if)

o Transformacioacuten de Documentos (transformhellipparam)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlxml

Aacuterea Internacionalizacioacuten (su prefijo es fmt) Contiene

o Localidad (setLocale y requestEncoding)

o Mensajes (bundle message param y setBundle)

o Formateo de Fechas y nuacutemeros (formatNumber formateacuteate parseDate

parseNumber setTimeZone timeZone)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlfmt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Aacuterea SQL (su prefijo es sql) es el lenguaje estandar para interactuar con bases de datos

relacionales y contiene setDataSource Quero dateParam param transaction y

update dateParam param) El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlsql

Aacuterea Funciones (su prefijo es fn) y contiene

o Longitud de una coleccioacuten (length)

o Manipulacioacuten de String (toUpperCase toLowerCase substring

substringAfter substringBefore trim replace indexOf startsWith

endsWith contains containsIgnoreCase split join y escapeXml)

o El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlfunctions

3231 OPERACIONES CON ETIQUETAS BAacuteSICAS

En un ejemplo pasado teniacuteamos el siguiente coacutedigo

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

En este ejemplo se hace referencia al aacuterea baacutesica de JSTL con el prefijo c y se utiliza la

etiqueta cset para definir la variable atrCuenta Si la variable ya esta definida simplemente

se le asigna el valor especificado

La uacuteltima parte del ejemplo anterior podriacutea haberse escrito de esta otra forma

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcif test=rdquo$atrCuenta gt 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcifgt

$atrCuenta $str

La etiqueta cif permite la ejecucioacuten condicional de su cuerpo en funcioacuten del valor del

atributo de test

La etiqueta cchoose permite la ejecucioacuten del cuerpo de la primera etiqueta cwhen cuyo

atributo test sea evaluado a true Si ninguna de las condiciones se evaluacutea a true entonces se

evaluacutea el cuerpo de la etiqueta cotherwise si estaacute presente El siguiente coacutedigo muestra otra

manera de escribir el ejemplo anterior utilizando estas uacuteltimas etiquetas

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcchoosegt

ltcwhen test=rdquo$atrCuenta == 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcwhengt

ltcotherwisegt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcotherwisegt

ltcchoosegt

$atrCuenta $str

La etiqueta cforEach permite iterar sobre una coleccioacuten de objetos La coleccioacuten se

especifica por medio del atributo iacutetems y el elemento actual de la coleccioacuten estaacute disponible a

traveacutes de la variable establecida por el atributo var Por ejemplo el siguiente fragmento de

coacutedigo visualiza una tabla con las variables definidas a nivel de aacutembito de paacutegina

lttable border=rdquo1rdquogt

ltcforEach var=rdquoitemrdquo iacutetems=rdquo$pageScoperdquogt

lttrgt

lttdgt $item lttdgt

lttrgt

ltcforEachgt

lttablegt

La etiqueta ccatch atrapa una excepcioacuten que ocurra en el cuerpo de la misma Por ejemplo

el siguiente segmento de coacutedigo lanzaraacute una excepcioacuten si el paraacutemetro mes se escribe con

letras en vez de con nuacutemeros

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltbodygt

lthtmlgt

Un URL anaacutelogo al siguiente daraacute lugar a que la excepcioacuten sea lanzada cuando se ejecute la

expresioacuten $nMes 3 de la paacutegina anterior

httplocalhost8080JSP2exceppruebajspmes=marzo

La excepcioacuten indica que ha ocurrido un error al tratar de convertir ldquomarzordquo a un entero de

tipo Long Para cachar esta excepcioacuten y darle un tratamiento adecuado habraacute que modificar

la paacutegina JSP anterior como se indica a continuacioacuten

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltccatch var=rdquoerrorOcurridordquogt

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltccatchgt

ltcif test=rdquo$not empty errorOcurridordquogt

Error el paraacutemetro mes debe ser un nuacutemero ltbgt

ltbrgt Informacioacuten del error dada por el sistema

ltbrgt ltfont color=rdquoFF0000rdquogt $errorOcurrido ltfontgt

ltcifgt

ltbodygt

lthtmlgt

3232 ACCESO A BASES DE DATOS CON JSP

Las etiquetas que proporciona el aacuterea SQL permiten realizar

Conexioacuten con una base de datos

Realizacioacuten de consultas a la base de datos

Acceso al conjunto de resultados

Ejecucioacuten de actualizaciones y transacciones

Todas las etiquetas SQL actuacutean sobre una base de datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

32321 CONEXIOacuteN CON LA BASE DE DATOS

La conexioacuten con la base de datos puede realizarse con la etiqueta sqlsetDataSource Por

ejemplo si se esta utilizando el administrador de bases de datos MySql con el controlador

JDBC se puede realizar una conexioacuten con una base de datos digamos bd_tutorias de la

manera siguiente

ltsqlsetDataSource var=rdquobdrdquo

driver=rdquocommysqljdbcDriverrdquo

url=rdquojdbcmysqllocalhost3306bd_tutoriasrdquo

user=rdquoadminrdquo

password=rdquoadminadminrdquo gt

32322 CONSULTA A LA BASE DE DATOS

La etiqueta sqlQuero permite realizar una consulta a una base de datos Por ejemplo el

siguiente fragmento de coacutedigo realiza una consulta a la base de datos representada por bd y

obtiene un conjunto de resultados representado por cdr

ltsqlquery var=rdquocdrrdquo dataSource=rdquo$bdrdquogt

SELECT professor dia hora alumno

FROM profesores tutorias citas

WHERE profesoresid_profesor=tutoriasid_profesor

AND tutoriasid_tutoria=citasid_tutoria

ltsqlquerygt

32323 MODIFICACIONES SOBRE LA BASE DE DATOS

La etiqueta sqlupdate permite ejecutar una sentencia SQL INSERT UPDATE o DELETE

y cualquier otra sentencia SQL que no retorne ninguacuten valor Por ejemplo

ltsqlupdate var=rdquocontrdquo dataSource=rdquo$bdrdquo gt

UPDATE profesores

SET profesor=

WHERE profesor=

ltsqlparam value=rdquo$paramProfesorrdquo gt

ltsqlparam value=rdquo$paramIDrdquo gt

ltsqlupdategt

Una operacioacuten UPDATE puede utilizar el siacutembolo para indicar que el valor que tendriacutea que

evaluarse en esa posicioacuten seraacute suministrado por una etiqueta sqlparam como por ejemplo

httplocalhost8080JSP2sqlpruebajspProfesor=Mario+Rossainz+LopezampID=514

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

FROM DatosPersonales)

Personasabsolute(Posicion)

IDAccion = IntegerparseInt(Accion)

switch (IDAccion)

case 0

PosicionCorrecta = Personaslast()

break

case 1

PosicionCorrecta = Personasfirst()

break

case 2

PosicionCorrecta = Personasrelative(-5)

break

case 3

PosicionCorrecta = Personasprevious()

break

case 4

PosicionCorrecta = Personasnext()

break

case 5

PosicionCorrecta = Personasrelative(+5)

break

if (PosicionCorrecta)

thisPosicion = PersonasgetRow()

DNI = PersonasgetString(DNI)

Nombre = PersonasgetString(Nombre)

Apellido = PersonasgetString(Apellido)

Edad = PersonasgetInt(Edad)

else

thisPosicion = Posicion

DNI = ----

Nombre = ----

Apellido = ----

Edad = 0

DatosPersona = new ObRegistro(DNINombreApellidoEdad)

Personasclose()

Conexionclose()

SentenciaSQLclose()

Systemoutprintln(StringvalueOf(Posicion)++StringvalueOf(thisPosicion))

catch (ClassNotFoundException e)

Systemoutprintln(Clase no encontrada)

catch (SQLException e)

Systemoutprintln(e)

public int Posicion()

return Posicion

public ObRegistro DameDatos() return DatosPersona

ObPosicionamientojava

En este ejemplo se emplean servlets y paacuteginas Web Los clientes habitualmente trabajan en

una computadora remota y los programas se ejecutan en un servidor El mecanismo de

comunicaciones que soporta el protocolo http nos permite consultar en el servidor los datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

que ha seleccionado o escrito el usuario de esta manera se puede observar una disociacioacuten

entre la interfaz graacutefica de usuario (que se ejecuta en los equipos de los clientes) y el

programa que recoge los datos y ejecuta las acciones pertinentes (que se ejecuta en el

servidor)

Como puede observarse el coacutedigo SvAccessoBD es un servlet que lleva a cabo las siguientes

operaciones

1 Recoge los valores provenientes del usuario

2 Determina la naturaleza de la accioacuten a realizar

3 Realiza su cometido con la base de datos

4 Genera la respuesta que recibiraacute el usuario

32 JSP

JSP significa Java Server Pages que traducido quiere decir Paacuteginas de Servidor Java y es

por tanto una tecnologiacutea orientada a crear paacuteginas Web con programacioacuten en JAVA es decir

permite mezclar HTML estaacutendar y estaacutetico con un contenido dinaacutemico etiquetas especiales

(oacuterdenes) y trozos de coacutedigo JAVA (scriptlets o secuencias de oacuterdenes) o contenido dinaacutemico

generado por servlets Eacuteste contenido dinaacutemico se encuentra encerrado en etiquetas

especiales muchas de las cuales inician con lt y finalizan con gt El motor de las paacuteginas

JSP esta basado en los servlets de JAVA

En la tecnologiacutea JSP se crean paacuteginas parecidas a las paacuteginas que se crean en ASP (Active

Server Page de Microsoft) o PHP (Personal Home Page) que son dos tecnologiacuteas de paacuteginas

ejecutadas en el servidor Sin embargo JSP no se cintildee a un sistema operativo o servidor Web

en particular ademaacutes de que proporciona acceso a la tecnologiacutea de Servlets y a JAVA en la

parte dinaacutemica

El proceso para generar paacuteginas JSP accesibles en Web es mucho maacutes simple que en los

servlets Dando por hecho que se tiene un servidor Web que permite usar JSP el coacutedigo se

almacenaraacute en archivos con extensioacuten jsp que incluyen dentro de la estructuras de etiquetas

HTML las sentencias JAVA a ejecutar y tan soacutelo se colocaraacuten en cualquier lugar en donde

se pusiera una paacutegina Web normal sin compilacioacuten sin paquetes y sin configuracioacuten aunque

el servidor tendraacute que ser configurado para acceder a los archivos de clases Servlets y de

JSPs

Aunque lo que se escriba con frecuencia luciraacute como un archivo HTML estaacutendar detraacutes de

ello la paacutegina JSP se convierte automaacuteticamente en un servlet normal donde el HTML

estaacutetico tan soacutelo es enviado al flujo de salida asociado con el meacutetodo service del servlet Esta

traduccioacuten se realiza la primera vez que se solicita la paacutegina De acuerdo como este

configurado el servidor es posible ver el coacutedigo fuente de los servlets generados a partir de

sus paacuteginas JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Por ejemplo supongamos que se ha escrito el siguiente coacutedigo en el archivo Saludojsp

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtEjemplo JSPlttitlegtltheadgt

ltbody bgcolor=ffffccgt

ltcentergt

lth2gtHola mundolth2gt

ltjavautilDate hoy = new javautilDate()gt

La fecha de hoy es lt=hoygt

ltcentergt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional y un fragmento de un scriptlet de JAVA La etiqueta

lt identifica el comienzo del scriptlet y gt el final Una expresioacuten de la forma =variable

es sustituida por el valor de esa variable Para ejecutar esta paacutegina o cualquier otra paacutegina

JSP desde un navegador hay que instalarla en el servidor de aplicaciones de la misma manera

en como se hizo con los servlets Suponiendo entonces que se tiene instalado el Tomcat 5

siga los siguientes pasos

1 Antildeadir en el servidor la carpeta digamos JSP2 dentro de la carpeta webapps del Tomcat

y construir sobre ella la jerarquiacutea de clases ya conocida de los servlets

webappsrarrJSP2rarrWEB-INFrarrclasses

WEB-INFrarrlib

WEB-INFrarrtags

2 Editar en la carpeta WEB-INF el descriptor de despliegue webxml que se indica a

continuacioacuten Este archivo XML indica doacutende se localiza el esquema XML para la

especificacioacuten Servlet 24 que a suvez utiliza el esquema XML para la especificacioacuten

Java Server Page 20 que son las especificaciones que soporta en servidor Tomcat

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=

httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

3 Crear en JSP2 la carpeta saludo que contendraacute la aplicacioacuten y copiar en ella la paacutegina

Saludojsp

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

4 Arrancar el servidor Si el servidor ya estaba arrancado detenerlo y volverlo a arrancar o

bien abrir el explorador escribir el URL httplocalhost8080managerhtml e instalar

la aplicacioacuten

5 Una vez arrancado el servidor verificar si estaacute funcionando correctamente escribiendo

el URL siguiente en el explorador httplocalhost8080 El explorador debe mostrar la

paacutegina del Tomcat

6 Ejecutar la paacutegina JSP iniciando el explorador y escribiendo el URL siguiente

httplocalhost8080JSP2saludoSaludojsp donde la sintaxis geneacuterica es

httpservidor[puerto]MiCarpetapaginajsp

Cuando esta paacutegina (Saludojsp) es invocada por primera vez el motor JSP lleva a cabo una

fase de traduccioacuten de la misma en un servlet y el motor Servlet es el que ejecutaraacute eacuteste uacuteltimo

para generar el HTML dinaacutemico que seraacute enviado al explorador cliente seguacuten puede

deducirse de la figura siguiente La proacutexima vez que la paacutegina sea solicitada el motor JSP

ejecutaraacute el servlet que fue caragado la primera vez a no ser que la paacutegina haya cambiado

en cuyo caso seraacute compilada automaacuteticamente en un nuevo servlet y ejecutada

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Regresando al ejemplo el archivo java generado por el Tomcat a partir del archivo

Saludojsp se localiza en la carpeta workCatalinalocalhost de la instalacioacuten de Tomcat

321 ELEMENTOS PARA SECUENCIAS DE COMANDOS

Los elementos para secuencias de comandos permiten insertar coacutedigo en el servlet que seraacute

generado a partir de la paacutegina JSP Existen tres formas

1 Expresiones del tipo lt= expresioacuten gt que se evaluacutean e insertan en el resultado del

servlet

2 Los scriptlets del tipo lt codigo gt que se insertan en el meacutetodo _jspService del

servlet (ejecutado por service)

3 Las declaraciones del tipo lt Codigo gt que se insertan en el cuerpo de la clase del

servlet fuera de cualquier meacutetodo existente

NOTA Los comentarios en JSP se escriben lt-- Comentario JSP --gt en tanto que los

comentarios en HTML son de la forma lt--Comentario HTML --gt La diferencia

semaacutentica radica en que los comentarios HTML cuando se insertan en la respuesta enviada

por el servidor al cliente no se muestran cuando se visualiza el documento HTML pero si

Servidor Maacutequina Cliente

Explorador Web

Contenedor Web

Motor Servlet

Motor JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

los podemos ver cuando se visualiza el coacutedigo fuente en tanto que los comentarios JSP

aunque se inserten en la respuesta enviada por el servidor al cliente no son enviados al

explorador de forma que tampoco se muestran ni se ven cuando se visualiza el coacutedigo fuente

HTML desde el explorador

3211 EXPRESIONES

Se utiliza una expresioacuten JSP para insertar valores directamente en el resultado La sintaxis es

lt= expresioacuten gt Por ejemplo

lt= requestgetParameter(ldquoparNombre) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt lt= s gt

La fecha y hora actual es lt= new javautilDate() gt

La expresioacuten se evaluacutea se convierte a cadena y se inserta en la paacutegina Esta evaluacioacuten se

realiza durante la ejecucioacuten

32111 VARIABLES PREDEFINIDAS

Para simplificar estas expresiones se pueden utilizar cierta cantidad de variables

predefinidas Estos objetos impliacutecitos como tambieacuten se les llama estaacuten disponibles para su

uso durante la implementacioacuten de una paacutegina Web

bull pageContext Es un objeto de la clase PageContext que proporciona acceso a objetos

relacionados con los servlets

bull request Es un objeto de la clase HttpServletRequest que se puede obtener a traveacutes del

meacutetodo getRequest que encapsula los datos enviados por el cliente al servidor

bull response Es un objeto de la clase HttpServletResponse que puede obtenerse a traveacutes

del meacutetodo getResponse que encapsula los datos que el servidor enviaraacute al cliente

bull application Es un objeto de la clase ServletContext que se obtiene a traveacutes del meacutetodo

getServletContext que define un conjunto de meacutetodos que todo servlet utiliza para

comunicar con el contenedor de servlets

bull config Es un objeto de la clase ServletConfig que se obtiene a traveacutes del meacutetodo

getServletConfig y que se utiliza por el contenedor de servlets para pasar informacioacuten

al servlet durante la iniciacioacuten

bull session Es un objeto de la clase HttpSession que se obtiene a traveacutes del meacutetodo

getSession que proporciona una forma de identificar a un usuario que visita las paacuteginas

de un sitio Web

bull out Es un objeto de la clase JspWriter que se obtiene a traveacutes del meacutetodo getOut que

se utiliza para almacenar la respuesta que seraacute enviada al cliente que hizo la peticioacuten de

la paacutegina

bull page Es un objeto geneacuterico de la clase Object que se obtiene a traveacutes del meacutetodo

getPage y que representa al servlet obtenido a partir de la paacutegina JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

bull exception Es un objeto de la clase Exception que se obtiene a traveacutes del meacutetodo

getException que contendraacute informacioacuten a cerca de cualquier excepcioacuten que se lance

desde la paacutegina JSP

Un ejemplo del uso de uno de estos objetos impliacutecitos seriacutea el siguiente

El nombre de tu host es lt= requestgetRemoteHost() gt

El listado siguiente da un ejemplo de una paacutegina JSP que utiliza algunas variables

predefinidas como uso de expresiones JSP

ltDOCTYPE HTML PUBLIC -W3CDTD HTML 40 Transitional ENgt

lthtmlgt

ltheadgt

lttitlegt Expresiones JSP lttitlegt

ltheadgt

ltbodygt

lth2gt Expresiones JSP lth2gt

ltULgt

ltligt Fecha y hora en curso lt= new javautilDate() gt ltligt

ltligt Nombre de su host lt= requestgetRemoteHost() gt ltligt

ltligt Identificador de su sesioacuten lt= sessiongetId() gt ltligt

ltligt El paraacutemetro ltcodegt paramPrueba ltcodegt del formulario

lt= requestgetParameter(paramPrueba) gt ltligt

ltULgt

ltbodygt

lthtmlgt

Cuya salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3212 LOS SCRIPTLETS JSP

Si se desea hacer algo maacutes complejo que una simple expresioacuten los scriptlets permiten insertar

coacutedigo JAVA en el meacutetodo _jspService del servlet (que es ejecutado por service) La sintaxis

utilizada por los scriptlets es lt coacutedigo java gt Los escriptlets tienen acceso a las

mismas variables definidas de forma automaacutetica como expresiones A manera de ejemplo si

se desea que el resultado aparezca en la paacutegina generada deberiacutea de utilizarse la variable out

como en la siguiente instruccioacuten

lt String datosConsultados= requestgetQueryString()

outprintln(ldquoDatos GET adjuntos ldquo+datosConsultados)

gt

En este ejemplo podriacutea haberse obtenido el mismo resultado utilizando la siguiente expresioacuten

JSP

Datos GET adjuntos lt=requestgetQueryString() gt

En general los scriptlets pueden ejecutar varias tareas que no podriacutean realizarse con las

expresiones Tales tareas incluyen

bull La determinacioacuten de encabezados de respuesta

bull Actualizacioacuten de Bases de Datos

bull Ejecucioacuten de bucles condiciones y otras estructuras complejas

lt for (int i=1 ilt=6 i++)

gt

lth lt=i gtgt Hola Mundo lthlt=i gtgt

lt gt

Como un ejemplo concreto se muestra la siguiente paacutegina JSP llamada Cuentajsp en donde

se observa coacutemo se hace un seguimiento del nuacutemero de veces que un cliente accede a esta

paacutegina a traveacutes de distintas sesiones Para ello supondremos que dicha cuenta es el valor del

atributo atrCuenta del objeto impliacutecito application ya citado La primera vez que el cliente

accede a la paacutegina el valor de atrCuenta seraacute null debido a que auacuten no ha sido fijado este

atributo en este caso se fijaraacute con el valor 1 En los siguientes accesos se leeraacute el valor del

atributo atrCuenta se incrementaraacute en una unidad y se volveraacute a fijar Finalmente se enviacutea

la respuesta al cliente para que se muestre al usuario el valor del contador

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en el objeto impliacutecito application con el nombre

atrCuenta

--gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt

Integer cuenta = (Integer)applicationgetAttribute(atrCuenta)

String s = vez

if (cuenta == null)

cuenta = new Integer(1)

else

cuenta = new Integer(cuentaintValue() + 1)

s = veces

applicationsetAttribute(atrCuenta cuenta)

gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

Has visitado esta paacutegina lt= cuenta gt lt= s gt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional un fragmento de coacutedigo JAVA o scriptlet

expresiones y comentarioshellip

Aquiacute otro ejemplo de la ejecucioacuten de un coacutedigo demasiado complejo para una expresioacuten JSP

Este listado presenta una paacutegina JSP que utiliza el paraacutemetro de peticioacuten colorFondo para

establecer el color de fondo de la paacutegina

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgt

lttitlegt Prueba de Color lttitlegt

ltheadgt

lt

String colorFondo=requestgetParameter(colorFondo)

boolean tieneColorExplicito

if (colorFondo =null)

tieneColorExplicito=true

else

tieneColorExplicito=false

colorFondo=WHITE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt

ltbody bgcolor=lt= colorFondo gtgt

lth2 align=centergt Prueba de color lth2gt

lt

if (tieneColorExplicito)

outprintln(Ha indicado un color de fondo expliacutecito +

colorFondo +)

else

outprintln(Usareacute el color de fondo predeterminado WHITE +

Indique el atributo de peticioacuten

ltigtcolorFondoltigt+

para intentar un color estaacutendar un +

valor RRGGBB o para ver si el navegador Web +

permite el uso de nombres de color X11)

gt

ltbodygt

lthtmlgt

Cuyas posibles salidas son

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3213 DECLARACIONES JSP

Una declaracioacuten JSP permite definir meacutetodos o campos que seraacuten insertados en el cuerpo

principal de la clase del servlet (fuera del meacutetodo _jspService) Una declaracioacuten tiene la

sintaxis lt Coacutedigo Java gt Por ejemplo

lt int i=0 gt

lt

Public void jspinit()

coacutedigo de iniciacioacuten

gt

Una declaracioacuten no genera ninguacuten resultado y se usan junto con las expresiones JSP o los

scriptlets A continuacioacuten se muestra una paacutegina JSP que despliega la cantidad de veces que

se ha solicitado esta paacutegina desde que se arrancoacute el servidor haciendo uso de las

declaraciones JSP

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtDeclaraciones JSPlttitlegtltheadgt

ltbodygt

lth1gtDeclaraciones JSPlth1gt

lt-- Esto es un comentario en JSP --gt

lt private int recuentoAccesos=0 gt

lth2gt Accesos a la paacutegina desde el reinicio del servidor

lt= ++recuentoAccesos gt lth2gt

ltbodygt

lthtmlgt

La salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

322 EL LENGUAJE DE EXPRESION EN JSP 20

Anteriormente se ha visto la necesidad de utilizar fragmentos de coacutedigo java en el desarrollo

de paacuteginas JSP pero con la aparicioacuten de la especificacioacuten JSP 20 ya no hay necesidad de

utilizar fragmentos de coacutedigo Java para nada gracias al nuevo lenguaje de expresioacuten EL

(Expresioacuten Language) a la biblioteca de etiquetas estandar JSTL (JSP Standar Tag Library)

y a las nuevas formas para desarrollar etiquetas personalizadas

El lenguaje de expresioacuten JSP es maacutes un lenguaje de acceso a datos que un lenguaje de

programacioacuten Ya se ha visto que para pasar informacioacuten de un cliente a una paacutegina JSP se

utilizan paraacutemetros en la peticioacuten y atributos en la paacutegina El lenguaje de expresioacuten lo hace

posible sin tener que utilizar scriptlets o expresiones (lt= expresioacuten gt) Por ejemplo las

liacuteneas JSP 12 siguientes escritas utilizando coacutedigo Java

lt= requestgetParameter(ldquoparNombrerdquo) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt veces

bajo la especificacioacuten JSP 20 se pueden escribir de una forma maacutes sencilla como sigue

(ahora no se trata de coacutedigo JAVA)

$paramparNombre has visitado esta paacutegina

$atrCuenta veces

La sintaxis de JSP es sensible a mayuacutesculas y minuacutesculas pero un par de comillas simples es

equivalente a un par de comillas dobles

3221 VARIABLES PREDEFINIDAS (Objetos Impliacutecitos)

El lenguaje de expresioacuten JSP 20 soporta los objetos impliacutecitos siguientes

pageContext Objeto de javaxservletjspPageContext que proporciona acceso a los

datos de una peticioacuten

param Coleccioacuten (objeto de tipo javautilMap) de todos los valores de los paraacutemetros

enviados en una peticioacuten un String por paraacutemetro

paramValues Coleccioacuten de todos los valores de los paraacutemetros enviados en una

peticioacuten una matriz de tipo String por paraacutemetro

header Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten un

String por cabecera

headerValues Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten

una matriz de tipo String por cabecera

cookie Coleccioacuten de todos los valores de las cookies un objeto javaxservlethttpCookie

por cookie

initParam Coleccioacuten de todos los valores de los paraacutemetros de iniciacioacuten de la

aplicacioacuten un String por paraacutemetro

Tambieacuten hay objetos que permiten acceder a variables definidas en diferentes aacutembitos lo que

posibilita compartir informacioacuten

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

pageScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de paacutegina

requestScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

peticioacuten

sessionScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de sesioacuten

applicationScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

aplicacioacuten

3222 DIRECTRICES

Las directrices page incluye y taglib son mensajes para el motor JSP y son siempre incluidas

entre los siacutembolos lt y gt

32221 LA DIRECTRIZ PAGE

Define atributos que se aplican a toda la paacutegina JSP donde es incluida

lt page lista_de_atributos gt

Donde la lista_de_atributos puede contener algunos de los siguientes (aquellos que estaacuten

escritos en negrita son los tomados por omisioacuten)

language= ldquoscriptingLanguagerdquo

extends= rdquoclassNamerdquo

import= ldquoimportListrdquo

session= ldquotrue|falserdquo

buffer= ldquonone|sizeKb

autoflush= ldquotrue|falserdquo

isThreadSafe= rdquotrue|falserdquo

info= rdquoinfo_textrdquo

errorPage= ldquoerror_urlrdquo

isErrorPage= rdquotrue|falserdquo

contentType= rdquoctinfordquo

pageEncoding= rdquopeinfordquo

isELIgnored= ldquotrue|falserdquo

Tiacutepicamente se localiza al principio de la paacutegina JSP y puede haber cualquier nuacutemero de

ellas El lenguaje por omisioacuten es Java Ejemplos

lt page contentType=rdquotexthtmlrdquo language=rdquojavardquo gt

lt page import=rdquojavautil javalangrdquo gt

lt page buffer=rdquo5kbrdquo autoflush=rdquofalserdquo gt

32222 LA DIRECTRIZ INCLUDE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

La directriz include incluye un archivo (html jsp xml o de texto) en una paacutegina JSP Esto

permite dividir el contenido de la paacutegina en trozos maacutes manejables

lt incluye file=rdquoURL_relativordquo gt

El ejemplo siguiente muestra dos archivos el primero incluye al segundo para mostrar la

fecha y hora actuales

lt-- fichero mostrarFechaHorajsp --gt

lthtmlgt

ltheadgtlttitlegtIncluir un ficherolttitlegtltheadgt

ltbody bgcolor=whitegt

ltfont color=bluegt

La fecha y hora actuales son

lt include file=fechaHorajsp gt

ltfontgt

ltbodygt

lthtmlgt

lt-- fichero fechaHorajsp --gt

lt page import=javautil gt

lt= (new javautilDate())toLocaleString() gt

32223 LA DIRECTRIZ TAGLIB

La directriz taglib indica la biblioteca de acciones personalizadas que podremos utilizar en

la codificacioacuten de la paacutegina JSP Para distinguir esas acciones entre otras existentes se utiliza

un prefijo (prefix) Su sintaxis es

lt taglib (uri=rdquoURI_bibliotecardquo|tagdir=rdquoDir_biblioteca_tagrdquo)

prefix=rdquoprefijordquo gt

Cuando se trata de una biblioteca definida mediante una clase Java y un descriptor (archivo

tld) eacutesta se identifica mediante un URI (Uniform Resource Identifier- URL relativos) Por

ejemplo

lt taglib uri=rdquohttpMarioRossainzLopezmiBibliotecardquo

prefix=rdquofunrdquo gt

ltpgtltfunaccion01 gt

La uacuteltima liacutenea del ejemplo tiene dos etiquetas una etiqueta p HTML y otra accion01

perteneciente a la biblioteca miBiblioteca En cambio si la biblioteca se define mediante un

archivo tag entonces se identifica mediante su ruta relativa en el sistema de archivos

lt taglib tagdir=rdquoWEB-INFtagsrdquo prefix=rdquofunrdquo gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpgtltfunaccion01 gt

La directriz taglib debe colocarse antes de utilizar en la paacutegina JSP las acciones

personalizadas definidas por la misma Se puede utilizar maacutes de una directriz pero el prefijo

utilizado debe ser uacutenico para cada una de ellas

3223 ACTIVACION DEL LENGUAJE DE EXPRESION (LE)

La especificacioacuten JSP 20 define un lenguaje de expresioacuten como alternativa a elementos de

programacioacuten escritos con coacutedigo Java y especificaciones anteriores a la JSP 20 Para que

este lenguaje pueda ser interpretado tienen que cumplirse 2 requisitos

1 Que la propiedad isELIgnored de la directriz page valga false

lt page isELIgnored= ldquofalserdquo gt

2 Que el descriptor de despliegue webxml en la carpeta WEB-INF indique doacutende se

localiza el esquema XML para la especificacioacuten Servlet 24 que a su vez utiliza el

esquema XML para la especificacioacuten Java Server Page 20

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

Utilizando el lenguaje de expresioacuten se podriacutea modificar la paacutegina Cuentajsp de la seccioacuten

3212 de este documento como se muestra a continuacioacuten Esta nueva paacutegina

1 Especifica que utilizaraacute la biblioteca core de etiquetas estandar (de la que se hablaraacute maacutes

adelante)

2 La primera vez que sea accedida definiraacute la variable atrCuenta en el aacutembito de la

aplicacioacuten con un valor inicial nulo y la incrementaraacute en una unidad cuando sea accedida

sucesivas veces simplemente incrementaraacute esta variable en una unidad

3 Finalmente mostraraacute una paacutegina con un contenido anaacutelogo al siguiente Esta formado

por una cabecera y una segunda liacutenea compuesta por el valor del paraacutemetro parNombre

enviado con la peticioacuten un texto fijo el valor de la variable atrCuenta y otro texto fijo

dependiente del valor de esta variable

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

El coacutedigo completo es el siguiente

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

3224 VARIABLES Y EXPRESIONES

Para acceder a una simple variable se puede escribir algo como lo siguiente $nombre y

para acceder a una propiedad de un objeto podemos escribir algo como

$paramparNombre

$applicationScopeatrCuenta

$pageContextrequestrequestURI

La primera liacutenea del ejemplo anterior obtiene el valor de la propiedad parNombre del objeto

param la segunda el valor del atributo atrCuenta del objeto applicationScope y la tercera

el URL relativo de la paacutegina JSP solicitada

El lenguaje de expresioacuten es maacutes tolerante con respecto a las variables con valor null y ejecuta

muchas maacutes conversiones de forma automaacutetica sobre el tipo de los datos cuando la expresioacuten

a evaluar asiacute lo requiere Por ejemplo la etiqueta condicional siguiente incluye una expresioacuten

que compara el valor del atributo atrCuenta con aacutembito de aplicacioacuten con 10 (convirtiendo

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

impliacutecitamente el valor del atributo al tipo de la constante para poder realizar la comparacioacuten

El resultado seraacute un valor de tipo boolean

ltcif test=rdquo$applicationScopeatrCuenta gt 10rdquogt

ltcifgt

o bien

ltcif test=rdquo$atrCuenta gt 10rdquogt

ltcifgt

Para que una literal pueda incluir un caracter significativo para el lenguaje dicho caracter

debe ser especificado como una secuencia de escape (caracter) Por ejemplo la siguiente

expresioacuten da lugar al literal ldquovezrdquo o ldquovecesrdquo entre comillas dobles

$(atrCuenta gt 1) iquest ldquordquovecesrdquordquo ldquordquovezrdquordquo

Cualquier objeto o atributo de un objeto definido en algunos de los aacutembitos de una paacutegina

puede ser utilizado como una variable Por ejemplo $atrCuenta+1 es una expresioacuten que

realiza la suma de la variable atrCuenta con 1

Cuando se trate de una propiedad de un objeto para acceder a ella se utilizaraacute el operador

punto o bien la notacioacuten empleada para acceder a un elemento de una matriz Por ejemplo

$paramparNombre

$param[ldquoparNombrerdquo]

Una expresioacuten LE puede aparecer en cualquier lugar donde pueda aparecer un texto fijo Por

tanto para informar al contenedor JSP que se trata de una expresioacuten y no de un texto fijo se

utilizan los delimitadores $ al principio y al final

3225 OPERADORES

OPERADOR DESCRIPCIOacuteN Acceso a la propiedad de un objeto o a un elemento de un Map

[] Acceso al elemento de una matriz o de un objeto List

() Pareacutentesis para alterar la prioridad en la evaluacioacuten de una expresioacuten

If ternario condicion expresion1 expresioacuten 2

+ Suma

- Resta

Producto

oacute div Divisioacuten

oacute mod Moacutedulo o resto de una divisioacuten

== oacute eq Igualdad

= oacute ne Diferente

lt oacute lt Menor que

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt oacute gt Mayor que

lt= oacute le Menor o igual que

gt= oacute ge Mayor o igual que

ampamp oacute and Operacioacuten Loacutegica AND

|| oacute or Operacioacuten Loacutegica OR

oacute not Operacioacuten Loacutegica NOT

empty Verifica si el valor de una variable es null si un String esta vaciacuteo o si una matriz Map

o Collection no tienen elementos

func(args) Llamada a una funcioacuten donde func es el nombre de la funcioacuten y arg representa cero o

maacutes argumentos separados por comas

El ejemplo siguiente muestra una paacutegina JSP compuesta por elementos HTML expresiones

LE y objetos impliacutecitos

lthtmlgt

ltheadgtlttitlegtJSP 20lttitlegtltheadgt

ltbodygt

lth3gtLenguaje de expresioacuten (LE)lth3gt

ltpgtLa siguiente tabla ilustra algunas expresiones LE

ltbrgtltbrgtlttable border=1gt

lttrgt

ltthgtltbgtExpresioacutenltbgtltthgt

ltthgtltbgtValorltbgtltthgt

lttrgt

lttrgt

lttdgt$3 + 6lttdgt

lttdgt$3 + 6lttdgt

lttdgt

lttrgt

lttdgt$(7 gt 4) 7 4lttdgt

lttdgt$(7 gt 4) 7 4lttdgt

lttrgt

lttrgt

lttdgt$header[host]lttdgt

lttdgt$header[host]lttdgt

lttrgt

lttablegt

ltbodygt

lthtmlgt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

323 BIBLIOTECA ESTANDAR DE ETIQUETAS

La biblioteca estaacutendar de etiquetas JSP (JSTL ndash Java Server Page Estaacutendar Tag Library)

incluye una cantidad amplia de etiquetas para diferentes aacutereas de trabajo

Aacuterea baacutesica (su prefijo es c ndash core) y contiene

o Soporte de variables (remove y set)

o Control del flujo (choose when otherwise forEach forTokens if)

o Manejo de URL (import param redirect param y url param)

o Operaciones varias (match y out)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlcore

Aacuterea XML (su prefijo es x) y contiene

o Sentencias baacutesicas (out parse y set)

o Control del flujo (choosehellip whenhellip otherwise forEach e if)

o Transformacioacuten de Documentos (transformhellipparam)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlxml

Aacuterea Internacionalizacioacuten (su prefijo es fmt) Contiene

o Localidad (setLocale y requestEncoding)

o Mensajes (bundle message param y setBundle)

o Formateo de Fechas y nuacutemeros (formatNumber formateacuteate parseDate

parseNumber setTimeZone timeZone)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlfmt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Aacuterea SQL (su prefijo es sql) es el lenguaje estandar para interactuar con bases de datos

relacionales y contiene setDataSource Quero dateParam param transaction y

update dateParam param) El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlsql

Aacuterea Funciones (su prefijo es fn) y contiene

o Longitud de una coleccioacuten (length)

o Manipulacioacuten de String (toUpperCase toLowerCase substring

substringAfter substringBefore trim replace indexOf startsWith

endsWith contains containsIgnoreCase split join y escapeXml)

o El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlfunctions

3231 OPERACIONES CON ETIQUETAS BAacuteSICAS

En un ejemplo pasado teniacuteamos el siguiente coacutedigo

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

En este ejemplo se hace referencia al aacuterea baacutesica de JSTL con el prefijo c y se utiliza la

etiqueta cset para definir la variable atrCuenta Si la variable ya esta definida simplemente

se le asigna el valor especificado

La uacuteltima parte del ejemplo anterior podriacutea haberse escrito de esta otra forma

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcif test=rdquo$atrCuenta gt 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcifgt

$atrCuenta $str

La etiqueta cif permite la ejecucioacuten condicional de su cuerpo en funcioacuten del valor del

atributo de test

La etiqueta cchoose permite la ejecucioacuten del cuerpo de la primera etiqueta cwhen cuyo

atributo test sea evaluado a true Si ninguna de las condiciones se evaluacutea a true entonces se

evaluacutea el cuerpo de la etiqueta cotherwise si estaacute presente El siguiente coacutedigo muestra otra

manera de escribir el ejemplo anterior utilizando estas uacuteltimas etiquetas

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcchoosegt

ltcwhen test=rdquo$atrCuenta == 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcwhengt

ltcotherwisegt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcotherwisegt

ltcchoosegt

$atrCuenta $str

La etiqueta cforEach permite iterar sobre una coleccioacuten de objetos La coleccioacuten se

especifica por medio del atributo iacutetems y el elemento actual de la coleccioacuten estaacute disponible a

traveacutes de la variable establecida por el atributo var Por ejemplo el siguiente fragmento de

coacutedigo visualiza una tabla con las variables definidas a nivel de aacutembito de paacutegina

lttable border=rdquo1rdquogt

ltcforEach var=rdquoitemrdquo iacutetems=rdquo$pageScoperdquogt

lttrgt

lttdgt $item lttdgt

lttrgt

ltcforEachgt

lttablegt

La etiqueta ccatch atrapa una excepcioacuten que ocurra en el cuerpo de la misma Por ejemplo

el siguiente segmento de coacutedigo lanzaraacute una excepcioacuten si el paraacutemetro mes se escribe con

letras en vez de con nuacutemeros

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltbodygt

lthtmlgt

Un URL anaacutelogo al siguiente daraacute lugar a que la excepcioacuten sea lanzada cuando se ejecute la

expresioacuten $nMes 3 de la paacutegina anterior

httplocalhost8080JSP2exceppruebajspmes=marzo

La excepcioacuten indica que ha ocurrido un error al tratar de convertir ldquomarzordquo a un entero de

tipo Long Para cachar esta excepcioacuten y darle un tratamiento adecuado habraacute que modificar

la paacutegina JSP anterior como se indica a continuacioacuten

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltccatch var=rdquoerrorOcurridordquogt

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltccatchgt

ltcif test=rdquo$not empty errorOcurridordquogt

Error el paraacutemetro mes debe ser un nuacutemero ltbgt

ltbrgt Informacioacuten del error dada por el sistema

ltbrgt ltfont color=rdquoFF0000rdquogt $errorOcurrido ltfontgt

ltcifgt

ltbodygt

lthtmlgt

3232 ACCESO A BASES DE DATOS CON JSP

Las etiquetas que proporciona el aacuterea SQL permiten realizar

Conexioacuten con una base de datos

Realizacioacuten de consultas a la base de datos

Acceso al conjunto de resultados

Ejecucioacuten de actualizaciones y transacciones

Todas las etiquetas SQL actuacutean sobre una base de datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

32321 CONEXIOacuteN CON LA BASE DE DATOS

La conexioacuten con la base de datos puede realizarse con la etiqueta sqlsetDataSource Por

ejemplo si se esta utilizando el administrador de bases de datos MySql con el controlador

JDBC se puede realizar una conexioacuten con una base de datos digamos bd_tutorias de la

manera siguiente

ltsqlsetDataSource var=rdquobdrdquo

driver=rdquocommysqljdbcDriverrdquo

url=rdquojdbcmysqllocalhost3306bd_tutoriasrdquo

user=rdquoadminrdquo

password=rdquoadminadminrdquo gt

32322 CONSULTA A LA BASE DE DATOS

La etiqueta sqlQuero permite realizar una consulta a una base de datos Por ejemplo el

siguiente fragmento de coacutedigo realiza una consulta a la base de datos representada por bd y

obtiene un conjunto de resultados representado por cdr

ltsqlquery var=rdquocdrrdquo dataSource=rdquo$bdrdquogt

SELECT professor dia hora alumno

FROM profesores tutorias citas

WHERE profesoresid_profesor=tutoriasid_profesor

AND tutoriasid_tutoria=citasid_tutoria

ltsqlquerygt

32323 MODIFICACIONES SOBRE LA BASE DE DATOS

La etiqueta sqlupdate permite ejecutar una sentencia SQL INSERT UPDATE o DELETE

y cualquier otra sentencia SQL que no retorne ninguacuten valor Por ejemplo

ltsqlupdate var=rdquocontrdquo dataSource=rdquo$bdrdquo gt

UPDATE profesores

SET profesor=

WHERE profesor=

ltsqlparam value=rdquo$paramProfesorrdquo gt

ltsqlparam value=rdquo$paramIDrdquo gt

ltsqlupdategt

Una operacioacuten UPDATE puede utilizar el siacutembolo para indicar que el valor que tendriacutea que

evaluarse en esa posicioacuten seraacute suministrado por una etiqueta sqlparam como por ejemplo

httplocalhost8080JSP2sqlpruebajspProfesor=Mario+Rossainz+LopezampID=514

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

que ha seleccionado o escrito el usuario de esta manera se puede observar una disociacioacuten

entre la interfaz graacutefica de usuario (que se ejecuta en los equipos de los clientes) y el

programa que recoge los datos y ejecuta las acciones pertinentes (que se ejecuta en el

servidor)

Como puede observarse el coacutedigo SvAccessoBD es un servlet que lleva a cabo las siguientes

operaciones

1 Recoge los valores provenientes del usuario

2 Determina la naturaleza de la accioacuten a realizar

3 Realiza su cometido con la base de datos

4 Genera la respuesta que recibiraacute el usuario

32 JSP

JSP significa Java Server Pages que traducido quiere decir Paacuteginas de Servidor Java y es

por tanto una tecnologiacutea orientada a crear paacuteginas Web con programacioacuten en JAVA es decir

permite mezclar HTML estaacutendar y estaacutetico con un contenido dinaacutemico etiquetas especiales

(oacuterdenes) y trozos de coacutedigo JAVA (scriptlets o secuencias de oacuterdenes) o contenido dinaacutemico

generado por servlets Eacuteste contenido dinaacutemico se encuentra encerrado en etiquetas

especiales muchas de las cuales inician con lt y finalizan con gt El motor de las paacuteginas

JSP esta basado en los servlets de JAVA

En la tecnologiacutea JSP se crean paacuteginas parecidas a las paacuteginas que se crean en ASP (Active

Server Page de Microsoft) o PHP (Personal Home Page) que son dos tecnologiacuteas de paacuteginas

ejecutadas en el servidor Sin embargo JSP no se cintildee a un sistema operativo o servidor Web

en particular ademaacutes de que proporciona acceso a la tecnologiacutea de Servlets y a JAVA en la

parte dinaacutemica

El proceso para generar paacuteginas JSP accesibles en Web es mucho maacutes simple que en los

servlets Dando por hecho que se tiene un servidor Web que permite usar JSP el coacutedigo se

almacenaraacute en archivos con extensioacuten jsp que incluyen dentro de la estructuras de etiquetas

HTML las sentencias JAVA a ejecutar y tan soacutelo se colocaraacuten en cualquier lugar en donde

se pusiera una paacutegina Web normal sin compilacioacuten sin paquetes y sin configuracioacuten aunque

el servidor tendraacute que ser configurado para acceder a los archivos de clases Servlets y de

JSPs

Aunque lo que se escriba con frecuencia luciraacute como un archivo HTML estaacutendar detraacutes de

ello la paacutegina JSP se convierte automaacuteticamente en un servlet normal donde el HTML

estaacutetico tan soacutelo es enviado al flujo de salida asociado con el meacutetodo service del servlet Esta

traduccioacuten se realiza la primera vez que se solicita la paacutegina De acuerdo como este

configurado el servidor es posible ver el coacutedigo fuente de los servlets generados a partir de

sus paacuteginas JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Por ejemplo supongamos que se ha escrito el siguiente coacutedigo en el archivo Saludojsp

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtEjemplo JSPlttitlegtltheadgt

ltbody bgcolor=ffffccgt

ltcentergt

lth2gtHola mundolth2gt

ltjavautilDate hoy = new javautilDate()gt

La fecha de hoy es lt=hoygt

ltcentergt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional y un fragmento de un scriptlet de JAVA La etiqueta

lt identifica el comienzo del scriptlet y gt el final Una expresioacuten de la forma =variable

es sustituida por el valor de esa variable Para ejecutar esta paacutegina o cualquier otra paacutegina

JSP desde un navegador hay que instalarla en el servidor de aplicaciones de la misma manera

en como se hizo con los servlets Suponiendo entonces que se tiene instalado el Tomcat 5

siga los siguientes pasos

1 Antildeadir en el servidor la carpeta digamos JSP2 dentro de la carpeta webapps del Tomcat

y construir sobre ella la jerarquiacutea de clases ya conocida de los servlets

webappsrarrJSP2rarrWEB-INFrarrclasses

WEB-INFrarrlib

WEB-INFrarrtags

2 Editar en la carpeta WEB-INF el descriptor de despliegue webxml que se indica a

continuacioacuten Este archivo XML indica doacutende se localiza el esquema XML para la

especificacioacuten Servlet 24 que a suvez utiliza el esquema XML para la especificacioacuten

Java Server Page 20 que son las especificaciones que soporta en servidor Tomcat

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=

httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

3 Crear en JSP2 la carpeta saludo que contendraacute la aplicacioacuten y copiar en ella la paacutegina

Saludojsp

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

4 Arrancar el servidor Si el servidor ya estaba arrancado detenerlo y volverlo a arrancar o

bien abrir el explorador escribir el URL httplocalhost8080managerhtml e instalar

la aplicacioacuten

5 Una vez arrancado el servidor verificar si estaacute funcionando correctamente escribiendo

el URL siguiente en el explorador httplocalhost8080 El explorador debe mostrar la

paacutegina del Tomcat

6 Ejecutar la paacutegina JSP iniciando el explorador y escribiendo el URL siguiente

httplocalhost8080JSP2saludoSaludojsp donde la sintaxis geneacuterica es

httpservidor[puerto]MiCarpetapaginajsp

Cuando esta paacutegina (Saludojsp) es invocada por primera vez el motor JSP lleva a cabo una

fase de traduccioacuten de la misma en un servlet y el motor Servlet es el que ejecutaraacute eacuteste uacuteltimo

para generar el HTML dinaacutemico que seraacute enviado al explorador cliente seguacuten puede

deducirse de la figura siguiente La proacutexima vez que la paacutegina sea solicitada el motor JSP

ejecutaraacute el servlet que fue caragado la primera vez a no ser que la paacutegina haya cambiado

en cuyo caso seraacute compilada automaacuteticamente en un nuevo servlet y ejecutada

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Regresando al ejemplo el archivo java generado por el Tomcat a partir del archivo

Saludojsp se localiza en la carpeta workCatalinalocalhost de la instalacioacuten de Tomcat

321 ELEMENTOS PARA SECUENCIAS DE COMANDOS

Los elementos para secuencias de comandos permiten insertar coacutedigo en el servlet que seraacute

generado a partir de la paacutegina JSP Existen tres formas

1 Expresiones del tipo lt= expresioacuten gt que se evaluacutean e insertan en el resultado del

servlet

2 Los scriptlets del tipo lt codigo gt que se insertan en el meacutetodo _jspService del

servlet (ejecutado por service)

3 Las declaraciones del tipo lt Codigo gt que se insertan en el cuerpo de la clase del

servlet fuera de cualquier meacutetodo existente

NOTA Los comentarios en JSP se escriben lt-- Comentario JSP --gt en tanto que los

comentarios en HTML son de la forma lt--Comentario HTML --gt La diferencia

semaacutentica radica en que los comentarios HTML cuando se insertan en la respuesta enviada

por el servidor al cliente no se muestran cuando se visualiza el documento HTML pero si

Servidor Maacutequina Cliente

Explorador Web

Contenedor Web

Motor Servlet

Motor JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

los podemos ver cuando se visualiza el coacutedigo fuente en tanto que los comentarios JSP

aunque se inserten en la respuesta enviada por el servidor al cliente no son enviados al

explorador de forma que tampoco se muestran ni se ven cuando se visualiza el coacutedigo fuente

HTML desde el explorador

3211 EXPRESIONES

Se utiliza una expresioacuten JSP para insertar valores directamente en el resultado La sintaxis es

lt= expresioacuten gt Por ejemplo

lt= requestgetParameter(ldquoparNombre) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt lt= s gt

La fecha y hora actual es lt= new javautilDate() gt

La expresioacuten se evaluacutea se convierte a cadena y se inserta en la paacutegina Esta evaluacioacuten se

realiza durante la ejecucioacuten

32111 VARIABLES PREDEFINIDAS

Para simplificar estas expresiones se pueden utilizar cierta cantidad de variables

predefinidas Estos objetos impliacutecitos como tambieacuten se les llama estaacuten disponibles para su

uso durante la implementacioacuten de una paacutegina Web

bull pageContext Es un objeto de la clase PageContext que proporciona acceso a objetos

relacionados con los servlets

bull request Es un objeto de la clase HttpServletRequest que se puede obtener a traveacutes del

meacutetodo getRequest que encapsula los datos enviados por el cliente al servidor

bull response Es un objeto de la clase HttpServletResponse que puede obtenerse a traveacutes

del meacutetodo getResponse que encapsula los datos que el servidor enviaraacute al cliente

bull application Es un objeto de la clase ServletContext que se obtiene a traveacutes del meacutetodo

getServletContext que define un conjunto de meacutetodos que todo servlet utiliza para

comunicar con el contenedor de servlets

bull config Es un objeto de la clase ServletConfig que se obtiene a traveacutes del meacutetodo

getServletConfig y que se utiliza por el contenedor de servlets para pasar informacioacuten

al servlet durante la iniciacioacuten

bull session Es un objeto de la clase HttpSession que se obtiene a traveacutes del meacutetodo

getSession que proporciona una forma de identificar a un usuario que visita las paacuteginas

de un sitio Web

bull out Es un objeto de la clase JspWriter que se obtiene a traveacutes del meacutetodo getOut que

se utiliza para almacenar la respuesta que seraacute enviada al cliente que hizo la peticioacuten de

la paacutegina

bull page Es un objeto geneacuterico de la clase Object que se obtiene a traveacutes del meacutetodo

getPage y que representa al servlet obtenido a partir de la paacutegina JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

bull exception Es un objeto de la clase Exception que se obtiene a traveacutes del meacutetodo

getException que contendraacute informacioacuten a cerca de cualquier excepcioacuten que se lance

desde la paacutegina JSP

Un ejemplo del uso de uno de estos objetos impliacutecitos seriacutea el siguiente

El nombre de tu host es lt= requestgetRemoteHost() gt

El listado siguiente da un ejemplo de una paacutegina JSP que utiliza algunas variables

predefinidas como uso de expresiones JSP

ltDOCTYPE HTML PUBLIC -W3CDTD HTML 40 Transitional ENgt

lthtmlgt

ltheadgt

lttitlegt Expresiones JSP lttitlegt

ltheadgt

ltbodygt

lth2gt Expresiones JSP lth2gt

ltULgt

ltligt Fecha y hora en curso lt= new javautilDate() gt ltligt

ltligt Nombre de su host lt= requestgetRemoteHost() gt ltligt

ltligt Identificador de su sesioacuten lt= sessiongetId() gt ltligt

ltligt El paraacutemetro ltcodegt paramPrueba ltcodegt del formulario

lt= requestgetParameter(paramPrueba) gt ltligt

ltULgt

ltbodygt

lthtmlgt

Cuya salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3212 LOS SCRIPTLETS JSP

Si se desea hacer algo maacutes complejo que una simple expresioacuten los scriptlets permiten insertar

coacutedigo JAVA en el meacutetodo _jspService del servlet (que es ejecutado por service) La sintaxis

utilizada por los scriptlets es lt coacutedigo java gt Los escriptlets tienen acceso a las

mismas variables definidas de forma automaacutetica como expresiones A manera de ejemplo si

se desea que el resultado aparezca en la paacutegina generada deberiacutea de utilizarse la variable out

como en la siguiente instruccioacuten

lt String datosConsultados= requestgetQueryString()

outprintln(ldquoDatos GET adjuntos ldquo+datosConsultados)

gt

En este ejemplo podriacutea haberse obtenido el mismo resultado utilizando la siguiente expresioacuten

JSP

Datos GET adjuntos lt=requestgetQueryString() gt

En general los scriptlets pueden ejecutar varias tareas que no podriacutean realizarse con las

expresiones Tales tareas incluyen

bull La determinacioacuten de encabezados de respuesta

bull Actualizacioacuten de Bases de Datos

bull Ejecucioacuten de bucles condiciones y otras estructuras complejas

lt for (int i=1 ilt=6 i++)

gt

lth lt=i gtgt Hola Mundo lthlt=i gtgt

lt gt

Como un ejemplo concreto se muestra la siguiente paacutegina JSP llamada Cuentajsp en donde

se observa coacutemo se hace un seguimiento del nuacutemero de veces que un cliente accede a esta

paacutegina a traveacutes de distintas sesiones Para ello supondremos que dicha cuenta es el valor del

atributo atrCuenta del objeto impliacutecito application ya citado La primera vez que el cliente

accede a la paacutegina el valor de atrCuenta seraacute null debido a que auacuten no ha sido fijado este

atributo en este caso se fijaraacute con el valor 1 En los siguientes accesos se leeraacute el valor del

atributo atrCuenta se incrementaraacute en una unidad y se volveraacute a fijar Finalmente se enviacutea

la respuesta al cliente para que se muestre al usuario el valor del contador

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en el objeto impliacutecito application con el nombre

atrCuenta

--gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt

Integer cuenta = (Integer)applicationgetAttribute(atrCuenta)

String s = vez

if (cuenta == null)

cuenta = new Integer(1)

else

cuenta = new Integer(cuentaintValue() + 1)

s = veces

applicationsetAttribute(atrCuenta cuenta)

gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

Has visitado esta paacutegina lt= cuenta gt lt= s gt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional un fragmento de coacutedigo JAVA o scriptlet

expresiones y comentarioshellip

Aquiacute otro ejemplo de la ejecucioacuten de un coacutedigo demasiado complejo para una expresioacuten JSP

Este listado presenta una paacutegina JSP que utiliza el paraacutemetro de peticioacuten colorFondo para

establecer el color de fondo de la paacutegina

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgt

lttitlegt Prueba de Color lttitlegt

ltheadgt

lt

String colorFondo=requestgetParameter(colorFondo)

boolean tieneColorExplicito

if (colorFondo =null)

tieneColorExplicito=true

else

tieneColorExplicito=false

colorFondo=WHITE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt

ltbody bgcolor=lt= colorFondo gtgt

lth2 align=centergt Prueba de color lth2gt

lt

if (tieneColorExplicito)

outprintln(Ha indicado un color de fondo expliacutecito +

colorFondo +)

else

outprintln(Usareacute el color de fondo predeterminado WHITE +

Indique el atributo de peticioacuten

ltigtcolorFondoltigt+

para intentar un color estaacutendar un +

valor RRGGBB o para ver si el navegador Web +

permite el uso de nombres de color X11)

gt

ltbodygt

lthtmlgt

Cuyas posibles salidas son

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3213 DECLARACIONES JSP

Una declaracioacuten JSP permite definir meacutetodos o campos que seraacuten insertados en el cuerpo

principal de la clase del servlet (fuera del meacutetodo _jspService) Una declaracioacuten tiene la

sintaxis lt Coacutedigo Java gt Por ejemplo

lt int i=0 gt

lt

Public void jspinit()

coacutedigo de iniciacioacuten

gt

Una declaracioacuten no genera ninguacuten resultado y se usan junto con las expresiones JSP o los

scriptlets A continuacioacuten se muestra una paacutegina JSP que despliega la cantidad de veces que

se ha solicitado esta paacutegina desde que se arrancoacute el servidor haciendo uso de las

declaraciones JSP

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtDeclaraciones JSPlttitlegtltheadgt

ltbodygt

lth1gtDeclaraciones JSPlth1gt

lt-- Esto es un comentario en JSP --gt

lt private int recuentoAccesos=0 gt

lth2gt Accesos a la paacutegina desde el reinicio del servidor

lt= ++recuentoAccesos gt lth2gt

ltbodygt

lthtmlgt

La salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

322 EL LENGUAJE DE EXPRESION EN JSP 20

Anteriormente se ha visto la necesidad de utilizar fragmentos de coacutedigo java en el desarrollo

de paacuteginas JSP pero con la aparicioacuten de la especificacioacuten JSP 20 ya no hay necesidad de

utilizar fragmentos de coacutedigo Java para nada gracias al nuevo lenguaje de expresioacuten EL

(Expresioacuten Language) a la biblioteca de etiquetas estandar JSTL (JSP Standar Tag Library)

y a las nuevas formas para desarrollar etiquetas personalizadas

El lenguaje de expresioacuten JSP es maacutes un lenguaje de acceso a datos que un lenguaje de

programacioacuten Ya se ha visto que para pasar informacioacuten de un cliente a una paacutegina JSP se

utilizan paraacutemetros en la peticioacuten y atributos en la paacutegina El lenguaje de expresioacuten lo hace

posible sin tener que utilizar scriptlets o expresiones (lt= expresioacuten gt) Por ejemplo las

liacuteneas JSP 12 siguientes escritas utilizando coacutedigo Java

lt= requestgetParameter(ldquoparNombrerdquo) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt veces

bajo la especificacioacuten JSP 20 se pueden escribir de una forma maacutes sencilla como sigue

(ahora no se trata de coacutedigo JAVA)

$paramparNombre has visitado esta paacutegina

$atrCuenta veces

La sintaxis de JSP es sensible a mayuacutesculas y minuacutesculas pero un par de comillas simples es

equivalente a un par de comillas dobles

3221 VARIABLES PREDEFINIDAS (Objetos Impliacutecitos)

El lenguaje de expresioacuten JSP 20 soporta los objetos impliacutecitos siguientes

pageContext Objeto de javaxservletjspPageContext que proporciona acceso a los

datos de una peticioacuten

param Coleccioacuten (objeto de tipo javautilMap) de todos los valores de los paraacutemetros

enviados en una peticioacuten un String por paraacutemetro

paramValues Coleccioacuten de todos los valores de los paraacutemetros enviados en una

peticioacuten una matriz de tipo String por paraacutemetro

header Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten un

String por cabecera

headerValues Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten

una matriz de tipo String por cabecera

cookie Coleccioacuten de todos los valores de las cookies un objeto javaxservlethttpCookie

por cookie

initParam Coleccioacuten de todos los valores de los paraacutemetros de iniciacioacuten de la

aplicacioacuten un String por paraacutemetro

Tambieacuten hay objetos que permiten acceder a variables definidas en diferentes aacutembitos lo que

posibilita compartir informacioacuten

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

pageScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de paacutegina

requestScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

peticioacuten

sessionScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de sesioacuten

applicationScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

aplicacioacuten

3222 DIRECTRICES

Las directrices page incluye y taglib son mensajes para el motor JSP y son siempre incluidas

entre los siacutembolos lt y gt

32221 LA DIRECTRIZ PAGE

Define atributos que se aplican a toda la paacutegina JSP donde es incluida

lt page lista_de_atributos gt

Donde la lista_de_atributos puede contener algunos de los siguientes (aquellos que estaacuten

escritos en negrita son los tomados por omisioacuten)

language= ldquoscriptingLanguagerdquo

extends= rdquoclassNamerdquo

import= ldquoimportListrdquo

session= ldquotrue|falserdquo

buffer= ldquonone|sizeKb

autoflush= ldquotrue|falserdquo

isThreadSafe= rdquotrue|falserdquo

info= rdquoinfo_textrdquo

errorPage= ldquoerror_urlrdquo

isErrorPage= rdquotrue|falserdquo

contentType= rdquoctinfordquo

pageEncoding= rdquopeinfordquo

isELIgnored= ldquotrue|falserdquo

Tiacutepicamente se localiza al principio de la paacutegina JSP y puede haber cualquier nuacutemero de

ellas El lenguaje por omisioacuten es Java Ejemplos

lt page contentType=rdquotexthtmlrdquo language=rdquojavardquo gt

lt page import=rdquojavautil javalangrdquo gt

lt page buffer=rdquo5kbrdquo autoflush=rdquofalserdquo gt

32222 LA DIRECTRIZ INCLUDE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

La directriz include incluye un archivo (html jsp xml o de texto) en una paacutegina JSP Esto

permite dividir el contenido de la paacutegina en trozos maacutes manejables

lt incluye file=rdquoURL_relativordquo gt

El ejemplo siguiente muestra dos archivos el primero incluye al segundo para mostrar la

fecha y hora actuales

lt-- fichero mostrarFechaHorajsp --gt

lthtmlgt

ltheadgtlttitlegtIncluir un ficherolttitlegtltheadgt

ltbody bgcolor=whitegt

ltfont color=bluegt

La fecha y hora actuales son

lt include file=fechaHorajsp gt

ltfontgt

ltbodygt

lthtmlgt

lt-- fichero fechaHorajsp --gt

lt page import=javautil gt

lt= (new javautilDate())toLocaleString() gt

32223 LA DIRECTRIZ TAGLIB

La directriz taglib indica la biblioteca de acciones personalizadas que podremos utilizar en

la codificacioacuten de la paacutegina JSP Para distinguir esas acciones entre otras existentes se utiliza

un prefijo (prefix) Su sintaxis es

lt taglib (uri=rdquoURI_bibliotecardquo|tagdir=rdquoDir_biblioteca_tagrdquo)

prefix=rdquoprefijordquo gt

Cuando se trata de una biblioteca definida mediante una clase Java y un descriptor (archivo

tld) eacutesta se identifica mediante un URI (Uniform Resource Identifier- URL relativos) Por

ejemplo

lt taglib uri=rdquohttpMarioRossainzLopezmiBibliotecardquo

prefix=rdquofunrdquo gt

ltpgtltfunaccion01 gt

La uacuteltima liacutenea del ejemplo tiene dos etiquetas una etiqueta p HTML y otra accion01

perteneciente a la biblioteca miBiblioteca En cambio si la biblioteca se define mediante un

archivo tag entonces se identifica mediante su ruta relativa en el sistema de archivos

lt taglib tagdir=rdquoWEB-INFtagsrdquo prefix=rdquofunrdquo gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpgtltfunaccion01 gt

La directriz taglib debe colocarse antes de utilizar en la paacutegina JSP las acciones

personalizadas definidas por la misma Se puede utilizar maacutes de una directriz pero el prefijo

utilizado debe ser uacutenico para cada una de ellas

3223 ACTIVACION DEL LENGUAJE DE EXPRESION (LE)

La especificacioacuten JSP 20 define un lenguaje de expresioacuten como alternativa a elementos de

programacioacuten escritos con coacutedigo Java y especificaciones anteriores a la JSP 20 Para que

este lenguaje pueda ser interpretado tienen que cumplirse 2 requisitos

1 Que la propiedad isELIgnored de la directriz page valga false

lt page isELIgnored= ldquofalserdquo gt

2 Que el descriptor de despliegue webxml en la carpeta WEB-INF indique doacutende se

localiza el esquema XML para la especificacioacuten Servlet 24 que a su vez utiliza el

esquema XML para la especificacioacuten Java Server Page 20

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

Utilizando el lenguaje de expresioacuten se podriacutea modificar la paacutegina Cuentajsp de la seccioacuten

3212 de este documento como se muestra a continuacioacuten Esta nueva paacutegina

1 Especifica que utilizaraacute la biblioteca core de etiquetas estandar (de la que se hablaraacute maacutes

adelante)

2 La primera vez que sea accedida definiraacute la variable atrCuenta en el aacutembito de la

aplicacioacuten con un valor inicial nulo y la incrementaraacute en una unidad cuando sea accedida

sucesivas veces simplemente incrementaraacute esta variable en una unidad

3 Finalmente mostraraacute una paacutegina con un contenido anaacutelogo al siguiente Esta formado

por una cabecera y una segunda liacutenea compuesta por el valor del paraacutemetro parNombre

enviado con la peticioacuten un texto fijo el valor de la variable atrCuenta y otro texto fijo

dependiente del valor de esta variable

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

El coacutedigo completo es el siguiente

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

3224 VARIABLES Y EXPRESIONES

Para acceder a una simple variable se puede escribir algo como lo siguiente $nombre y

para acceder a una propiedad de un objeto podemos escribir algo como

$paramparNombre

$applicationScopeatrCuenta

$pageContextrequestrequestURI

La primera liacutenea del ejemplo anterior obtiene el valor de la propiedad parNombre del objeto

param la segunda el valor del atributo atrCuenta del objeto applicationScope y la tercera

el URL relativo de la paacutegina JSP solicitada

El lenguaje de expresioacuten es maacutes tolerante con respecto a las variables con valor null y ejecuta

muchas maacutes conversiones de forma automaacutetica sobre el tipo de los datos cuando la expresioacuten

a evaluar asiacute lo requiere Por ejemplo la etiqueta condicional siguiente incluye una expresioacuten

que compara el valor del atributo atrCuenta con aacutembito de aplicacioacuten con 10 (convirtiendo

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

impliacutecitamente el valor del atributo al tipo de la constante para poder realizar la comparacioacuten

El resultado seraacute un valor de tipo boolean

ltcif test=rdquo$applicationScopeatrCuenta gt 10rdquogt

ltcifgt

o bien

ltcif test=rdquo$atrCuenta gt 10rdquogt

ltcifgt

Para que una literal pueda incluir un caracter significativo para el lenguaje dicho caracter

debe ser especificado como una secuencia de escape (caracter) Por ejemplo la siguiente

expresioacuten da lugar al literal ldquovezrdquo o ldquovecesrdquo entre comillas dobles

$(atrCuenta gt 1) iquest ldquordquovecesrdquordquo ldquordquovezrdquordquo

Cualquier objeto o atributo de un objeto definido en algunos de los aacutembitos de una paacutegina

puede ser utilizado como una variable Por ejemplo $atrCuenta+1 es una expresioacuten que

realiza la suma de la variable atrCuenta con 1

Cuando se trate de una propiedad de un objeto para acceder a ella se utilizaraacute el operador

punto o bien la notacioacuten empleada para acceder a un elemento de una matriz Por ejemplo

$paramparNombre

$param[ldquoparNombrerdquo]

Una expresioacuten LE puede aparecer en cualquier lugar donde pueda aparecer un texto fijo Por

tanto para informar al contenedor JSP que se trata de una expresioacuten y no de un texto fijo se

utilizan los delimitadores $ al principio y al final

3225 OPERADORES

OPERADOR DESCRIPCIOacuteN Acceso a la propiedad de un objeto o a un elemento de un Map

[] Acceso al elemento de una matriz o de un objeto List

() Pareacutentesis para alterar la prioridad en la evaluacioacuten de una expresioacuten

If ternario condicion expresion1 expresioacuten 2

+ Suma

- Resta

Producto

oacute div Divisioacuten

oacute mod Moacutedulo o resto de una divisioacuten

== oacute eq Igualdad

= oacute ne Diferente

lt oacute lt Menor que

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt oacute gt Mayor que

lt= oacute le Menor o igual que

gt= oacute ge Mayor o igual que

ampamp oacute and Operacioacuten Loacutegica AND

|| oacute or Operacioacuten Loacutegica OR

oacute not Operacioacuten Loacutegica NOT

empty Verifica si el valor de una variable es null si un String esta vaciacuteo o si una matriz Map

o Collection no tienen elementos

func(args) Llamada a una funcioacuten donde func es el nombre de la funcioacuten y arg representa cero o

maacutes argumentos separados por comas

El ejemplo siguiente muestra una paacutegina JSP compuesta por elementos HTML expresiones

LE y objetos impliacutecitos

lthtmlgt

ltheadgtlttitlegtJSP 20lttitlegtltheadgt

ltbodygt

lth3gtLenguaje de expresioacuten (LE)lth3gt

ltpgtLa siguiente tabla ilustra algunas expresiones LE

ltbrgtltbrgtlttable border=1gt

lttrgt

ltthgtltbgtExpresioacutenltbgtltthgt

ltthgtltbgtValorltbgtltthgt

lttrgt

lttrgt

lttdgt$3 + 6lttdgt

lttdgt$3 + 6lttdgt

lttdgt

lttrgt

lttdgt$(7 gt 4) 7 4lttdgt

lttdgt$(7 gt 4) 7 4lttdgt

lttrgt

lttrgt

lttdgt$header[host]lttdgt

lttdgt$header[host]lttdgt

lttrgt

lttablegt

ltbodygt

lthtmlgt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

323 BIBLIOTECA ESTANDAR DE ETIQUETAS

La biblioteca estaacutendar de etiquetas JSP (JSTL ndash Java Server Page Estaacutendar Tag Library)

incluye una cantidad amplia de etiquetas para diferentes aacutereas de trabajo

Aacuterea baacutesica (su prefijo es c ndash core) y contiene

o Soporte de variables (remove y set)

o Control del flujo (choose when otherwise forEach forTokens if)

o Manejo de URL (import param redirect param y url param)

o Operaciones varias (match y out)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlcore

Aacuterea XML (su prefijo es x) y contiene

o Sentencias baacutesicas (out parse y set)

o Control del flujo (choosehellip whenhellip otherwise forEach e if)

o Transformacioacuten de Documentos (transformhellipparam)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlxml

Aacuterea Internacionalizacioacuten (su prefijo es fmt) Contiene

o Localidad (setLocale y requestEncoding)

o Mensajes (bundle message param y setBundle)

o Formateo de Fechas y nuacutemeros (formatNumber formateacuteate parseDate

parseNumber setTimeZone timeZone)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlfmt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Aacuterea SQL (su prefijo es sql) es el lenguaje estandar para interactuar con bases de datos

relacionales y contiene setDataSource Quero dateParam param transaction y

update dateParam param) El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlsql

Aacuterea Funciones (su prefijo es fn) y contiene

o Longitud de una coleccioacuten (length)

o Manipulacioacuten de String (toUpperCase toLowerCase substring

substringAfter substringBefore trim replace indexOf startsWith

endsWith contains containsIgnoreCase split join y escapeXml)

o El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlfunctions

3231 OPERACIONES CON ETIQUETAS BAacuteSICAS

En un ejemplo pasado teniacuteamos el siguiente coacutedigo

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

En este ejemplo se hace referencia al aacuterea baacutesica de JSTL con el prefijo c y se utiliza la

etiqueta cset para definir la variable atrCuenta Si la variable ya esta definida simplemente

se le asigna el valor especificado

La uacuteltima parte del ejemplo anterior podriacutea haberse escrito de esta otra forma

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcif test=rdquo$atrCuenta gt 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcifgt

$atrCuenta $str

La etiqueta cif permite la ejecucioacuten condicional de su cuerpo en funcioacuten del valor del

atributo de test

La etiqueta cchoose permite la ejecucioacuten del cuerpo de la primera etiqueta cwhen cuyo

atributo test sea evaluado a true Si ninguna de las condiciones se evaluacutea a true entonces se

evaluacutea el cuerpo de la etiqueta cotherwise si estaacute presente El siguiente coacutedigo muestra otra

manera de escribir el ejemplo anterior utilizando estas uacuteltimas etiquetas

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcchoosegt

ltcwhen test=rdquo$atrCuenta == 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcwhengt

ltcotherwisegt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcotherwisegt

ltcchoosegt

$atrCuenta $str

La etiqueta cforEach permite iterar sobre una coleccioacuten de objetos La coleccioacuten se

especifica por medio del atributo iacutetems y el elemento actual de la coleccioacuten estaacute disponible a

traveacutes de la variable establecida por el atributo var Por ejemplo el siguiente fragmento de

coacutedigo visualiza una tabla con las variables definidas a nivel de aacutembito de paacutegina

lttable border=rdquo1rdquogt

ltcforEach var=rdquoitemrdquo iacutetems=rdquo$pageScoperdquogt

lttrgt

lttdgt $item lttdgt

lttrgt

ltcforEachgt

lttablegt

La etiqueta ccatch atrapa una excepcioacuten que ocurra en el cuerpo de la misma Por ejemplo

el siguiente segmento de coacutedigo lanzaraacute una excepcioacuten si el paraacutemetro mes se escribe con

letras en vez de con nuacutemeros

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltbodygt

lthtmlgt

Un URL anaacutelogo al siguiente daraacute lugar a que la excepcioacuten sea lanzada cuando se ejecute la

expresioacuten $nMes 3 de la paacutegina anterior

httplocalhost8080JSP2exceppruebajspmes=marzo

La excepcioacuten indica que ha ocurrido un error al tratar de convertir ldquomarzordquo a un entero de

tipo Long Para cachar esta excepcioacuten y darle un tratamiento adecuado habraacute que modificar

la paacutegina JSP anterior como se indica a continuacioacuten

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltccatch var=rdquoerrorOcurridordquogt

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltccatchgt

ltcif test=rdquo$not empty errorOcurridordquogt

Error el paraacutemetro mes debe ser un nuacutemero ltbgt

ltbrgt Informacioacuten del error dada por el sistema

ltbrgt ltfont color=rdquoFF0000rdquogt $errorOcurrido ltfontgt

ltcifgt

ltbodygt

lthtmlgt

3232 ACCESO A BASES DE DATOS CON JSP

Las etiquetas que proporciona el aacuterea SQL permiten realizar

Conexioacuten con una base de datos

Realizacioacuten de consultas a la base de datos

Acceso al conjunto de resultados

Ejecucioacuten de actualizaciones y transacciones

Todas las etiquetas SQL actuacutean sobre una base de datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

32321 CONEXIOacuteN CON LA BASE DE DATOS

La conexioacuten con la base de datos puede realizarse con la etiqueta sqlsetDataSource Por

ejemplo si se esta utilizando el administrador de bases de datos MySql con el controlador

JDBC se puede realizar una conexioacuten con una base de datos digamos bd_tutorias de la

manera siguiente

ltsqlsetDataSource var=rdquobdrdquo

driver=rdquocommysqljdbcDriverrdquo

url=rdquojdbcmysqllocalhost3306bd_tutoriasrdquo

user=rdquoadminrdquo

password=rdquoadminadminrdquo gt

32322 CONSULTA A LA BASE DE DATOS

La etiqueta sqlQuero permite realizar una consulta a una base de datos Por ejemplo el

siguiente fragmento de coacutedigo realiza una consulta a la base de datos representada por bd y

obtiene un conjunto de resultados representado por cdr

ltsqlquery var=rdquocdrrdquo dataSource=rdquo$bdrdquogt

SELECT professor dia hora alumno

FROM profesores tutorias citas

WHERE profesoresid_profesor=tutoriasid_profesor

AND tutoriasid_tutoria=citasid_tutoria

ltsqlquerygt

32323 MODIFICACIONES SOBRE LA BASE DE DATOS

La etiqueta sqlupdate permite ejecutar una sentencia SQL INSERT UPDATE o DELETE

y cualquier otra sentencia SQL que no retorne ninguacuten valor Por ejemplo

ltsqlupdate var=rdquocontrdquo dataSource=rdquo$bdrdquo gt

UPDATE profesores

SET profesor=

WHERE profesor=

ltsqlparam value=rdquo$paramProfesorrdquo gt

ltsqlparam value=rdquo$paramIDrdquo gt

ltsqlupdategt

Una operacioacuten UPDATE puede utilizar el siacutembolo para indicar que el valor que tendriacutea que

evaluarse en esa posicioacuten seraacute suministrado por una etiqueta sqlparam como por ejemplo

httplocalhost8080JSP2sqlpruebajspProfesor=Mario+Rossainz+LopezampID=514

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Por ejemplo supongamos que se ha escrito el siguiente coacutedigo en el archivo Saludojsp

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtEjemplo JSPlttitlegtltheadgt

ltbody bgcolor=ffffccgt

ltcentergt

lth2gtHola mundolth2gt

ltjavautilDate hoy = new javautilDate()gt

La fecha de hoy es lt=hoygt

ltcentergt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional y un fragmento de un scriptlet de JAVA La etiqueta

lt identifica el comienzo del scriptlet y gt el final Una expresioacuten de la forma =variable

es sustituida por el valor de esa variable Para ejecutar esta paacutegina o cualquier otra paacutegina

JSP desde un navegador hay que instalarla en el servidor de aplicaciones de la misma manera

en como se hizo con los servlets Suponiendo entonces que se tiene instalado el Tomcat 5

siga los siguientes pasos

1 Antildeadir en el servidor la carpeta digamos JSP2 dentro de la carpeta webapps del Tomcat

y construir sobre ella la jerarquiacutea de clases ya conocida de los servlets

webappsrarrJSP2rarrWEB-INFrarrclasses

WEB-INFrarrlib

WEB-INFrarrtags

2 Editar en la carpeta WEB-INF el descriptor de despliegue webxml que se indica a

continuacioacuten Este archivo XML indica doacutende se localiza el esquema XML para la

especificacioacuten Servlet 24 que a suvez utiliza el esquema XML para la especificacioacuten

Java Server Page 20 que son las especificaciones que soporta en servidor Tomcat

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=

httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

3 Crear en JSP2 la carpeta saludo que contendraacute la aplicacioacuten y copiar en ella la paacutegina

Saludojsp

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

4 Arrancar el servidor Si el servidor ya estaba arrancado detenerlo y volverlo a arrancar o

bien abrir el explorador escribir el URL httplocalhost8080managerhtml e instalar

la aplicacioacuten

5 Una vez arrancado el servidor verificar si estaacute funcionando correctamente escribiendo

el URL siguiente en el explorador httplocalhost8080 El explorador debe mostrar la

paacutegina del Tomcat

6 Ejecutar la paacutegina JSP iniciando el explorador y escribiendo el URL siguiente

httplocalhost8080JSP2saludoSaludojsp donde la sintaxis geneacuterica es

httpservidor[puerto]MiCarpetapaginajsp

Cuando esta paacutegina (Saludojsp) es invocada por primera vez el motor JSP lleva a cabo una

fase de traduccioacuten de la misma en un servlet y el motor Servlet es el que ejecutaraacute eacuteste uacuteltimo

para generar el HTML dinaacutemico que seraacute enviado al explorador cliente seguacuten puede

deducirse de la figura siguiente La proacutexima vez que la paacutegina sea solicitada el motor JSP

ejecutaraacute el servlet que fue caragado la primera vez a no ser que la paacutegina haya cambiado

en cuyo caso seraacute compilada automaacuteticamente en un nuevo servlet y ejecutada

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Regresando al ejemplo el archivo java generado por el Tomcat a partir del archivo

Saludojsp se localiza en la carpeta workCatalinalocalhost de la instalacioacuten de Tomcat

321 ELEMENTOS PARA SECUENCIAS DE COMANDOS

Los elementos para secuencias de comandos permiten insertar coacutedigo en el servlet que seraacute

generado a partir de la paacutegina JSP Existen tres formas

1 Expresiones del tipo lt= expresioacuten gt que se evaluacutean e insertan en el resultado del

servlet

2 Los scriptlets del tipo lt codigo gt que se insertan en el meacutetodo _jspService del

servlet (ejecutado por service)

3 Las declaraciones del tipo lt Codigo gt que se insertan en el cuerpo de la clase del

servlet fuera de cualquier meacutetodo existente

NOTA Los comentarios en JSP se escriben lt-- Comentario JSP --gt en tanto que los

comentarios en HTML son de la forma lt--Comentario HTML --gt La diferencia

semaacutentica radica en que los comentarios HTML cuando se insertan en la respuesta enviada

por el servidor al cliente no se muestran cuando se visualiza el documento HTML pero si

Servidor Maacutequina Cliente

Explorador Web

Contenedor Web

Motor Servlet

Motor JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

los podemos ver cuando se visualiza el coacutedigo fuente en tanto que los comentarios JSP

aunque se inserten en la respuesta enviada por el servidor al cliente no son enviados al

explorador de forma que tampoco se muestran ni se ven cuando se visualiza el coacutedigo fuente

HTML desde el explorador

3211 EXPRESIONES

Se utiliza una expresioacuten JSP para insertar valores directamente en el resultado La sintaxis es

lt= expresioacuten gt Por ejemplo

lt= requestgetParameter(ldquoparNombre) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt lt= s gt

La fecha y hora actual es lt= new javautilDate() gt

La expresioacuten se evaluacutea se convierte a cadena y se inserta en la paacutegina Esta evaluacioacuten se

realiza durante la ejecucioacuten

32111 VARIABLES PREDEFINIDAS

Para simplificar estas expresiones se pueden utilizar cierta cantidad de variables

predefinidas Estos objetos impliacutecitos como tambieacuten se les llama estaacuten disponibles para su

uso durante la implementacioacuten de una paacutegina Web

bull pageContext Es un objeto de la clase PageContext que proporciona acceso a objetos

relacionados con los servlets

bull request Es un objeto de la clase HttpServletRequest que se puede obtener a traveacutes del

meacutetodo getRequest que encapsula los datos enviados por el cliente al servidor

bull response Es un objeto de la clase HttpServletResponse que puede obtenerse a traveacutes

del meacutetodo getResponse que encapsula los datos que el servidor enviaraacute al cliente

bull application Es un objeto de la clase ServletContext que se obtiene a traveacutes del meacutetodo

getServletContext que define un conjunto de meacutetodos que todo servlet utiliza para

comunicar con el contenedor de servlets

bull config Es un objeto de la clase ServletConfig que se obtiene a traveacutes del meacutetodo

getServletConfig y que se utiliza por el contenedor de servlets para pasar informacioacuten

al servlet durante la iniciacioacuten

bull session Es un objeto de la clase HttpSession que se obtiene a traveacutes del meacutetodo

getSession que proporciona una forma de identificar a un usuario que visita las paacuteginas

de un sitio Web

bull out Es un objeto de la clase JspWriter que se obtiene a traveacutes del meacutetodo getOut que

se utiliza para almacenar la respuesta que seraacute enviada al cliente que hizo la peticioacuten de

la paacutegina

bull page Es un objeto geneacuterico de la clase Object que se obtiene a traveacutes del meacutetodo

getPage y que representa al servlet obtenido a partir de la paacutegina JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

bull exception Es un objeto de la clase Exception que se obtiene a traveacutes del meacutetodo

getException que contendraacute informacioacuten a cerca de cualquier excepcioacuten que se lance

desde la paacutegina JSP

Un ejemplo del uso de uno de estos objetos impliacutecitos seriacutea el siguiente

El nombre de tu host es lt= requestgetRemoteHost() gt

El listado siguiente da un ejemplo de una paacutegina JSP que utiliza algunas variables

predefinidas como uso de expresiones JSP

ltDOCTYPE HTML PUBLIC -W3CDTD HTML 40 Transitional ENgt

lthtmlgt

ltheadgt

lttitlegt Expresiones JSP lttitlegt

ltheadgt

ltbodygt

lth2gt Expresiones JSP lth2gt

ltULgt

ltligt Fecha y hora en curso lt= new javautilDate() gt ltligt

ltligt Nombre de su host lt= requestgetRemoteHost() gt ltligt

ltligt Identificador de su sesioacuten lt= sessiongetId() gt ltligt

ltligt El paraacutemetro ltcodegt paramPrueba ltcodegt del formulario

lt= requestgetParameter(paramPrueba) gt ltligt

ltULgt

ltbodygt

lthtmlgt

Cuya salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3212 LOS SCRIPTLETS JSP

Si se desea hacer algo maacutes complejo que una simple expresioacuten los scriptlets permiten insertar

coacutedigo JAVA en el meacutetodo _jspService del servlet (que es ejecutado por service) La sintaxis

utilizada por los scriptlets es lt coacutedigo java gt Los escriptlets tienen acceso a las

mismas variables definidas de forma automaacutetica como expresiones A manera de ejemplo si

se desea que el resultado aparezca en la paacutegina generada deberiacutea de utilizarse la variable out

como en la siguiente instruccioacuten

lt String datosConsultados= requestgetQueryString()

outprintln(ldquoDatos GET adjuntos ldquo+datosConsultados)

gt

En este ejemplo podriacutea haberse obtenido el mismo resultado utilizando la siguiente expresioacuten

JSP

Datos GET adjuntos lt=requestgetQueryString() gt

En general los scriptlets pueden ejecutar varias tareas que no podriacutean realizarse con las

expresiones Tales tareas incluyen

bull La determinacioacuten de encabezados de respuesta

bull Actualizacioacuten de Bases de Datos

bull Ejecucioacuten de bucles condiciones y otras estructuras complejas

lt for (int i=1 ilt=6 i++)

gt

lth lt=i gtgt Hola Mundo lthlt=i gtgt

lt gt

Como un ejemplo concreto se muestra la siguiente paacutegina JSP llamada Cuentajsp en donde

se observa coacutemo se hace un seguimiento del nuacutemero de veces que un cliente accede a esta

paacutegina a traveacutes de distintas sesiones Para ello supondremos que dicha cuenta es el valor del

atributo atrCuenta del objeto impliacutecito application ya citado La primera vez que el cliente

accede a la paacutegina el valor de atrCuenta seraacute null debido a que auacuten no ha sido fijado este

atributo en este caso se fijaraacute con el valor 1 En los siguientes accesos se leeraacute el valor del

atributo atrCuenta se incrementaraacute en una unidad y se volveraacute a fijar Finalmente se enviacutea

la respuesta al cliente para que se muestre al usuario el valor del contador

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en el objeto impliacutecito application con el nombre

atrCuenta

--gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt

Integer cuenta = (Integer)applicationgetAttribute(atrCuenta)

String s = vez

if (cuenta == null)

cuenta = new Integer(1)

else

cuenta = new Integer(cuentaintValue() + 1)

s = veces

applicationsetAttribute(atrCuenta cuenta)

gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

Has visitado esta paacutegina lt= cuenta gt lt= s gt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional un fragmento de coacutedigo JAVA o scriptlet

expresiones y comentarioshellip

Aquiacute otro ejemplo de la ejecucioacuten de un coacutedigo demasiado complejo para una expresioacuten JSP

Este listado presenta una paacutegina JSP que utiliza el paraacutemetro de peticioacuten colorFondo para

establecer el color de fondo de la paacutegina

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgt

lttitlegt Prueba de Color lttitlegt

ltheadgt

lt

String colorFondo=requestgetParameter(colorFondo)

boolean tieneColorExplicito

if (colorFondo =null)

tieneColorExplicito=true

else

tieneColorExplicito=false

colorFondo=WHITE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt

ltbody bgcolor=lt= colorFondo gtgt

lth2 align=centergt Prueba de color lth2gt

lt

if (tieneColorExplicito)

outprintln(Ha indicado un color de fondo expliacutecito +

colorFondo +)

else

outprintln(Usareacute el color de fondo predeterminado WHITE +

Indique el atributo de peticioacuten

ltigtcolorFondoltigt+

para intentar un color estaacutendar un +

valor RRGGBB o para ver si el navegador Web +

permite el uso de nombres de color X11)

gt

ltbodygt

lthtmlgt

Cuyas posibles salidas son

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3213 DECLARACIONES JSP

Una declaracioacuten JSP permite definir meacutetodos o campos que seraacuten insertados en el cuerpo

principal de la clase del servlet (fuera del meacutetodo _jspService) Una declaracioacuten tiene la

sintaxis lt Coacutedigo Java gt Por ejemplo

lt int i=0 gt

lt

Public void jspinit()

coacutedigo de iniciacioacuten

gt

Una declaracioacuten no genera ninguacuten resultado y se usan junto con las expresiones JSP o los

scriptlets A continuacioacuten se muestra una paacutegina JSP que despliega la cantidad de veces que

se ha solicitado esta paacutegina desde que se arrancoacute el servidor haciendo uso de las

declaraciones JSP

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtDeclaraciones JSPlttitlegtltheadgt

ltbodygt

lth1gtDeclaraciones JSPlth1gt

lt-- Esto es un comentario en JSP --gt

lt private int recuentoAccesos=0 gt

lth2gt Accesos a la paacutegina desde el reinicio del servidor

lt= ++recuentoAccesos gt lth2gt

ltbodygt

lthtmlgt

La salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

322 EL LENGUAJE DE EXPRESION EN JSP 20

Anteriormente se ha visto la necesidad de utilizar fragmentos de coacutedigo java en el desarrollo

de paacuteginas JSP pero con la aparicioacuten de la especificacioacuten JSP 20 ya no hay necesidad de

utilizar fragmentos de coacutedigo Java para nada gracias al nuevo lenguaje de expresioacuten EL

(Expresioacuten Language) a la biblioteca de etiquetas estandar JSTL (JSP Standar Tag Library)

y a las nuevas formas para desarrollar etiquetas personalizadas

El lenguaje de expresioacuten JSP es maacutes un lenguaje de acceso a datos que un lenguaje de

programacioacuten Ya se ha visto que para pasar informacioacuten de un cliente a una paacutegina JSP se

utilizan paraacutemetros en la peticioacuten y atributos en la paacutegina El lenguaje de expresioacuten lo hace

posible sin tener que utilizar scriptlets o expresiones (lt= expresioacuten gt) Por ejemplo las

liacuteneas JSP 12 siguientes escritas utilizando coacutedigo Java

lt= requestgetParameter(ldquoparNombrerdquo) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt veces

bajo la especificacioacuten JSP 20 se pueden escribir de una forma maacutes sencilla como sigue

(ahora no se trata de coacutedigo JAVA)

$paramparNombre has visitado esta paacutegina

$atrCuenta veces

La sintaxis de JSP es sensible a mayuacutesculas y minuacutesculas pero un par de comillas simples es

equivalente a un par de comillas dobles

3221 VARIABLES PREDEFINIDAS (Objetos Impliacutecitos)

El lenguaje de expresioacuten JSP 20 soporta los objetos impliacutecitos siguientes

pageContext Objeto de javaxservletjspPageContext que proporciona acceso a los

datos de una peticioacuten

param Coleccioacuten (objeto de tipo javautilMap) de todos los valores de los paraacutemetros

enviados en una peticioacuten un String por paraacutemetro

paramValues Coleccioacuten de todos los valores de los paraacutemetros enviados en una

peticioacuten una matriz de tipo String por paraacutemetro

header Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten un

String por cabecera

headerValues Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten

una matriz de tipo String por cabecera

cookie Coleccioacuten de todos los valores de las cookies un objeto javaxservlethttpCookie

por cookie

initParam Coleccioacuten de todos los valores de los paraacutemetros de iniciacioacuten de la

aplicacioacuten un String por paraacutemetro

Tambieacuten hay objetos que permiten acceder a variables definidas en diferentes aacutembitos lo que

posibilita compartir informacioacuten

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

pageScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de paacutegina

requestScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

peticioacuten

sessionScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de sesioacuten

applicationScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

aplicacioacuten

3222 DIRECTRICES

Las directrices page incluye y taglib son mensajes para el motor JSP y son siempre incluidas

entre los siacutembolos lt y gt

32221 LA DIRECTRIZ PAGE

Define atributos que se aplican a toda la paacutegina JSP donde es incluida

lt page lista_de_atributos gt

Donde la lista_de_atributos puede contener algunos de los siguientes (aquellos que estaacuten

escritos en negrita son los tomados por omisioacuten)

language= ldquoscriptingLanguagerdquo

extends= rdquoclassNamerdquo

import= ldquoimportListrdquo

session= ldquotrue|falserdquo

buffer= ldquonone|sizeKb

autoflush= ldquotrue|falserdquo

isThreadSafe= rdquotrue|falserdquo

info= rdquoinfo_textrdquo

errorPage= ldquoerror_urlrdquo

isErrorPage= rdquotrue|falserdquo

contentType= rdquoctinfordquo

pageEncoding= rdquopeinfordquo

isELIgnored= ldquotrue|falserdquo

Tiacutepicamente se localiza al principio de la paacutegina JSP y puede haber cualquier nuacutemero de

ellas El lenguaje por omisioacuten es Java Ejemplos

lt page contentType=rdquotexthtmlrdquo language=rdquojavardquo gt

lt page import=rdquojavautil javalangrdquo gt

lt page buffer=rdquo5kbrdquo autoflush=rdquofalserdquo gt

32222 LA DIRECTRIZ INCLUDE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

La directriz include incluye un archivo (html jsp xml o de texto) en una paacutegina JSP Esto

permite dividir el contenido de la paacutegina en trozos maacutes manejables

lt incluye file=rdquoURL_relativordquo gt

El ejemplo siguiente muestra dos archivos el primero incluye al segundo para mostrar la

fecha y hora actuales

lt-- fichero mostrarFechaHorajsp --gt

lthtmlgt

ltheadgtlttitlegtIncluir un ficherolttitlegtltheadgt

ltbody bgcolor=whitegt

ltfont color=bluegt

La fecha y hora actuales son

lt include file=fechaHorajsp gt

ltfontgt

ltbodygt

lthtmlgt

lt-- fichero fechaHorajsp --gt

lt page import=javautil gt

lt= (new javautilDate())toLocaleString() gt

32223 LA DIRECTRIZ TAGLIB

La directriz taglib indica la biblioteca de acciones personalizadas que podremos utilizar en

la codificacioacuten de la paacutegina JSP Para distinguir esas acciones entre otras existentes se utiliza

un prefijo (prefix) Su sintaxis es

lt taglib (uri=rdquoURI_bibliotecardquo|tagdir=rdquoDir_biblioteca_tagrdquo)

prefix=rdquoprefijordquo gt

Cuando se trata de una biblioteca definida mediante una clase Java y un descriptor (archivo

tld) eacutesta se identifica mediante un URI (Uniform Resource Identifier- URL relativos) Por

ejemplo

lt taglib uri=rdquohttpMarioRossainzLopezmiBibliotecardquo

prefix=rdquofunrdquo gt

ltpgtltfunaccion01 gt

La uacuteltima liacutenea del ejemplo tiene dos etiquetas una etiqueta p HTML y otra accion01

perteneciente a la biblioteca miBiblioteca En cambio si la biblioteca se define mediante un

archivo tag entonces se identifica mediante su ruta relativa en el sistema de archivos

lt taglib tagdir=rdquoWEB-INFtagsrdquo prefix=rdquofunrdquo gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpgtltfunaccion01 gt

La directriz taglib debe colocarse antes de utilizar en la paacutegina JSP las acciones

personalizadas definidas por la misma Se puede utilizar maacutes de una directriz pero el prefijo

utilizado debe ser uacutenico para cada una de ellas

3223 ACTIVACION DEL LENGUAJE DE EXPRESION (LE)

La especificacioacuten JSP 20 define un lenguaje de expresioacuten como alternativa a elementos de

programacioacuten escritos con coacutedigo Java y especificaciones anteriores a la JSP 20 Para que

este lenguaje pueda ser interpretado tienen que cumplirse 2 requisitos

1 Que la propiedad isELIgnored de la directriz page valga false

lt page isELIgnored= ldquofalserdquo gt

2 Que el descriptor de despliegue webxml en la carpeta WEB-INF indique doacutende se

localiza el esquema XML para la especificacioacuten Servlet 24 que a su vez utiliza el

esquema XML para la especificacioacuten Java Server Page 20

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

Utilizando el lenguaje de expresioacuten se podriacutea modificar la paacutegina Cuentajsp de la seccioacuten

3212 de este documento como se muestra a continuacioacuten Esta nueva paacutegina

1 Especifica que utilizaraacute la biblioteca core de etiquetas estandar (de la que se hablaraacute maacutes

adelante)

2 La primera vez que sea accedida definiraacute la variable atrCuenta en el aacutembito de la

aplicacioacuten con un valor inicial nulo y la incrementaraacute en una unidad cuando sea accedida

sucesivas veces simplemente incrementaraacute esta variable en una unidad

3 Finalmente mostraraacute una paacutegina con un contenido anaacutelogo al siguiente Esta formado

por una cabecera y una segunda liacutenea compuesta por el valor del paraacutemetro parNombre

enviado con la peticioacuten un texto fijo el valor de la variable atrCuenta y otro texto fijo

dependiente del valor de esta variable

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

El coacutedigo completo es el siguiente

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

3224 VARIABLES Y EXPRESIONES

Para acceder a una simple variable se puede escribir algo como lo siguiente $nombre y

para acceder a una propiedad de un objeto podemos escribir algo como

$paramparNombre

$applicationScopeatrCuenta

$pageContextrequestrequestURI

La primera liacutenea del ejemplo anterior obtiene el valor de la propiedad parNombre del objeto

param la segunda el valor del atributo atrCuenta del objeto applicationScope y la tercera

el URL relativo de la paacutegina JSP solicitada

El lenguaje de expresioacuten es maacutes tolerante con respecto a las variables con valor null y ejecuta

muchas maacutes conversiones de forma automaacutetica sobre el tipo de los datos cuando la expresioacuten

a evaluar asiacute lo requiere Por ejemplo la etiqueta condicional siguiente incluye una expresioacuten

que compara el valor del atributo atrCuenta con aacutembito de aplicacioacuten con 10 (convirtiendo

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

impliacutecitamente el valor del atributo al tipo de la constante para poder realizar la comparacioacuten

El resultado seraacute un valor de tipo boolean

ltcif test=rdquo$applicationScopeatrCuenta gt 10rdquogt

ltcifgt

o bien

ltcif test=rdquo$atrCuenta gt 10rdquogt

ltcifgt

Para que una literal pueda incluir un caracter significativo para el lenguaje dicho caracter

debe ser especificado como una secuencia de escape (caracter) Por ejemplo la siguiente

expresioacuten da lugar al literal ldquovezrdquo o ldquovecesrdquo entre comillas dobles

$(atrCuenta gt 1) iquest ldquordquovecesrdquordquo ldquordquovezrdquordquo

Cualquier objeto o atributo de un objeto definido en algunos de los aacutembitos de una paacutegina

puede ser utilizado como una variable Por ejemplo $atrCuenta+1 es una expresioacuten que

realiza la suma de la variable atrCuenta con 1

Cuando se trate de una propiedad de un objeto para acceder a ella se utilizaraacute el operador

punto o bien la notacioacuten empleada para acceder a un elemento de una matriz Por ejemplo

$paramparNombre

$param[ldquoparNombrerdquo]

Una expresioacuten LE puede aparecer en cualquier lugar donde pueda aparecer un texto fijo Por

tanto para informar al contenedor JSP que se trata de una expresioacuten y no de un texto fijo se

utilizan los delimitadores $ al principio y al final

3225 OPERADORES

OPERADOR DESCRIPCIOacuteN Acceso a la propiedad de un objeto o a un elemento de un Map

[] Acceso al elemento de una matriz o de un objeto List

() Pareacutentesis para alterar la prioridad en la evaluacioacuten de una expresioacuten

If ternario condicion expresion1 expresioacuten 2

+ Suma

- Resta

Producto

oacute div Divisioacuten

oacute mod Moacutedulo o resto de una divisioacuten

== oacute eq Igualdad

= oacute ne Diferente

lt oacute lt Menor que

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt oacute gt Mayor que

lt= oacute le Menor o igual que

gt= oacute ge Mayor o igual que

ampamp oacute and Operacioacuten Loacutegica AND

|| oacute or Operacioacuten Loacutegica OR

oacute not Operacioacuten Loacutegica NOT

empty Verifica si el valor de una variable es null si un String esta vaciacuteo o si una matriz Map

o Collection no tienen elementos

func(args) Llamada a una funcioacuten donde func es el nombre de la funcioacuten y arg representa cero o

maacutes argumentos separados por comas

El ejemplo siguiente muestra una paacutegina JSP compuesta por elementos HTML expresiones

LE y objetos impliacutecitos

lthtmlgt

ltheadgtlttitlegtJSP 20lttitlegtltheadgt

ltbodygt

lth3gtLenguaje de expresioacuten (LE)lth3gt

ltpgtLa siguiente tabla ilustra algunas expresiones LE

ltbrgtltbrgtlttable border=1gt

lttrgt

ltthgtltbgtExpresioacutenltbgtltthgt

ltthgtltbgtValorltbgtltthgt

lttrgt

lttrgt

lttdgt$3 + 6lttdgt

lttdgt$3 + 6lttdgt

lttdgt

lttrgt

lttdgt$(7 gt 4) 7 4lttdgt

lttdgt$(7 gt 4) 7 4lttdgt

lttrgt

lttrgt

lttdgt$header[host]lttdgt

lttdgt$header[host]lttdgt

lttrgt

lttablegt

ltbodygt

lthtmlgt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

323 BIBLIOTECA ESTANDAR DE ETIQUETAS

La biblioteca estaacutendar de etiquetas JSP (JSTL ndash Java Server Page Estaacutendar Tag Library)

incluye una cantidad amplia de etiquetas para diferentes aacutereas de trabajo

Aacuterea baacutesica (su prefijo es c ndash core) y contiene

o Soporte de variables (remove y set)

o Control del flujo (choose when otherwise forEach forTokens if)

o Manejo de URL (import param redirect param y url param)

o Operaciones varias (match y out)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlcore

Aacuterea XML (su prefijo es x) y contiene

o Sentencias baacutesicas (out parse y set)

o Control del flujo (choosehellip whenhellip otherwise forEach e if)

o Transformacioacuten de Documentos (transformhellipparam)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlxml

Aacuterea Internacionalizacioacuten (su prefijo es fmt) Contiene

o Localidad (setLocale y requestEncoding)

o Mensajes (bundle message param y setBundle)

o Formateo de Fechas y nuacutemeros (formatNumber formateacuteate parseDate

parseNumber setTimeZone timeZone)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlfmt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Aacuterea SQL (su prefijo es sql) es el lenguaje estandar para interactuar con bases de datos

relacionales y contiene setDataSource Quero dateParam param transaction y

update dateParam param) El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlsql

Aacuterea Funciones (su prefijo es fn) y contiene

o Longitud de una coleccioacuten (length)

o Manipulacioacuten de String (toUpperCase toLowerCase substring

substringAfter substringBefore trim replace indexOf startsWith

endsWith contains containsIgnoreCase split join y escapeXml)

o El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlfunctions

3231 OPERACIONES CON ETIQUETAS BAacuteSICAS

En un ejemplo pasado teniacuteamos el siguiente coacutedigo

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

En este ejemplo se hace referencia al aacuterea baacutesica de JSTL con el prefijo c y se utiliza la

etiqueta cset para definir la variable atrCuenta Si la variable ya esta definida simplemente

se le asigna el valor especificado

La uacuteltima parte del ejemplo anterior podriacutea haberse escrito de esta otra forma

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcif test=rdquo$atrCuenta gt 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcifgt

$atrCuenta $str

La etiqueta cif permite la ejecucioacuten condicional de su cuerpo en funcioacuten del valor del

atributo de test

La etiqueta cchoose permite la ejecucioacuten del cuerpo de la primera etiqueta cwhen cuyo

atributo test sea evaluado a true Si ninguna de las condiciones se evaluacutea a true entonces se

evaluacutea el cuerpo de la etiqueta cotherwise si estaacute presente El siguiente coacutedigo muestra otra

manera de escribir el ejemplo anterior utilizando estas uacuteltimas etiquetas

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcchoosegt

ltcwhen test=rdquo$atrCuenta == 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcwhengt

ltcotherwisegt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcotherwisegt

ltcchoosegt

$atrCuenta $str

La etiqueta cforEach permite iterar sobre una coleccioacuten de objetos La coleccioacuten se

especifica por medio del atributo iacutetems y el elemento actual de la coleccioacuten estaacute disponible a

traveacutes de la variable establecida por el atributo var Por ejemplo el siguiente fragmento de

coacutedigo visualiza una tabla con las variables definidas a nivel de aacutembito de paacutegina

lttable border=rdquo1rdquogt

ltcforEach var=rdquoitemrdquo iacutetems=rdquo$pageScoperdquogt

lttrgt

lttdgt $item lttdgt

lttrgt

ltcforEachgt

lttablegt

La etiqueta ccatch atrapa una excepcioacuten que ocurra en el cuerpo de la misma Por ejemplo

el siguiente segmento de coacutedigo lanzaraacute una excepcioacuten si el paraacutemetro mes se escribe con

letras en vez de con nuacutemeros

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltbodygt

lthtmlgt

Un URL anaacutelogo al siguiente daraacute lugar a que la excepcioacuten sea lanzada cuando se ejecute la

expresioacuten $nMes 3 de la paacutegina anterior

httplocalhost8080JSP2exceppruebajspmes=marzo

La excepcioacuten indica que ha ocurrido un error al tratar de convertir ldquomarzordquo a un entero de

tipo Long Para cachar esta excepcioacuten y darle un tratamiento adecuado habraacute que modificar

la paacutegina JSP anterior como se indica a continuacioacuten

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltccatch var=rdquoerrorOcurridordquogt

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltccatchgt

ltcif test=rdquo$not empty errorOcurridordquogt

Error el paraacutemetro mes debe ser un nuacutemero ltbgt

ltbrgt Informacioacuten del error dada por el sistema

ltbrgt ltfont color=rdquoFF0000rdquogt $errorOcurrido ltfontgt

ltcifgt

ltbodygt

lthtmlgt

3232 ACCESO A BASES DE DATOS CON JSP

Las etiquetas que proporciona el aacuterea SQL permiten realizar

Conexioacuten con una base de datos

Realizacioacuten de consultas a la base de datos

Acceso al conjunto de resultados

Ejecucioacuten de actualizaciones y transacciones

Todas las etiquetas SQL actuacutean sobre una base de datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

32321 CONEXIOacuteN CON LA BASE DE DATOS

La conexioacuten con la base de datos puede realizarse con la etiqueta sqlsetDataSource Por

ejemplo si se esta utilizando el administrador de bases de datos MySql con el controlador

JDBC se puede realizar una conexioacuten con una base de datos digamos bd_tutorias de la

manera siguiente

ltsqlsetDataSource var=rdquobdrdquo

driver=rdquocommysqljdbcDriverrdquo

url=rdquojdbcmysqllocalhost3306bd_tutoriasrdquo

user=rdquoadminrdquo

password=rdquoadminadminrdquo gt

32322 CONSULTA A LA BASE DE DATOS

La etiqueta sqlQuero permite realizar una consulta a una base de datos Por ejemplo el

siguiente fragmento de coacutedigo realiza una consulta a la base de datos representada por bd y

obtiene un conjunto de resultados representado por cdr

ltsqlquery var=rdquocdrrdquo dataSource=rdquo$bdrdquogt

SELECT professor dia hora alumno

FROM profesores tutorias citas

WHERE profesoresid_profesor=tutoriasid_profesor

AND tutoriasid_tutoria=citasid_tutoria

ltsqlquerygt

32323 MODIFICACIONES SOBRE LA BASE DE DATOS

La etiqueta sqlupdate permite ejecutar una sentencia SQL INSERT UPDATE o DELETE

y cualquier otra sentencia SQL que no retorne ninguacuten valor Por ejemplo

ltsqlupdate var=rdquocontrdquo dataSource=rdquo$bdrdquo gt

UPDATE profesores

SET profesor=

WHERE profesor=

ltsqlparam value=rdquo$paramProfesorrdquo gt

ltsqlparam value=rdquo$paramIDrdquo gt

ltsqlupdategt

Una operacioacuten UPDATE puede utilizar el siacutembolo para indicar que el valor que tendriacutea que

evaluarse en esa posicioacuten seraacute suministrado por una etiqueta sqlparam como por ejemplo

httplocalhost8080JSP2sqlpruebajspProfesor=Mario+Rossainz+LopezampID=514

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

4 Arrancar el servidor Si el servidor ya estaba arrancado detenerlo y volverlo a arrancar o

bien abrir el explorador escribir el URL httplocalhost8080managerhtml e instalar

la aplicacioacuten

5 Una vez arrancado el servidor verificar si estaacute funcionando correctamente escribiendo

el URL siguiente en el explorador httplocalhost8080 El explorador debe mostrar la

paacutegina del Tomcat

6 Ejecutar la paacutegina JSP iniciando el explorador y escribiendo el URL siguiente

httplocalhost8080JSP2saludoSaludojsp donde la sintaxis geneacuterica es

httpservidor[puerto]MiCarpetapaginajsp

Cuando esta paacutegina (Saludojsp) es invocada por primera vez el motor JSP lleva a cabo una

fase de traduccioacuten de la misma en un servlet y el motor Servlet es el que ejecutaraacute eacuteste uacuteltimo

para generar el HTML dinaacutemico que seraacute enviado al explorador cliente seguacuten puede

deducirse de la figura siguiente La proacutexima vez que la paacutegina sea solicitada el motor JSP

ejecutaraacute el servlet que fue caragado la primera vez a no ser que la paacutegina haya cambiado

en cuyo caso seraacute compilada automaacuteticamente en un nuevo servlet y ejecutada

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Regresando al ejemplo el archivo java generado por el Tomcat a partir del archivo

Saludojsp se localiza en la carpeta workCatalinalocalhost de la instalacioacuten de Tomcat

321 ELEMENTOS PARA SECUENCIAS DE COMANDOS

Los elementos para secuencias de comandos permiten insertar coacutedigo en el servlet que seraacute

generado a partir de la paacutegina JSP Existen tres formas

1 Expresiones del tipo lt= expresioacuten gt que se evaluacutean e insertan en el resultado del

servlet

2 Los scriptlets del tipo lt codigo gt que se insertan en el meacutetodo _jspService del

servlet (ejecutado por service)

3 Las declaraciones del tipo lt Codigo gt que se insertan en el cuerpo de la clase del

servlet fuera de cualquier meacutetodo existente

NOTA Los comentarios en JSP se escriben lt-- Comentario JSP --gt en tanto que los

comentarios en HTML son de la forma lt--Comentario HTML --gt La diferencia

semaacutentica radica en que los comentarios HTML cuando se insertan en la respuesta enviada

por el servidor al cliente no se muestran cuando se visualiza el documento HTML pero si

Servidor Maacutequina Cliente

Explorador Web

Contenedor Web

Motor Servlet

Motor JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

los podemos ver cuando se visualiza el coacutedigo fuente en tanto que los comentarios JSP

aunque se inserten en la respuesta enviada por el servidor al cliente no son enviados al

explorador de forma que tampoco se muestran ni se ven cuando se visualiza el coacutedigo fuente

HTML desde el explorador

3211 EXPRESIONES

Se utiliza una expresioacuten JSP para insertar valores directamente en el resultado La sintaxis es

lt= expresioacuten gt Por ejemplo

lt= requestgetParameter(ldquoparNombre) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt lt= s gt

La fecha y hora actual es lt= new javautilDate() gt

La expresioacuten se evaluacutea se convierte a cadena y se inserta en la paacutegina Esta evaluacioacuten se

realiza durante la ejecucioacuten

32111 VARIABLES PREDEFINIDAS

Para simplificar estas expresiones se pueden utilizar cierta cantidad de variables

predefinidas Estos objetos impliacutecitos como tambieacuten se les llama estaacuten disponibles para su

uso durante la implementacioacuten de una paacutegina Web

bull pageContext Es un objeto de la clase PageContext que proporciona acceso a objetos

relacionados con los servlets

bull request Es un objeto de la clase HttpServletRequest que se puede obtener a traveacutes del

meacutetodo getRequest que encapsula los datos enviados por el cliente al servidor

bull response Es un objeto de la clase HttpServletResponse que puede obtenerse a traveacutes

del meacutetodo getResponse que encapsula los datos que el servidor enviaraacute al cliente

bull application Es un objeto de la clase ServletContext que se obtiene a traveacutes del meacutetodo

getServletContext que define un conjunto de meacutetodos que todo servlet utiliza para

comunicar con el contenedor de servlets

bull config Es un objeto de la clase ServletConfig que se obtiene a traveacutes del meacutetodo

getServletConfig y que se utiliza por el contenedor de servlets para pasar informacioacuten

al servlet durante la iniciacioacuten

bull session Es un objeto de la clase HttpSession que se obtiene a traveacutes del meacutetodo

getSession que proporciona una forma de identificar a un usuario que visita las paacuteginas

de un sitio Web

bull out Es un objeto de la clase JspWriter que se obtiene a traveacutes del meacutetodo getOut que

se utiliza para almacenar la respuesta que seraacute enviada al cliente que hizo la peticioacuten de

la paacutegina

bull page Es un objeto geneacuterico de la clase Object que se obtiene a traveacutes del meacutetodo

getPage y que representa al servlet obtenido a partir de la paacutegina JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

bull exception Es un objeto de la clase Exception que se obtiene a traveacutes del meacutetodo

getException que contendraacute informacioacuten a cerca de cualquier excepcioacuten que se lance

desde la paacutegina JSP

Un ejemplo del uso de uno de estos objetos impliacutecitos seriacutea el siguiente

El nombre de tu host es lt= requestgetRemoteHost() gt

El listado siguiente da un ejemplo de una paacutegina JSP que utiliza algunas variables

predefinidas como uso de expresiones JSP

ltDOCTYPE HTML PUBLIC -W3CDTD HTML 40 Transitional ENgt

lthtmlgt

ltheadgt

lttitlegt Expresiones JSP lttitlegt

ltheadgt

ltbodygt

lth2gt Expresiones JSP lth2gt

ltULgt

ltligt Fecha y hora en curso lt= new javautilDate() gt ltligt

ltligt Nombre de su host lt= requestgetRemoteHost() gt ltligt

ltligt Identificador de su sesioacuten lt= sessiongetId() gt ltligt

ltligt El paraacutemetro ltcodegt paramPrueba ltcodegt del formulario

lt= requestgetParameter(paramPrueba) gt ltligt

ltULgt

ltbodygt

lthtmlgt

Cuya salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3212 LOS SCRIPTLETS JSP

Si se desea hacer algo maacutes complejo que una simple expresioacuten los scriptlets permiten insertar

coacutedigo JAVA en el meacutetodo _jspService del servlet (que es ejecutado por service) La sintaxis

utilizada por los scriptlets es lt coacutedigo java gt Los escriptlets tienen acceso a las

mismas variables definidas de forma automaacutetica como expresiones A manera de ejemplo si

se desea que el resultado aparezca en la paacutegina generada deberiacutea de utilizarse la variable out

como en la siguiente instruccioacuten

lt String datosConsultados= requestgetQueryString()

outprintln(ldquoDatos GET adjuntos ldquo+datosConsultados)

gt

En este ejemplo podriacutea haberse obtenido el mismo resultado utilizando la siguiente expresioacuten

JSP

Datos GET adjuntos lt=requestgetQueryString() gt

En general los scriptlets pueden ejecutar varias tareas que no podriacutean realizarse con las

expresiones Tales tareas incluyen

bull La determinacioacuten de encabezados de respuesta

bull Actualizacioacuten de Bases de Datos

bull Ejecucioacuten de bucles condiciones y otras estructuras complejas

lt for (int i=1 ilt=6 i++)

gt

lth lt=i gtgt Hola Mundo lthlt=i gtgt

lt gt

Como un ejemplo concreto se muestra la siguiente paacutegina JSP llamada Cuentajsp en donde

se observa coacutemo se hace un seguimiento del nuacutemero de veces que un cliente accede a esta

paacutegina a traveacutes de distintas sesiones Para ello supondremos que dicha cuenta es el valor del

atributo atrCuenta del objeto impliacutecito application ya citado La primera vez que el cliente

accede a la paacutegina el valor de atrCuenta seraacute null debido a que auacuten no ha sido fijado este

atributo en este caso se fijaraacute con el valor 1 En los siguientes accesos se leeraacute el valor del

atributo atrCuenta se incrementaraacute en una unidad y se volveraacute a fijar Finalmente se enviacutea

la respuesta al cliente para que se muestre al usuario el valor del contador

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en el objeto impliacutecito application con el nombre

atrCuenta

--gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt

Integer cuenta = (Integer)applicationgetAttribute(atrCuenta)

String s = vez

if (cuenta == null)

cuenta = new Integer(1)

else

cuenta = new Integer(cuentaintValue() + 1)

s = veces

applicationsetAttribute(atrCuenta cuenta)

gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

Has visitado esta paacutegina lt= cuenta gt lt= s gt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional un fragmento de coacutedigo JAVA o scriptlet

expresiones y comentarioshellip

Aquiacute otro ejemplo de la ejecucioacuten de un coacutedigo demasiado complejo para una expresioacuten JSP

Este listado presenta una paacutegina JSP que utiliza el paraacutemetro de peticioacuten colorFondo para

establecer el color de fondo de la paacutegina

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgt

lttitlegt Prueba de Color lttitlegt

ltheadgt

lt

String colorFondo=requestgetParameter(colorFondo)

boolean tieneColorExplicito

if (colorFondo =null)

tieneColorExplicito=true

else

tieneColorExplicito=false

colorFondo=WHITE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt

ltbody bgcolor=lt= colorFondo gtgt

lth2 align=centergt Prueba de color lth2gt

lt

if (tieneColorExplicito)

outprintln(Ha indicado un color de fondo expliacutecito +

colorFondo +)

else

outprintln(Usareacute el color de fondo predeterminado WHITE +

Indique el atributo de peticioacuten

ltigtcolorFondoltigt+

para intentar un color estaacutendar un +

valor RRGGBB o para ver si el navegador Web +

permite el uso de nombres de color X11)

gt

ltbodygt

lthtmlgt

Cuyas posibles salidas son

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3213 DECLARACIONES JSP

Una declaracioacuten JSP permite definir meacutetodos o campos que seraacuten insertados en el cuerpo

principal de la clase del servlet (fuera del meacutetodo _jspService) Una declaracioacuten tiene la

sintaxis lt Coacutedigo Java gt Por ejemplo

lt int i=0 gt

lt

Public void jspinit()

coacutedigo de iniciacioacuten

gt

Una declaracioacuten no genera ninguacuten resultado y se usan junto con las expresiones JSP o los

scriptlets A continuacioacuten se muestra una paacutegina JSP que despliega la cantidad de veces que

se ha solicitado esta paacutegina desde que se arrancoacute el servidor haciendo uso de las

declaraciones JSP

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtDeclaraciones JSPlttitlegtltheadgt

ltbodygt

lth1gtDeclaraciones JSPlth1gt

lt-- Esto es un comentario en JSP --gt

lt private int recuentoAccesos=0 gt

lth2gt Accesos a la paacutegina desde el reinicio del servidor

lt= ++recuentoAccesos gt lth2gt

ltbodygt

lthtmlgt

La salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

322 EL LENGUAJE DE EXPRESION EN JSP 20

Anteriormente se ha visto la necesidad de utilizar fragmentos de coacutedigo java en el desarrollo

de paacuteginas JSP pero con la aparicioacuten de la especificacioacuten JSP 20 ya no hay necesidad de

utilizar fragmentos de coacutedigo Java para nada gracias al nuevo lenguaje de expresioacuten EL

(Expresioacuten Language) a la biblioteca de etiquetas estandar JSTL (JSP Standar Tag Library)

y a las nuevas formas para desarrollar etiquetas personalizadas

El lenguaje de expresioacuten JSP es maacutes un lenguaje de acceso a datos que un lenguaje de

programacioacuten Ya se ha visto que para pasar informacioacuten de un cliente a una paacutegina JSP se

utilizan paraacutemetros en la peticioacuten y atributos en la paacutegina El lenguaje de expresioacuten lo hace

posible sin tener que utilizar scriptlets o expresiones (lt= expresioacuten gt) Por ejemplo las

liacuteneas JSP 12 siguientes escritas utilizando coacutedigo Java

lt= requestgetParameter(ldquoparNombrerdquo) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt veces

bajo la especificacioacuten JSP 20 se pueden escribir de una forma maacutes sencilla como sigue

(ahora no se trata de coacutedigo JAVA)

$paramparNombre has visitado esta paacutegina

$atrCuenta veces

La sintaxis de JSP es sensible a mayuacutesculas y minuacutesculas pero un par de comillas simples es

equivalente a un par de comillas dobles

3221 VARIABLES PREDEFINIDAS (Objetos Impliacutecitos)

El lenguaje de expresioacuten JSP 20 soporta los objetos impliacutecitos siguientes

pageContext Objeto de javaxservletjspPageContext que proporciona acceso a los

datos de una peticioacuten

param Coleccioacuten (objeto de tipo javautilMap) de todos los valores de los paraacutemetros

enviados en una peticioacuten un String por paraacutemetro

paramValues Coleccioacuten de todos los valores de los paraacutemetros enviados en una

peticioacuten una matriz de tipo String por paraacutemetro

header Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten un

String por cabecera

headerValues Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten

una matriz de tipo String por cabecera

cookie Coleccioacuten de todos los valores de las cookies un objeto javaxservlethttpCookie

por cookie

initParam Coleccioacuten de todos los valores de los paraacutemetros de iniciacioacuten de la

aplicacioacuten un String por paraacutemetro

Tambieacuten hay objetos que permiten acceder a variables definidas en diferentes aacutembitos lo que

posibilita compartir informacioacuten

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

pageScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de paacutegina

requestScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

peticioacuten

sessionScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de sesioacuten

applicationScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

aplicacioacuten

3222 DIRECTRICES

Las directrices page incluye y taglib son mensajes para el motor JSP y son siempre incluidas

entre los siacutembolos lt y gt

32221 LA DIRECTRIZ PAGE

Define atributos que se aplican a toda la paacutegina JSP donde es incluida

lt page lista_de_atributos gt

Donde la lista_de_atributos puede contener algunos de los siguientes (aquellos que estaacuten

escritos en negrita son los tomados por omisioacuten)

language= ldquoscriptingLanguagerdquo

extends= rdquoclassNamerdquo

import= ldquoimportListrdquo

session= ldquotrue|falserdquo

buffer= ldquonone|sizeKb

autoflush= ldquotrue|falserdquo

isThreadSafe= rdquotrue|falserdquo

info= rdquoinfo_textrdquo

errorPage= ldquoerror_urlrdquo

isErrorPage= rdquotrue|falserdquo

contentType= rdquoctinfordquo

pageEncoding= rdquopeinfordquo

isELIgnored= ldquotrue|falserdquo

Tiacutepicamente se localiza al principio de la paacutegina JSP y puede haber cualquier nuacutemero de

ellas El lenguaje por omisioacuten es Java Ejemplos

lt page contentType=rdquotexthtmlrdquo language=rdquojavardquo gt

lt page import=rdquojavautil javalangrdquo gt

lt page buffer=rdquo5kbrdquo autoflush=rdquofalserdquo gt

32222 LA DIRECTRIZ INCLUDE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

La directriz include incluye un archivo (html jsp xml o de texto) en una paacutegina JSP Esto

permite dividir el contenido de la paacutegina en trozos maacutes manejables

lt incluye file=rdquoURL_relativordquo gt

El ejemplo siguiente muestra dos archivos el primero incluye al segundo para mostrar la

fecha y hora actuales

lt-- fichero mostrarFechaHorajsp --gt

lthtmlgt

ltheadgtlttitlegtIncluir un ficherolttitlegtltheadgt

ltbody bgcolor=whitegt

ltfont color=bluegt

La fecha y hora actuales son

lt include file=fechaHorajsp gt

ltfontgt

ltbodygt

lthtmlgt

lt-- fichero fechaHorajsp --gt

lt page import=javautil gt

lt= (new javautilDate())toLocaleString() gt

32223 LA DIRECTRIZ TAGLIB

La directriz taglib indica la biblioteca de acciones personalizadas que podremos utilizar en

la codificacioacuten de la paacutegina JSP Para distinguir esas acciones entre otras existentes se utiliza

un prefijo (prefix) Su sintaxis es

lt taglib (uri=rdquoURI_bibliotecardquo|tagdir=rdquoDir_biblioteca_tagrdquo)

prefix=rdquoprefijordquo gt

Cuando se trata de una biblioteca definida mediante una clase Java y un descriptor (archivo

tld) eacutesta se identifica mediante un URI (Uniform Resource Identifier- URL relativos) Por

ejemplo

lt taglib uri=rdquohttpMarioRossainzLopezmiBibliotecardquo

prefix=rdquofunrdquo gt

ltpgtltfunaccion01 gt

La uacuteltima liacutenea del ejemplo tiene dos etiquetas una etiqueta p HTML y otra accion01

perteneciente a la biblioteca miBiblioteca En cambio si la biblioteca se define mediante un

archivo tag entonces se identifica mediante su ruta relativa en el sistema de archivos

lt taglib tagdir=rdquoWEB-INFtagsrdquo prefix=rdquofunrdquo gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpgtltfunaccion01 gt

La directriz taglib debe colocarse antes de utilizar en la paacutegina JSP las acciones

personalizadas definidas por la misma Se puede utilizar maacutes de una directriz pero el prefijo

utilizado debe ser uacutenico para cada una de ellas

3223 ACTIVACION DEL LENGUAJE DE EXPRESION (LE)

La especificacioacuten JSP 20 define un lenguaje de expresioacuten como alternativa a elementos de

programacioacuten escritos con coacutedigo Java y especificaciones anteriores a la JSP 20 Para que

este lenguaje pueda ser interpretado tienen que cumplirse 2 requisitos

1 Que la propiedad isELIgnored de la directriz page valga false

lt page isELIgnored= ldquofalserdquo gt

2 Que el descriptor de despliegue webxml en la carpeta WEB-INF indique doacutende se

localiza el esquema XML para la especificacioacuten Servlet 24 que a su vez utiliza el

esquema XML para la especificacioacuten Java Server Page 20

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

Utilizando el lenguaje de expresioacuten se podriacutea modificar la paacutegina Cuentajsp de la seccioacuten

3212 de este documento como se muestra a continuacioacuten Esta nueva paacutegina

1 Especifica que utilizaraacute la biblioteca core de etiquetas estandar (de la que se hablaraacute maacutes

adelante)

2 La primera vez que sea accedida definiraacute la variable atrCuenta en el aacutembito de la

aplicacioacuten con un valor inicial nulo y la incrementaraacute en una unidad cuando sea accedida

sucesivas veces simplemente incrementaraacute esta variable en una unidad

3 Finalmente mostraraacute una paacutegina con un contenido anaacutelogo al siguiente Esta formado

por una cabecera y una segunda liacutenea compuesta por el valor del paraacutemetro parNombre

enviado con la peticioacuten un texto fijo el valor de la variable atrCuenta y otro texto fijo

dependiente del valor de esta variable

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

El coacutedigo completo es el siguiente

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

3224 VARIABLES Y EXPRESIONES

Para acceder a una simple variable se puede escribir algo como lo siguiente $nombre y

para acceder a una propiedad de un objeto podemos escribir algo como

$paramparNombre

$applicationScopeatrCuenta

$pageContextrequestrequestURI

La primera liacutenea del ejemplo anterior obtiene el valor de la propiedad parNombre del objeto

param la segunda el valor del atributo atrCuenta del objeto applicationScope y la tercera

el URL relativo de la paacutegina JSP solicitada

El lenguaje de expresioacuten es maacutes tolerante con respecto a las variables con valor null y ejecuta

muchas maacutes conversiones de forma automaacutetica sobre el tipo de los datos cuando la expresioacuten

a evaluar asiacute lo requiere Por ejemplo la etiqueta condicional siguiente incluye una expresioacuten

que compara el valor del atributo atrCuenta con aacutembito de aplicacioacuten con 10 (convirtiendo

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

impliacutecitamente el valor del atributo al tipo de la constante para poder realizar la comparacioacuten

El resultado seraacute un valor de tipo boolean

ltcif test=rdquo$applicationScopeatrCuenta gt 10rdquogt

ltcifgt

o bien

ltcif test=rdquo$atrCuenta gt 10rdquogt

ltcifgt

Para que una literal pueda incluir un caracter significativo para el lenguaje dicho caracter

debe ser especificado como una secuencia de escape (caracter) Por ejemplo la siguiente

expresioacuten da lugar al literal ldquovezrdquo o ldquovecesrdquo entre comillas dobles

$(atrCuenta gt 1) iquest ldquordquovecesrdquordquo ldquordquovezrdquordquo

Cualquier objeto o atributo de un objeto definido en algunos de los aacutembitos de una paacutegina

puede ser utilizado como una variable Por ejemplo $atrCuenta+1 es una expresioacuten que

realiza la suma de la variable atrCuenta con 1

Cuando se trate de una propiedad de un objeto para acceder a ella se utilizaraacute el operador

punto o bien la notacioacuten empleada para acceder a un elemento de una matriz Por ejemplo

$paramparNombre

$param[ldquoparNombrerdquo]

Una expresioacuten LE puede aparecer en cualquier lugar donde pueda aparecer un texto fijo Por

tanto para informar al contenedor JSP que se trata de una expresioacuten y no de un texto fijo se

utilizan los delimitadores $ al principio y al final

3225 OPERADORES

OPERADOR DESCRIPCIOacuteN Acceso a la propiedad de un objeto o a un elemento de un Map

[] Acceso al elemento de una matriz o de un objeto List

() Pareacutentesis para alterar la prioridad en la evaluacioacuten de una expresioacuten

If ternario condicion expresion1 expresioacuten 2

+ Suma

- Resta

Producto

oacute div Divisioacuten

oacute mod Moacutedulo o resto de una divisioacuten

== oacute eq Igualdad

= oacute ne Diferente

lt oacute lt Menor que

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt oacute gt Mayor que

lt= oacute le Menor o igual que

gt= oacute ge Mayor o igual que

ampamp oacute and Operacioacuten Loacutegica AND

|| oacute or Operacioacuten Loacutegica OR

oacute not Operacioacuten Loacutegica NOT

empty Verifica si el valor de una variable es null si un String esta vaciacuteo o si una matriz Map

o Collection no tienen elementos

func(args) Llamada a una funcioacuten donde func es el nombre de la funcioacuten y arg representa cero o

maacutes argumentos separados por comas

El ejemplo siguiente muestra una paacutegina JSP compuesta por elementos HTML expresiones

LE y objetos impliacutecitos

lthtmlgt

ltheadgtlttitlegtJSP 20lttitlegtltheadgt

ltbodygt

lth3gtLenguaje de expresioacuten (LE)lth3gt

ltpgtLa siguiente tabla ilustra algunas expresiones LE

ltbrgtltbrgtlttable border=1gt

lttrgt

ltthgtltbgtExpresioacutenltbgtltthgt

ltthgtltbgtValorltbgtltthgt

lttrgt

lttrgt

lttdgt$3 + 6lttdgt

lttdgt$3 + 6lttdgt

lttdgt

lttrgt

lttdgt$(7 gt 4) 7 4lttdgt

lttdgt$(7 gt 4) 7 4lttdgt

lttrgt

lttrgt

lttdgt$header[host]lttdgt

lttdgt$header[host]lttdgt

lttrgt

lttablegt

ltbodygt

lthtmlgt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

323 BIBLIOTECA ESTANDAR DE ETIQUETAS

La biblioteca estaacutendar de etiquetas JSP (JSTL ndash Java Server Page Estaacutendar Tag Library)

incluye una cantidad amplia de etiquetas para diferentes aacutereas de trabajo

Aacuterea baacutesica (su prefijo es c ndash core) y contiene

o Soporte de variables (remove y set)

o Control del flujo (choose when otherwise forEach forTokens if)

o Manejo de URL (import param redirect param y url param)

o Operaciones varias (match y out)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlcore

Aacuterea XML (su prefijo es x) y contiene

o Sentencias baacutesicas (out parse y set)

o Control del flujo (choosehellip whenhellip otherwise forEach e if)

o Transformacioacuten de Documentos (transformhellipparam)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlxml

Aacuterea Internacionalizacioacuten (su prefijo es fmt) Contiene

o Localidad (setLocale y requestEncoding)

o Mensajes (bundle message param y setBundle)

o Formateo de Fechas y nuacutemeros (formatNumber formateacuteate parseDate

parseNumber setTimeZone timeZone)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlfmt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Aacuterea SQL (su prefijo es sql) es el lenguaje estandar para interactuar con bases de datos

relacionales y contiene setDataSource Quero dateParam param transaction y

update dateParam param) El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlsql

Aacuterea Funciones (su prefijo es fn) y contiene

o Longitud de una coleccioacuten (length)

o Manipulacioacuten de String (toUpperCase toLowerCase substring

substringAfter substringBefore trim replace indexOf startsWith

endsWith contains containsIgnoreCase split join y escapeXml)

o El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlfunctions

3231 OPERACIONES CON ETIQUETAS BAacuteSICAS

En un ejemplo pasado teniacuteamos el siguiente coacutedigo

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

En este ejemplo se hace referencia al aacuterea baacutesica de JSTL con el prefijo c y se utiliza la

etiqueta cset para definir la variable atrCuenta Si la variable ya esta definida simplemente

se le asigna el valor especificado

La uacuteltima parte del ejemplo anterior podriacutea haberse escrito de esta otra forma

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcif test=rdquo$atrCuenta gt 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcifgt

$atrCuenta $str

La etiqueta cif permite la ejecucioacuten condicional de su cuerpo en funcioacuten del valor del

atributo de test

La etiqueta cchoose permite la ejecucioacuten del cuerpo de la primera etiqueta cwhen cuyo

atributo test sea evaluado a true Si ninguna de las condiciones se evaluacutea a true entonces se

evaluacutea el cuerpo de la etiqueta cotherwise si estaacute presente El siguiente coacutedigo muestra otra

manera de escribir el ejemplo anterior utilizando estas uacuteltimas etiquetas

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcchoosegt

ltcwhen test=rdquo$atrCuenta == 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcwhengt

ltcotherwisegt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcotherwisegt

ltcchoosegt

$atrCuenta $str

La etiqueta cforEach permite iterar sobre una coleccioacuten de objetos La coleccioacuten se

especifica por medio del atributo iacutetems y el elemento actual de la coleccioacuten estaacute disponible a

traveacutes de la variable establecida por el atributo var Por ejemplo el siguiente fragmento de

coacutedigo visualiza una tabla con las variables definidas a nivel de aacutembito de paacutegina

lttable border=rdquo1rdquogt

ltcforEach var=rdquoitemrdquo iacutetems=rdquo$pageScoperdquogt

lttrgt

lttdgt $item lttdgt

lttrgt

ltcforEachgt

lttablegt

La etiqueta ccatch atrapa una excepcioacuten que ocurra en el cuerpo de la misma Por ejemplo

el siguiente segmento de coacutedigo lanzaraacute una excepcioacuten si el paraacutemetro mes se escribe con

letras en vez de con nuacutemeros

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltbodygt

lthtmlgt

Un URL anaacutelogo al siguiente daraacute lugar a que la excepcioacuten sea lanzada cuando se ejecute la

expresioacuten $nMes 3 de la paacutegina anterior

httplocalhost8080JSP2exceppruebajspmes=marzo

La excepcioacuten indica que ha ocurrido un error al tratar de convertir ldquomarzordquo a un entero de

tipo Long Para cachar esta excepcioacuten y darle un tratamiento adecuado habraacute que modificar

la paacutegina JSP anterior como se indica a continuacioacuten

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltccatch var=rdquoerrorOcurridordquogt

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltccatchgt

ltcif test=rdquo$not empty errorOcurridordquogt

Error el paraacutemetro mes debe ser un nuacutemero ltbgt

ltbrgt Informacioacuten del error dada por el sistema

ltbrgt ltfont color=rdquoFF0000rdquogt $errorOcurrido ltfontgt

ltcifgt

ltbodygt

lthtmlgt

3232 ACCESO A BASES DE DATOS CON JSP

Las etiquetas que proporciona el aacuterea SQL permiten realizar

Conexioacuten con una base de datos

Realizacioacuten de consultas a la base de datos

Acceso al conjunto de resultados

Ejecucioacuten de actualizaciones y transacciones

Todas las etiquetas SQL actuacutean sobre una base de datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

32321 CONEXIOacuteN CON LA BASE DE DATOS

La conexioacuten con la base de datos puede realizarse con la etiqueta sqlsetDataSource Por

ejemplo si se esta utilizando el administrador de bases de datos MySql con el controlador

JDBC se puede realizar una conexioacuten con una base de datos digamos bd_tutorias de la

manera siguiente

ltsqlsetDataSource var=rdquobdrdquo

driver=rdquocommysqljdbcDriverrdquo

url=rdquojdbcmysqllocalhost3306bd_tutoriasrdquo

user=rdquoadminrdquo

password=rdquoadminadminrdquo gt

32322 CONSULTA A LA BASE DE DATOS

La etiqueta sqlQuero permite realizar una consulta a una base de datos Por ejemplo el

siguiente fragmento de coacutedigo realiza una consulta a la base de datos representada por bd y

obtiene un conjunto de resultados representado por cdr

ltsqlquery var=rdquocdrrdquo dataSource=rdquo$bdrdquogt

SELECT professor dia hora alumno

FROM profesores tutorias citas

WHERE profesoresid_profesor=tutoriasid_profesor

AND tutoriasid_tutoria=citasid_tutoria

ltsqlquerygt

32323 MODIFICACIONES SOBRE LA BASE DE DATOS

La etiqueta sqlupdate permite ejecutar una sentencia SQL INSERT UPDATE o DELETE

y cualquier otra sentencia SQL que no retorne ninguacuten valor Por ejemplo

ltsqlupdate var=rdquocontrdquo dataSource=rdquo$bdrdquo gt

UPDATE profesores

SET profesor=

WHERE profesor=

ltsqlparam value=rdquo$paramProfesorrdquo gt

ltsqlparam value=rdquo$paramIDrdquo gt

ltsqlupdategt

Una operacioacuten UPDATE puede utilizar el siacutembolo para indicar que el valor que tendriacutea que

evaluarse en esa posicioacuten seraacute suministrado por una etiqueta sqlparam como por ejemplo

httplocalhost8080JSP2sqlpruebajspProfesor=Mario+Rossainz+LopezampID=514

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Regresando al ejemplo el archivo java generado por el Tomcat a partir del archivo

Saludojsp se localiza en la carpeta workCatalinalocalhost de la instalacioacuten de Tomcat

321 ELEMENTOS PARA SECUENCIAS DE COMANDOS

Los elementos para secuencias de comandos permiten insertar coacutedigo en el servlet que seraacute

generado a partir de la paacutegina JSP Existen tres formas

1 Expresiones del tipo lt= expresioacuten gt que se evaluacutean e insertan en el resultado del

servlet

2 Los scriptlets del tipo lt codigo gt que se insertan en el meacutetodo _jspService del

servlet (ejecutado por service)

3 Las declaraciones del tipo lt Codigo gt que se insertan en el cuerpo de la clase del

servlet fuera de cualquier meacutetodo existente

NOTA Los comentarios en JSP se escriben lt-- Comentario JSP --gt en tanto que los

comentarios en HTML son de la forma lt--Comentario HTML --gt La diferencia

semaacutentica radica en que los comentarios HTML cuando se insertan en la respuesta enviada

por el servidor al cliente no se muestran cuando se visualiza el documento HTML pero si

Servidor Maacutequina Cliente

Explorador Web

Contenedor Web

Motor Servlet

Motor JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

los podemos ver cuando se visualiza el coacutedigo fuente en tanto que los comentarios JSP

aunque se inserten en la respuesta enviada por el servidor al cliente no son enviados al

explorador de forma que tampoco se muestran ni se ven cuando se visualiza el coacutedigo fuente

HTML desde el explorador

3211 EXPRESIONES

Se utiliza una expresioacuten JSP para insertar valores directamente en el resultado La sintaxis es

lt= expresioacuten gt Por ejemplo

lt= requestgetParameter(ldquoparNombre) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt lt= s gt

La fecha y hora actual es lt= new javautilDate() gt

La expresioacuten se evaluacutea se convierte a cadena y se inserta en la paacutegina Esta evaluacioacuten se

realiza durante la ejecucioacuten

32111 VARIABLES PREDEFINIDAS

Para simplificar estas expresiones se pueden utilizar cierta cantidad de variables

predefinidas Estos objetos impliacutecitos como tambieacuten se les llama estaacuten disponibles para su

uso durante la implementacioacuten de una paacutegina Web

bull pageContext Es un objeto de la clase PageContext que proporciona acceso a objetos

relacionados con los servlets

bull request Es un objeto de la clase HttpServletRequest que se puede obtener a traveacutes del

meacutetodo getRequest que encapsula los datos enviados por el cliente al servidor

bull response Es un objeto de la clase HttpServletResponse que puede obtenerse a traveacutes

del meacutetodo getResponse que encapsula los datos que el servidor enviaraacute al cliente

bull application Es un objeto de la clase ServletContext que se obtiene a traveacutes del meacutetodo

getServletContext que define un conjunto de meacutetodos que todo servlet utiliza para

comunicar con el contenedor de servlets

bull config Es un objeto de la clase ServletConfig que se obtiene a traveacutes del meacutetodo

getServletConfig y que se utiliza por el contenedor de servlets para pasar informacioacuten

al servlet durante la iniciacioacuten

bull session Es un objeto de la clase HttpSession que se obtiene a traveacutes del meacutetodo

getSession que proporciona una forma de identificar a un usuario que visita las paacuteginas

de un sitio Web

bull out Es un objeto de la clase JspWriter que se obtiene a traveacutes del meacutetodo getOut que

se utiliza para almacenar la respuesta que seraacute enviada al cliente que hizo la peticioacuten de

la paacutegina

bull page Es un objeto geneacuterico de la clase Object que se obtiene a traveacutes del meacutetodo

getPage y que representa al servlet obtenido a partir de la paacutegina JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

bull exception Es un objeto de la clase Exception que se obtiene a traveacutes del meacutetodo

getException que contendraacute informacioacuten a cerca de cualquier excepcioacuten que se lance

desde la paacutegina JSP

Un ejemplo del uso de uno de estos objetos impliacutecitos seriacutea el siguiente

El nombre de tu host es lt= requestgetRemoteHost() gt

El listado siguiente da un ejemplo de una paacutegina JSP que utiliza algunas variables

predefinidas como uso de expresiones JSP

ltDOCTYPE HTML PUBLIC -W3CDTD HTML 40 Transitional ENgt

lthtmlgt

ltheadgt

lttitlegt Expresiones JSP lttitlegt

ltheadgt

ltbodygt

lth2gt Expresiones JSP lth2gt

ltULgt

ltligt Fecha y hora en curso lt= new javautilDate() gt ltligt

ltligt Nombre de su host lt= requestgetRemoteHost() gt ltligt

ltligt Identificador de su sesioacuten lt= sessiongetId() gt ltligt

ltligt El paraacutemetro ltcodegt paramPrueba ltcodegt del formulario

lt= requestgetParameter(paramPrueba) gt ltligt

ltULgt

ltbodygt

lthtmlgt

Cuya salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3212 LOS SCRIPTLETS JSP

Si se desea hacer algo maacutes complejo que una simple expresioacuten los scriptlets permiten insertar

coacutedigo JAVA en el meacutetodo _jspService del servlet (que es ejecutado por service) La sintaxis

utilizada por los scriptlets es lt coacutedigo java gt Los escriptlets tienen acceso a las

mismas variables definidas de forma automaacutetica como expresiones A manera de ejemplo si

se desea que el resultado aparezca en la paacutegina generada deberiacutea de utilizarse la variable out

como en la siguiente instruccioacuten

lt String datosConsultados= requestgetQueryString()

outprintln(ldquoDatos GET adjuntos ldquo+datosConsultados)

gt

En este ejemplo podriacutea haberse obtenido el mismo resultado utilizando la siguiente expresioacuten

JSP

Datos GET adjuntos lt=requestgetQueryString() gt

En general los scriptlets pueden ejecutar varias tareas que no podriacutean realizarse con las

expresiones Tales tareas incluyen

bull La determinacioacuten de encabezados de respuesta

bull Actualizacioacuten de Bases de Datos

bull Ejecucioacuten de bucles condiciones y otras estructuras complejas

lt for (int i=1 ilt=6 i++)

gt

lth lt=i gtgt Hola Mundo lthlt=i gtgt

lt gt

Como un ejemplo concreto se muestra la siguiente paacutegina JSP llamada Cuentajsp en donde

se observa coacutemo se hace un seguimiento del nuacutemero de veces que un cliente accede a esta

paacutegina a traveacutes de distintas sesiones Para ello supondremos que dicha cuenta es el valor del

atributo atrCuenta del objeto impliacutecito application ya citado La primera vez que el cliente

accede a la paacutegina el valor de atrCuenta seraacute null debido a que auacuten no ha sido fijado este

atributo en este caso se fijaraacute con el valor 1 En los siguientes accesos se leeraacute el valor del

atributo atrCuenta se incrementaraacute en una unidad y se volveraacute a fijar Finalmente se enviacutea

la respuesta al cliente para que se muestre al usuario el valor del contador

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en el objeto impliacutecito application con el nombre

atrCuenta

--gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt

Integer cuenta = (Integer)applicationgetAttribute(atrCuenta)

String s = vez

if (cuenta == null)

cuenta = new Integer(1)

else

cuenta = new Integer(cuentaintValue() + 1)

s = veces

applicationsetAttribute(atrCuenta cuenta)

gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

Has visitado esta paacutegina lt= cuenta gt lt= s gt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional un fragmento de coacutedigo JAVA o scriptlet

expresiones y comentarioshellip

Aquiacute otro ejemplo de la ejecucioacuten de un coacutedigo demasiado complejo para una expresioacuten JSP

Este listado presenta una paacutegina JSP que utiliza el paraacutemetro de peticioacuten colorFondo para

establecer el color de fondo de la paacutegina

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgt

lttitlegt Prueba de Color lttitlegt

ltheadgt

lt

String colorFondo=requestgetParameter(colorFondo)

boolean tieneColorExplicito

if (colorFondo =null)

tieneColorExplicito=true

else

tieneColorExplicito=false

colorFondo=WHITE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt

ltbody bgcolor=lt= colorFondo gtgt

lth2 align=centergt Prueba de color lth2gt

lt

if (tieneColorExplicito)

outprintln(Ha indicado un color de fondo expliacutecito +

colorFondo +)

else

outprintln(Usareacute el color de fondo predeterminado WHITE +

Indique el atributo de peticioacuten

ltigtcolorFondoltigt+

para intentar un color estaacutendar un +

valor RRGGBB o para ver si el navegador Web +

permite el uso de nombres de color X11)

gt

ltbodygt

lthtmlgt

Cuyas posibles salidas son

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3213 DECLARACIONES JSP

Una declaracioacuten JSP permite definir meacutetodos o campos que seraacuten insertados en el cuerpo

principal de la clase del servlet (fuera del meacutetodo _jspService) Una declaracioacuten tiene la

sintaxis lt Coacutedigo Java gt Por ejemplo

lt int i=0 gt

lt

Public void jspinit()

coacutedigo de iniciacioacuten

gt

Una declaracioacuten no genera ninguacuten resultado y se usan junto con las expresiones JSP o los

scriptlets A continuacioacuten se muestra una paacutegina JSP que despliega la cantidad de veces que

se ha solicitado esta paacutegina desde que se arrancoacute el servidor haciendo uso de las

declaraciones JSP

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtDeclaraciones JSPlttitlegtltheadgt

ltbodygt

lth1gtDeclaraciones JSPlth1gt

lt-- Esto es un comentario en JSP --gt

lt private int recuentoAccesos=0 gt

lth2gt Accesos a la paacutegina desde el reinicio del servidor

lt= ++recuentoAccesos gt lth2gt

ltbodygt

lthtmlgt

La salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

322 EL LENGUAJE DE EXPRESION EN JSP 20

Anteriormente se ha visto la necesidad de utilizar fragmentos de coacutedigo java en el desarrollo

de paacuteginas JSP pero con la aparicioacuten de la especificacioacuten JSP 20 ya no hay necesidad de

utilizar fragmentos de coacutedigo Java para nada gracias al nuevo lenguaje de expresioacuten EL

(Expresioacuten Language) a la biblioteca de etiquetas estandar JSTL (JSP Standar Tag Library)

y a las nuevas formas para desarrollar etiquetas personalizadas

El lenguaje de expresioacuten JSP es maacutes un lenguaje de acceso a datos que un lenguaje de

programacioacuten Ya se ha visto que para pasar informacioacuten de un cliente a una paacutegina JSP se

utilizan paraacutemetros en la peticioacuten y atributos en la paacutegina El lenguaje de expresioacuten lo hace

posible sin tener que utilizar scriptlets o expresiones (lt= expresioacuten gt) Por ejemplo las

liacuteneas JSP 12 siguientes escritas utilizando coacutedigo Java

lt= requestgetParameter(ldquoparNombrerdquo) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt veces

bajo la especificacioacuten JSP 20 se pueden escribir de una forma maacutes sencilla como sigue

(ahora no se trata de coacutedigo JAVA)

$paramparNombre has visitado esta paacutegina

$atrCuenta veces

La sintaxis de JSP es sensible a mayuacutesculas y minuacutesculas pero un par de comillas simples es

equivalente a un par de comillas dobles

3221 VARIABLES PREDEFINIDAS (Objetos Impliacutecitos)

El lenguaje de expresioacuten JSP 20 soporta los objetos impliacutecitos siguientes

pageContext Objeto de javaxservletjspPageContext que proporciona acceso a los

datos de una peticioacuten

param Coleccioacuten (objeto de tipo javautilMap) de todos los valores de los paraacutemetros

enviados en una peticioacuten un String por paraacutemetro

paramValues Coleccioacuten de todos los valores de los paraacutemetros enviados en una

peticioacuten una matriz de tipo String por paraacutemetro

header Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten un

String por cabecera

headerValues Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten

una matriz de tipo String por cabecera

cookie Coleccioacuten de todos los valores de las cookies un objeto javaxservlethttpCookie

por cookie

initParam Coleccioacuten de todos los valores de los paraacutemetros de iniciacioacuten de la

aplicacioacuten un String por paraacutemetro

Tambieacuten hay objetos que permiten acceder a variables definidas en diferentes aacutembitos lo que

posibilita compartir informacioacuten

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

pageScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de paacutegina

requestScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

peticioacuten

sessionScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de sesioacuten

applicationScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

aplicacioacuten

3222 DIRECTRICES

Las directrices page incluye y taglib son mensajes para el motor JSP y son siempre incluidas

entre los siacutembolos lt y gt

32221 LA DIRECTRIZ PAGE

Define atributos que se aplican a toda la paacutegina JSP donde es incluida

lt page lista_de_atributos gt

Donde la lista_de_atributos puede contener algunos de los siguientes (aquellos que estaacuten

escritos en negrita son los tomados por omisioacuten)

language= ldquoscriptingLanguagerdquo

extends= rdquoclassNamerdquo

import= ldquoimportListrdquo

session= ldquotrue|falserdquo

buffer= ldquonone|sizeKb

autoflush= ldquotrue|falserdquo

isThreadSafe= rdquotrue|falserdquo

info= rdquoinfo_textrdquo

errorPage= ldquoerror_urlrdquo

isErrorPage= rdquotrue|falserdquo

contentType= rdquoctinfordquo

pageEncoding= rdquopeinfordquo

isELIgnored= ldquotrue|falserdquo

Tiacutepicamente se localiza al principio de la paacutegina JSP y puede haber cualquier nuacutemero de

ellas El lenguaje por omisioacuten es Java Ejemplos

lt page contentType=rdquotexthtmlrdquo language=rdquojavardquo gt

lt page import=rdquojavautil javalangrdquo gt

lt page buffer=rdquo5kbrdquo autoflush=rdquofalserdquo gt

32222 LA DIRECTRIZ INCLUDE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

La directriz include incluye un archivo (html jsp xml o de texto) en una paacutegina JSP Esto

permite dividir el contenido de la paacutegina en trozos maacutes manejables

lt incluye file=rdquoURL_relativordquo gt

El ejemplo siguiente muestra dos archivos el primero incluye al segundo para mostrar la

fecha y hora actuales

lt-- fichero mostrarFechaHorajsp --gt

lthtmlgt

ltheadgtlttitlegtIncluir un ficherolttitlegtltheadgt

ltbody bgcolor=whitegt

ltfont color=bluegt

La fecha y hora actuales son

lt include file=fechaHorajsp gt

ltfontgt

ltbodygt

lthtmlgt

lt-- fichero fechaHorajsp --gt

lt page import=javautil gt

lt= (new javautilDate())toLocaleString() gt

32223 LA DIRECTRIZ TAGLIB

La directriz taglib indica la biblioteca de acciones personalizadas que podremos utilizar en

la codificacioacuten de la paacutegina JSP Para distinguir esas acciones entre otras existentes se utiliza

un prefijo (prefix) Su sintaxis es

lt taglib (uri=rdquoURI_bibliotecardquo|tagdir=rdquoDir_biblioteca_tagrdquo)

prefix=rdquoprefijordquo gt

Cuando se trata de una biblioteca definida mediante una clase Java y un descriptor (archivo

tld) eacutesta se identifica mediante un URI (Uniform Resource Identifier- URL relativos) Por

ejemplo

lt taglib uri=rdquohttpMarioRossainzLopezmiBibliotecardquo

prefix=rdquofunrdquo gt

ltpgtltfunaccion01 gt

La uacuteltima liacutenea del ejemplo tiene dos etiquetas una etiqueta p HTML y otra accion01

perteneciente a la biblioteca miBiblioteca En cambio si la biblioteca se define mediante un

archivo tag entonces se identifica mediante su ruta relativa en el sistema de archivos

lt taglib tagdir=rdquoWEB-INFtagsrdquo prefix=rdquofunrdquo gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpgtltfunaccion01 gt

La directriz taglib debe colocarse antes de utilizar en la paacutegina JSP las acciones

personalizadas definidas por la misma Se puede utilizar maacutes de una directriz pero el prefijo

utilizado debe ser uacutenico para cada una de ellas

3223 ACTIVACION DEL LENGUAJE DE EXPRESION (LE)

La especificacioacuten JSP 20 define un lenguaje de expresioacuten como alternativa a elementos de

programacioacuten escritos con coacutedigo Java y especificaciones anteriores a la JSP 20 Para que

este lenguaje pueda ser interpretado tienen que cumplirse 2 requisitos

1 Que la propiedad isELIgnored de la directriz page valga false

lt page isELIgnored= ldquofalserdquo gt

2 Que el descriptor de despliegue webxml en la carpeta WEB-INF indique doacutende se

localiza el esquema XML para la especificacioacuten Servlet 24 que a su vez utiliza el

esquema XML para la especificacioacuten Java Server Page 20

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

Utilizando el lenguaje de expresioacuten se podriacutea modificar la paacutegina Cuentajsp de la seccioacuten

3212 de este documento como se muestra a continuacioacuten Esta nueva paacutegina

1 Especifica que utilizaraacute la biblioteca core de etiquetas estandar (de la que se hablaraacute maacutes

adelante)

2 La primera vez que sea accedida definiraacute la variable atrCuenta en el aacutembito de la

aplicacioacuten con un valor inicial nulo y la incrementaraacute en una unidad cuando sea accedida

sucesivas veces simplemente incrementaraacute esta variable en una unidad

3 Finalmente mostraraacute una paacutegina con un contenido anaacutelogo al siguiente Esta formado

por una cabecera y una segunda liacutenea compuesta por el valor del paraacutemetro parNombre

enviado con la peticioacuten un texto fijo el valor de la variable atrCuenta y otro texto fijo

dependiente del valor de esta variable

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

El coacutedigo completo es el siguiente

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

3224 VARIABLES Y EXPRESIONES

Para acceder a una simple variable se puede escribir algo como lo siguiente $nombre y

para acceder a una propiedad de un objeto podemos escribir algo como

$paramparNombre

$applicationScopeatrCuenta

$pageContextrequestrequestURI

La primera liacutenea del ejemplo anterior obtiene el valor de la propiedad parNombre del objeto

param la segunda el valor del atributo atrCuenta del objeto applicationScope y la tercera

el URL relativo de la paacutegina JSP solicitada

El lenguaje de expresioacuten es maacutes tolerante con respecto a las variables con valor null y ejecuta

muchas maacutes conversiones de forma automaacutetica sobre el tipo de los datos cuando la expresioacuten

a evaluar asiacute lo requiere Por ejemplo la etiqueta condicional siguiente incluye una expresioacuten

que compara el valor del atributo atrCuenta con aacutembito de aplicacioacuten con 10 (convirtiendo

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

impliacutecitamente el valor del atributo al tipo de la constante para poder realizar la comparacioacuten

El resultado seraacute un valor de tipo boolean

ltcif test=rdquo$applicationScopeatrCuenta gt 10rdquogt

ltcifgt

o bien

ltcif test=rdquo$atrCuenta gt 10rdquogt

ltcifgt

Para que una literal pueda incluir un caracter significativo para el lenguaje dicho caracter

debe ser especificado como una secuencia de escape (caracter) Por ejemplo la siguiente

expresioacuten da lugar al literal ldquovezrdquo o ldquovecesrdquo entre comillas dobles

$(atrCuenta gt 1) iquest ldquordquovecesrdquordquo ldquordquovezrdquordquo

Cualquier objeto o atributo de un objeto definido en algunos de los aacutembitos de una paacutegina

puede ser utilizado como una variable Por ejemplo $atrCuenta+1 es una expresioacuten que

realiza la suma de la variable atrCuenta con 1

Cuando se trate de una propiedad de un objeto para acceder a ella se utilizaraacute el operador

punto o bien la notacioacuten empleada para acceder a un elemento de una matriz Por ejemplo

$paramparNombre

$param[ldquoparNombrerdquo]

Una expresioacuten LE puede aparecer en cualquier lugar donde pueda aparecer un texto fijo Por

tanto para informar al contenedor JSP que se trata de una expresioacuten y no de un texto fijo se

utilizan los delimitadores $ al principio y al final

3225 OPERADORES

OPERADOR DESCRIPCIOacuteN Acceso a la propiedad de un objeto o a un elemento de un Map

[] Acceso al elemento de una matriz o de un objeto List

() Pareacutentesis para alterar la prioridad en la evaluacioacuten de una expresioacuten

If ternario condicion expresion1 expresioacuten 2

+ Suma

- Resta

Producto

oacute div Divisioacuten

oacute mod Moacutedulo o resto de una divisioacuten

== oacute eq Igualdad

= oacute ne Diferente

lt oacute lt Menor que

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt oacute gt Mayor que

lt= oacute le Menor o igual que

gt= oacute ge Mayor o igual que

ampamp oacute and Operacioacuten Loacutegica AND

|| oacute or Operacioacuten Loacutegica OR

oacute not Operacioacuten Loacutegica NOT

empty Verifica si el valor de una variable es null si un String esta vaciacuteo o si una matriz Map

o Collection no tienen elementos

func(args) Llamada a una funcioacuten donde func es el nombre de la funcioacuten y arg representa cero o

maacutes argumentos separados por comas

El ejemplo siguiente muestra una paacutegina JSP compuesta por elementos HTML expresiones

LE y objetos impliacutecitos

lthtmlgt

ltheadgtlttitlegtJSP 20lttitlegtltheadgt

ltbodygt

lth3gtLenguaje de expresioacuten (LE)lth3gt

ltpgtLa siguiente tabla ilustra algunas expresiones LE

ltbrgtltbrgtlttable border=1gt

lttrgt

ltthgtltbgtExpresioacutenltbgtltthgt

ltthgtltbgtValorltbgtltthgt

lttrgt

lttrgt

lttdgt$3 + 6lttdgt

lttdgt$3 + 6lttdgt

lttdgt

lttrgt

lttdgt$(7 gt 4) 7 4lttdgt

lttdgt$(7 gt 4) 7 4lttdgt

lttrgt

lttrgt

lttdgt$header[host]lttdgt

lttdgt$header[host]lttdgt

lttrgt

lttablegt

ltbodygt

lthtmlgt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

323 BIBLIOTECA ESTANDAR DE ETIQUETAS

La biblioteca estaacutendar de etiquetas JSP (JSTL ndash Java Server Page Estaacutendar Tag Library)

incluye una cantidad amplia de etiquetas para diferentes aacutereas de trabajo

Aacuterea baacutesica (su prefijo es c ndash core) y contiene

o Soporte de variables (remove y set)

o Control del flujo (choose when otherwise forEach forTokens if)

o Manejo de URL (import param redirect param y url param)

o Operaciones varias (match y out)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlcore

Aacuterea XML (su prefijo es x) y contiene

o Sentencias baacutesicas (out parse y set)

o Control del flujo (choosehellip whenhellip otherwise forEach e if)

o Transformacioacuten de Documentos (transformhellipparam)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlxml

Aacuterea Internacionalizacioacuten (su prefijo es fmt) Contiene

o Localidad (setLocale y requestEncoding)

o Mensajes (bundle message param y setBundle)

o Formateo de Fechas y nuacutemeros (formatNumber formateacuteate parseDate

parseNumber setTimeZone timeZone)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlfmt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Aacuterea SQL (su prefijo es sql) es el lenguaje estandar para interactuar con bases de datos

relacionales y contiene setDataSource Quero dateParam param transaction y

update dateParam param) El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlsql

Aacuterea Funciones (su prefijo es fn) y contiene

o Longitud de una coleccioacuten (length)

o Manipulacioacuten de String (toUpperCase toLowerCase substring

substringAfter substringBefore trim replace indexOf startsWith

endsWith contains containsIgnoreCase split join y escapeXml)

o El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlfunctions

3231 OPERACIONES CON ETIQUETAS BAacuteSICAS

En un ejemplo pasado teniacuteamos el siguiente coacutedigo

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

En este ejemplo se hace referencia al aacuterea baacutesica de JSTL con el prefijo c y se utiliza la

etiqueta cset para definir la variable atrCuenta Si la variable ya esta definida simplemente

se le asigna el valor especificado

La uacuteltima parte del ejemplo anterior podriacutea haberse escrito de esta otra forma

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcif test=rdquo$atrCuenta gt 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcifgt

$atrCuenta $str

La etiqueta cif permite la ejecucioacuten condicional de su cuerpo en funcioacuten del valor del

atributo de test

La etiqueta cchoose permite la ejecucioacuten del cuerpo de la primera etiqueta cwhen cuyo

atributo test sea evaluado a true Si ninguna de las condiciones se evaluacutea a true entonces se

evaluacutea el cuerpo de la etiqueta cotherwise si estaacute presente El siguiente coacutedigo muestra otra

manera de escribir el ejemplo anterior utilizando estas uacuteltimas etiquetas

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcchoosegt

ltcwhen test=rdquo$atrCuenta == 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcwhengt

ltcotherwisegt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcotherwisegt

ltcchoosegt

$atrCuenta $str

La etiqueta cforEach permite iterar sobre una coleccioacuten de objetos La coleccioacuten se

especifica por medio del atributo iacutetems y el elemento actual de la coleccioacuten estaacute disponible a

traveacutes de la variable establecida por el atributo var Por ejemplo el siguiente fragmento de

coacutedigo visualiza una tabla con las variables definidas a nivel de aacutembito de paacutegina

lttable border=rdquo1rdquogt

ltcforEach var=rdquoitemrdquo iacutetems=rdquo$pageScoperdquogt

lttrgt

lttdgt $item lttdgt

lttrgt

ltcforEachgt

lttablegt

La etiqueta ccatch atrapa una excepcioacuten que ocurra en el cuerpo de la misma Por ejemplo

el siguiente segmento de coacutedigo lanzaraacute una excepcioacuten si el paraacutemetro mes se escribe con

letras en vez de con nuacutemeros

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltbodygt

lthtmlgt

Un URL anaacutelogo al siguiente daraacute lugar a que la excepcioacuten sea lanzada cuando se ejecute la

expresioacuten $nMes 3 de la paacutegina anterior

httplocalhost8080JSP2exceppruebajspmes=marzo

La excepcioacuten indica que ha ocurrido un error al tratar de convertir ldquomarzordquo a un entero de

tipo Long Para cachar esta excepcioacuten y darle un tratamiento adecuado habraacute que modificar

la paacutegina JSP anterior como se indica a continuacioacuten

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltccatch var=rdquoerrorOcurridordquogt

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltccatchgt

ltcif test=rdquo$not empty errorOcurridordquogt

Error el paraacutemetro mes debe ser un nuacutemero ltbgt

ltbrgt Informacioacuten del error dada por el sistema

ltbrgt ltfont color=rdquoFF0000rdquogt $errorOcurrido ltfontgt

ltcifgt

ltbodygt

lthtmlgt

3232 ACCESO A BASES DE DATOS CON JSP

Las etiquetas que proporciona el aacuterea SQL permiten realizar

Conexioacuten con una base de datos

Realizacioacuten de consultas a la base de datos

Acceso al conjunto de resultados

Ejecucioacuten de actualizaciones y transacciones

Todas las etiquetas SQL actuacutean sobre una base de datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

32321 CONEXIOacuteN CON LA BASE DE DATOS

La conexioacuten con la base de datos puede realizarse con la etiqueta sqlsetDataSource Por

ejemplo si se esta utilizando el administrador de bases de datos MySql con el controlador

JDBC se puede realizar una conexioacuten con una base de datos digamos bd_tutorias de la

manera siguiente

ltsqlsetDataSource var=rdquobdrdquo

driver=rdquocommysqljdbcDriverrdquo

url=rdquojdbcmysqllocalhost3306bd_tutoriasrdquo

user=rdquoadminrdquo

password=rdquoadminadminrdquo gt

32322 CONSULTA A LA BASE DE DATOS

La etiqueta sqlQuero permite realizar una consulta a una base de datos Por ejemplo el

siguiente fragmento de coacutedigo realiza una consulta a la base de datos representada por bd y

obtiene un conjunto de resultados representado por cdr

ltsqlquery var=rdquocdrrdquo dataSource=rdquo$bdrdquogt

SELECT professor dia hora alumno

FROM profesores tutorias citas

WHERE profesoresid_profesor=tutoriasid_profesor

AND tutoriasid_tutoria=citasid_tutoria

ltsqlquerygt

32323 MODIFICACIONES SOBRE LA BASE DE DATOS

La etiqueta sqlupdate permite ejecutar una sentencia SQL INSERT UPDATE o DELETE

y cualquier otra sentencia SQL que no retorne ninguacuten valor Por ejemplo

ltsqlupdate var=rdquocontrdquo dataSource=rdquo$bdrdquo gt

UPDATE profesores

SET profesor=

WHERE profesor=

ltsqlparam value=rdquo$paramProfesorrdquo gt

ltsqlparam value=rdquo$paramIDrdquo gt

ltsqlupdategt

Una operacioacuten UPDATE puede utilizar el siacutembolo para indicar que el valor que tendriacutea que

evaluarse en esa posicioacuten seraacute suministrado por una etiqueta sqlparam como por ejemplo

httplocalhost8080JSP2sqlpruebajspProfesor=Mario+Rossainz+LopezampID=514

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

los podemos ver cuando se visualiza el coacutedigo fuente en tanto que los comentarios JSP

aunque se inserten en la respuesta enviada por el servidor al cliente no son enviados al

explorador de forma que tampoco se muestran ni se ven cuando se visualiza el coacutedigo fuente

HTML desde el explorador

3211 EXPRESIONES

Se utiliza una expresioacuten JSP para insertar valores directamente en el resultado La sintaxis es

lt= expresioacuten gt Por ejemplo

lt= requestgetParameter(ldquoparNombre) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt lt= s gt

La fecha y hora actual es lt= new javautilDate() gt

La expresioacuten se evaluacutea se convierte a cadena y se inserta en la paacutegina Esta evaluacioacuten se

realiza durante la ejecucioacuten

32111 VARIABLES PREDEFINIDAS

Para simplificar estas expresiones se pueden utilizar cierta cantidad de variables

predefinidas Estos objetos impliacutecitos como tambieacuten se les llama estaacuten disponibles para su

uso durante la implementacioacuten de una paacutegina Web

bull pageContext Es un objeto de la clase PageContext que proporciona acceso a objetos

relacionados con los servlets

bull request Es un objeto de la clase HttpServletRequest que se puede obtener a traveacutes del

meacutetodo getRequest que encapsula los datos enviados por el cliente al servidor

bull response Es un objeto de la clase HttpServletResponse que puede obtenerse a traveacutes

del meacutetodo getResponse que encapsula los datos que el servidor enviaraacute al cliente

bull application Es un objeto de la clase ServletContext que se obtiene a traveacutes del meacutetodo

getServletContext que define un conjunto de meacutetodos que todo servlet utiliza para

comunicar con el contenedor de servlets

bull config Es un objeto de la clase ServletConfig que se obtiene a traveacutes del meacutetodo

getServletConfig y que se utiliza por el contenedor de servlets para pasar informacioacuten

al servlet durante la iniciacioacuten

bull session Es un objeto de la clase HttpSession que se obtiene a traveacutes del meacutetodo

getSession que proporciona una forma de identificar a un usuario que visita las paacuteginas

de un sitio Web

bull out Es un objeto de la clase JspWriter que se obtiene a traveacutes del meacutetodo getOut que

se utiliza para almacenar la respuesta que seraacute enviada al cliente que hizo la peticioacuten de

la paacutegina

bull page Es un objeto geneacuterico de la clase Object que se obtiene a traveacutes del meacutetodo

getPage y que representa al servlet obtenido a partir de la paacutegina JSP

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

bull exception Es un objeto de la clase Exception que se obtiene a traveacutes del meacutetodo

getException que contendraacute informacioacuten a cerca de cualquier excepcioacuten que se lance

desde la paacutegina JSP

Un ejemplo del uso de uno de estos objetos impliacutecitos seriacutea el siguiente

El nombre de tu host es lt= requestgetRemoteHost() gt

El listado siguiente da un ejemplo de una paacutegina JSP que utiliza algunas variables

predefinidas como uso de expresiones JSP

ltDOCTYPE HTML PUBLIC -W3CDTD HTML 40 Transitional ENgt

lthtmlgt

ltheadgt

lttitlegt Expresiones JSP lttitlegt

ltheadgt

ltbodygt

lth2gt Expresiones JSP lth2gt

ltULgt

ltligt Fecha y hora en curso lt= new javautilDate() gt ltligt

ltligt Nombre de su host lt= requestgetRemoteHost() gt ltligt

ltligt Identificador de su sesioacuten lt= sessiongetId() gt ltligt

ltligt El paraacutemetro ltcodegt paramPrueba ltcodegt del formulario

lt= requestgetParameter(paramPrueba) gt ltligt

ltULgt

ltbodygt

lthtmlgt

Cuya salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3212 LOS SCRIPTLETS JSP

Si se desea hacer algo maacutes complejo que una simple expresioacuten los scriptlets permiten insertar

coacutedigo JAVA en el meacutetodo _jspService del servlet (que es ejecutado por service) La sintaxis

utilizada por los scriptlets es lt coacutedigo java gt Los escriptlets tienen acceso a las

mismas variables definidas de forma automaacutetica como expresiones A manera de ejemplo si

se desea que el resultado aparezca en la paacutegina generada deberiacutea de utilizarse la variable out

como en la siguiente instruccioacuten

lt String datosConsultados= requestgetQueryString()

outprintln(ldquoDatos GET adjuntos ldquo+datosConsultados)

gt

En este ejemplo podriacutea haberse obtenido el mismo resultado utilizando la siguiente expresioacuten

JSP

Datos GET adjuntos lt=requestgetQueryString() gt

En general los scriptlets pueden ejecutar varias tareas que no podriacutean realizarse con las

expresiones Tales tareas incluyen

bull La determinacioacuten de encabezados de respuesta

bull Actualizacioacuten de Bases de Datos

bull Ejecucioacuten de bucles condiciones y otras estructuras complejas

lt for (int i=1 ilt=6 i++)

gt

lth lt=i gtgt Hola Mundo lthlt=i gtgt

lt gt

Como un ejemplo concreto se muestra la siguiente paacutegina JSP llamada Cuentajsp en donde

se observa coacutemo se hace un seguimiento del nuacutemero de veces que un cliente accede a esta

paacutegina a traveacutes de distintas sesiones Para ello supondremos que dicha cuenta es el valor del

atributo atrCuenta del objeto impliacutecito application ya citado La primera vez que el cliente

accede a la paacutegina el valor de atrCuenta seraacute null debido a que auacuten no ha sido fijado este

atributo en este caso se fijaraacute con el valor 1 En los siguientes accesos se leeraacute el valor del

atributo atrCuenta se incrementaraacute en una unidad y se volveraacute a fijar Finalmente se enviacutea

la respuesta al cliente para que se muestre al usuario el valor del contador

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en el objeto impliacutecito application con el nombre

atrCuenta

--gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt

Integer cuenta = (Integer)applicationgetAttribute(atrCuenta)

String s = vez

if (cuenta == null)

cuenta = new Integer(1)

else

cuenta = new Integer(cuentaintValue() + 1)

s = veces

applicationsetAttribute(atrCuenta cuenta)

gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

Has visitado esta paacutegina lt= cuenta gt lt= s gt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional un fragmento de coacutedigo JAVA o scriptlet

expresiones y comentarioshellip

Aquiacute otro ejemplo de la ejecucioacuten de un coacutedigo demasiado complejo para una expresioacuten JSP

Este listado presenta una paacutegina JSP que utiliza el paraacutemetro de peticioacuten colorFondo para

establecer el color de fondo de la paacutegina

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgt

lttitlegt Prueba de Color lttitlegt

ltheadgt

lt

String colorFondo=requestgetParameter(colorFondo)

boolean tieneColorExplicito

if (colorFondo =null)

tieneColorExplicito=true

else

tieneColorExplicito=false

colorFondo=WHITE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt

ltbody bgcolor=lt= colorFondo gtgt

lth2 align=centergt Prueba de color lth2gt

lt

if (tieneColorExplicito)

outprintln(Ha indicado un color de fondo expliacutecito +

colorFondo +)

else

outprintln(Usareacute el color de fondo predeterminado WHITE +

Indique el atributo de peticioacuten

ltigtcolorFondoltigt+

para intentar un color estaacutendar un +

valor RRGGBB o para ver si el navegador Web +

permite el uso de nombres de color X11)

gt

ltbodygt

lthtmlgt

Cuyas posibles salidas son

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3213 DECLARACIONES JSP

Una declaracioacuten JSP permite definir meacutetodos o campos que seraacuten insertados en el cuerpo

principal de la clase del servlet (fuera del meacutetodo _jspService) Una declaracioacuten tiene la

sintaxis lt Coacutedigo Java gt Por ejemplo

lt int i=0 gt

lt

Public void jspinit()

coacutedigo de iniciacioacuten

gt

Una declaracioacuten no genera ninguacuten resultado y se usan junto con las expresiones JSP o los

scriptlets A continuacioacuten se muestra una paacutegina JSP que despliega la cantidad de veces que

se ha solicitado esta paacutegina desde que se arrancoacute el servidor haciendo uso de las

declaraciones JSP

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtDeclaraciones JSPlttitlegtltheadgt

ltbodygt

lth1gtDeclaraciones JSPlth1gt

lt-- Esto es un comentario en JSP --gt

lt private int recuentoAccesos=0 gt

lth2gt Accesos a la paacutegina desde el reinicio del servidor

lt= ++recuentoAccesos gt lth2gt

ltbodygt

lthtmlgt

La salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

322 EL LENGUAJE DE EXPRESION EN JSP 20

Anteriormente se ha visto la necesidad de utilizar fragmentos de coacutedigo java en el desarrollo

de paacuteginas JSP pero con la aparicioacuten de la especificacioacuten JSP 20 ya no hay necesidad de

utilizar fragmentos de coacutedigo Java para nada gracias al nuevo lenguaje de expresioacuten EL

(Expresioacuten Language) a la biblioteca de etiquetas estandar JSTL (JSP Standar Tag Library)

y a las nuevas formas para desarrollar etiquetas personalizadas

El lenguaje de expresioacuten JSP es maacutes un lenguaje de acceso a datos que un lenguaje de

programacioacuten Ya se ha visto que para pasar informacioacuten de un cliente a una paacutegina JSP se

utilizan paraacutemetros en la peticioacuten y atributos en la paacutegina El lenguaje de expresioacuten lo hace

posible sin tener que utilizar scriptlets o expresiones (lt= expresioacuten gt) Por ejemplo las

liacuteneas JSP 12 siguientes escritas utilizando coacutedigo Java

lt= requestgetParameter(ldquoparNombrerdquo) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt veces

bajo la especificacioacuten JSP 20 se pueden escribir de una forma maacutes sencilla como sigue

(ahora no se trata de coacutedigo JAVA)

$paramparNombre has visitado esta paacutegina

$atrCuenta veces

La sintaxis de JSP es sensible a mayuacutesculas y minuacutesculas pero un par de comillas simples es

equivalente a un par de comillas dobles

3221 VARIABLES PREDEFINIDAS (Objetos Impliacutecitos)

El lenguaje de expresioacuten JSP 20 soporta los objetos impliacutecitos siguientes

pageContext Objeto de javaxservletjspPageContext que proporciona acceso a los

datos de una peticioacuten

param Coleccioacuten (objeto de tipo javautilMap) de todos los valores de los paraacutemetros

enviados en una peticioacuten un String por paraacutemetro

paramValues Coleccioacuten de todos los valores de los paraacutemetros enviados en una

peticioacuten una matriz de tipo String por paraacutemetro

header Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten un

String por cabecera

headerValues Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten

una matriz de tipo String por cabecera

cookie Coleccioacuten de todos los valores de las cookies un objeto javaxservlethttpCookie

por cookie

initParam Coleccioacuten de todos los valores de los paraacutemetros de iniciacioacuten de la

aplicacioacuten un String por paraacutemetro

Tambieacuten hay objetos que permiten acceder a variables definidas en diferentes aacutembitos lo que

posibilita compartir informacioacuten

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

pageScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de paacutegina

requestScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

peticioacuten

sessionScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de sesioacuten

applicationScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

aplicacioacuten

3222 DIRECTRICES

Las directrices page incluye y taglib son mensajes para el motor JSP y son siempre incluidas

entre los siacutembolos lt y gt

32221 LA DIRECTRIZ PAGE

Define atributos que se aplican a toda la paacutegina JSP donde es incluida

lt page lista_de_atributos gt

Donde la lista_de_atributos puede contener algunos de los siguientes (aquellos que estaacuten

escritos en negrita son los tomados por omisioacuten)

language= ldquoscriptingLanguagerdquo

extends= rdquoclassNamerdquo

import= ldquoimportListrdquo

session= ldquotrue|falserdquo

buffer= ldquonone|sizeKb

autoflush= ldquotrue|falserdquo

isThreadSafe= rdquotrue|falserdquo

info= rdquoinfo_textrdquo

errorPage= ldquoerror_urlrdquo

isErrorPage= rdquotrue|falserdquo

contentType= rdquoctinfordquo

pageEncoding= rdquopeinfordquo

isELIgnored= ldquotrue|falserdquo

Tiacutepicamente se localiza al principio de la paacutegina JSP y puede haber cualquier nuacutemero de

ellas El lenguaje por omisioacuten es Java Ejemplos

lt page contentType=rdquotexthtmlrdquo language=rdquojavardquo gt

lt page import=rdquojavautil javalangrdquo gt

lt page buffer=rdquo5kbrdquo autoflush=rdquofalserdquo gt

32222 LA DIRECTRIZ INCLUDE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

La directriz include incluye un archivo (html jsp xml o de texto) en una paacutegina JSP Esto

permite dividir el contenido de la paacutegina en trozos maacutes manejables

lt incluye file=rdquoURL_relativordquo gt

El ejemplo siguiente muestra dos archivos el primero incluye al segundo para mostrar la

fecha y hora actuales

lt-- fichero mostrarFechaHorajsp --gt

lthtmlgt

ltheadgtlttitlegtIncluir un ficherolttitlegtltheadgt

ltbody bgcolor=whitegt

ltfont color=bluegt

La fecha y hora actuales son

lt include file=fechaHorajsp gt

ltfontgt

ltbodygt

lthtmlgt

lt-- fichero fechaHorajsp --gt

lt page import=javautil gt

lt= (new javautilDate())toLocaleString() gt

32223 LA DIRECTRIZ TAGLIB

La directriz taglib indica la biblioteca de acciones personalizadas que podremos utilizar en

la codificacioacuten de la paacutegina JSP Para distinguir esas acciones entre otras existentes se utiliza

un prefijo (prefix) Su sintaxis es

lt taglib (uri=rdquoURI_bibliotecardquo|tagdir=rdquoDir_biblioteca_tagrdquo)

prefix=rdquoprefijordquo gt

Cuando se trata de una biblioteca definida mediante una clase Java y un descriptor (archivo

tld) eacutesta se identifica mediante un URI (Uniform Resource Identifier- URL relativos) Por

ejemplo

lt taglib uri=rdquohttpMarioRossainzLopezmiBibliotecardquo

prefix=rdquofunrdquo gt

ltpgtltfunaccion01 gt

La uacuteltima liacutenea del ejemplo tiene dos etiquetas una etiqueta p HTML y otra accion01

perteneciente a la biblioteca miBiblioteca En cambio si la biblioteca se define mediante un

archivo tag entonces se identifica mediante su ruta relativa en el sistema de archivos

lt taglib tagdir=rdquoWEB-INFtagsrdquo prefix=rdquofunrdquo gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpgtltfunaccion01 gt

La directriz taglib debe colocarse antes de utilizar en la paacutegina JSP las acciones

personalizadas definidas por la misma Se puede utilizar maacutes de una directriz pero el prefijo

utilizado debe ser uacutenico para cada una de ellas

3223 ACTIVACION DEL LENGUAJE DE EXPRESION (LE)

La especificacioacuten JSP 20 define un lenguaje de expresioacuten como alternativa a elementos de

programacioacuten escritos con coacutedigo Java y especificaciones anteriores a la JSP 20 Para que

este lenguaje pueda ser interpretado tienen que cumplirse 2 requisitos

1 Que la propiedad isELIgnored de la directriz page valga false

lt page isELIgnored= ldquofalserdquo gt

2 Que el descriptor de despliegue webxml en la carpeta WEB-INF indique doacutende se

localiza el esquema XML para la especificacioacuten Servlet 24 que a su vez utiliza el

esquema XML para la especificacioacuten Java Server Page 20

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

Utilizando el lenguaje de expresioacuten se podriacutea modificar la paacutegina Cuentajsp de la seccioacuten

3212 de este documento como se muestra a continuacioacuten Esta nueva paacutegina

1 Especifica que utilizaraacute la biblioteca core de etiquetas estandar (de la que se hablaraacute maacutes

adelante)

2 La primera vez que sea accedida definiraacute la variable atrCuenta en el aacutembito de la

aplicacioacuten con un valor inicial nulo y la incrementaraacute en una unidad cuando sea accedida

sucesivas veces simplemente incrementaraacute esta variable en una unidad

3 Finalmente mostraraacute una paacutegina con un contenido anaacutelogo al siguiente Esta formado

por una cabecera y una segunda liacutenea compuesta por el valor del paraacutemetro parNombre

enviado con la peticioacuten un texto fijo el valor de la variable atrCuenta y otro texto fijo

dependiente del valor de esta variable

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

El coacutedigo completo es el siguiente

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

3224 VARIABLES Y EXPRESIONES

Para acceder a una simple variable se puede escribir algo como lo siguiente $nombre y

para acceder a una propiedad de un objeto podemos escribir algo como

$paramparNombre

$applicationScopeatrCuenta

$pageContextrequestrequestURI

La primera liacutenea del ejemplo anterior obtiene el valor de la propiedad parNombre del objeto

param la segunda el valor del atributo atrCuenta del objeto applicationScope y la tercera

el URL relativo de la paacutegina JSP solicitada

El lenguaje de expresioacuten es maacutes tolerante con respecto a las variables con valor null y ejecuta

muchas maacutes conversiones de forma automaacutetica sobre el tipo de los datos cuando la expresioacuten

a evaluar asiacute lo requiere Por ejemplo la etiqueta condicional siguiente incluye una expresioacuten

que compara el valor del atributo atrCuenta con aacutembito de aplicacioacuten con 10 (convirtiendo

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

impliacutecitamente el valor del atributo al tipo de la constante para poder realizar la comparacioacuten

El resultado seraacute un valor de tipo boolean

ltcif test=rdquo$applicationScopeatrCuenta gt 10rdquogt

ltcifgt

o bien

ltcif test=rdquo$atrCuenta gt 10rdquogt

ltcifgt

Para que una literal pueda incluir un caracter significativo para el lenguaje dicho caracter

debe ser especificado como una secuencia de escape (caracter) Por ejemplo la siguiente

expresioacuten da lugar al literal ldquovezrdquo o ldquovecesrdquo entre comillas dobles

$(atrCuenta gt 1) iquest ldquordquovecesrdquordquo ldquordquovezrdquordquo

Cualquier objeto o atributo de un objeto definido en algunos de los aacutembitos de una paacutegina

puede ser utilizado como una variable Por ejemplo $atrCuenta+1 es una expresioacuten que

realiza la suma de la variable atrCuenta con 1

Cuando se trate de una propiedad de un objeto para acceder a ella se utilizaraacute el operador

punto o bien la notacioacuten empleada para acceder a un elemento de una matriz Por ejemplo

$paramparNombre

$param[ldquoparNombrerdquo]

Una expresioacuten LE puede aparecer en cualquier lugar donde pueda aparecer un texto fijo Por

tanto para informar al contenedor JSP que se trata de una expresioacuten y no de un texto fijo se

utilizan los delimitadores $ al principio y al final

3225 OPERADORES

OPERADOR DESCRIPCIOacuteN Acceso a la propiedad de un objeto o a un elemento de un Map

[] Acceso al elemento de una matriz o de un objeto List

() Pareacutentesis para alterar la prioridad en la evaluacioacuten de una expresioacuten

If ternario condicion expresion1 expresioacuten 2

+ Suma

- Resta

Producto

oacute div Divisioacuten

oacute mod Moacutedulo o resto de una divisioacuten

== oacute eq Igualdad

= oacute ne Diferente

lt oacute lt Menor que

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt oacute gt Mayor que

lt= oacute le Menor o igual que

gt= oacute ge Mayor o igual que

ampamp oacute and Operacioacuten Loacutegica AND

|| oacute or Operacioacuten Loacutegica OR

oacute not Operacioacuten Loacutegica NOT

empty Verifica si el valor de una variable es null si un String esta vaciacuteo o si una matriz Map

o Collection no tienen elementos

func(args) Llamada a una funcioacuten donde func es el nombre de la funcioacuten y arg representa cero o

maacutes argumentos separados por comas

El ejemplo siguiente muestra una paacutegina JSP compuesta por elementos HTML expresiones

LE y objetos impliacutecitos

lthtmlgt

ltheadgtlttitlegtJSP 20lttitlegtltheadgt

ltbodygt

lth3gtLenguaje de expresioacuten (LE)lth3gt

ltpgtLa siguiente tabla ilustra algunas expresiones LE

ltbrgtltbrgtlttable border=1gt

lttrgt

ltthgtltbgtExpresioacutenltbgtltthgt

ltthgtltbgtValorltbgtltthgt

lttrgt

lttrgt

lttdgt$3 + 6lttdgt

lttdgt$3 + 6lttdgt

lttdgt

lttrgt

lttdgt$(7 gt 4) 7 4lttdgt

lttdgt$(7 gt 4) 7 4lttdgt

lttrgt

lttrgt

lttdgt$header[host]lttdgt

lttdgt$header[host]lttdgt

lttrgt

lttablegt

ltbodygt

lthtmlgt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

323 BIBLIOTECA ESTANDAR DE ETIQUETAS

La biblioteca estaacutendar de etiquetas JSP (JSTL ndash Java Server Page Estaacutendar Tag Library)

incluye una cantidad amplia de etiquetas para diferentes aacutereas de trabajo

Aacuterea baacutesica (su prefijo es c ndash core) y contiene

o Soporte de variables (remove y set)

o Control del flujo (choose when otherwise forEach forTokens if)

o Manejo de URL (import param redirect param y url param)

o Operaciones varias (match y out)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlcore

Aacuterea XML (su prefijo es x) y contiene

o Sentencias baacutesicas (out parse y set)

o Control del flujo (choosehellip whenhellip otherwise forEach e if)

o Transformacioacuten de Documentos (transformhellipparam)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlxml

Aacuterea Internacionalizacioacuten (su prefijo es fmt) Contiene

o Localidad (setLocale y requestEncoding)

o Mensajes (bundle message param y setBundle)

o Formateo de Fechas y nuacutemeros (formatNumber formateacuteate parseDate

parseNumber setTimeZone timeZone)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlfmt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Aacuterea SQL (su prefijo es sql) es el lenguaje estandar para interactuar con bases de datos

relacionales y contiene setDataSource Quero dateParam param transaction y

update dateParam param) El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlsql

Aacuterea Funciones (su prefijo es fn) y contiene

o Longitud de una coleccioacuten (length)

o Manipulacioacuten de String (toUpperCase toLowerCase substring

substringAfter substringBefore trim replace indexOf startsWith

endsWith contains containsIgnoreCase split join y escapeXml)

o El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlfunctions

3231 OPERACIONES CON ETIQUETAS BAacuteSICAS

En un ejemplo pasado teniacuteamos el siguiente coacutedigo

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

En este ejemplo se hace referencia al aacuterea baacutesica de JSTL con el prefijo c y se utiliza la

etiqueta cset para definir la variable atrCuenta Si la variable ya esta definida simplemente

se le asigna el valor especificado

La uacuteltima parte del ejemplo anterior podriacutea haberse escrito de esta otra forma

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcif test=rdquo$atrCuenta gt 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcifgt

$atrCuenta $str

La etiqueta cif permite la ejecucioacuten condicional de su cuerpo en funcioacuten del valor del

atributo de test

La etiqueta cchoose permite la ejecucioacuten del cuerpo de la primera etiqueta cwhen cuyo

atributo test sea evaluado a true Si ninguna de las condiciones se evaluacutea a true entonces se

evaluacutea el cuerpo de la etiqueta cotherwise si estaacute presente El siguiente coacutedigo muestra otra

manera de escribir el ejemplo anterior utilizando estas uacuteltimas etiquetas

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcchoosegt

ltcwhen test=rdquo$atrCuenta == 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcwhengt

ltcotherwisegt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcotherwisegt

ltcchoosegt

$atrCuenta $str

La etiqueta cforEach permite iterar sobre una coleccioacuten de objetos La coleccioacuten se

especifica por medio del atributo iacutetems y el elemento actual de la coleccioacuten estaacute disponible a

traveacutes de la variable establecida por el atributo var Por ejemplo el siguiente fragmento de

coacutedigo visualiza una tabla con las variables definidas a nivel de aacutembito de paacutegina

lttable border=rdquo1rdquogt

ltcforEach var=rdquoitemrdquo iacutetems=rdquo$pageScoperdquogt

lttrgt

lttdgt $item lttdgt

lttrgt

ltcforEachgt

lttablegt

La etiqueta ccatch atrapa una excepcioacuten que ocurra en el cuerpo de la misma Por ejemplo

el siguiente segmento de coacutedigo lanzaraacute una excepcioacuten si el paraacutemetro mes se escribe con

letras en vez de con nuacutemeros

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltbodygt

lthtmlgt

Un URL anaacutelogo al siguiente daraacute lugar a que la excepcioacuten sea lanzada cuando se ejecute la

expresioacuten $nMes 3 de la paacutegina anterior

httplocalhost8080JSP2exceppruebajspmes=marzo

La excepcioacuten indica que ha ocurrido un error al tratar de convertir ldquomarzordquo a un entero de

tipo Long Para cachar esta excepcioacuten y darle un tratamiento adecuado habraacute que modificar

la paacutegina JSP anterior como se indica a continuacioacuten

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltccatch var=rdquoerrorOcurridordquogt

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltccatchgt

ltcif test=rdquo$not empty errorOcurridordquogt

Error el paraacutemetro mes debe ser un nuacutemero ltbgt

ltbrgt Informacioacuten del error dada por el sistema

ltbrgt ltfont color=rdquoFF0000rdquogt $errorOcurrido ltfontgt

ltcifgt

ltbodygt

lthtmlgt

3232 ACCESO A BASES DE DATOS CON JSP

Las etiquetas que proporciona el aacuterea SQL permiten realizar

Conexioacuten con una base de datos

Realizacioacuten de consultas a la base de datos

Acceso al conjunto de resultados

Ejecucioacuten de actualizaciones y transacciones

Todas las etiquetas SQL actuacutean sobre una base de datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

32321 CONEXIOacuteN CON LA BASE DE DATOS

La conexioacuten con la base de datos puede realizarse con la etiqueta sqlsetDataSource Por

ejemplo si se esta utilizando el administrador de bases de datos MySql con el controlador

JDBC se puede realizar una conexioacuten con una base de datos digamos bd_tutorias de la

manera siguiente

ltsqlsetDataSource var=rdquobdrdquo

driver=rdquocommysqljdbcDriverrdquo

url=rdquojdbcmysqllocalhost3306bd_tutoriasrdquo

user=rdquoadminrdquo

password=rdquoadminadminrdquo gt

32322 CONSULTA A LA BASE DE DATOS

La etiqueta sqlQuero permite realizar una consulta a una base de datos Por ejemplo el

siguiente fragmento de coacutedigo realiza una consulta a la base de datos representada por bd y

obtiene un conjunto de resultados representado por cdr

ltsqlquery var=rdquocdrrdquo dataSource=rdquo$bdrdquogt

SELECT professor dia hora alumno

FROM profesores tutorias citas

WHERE profesoresid_profesor=tutoriasid_profesor

AND tutoriasid_tutoria=citasid_tutoria

ltsqlquerygt

32323 MODIFICACIONES SOBRE LA BASE DE DATOS

La etiqueta sqlupdate permite ejecutar una sentencia SQL INSERT UPDATE o DELETE

y cualquier otra sentencia SQL que no retorne ninguacuten valor Por ejemplo

ltsqlupdate var=rdquocontrdquo dataSource=rdquo$bdrdquo gt

UPDATE profesores

SET profesor=

WHERE profesor=

ltsqlparam value=rdquo$paramProfesorrdquo gt

ltsqlparam value=rdquo$paramIDrdquo gt

ltsqlupdategt

Una operacioacuten UPDATE puede utilizar el siacutembolo para indicar que el valor que tendriacutea que

evaluarse en esa posicioacuten seraacute suministrado por una etiqueta sqlparam como por ejemplo

httplocalhost8080JSP2sqlpruebajspProfesor=Mario+Rossainz+LopezampID=514

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

bull exception Es un objeto de la clase Exception que se obtiene a traveacutes del meacutetodo

getException que contendraacute informacioacuten a cerca de cualquier excepcioacuten que se lance

desde la paacutegina JSP

Un ejemplo del uso de uno de estos objetos impliacutecitos seriacutea el siguiente

El nombre de tu host es lt= requestgetRemoteHost() gt

El listado siguiente da un ejemplo de una paacutegina JSP que utiliza algunas variables

predefinidas como uso de expresiones JSP

ltDOCTYPE HTML PUBLIC -W3CDTD HTML 40 Transitional ENgt

lthtmlgt

ltheadgt

lttitlegt Expresiones JSP lttitlegt

ltheadgt

ltbodygt

lth2gt Expresiones JSP lth2gt

ltULgt

ltligt Fecha y hora en curso lt= new javautilDate() gt ltligt

ltligt Nombre de su host lt= requestgetRemoteHost() gt ltligt

ltligt Identificador de su sesioacuten lt= sessiongetId() gt ltligt

ltligt El paraacutemetro ltcodegt paramPrueba ltcodegt del formulario

lt= requestgetParameter(paramPrueba) gt ltligt

ltULgt

ltbodygt

lthtmlgt

Cuya salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3212 LOS SCRIPTLETS JSP

Si se desea hacer algo maacutes complejo que una simple expresioacuten los scriptlets permiten insertar

coacutedigo JAVA en el meacutetodo _jspService del servlet (que es ejecutado por service) La sintaxis

utilizada por los scriptlets es lt coacutedigo java gt Los escriptlets tienen acceso a las

mismas variables definidas de forma automaacutetica como expresiones A manera de ejemplo si

se desea que el resultado aparezca en la paacutegina generada deberiacutea de utilizarse la variable out

como en la siguiente instruccioacuten

lt String datosConsultados= requestgetQueryString()

outprintln(ldquoDatos GET adjuntos ldquo+datosConsultados)

gt

En este ejemplo podriacutea haberse obtenido el mismo resultado utilizando la siguiente expresioacuten

JSP

Datos GET adjuntos lt=requestgetQueryString() gt

En general los scriptlets pueden ejecutar varias tareas que no podriacutean realizarse con las

expresiones Tales tareas incluyen

bull La determinacioacuten de encabezados de respuesta

bull Actualizacioacuten de Bases de Datos

bull Ejecucioacuten de bucles condiciones y otras estructuras complejas

lt for (int i=1 ilt=6 i++)

gt

lth lt=i gtgt Hola Mundo lthlt=i gtgt

lt gt

Como un ejemplo concreto se muestra la siguiente paacutegina JSP llamada Cuentajsp en donde

se observa coacutemo se hace un seguimiento del nuacutemero de veces que un cliente accede a esta

paacutegina a traveacutes de distintas sesiones Para ello supondremos que dicha cuenta es el valor del

atributo atrCuenta del objeto impliacutecito application ya citado La primera vez que el cliente

accede a la paacutegina el valor de atrCuenta seraacute null debido a que auacuten no ha sido fijado este

atributo en este caso se fijaraacute con el valor 1 En los siguientes accesos se leeraacute el valor del

atributo atrCuenta se incrementaraacute en una unidad y se volveraacute a fijar Finalmente se enviacutea

la respuesta al cliente para que se muestre al usuario el valor del contador

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en el objeto impliacutecito application con el nombre

atrCuenta

--gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt

Integer cuenta = (Integer)applicationgetAttribute(atrCuenta)

String s = vez

if (cuenta == null)

cuenta = new Integer(1)

else

cuenta = new Integer(cuentaintValue() + 1)

s = veces

applicationsetAttribute(atrCuenta cuenta)

gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

Has visitado esta paacutegina lt= cuenta gt lt= s gt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional un fragmento de coacutedigo JAVA o scriptlet

expresiones y comentarioshellip

Aquiacute otro ejemplo de la ejecucioacuten de un coacutedigo demasiado complejo para una expresioacuten JSP

Este listado presenta una paacutegina JSP que utiliza el paraacutemetro de peticioacuten colorFondo para

establecer el color de fondo de la paacutegina

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgt

lttitlegt Prueba de Color lttitlegt

ltheadgt

lt

String colorFondo=requestgetParameter(colorFondo)

boolean tieneColorExplicito

if (colorFondo =null)

tieneColorExplicito=true

else

tieneColorExplicito=false

colorFondo=WHITE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt

ltbody bgcolor=lt= colorFondo gtgt

lth2 align=centergt Prueba de color lth2gt

lt

if (tieneColorExplicito)

outprintln(Ha indicado un color de fondo expliacutecito +

colorFondo +)

else

outprintln(Usareacute el color de fondo predeterminado WHITE +

Indique el atributo de peticioacuten

ltigtcolorFondoltigt+

para intentar un color estaacutendar un +

valor RRGGBB o para ver si el navegador Web +

permite el uso de nombres de color X11)

gt

ltbodygt

lthtmlgt

Cuyas posibles salidas son

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3213 DECLARACIONES JSP

Una declaracioacuten JSP permite definir meacutetodos o campos que seraacuten insertados en el cuerpo

principal de la clase del servlet (fuera del meacutetodo _jspService) Una declaracioacuten tiene la

sintaxis lt Coacutedigo Java gt Por ejemplo

lt int i=0 gt

lt

Public void jspinit()

coacutedigo de iniciacioacuten

gt

Una declaracioacuten no genera ninguacuten resultado y se usan junto con las expresiones JSP o los

scriptlets A continuacioacuten se muestra una paacutegina JSP que despliega la cantidad de veces que

se ha solicitado esta paacutegina desde que se arrancoacute el servidor haciendo uso de las

declaraciones JSP

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtDeclaraciones JSPlttitlegtltheadgt

ltbodygt

lth1gtDeclaraciones JSPlth1gt

lt-- Esto es un comentario en JSP --gt

lt private int recuentoAccesos=0 gt

lth2gt Accesos a la paacutegina desde el reinicio del servidor

lt= ++recuentoAccesos gt lth2gt

ltbodygt

lthtmlgt

La salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

322 EL LENGUAJE DE EXPRESION EN JSP 20

Anteriormente se ha visto la necesidad de utilizar fragmentos de coacutedigo java en el desarrollo

de paacuteginas JSP pero con la aparicioacuten de la especificacioacuten JSP 20 ya no hay necesidad de

utilizar fragmentos de coacutedigo Java para nada gracias al nuevo lenguaje de expresioacuten EL

(Expresioacuten Language) a la biblioteca de etiquetas estandar JSTL (JSP Standar Tag Library)

y a las nuevas formas para desarrollar etiquetas personalizadas

El lenguaje de expresioacuten JSP es maacutes un lenguaje de acceso a datos que un lenguaje de

programacioacuten Ya se ha visto que para pasar informacioacuten de un cliente a una paacutegina JSP se

utilizan paraacutemetros en la peticioacuten y atributos en la paacutegina El lenguaje de expresioacuten lo hace

posible sin tener que utilizar scriptlets o expresiones (lt= expresioacuten gt) Por ejemplo las

liacuteneas JSP 12 siguientes escritas utilizando coacutedigo Java

lt= requestgetParameter(ldquoparNombrerdquo) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt veces

bajo la especificacioacuten JSP 20 se pueden escribir de una forma maacutes sencilla como sigue

(ahora no se trata de coacutedigo JAVA)

$paramparNombre has visitado esta paacutegina

$atrCuenta veces

La sintaxis de JSP es sensible a mayuacutesculas y minuacutesculas pero un par de comillas simples es

equivalente a un par de comillas dobles

3221 VARIABLES PREDEFINIDAS (Objetos Impliacutecitos)

El lenguaje de expresioacuten JSP 20 soporta los objetos impliacutecitos siguientes

pageContext Objeto de javaxservletjspPageContext que proporciona acceso a los

datos de una peticioacuten

param Coleccioacuten (objeto de tipo javautilMap) de todos los valores de los paraacutemetros

enviados en una peticioacuten un String por paraacutemetro

paramValues Coleccioacuten de todos los valores de los paraacutemetros enviados en una

peticioacuten una matriz de tipo String por paraacutemetro

header Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten un

String por cabecera

headerValues Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten

una matriz de tipo String por cabecera

cookie Coleccioacuten de todos los valores de las cookies un objeto javaxservlethttpCookie

por cookie

initParam Coleccioacuten de todos los valores de los paraacutemetros de iniciacioacuten de la

aplicacioacuten un String por paraacutemetro

Tambieacuten hay objetos que permiten acceder a variables definidas en diferentes aacutembitos lo que

posibilita compartir informacioacuten

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

pageScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de paacutegina

requestScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

peticioacuten

sessionScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de sesioacuten

applicationScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

aplicacioacuten

3222 DIRECTRICES

Las directrices page incluye y taglib son mensajes para el motor JSP y son siempre incluidas

entre los siacutembolos lt y gt

32221 LA DIRECTRIZ PAGE

Define atributos que se aplican a toda la paacutegina JSP donde es incluida

lt page lista_de_atributos gt

Donde la lista_de_atributos puede contener algunos de los siguientes (aquellos que estaacuten

escritos en negrita son los tomados por omisioacuten)

language= ldquoscriptingLanguagerdquo

extends= rdquoclassNamerdquo

import= ldquoimportListrdquo

session= ldquotrue|falserdquo

buffer= ldquonone|sizeKb

autoflush= ldquotrue|falserdquo

isThreadSafe= rdquotrue|falserdquo

info= rdquoinfo_textrdquo

errorPage= ldquoerror_urlrdquo

isErrorPage= rdquotrue|falserdquo

contentType= rdquoctinfordquo

pageEncoding= rdquopeinfordquo

isELIgnored= ldquotrue|falserdquo

Tiacutepicamente se localiza al principio de la paacutegina JSP y puede haber cualquier nuacutemero de

ellas El lenguaje por omisioacuten es Java Ejemplos

lt page contentType=rdquotexthtmlrdquo language=rdquojavardquo gt

lt page import=rdquojavautil javalangrdquo gt

lt page buffer=rdquo5kbrdquo autoflush=rdquofalserdquo gt

32222 LA DIRECTRIZ INCLUDE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

La directriz include incluye un archivo (html jsp xml o de texto) en una paacutegina JSP Esto

permite dividir el contenido de la paacutegina en trozos maacutes manejables

lt incluye file=rdquoURL_relativordquo gt

El ejemplo siguiente muestra dos archivos el primero incluye al segundo para mostrar la

fecha y hora actuales

lt-- fichero mostrarFechaHorajsp --gt

lthtmlgt

ltheadgtlttitlegtIncluir un ficherolttitlegtltheadgt

ltbody bgcolor=whitegt

ltfont color=bluegt

La fecha y hora actuales son

lt include file=fechaHorajsp gt

ltfontgt

ltbodygt

lthtmlgt

lt-- fichero fechaHorajsp --gt

lt page import=javautil gt

lt= (new javautilDate())toLocaleString() gt

32223 LA DIRECTRIZ TAGLIB

La directriz taglib indica la biblioteca de acciones personalizadas que podremos utilizar en

la codificacioacuten de la paacutegina JSP Para distinguir esas acciones entre otras existentes se utiliza

un prefijo (prefix) Su sintaxis es

lt taglib (uri=rdquoURI_bibliotecardquo|tagdir=rdquoDir_biblioteca_tagrdquo)

prefix=rdquoprefijordquo gt

Cuando se trata de una biblioteca definida mediante una clase Java y un descriptor (archivo

tld) eacutesta se identifica mediante un URI (Uniform Resource Identifier- URL relativos) Por

ejemplo

lt taglib uri=rdquohttpMarioRossainzLopezmiBibliotecardquo

prefix=rdquofunrdquo gt

ltpgtltfunaccion01 gt

La uacuteltima liacutenea del ejemplo tiene dos etiquetas una etiqueta p HTML y otra accion01

perteneciente a la biblioteca miBiblioteca En cambio si la biblioteca se define mediante un

archivo tag entonces se identifica mediante su ruta relativa en el sistema de archivos

lt taglib tagdir=rdquoWEB-INFtagsrdquo prefix=rdquofunrdquo gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpgtltfunaccion01 gt

La directriz taglib debe colocarse antes de utilizar en la paacutegina JSP las acciones

personalizadas definidas por la misma Se puede utilizar maacutes de una directriz pero el prefijo

utilizado debe ser uacutenico para cada una de ellas

3223 ACTIVACION DEL LENGUAJE DE EXPRESION (LE)

La especificacioacuten JSP 20 define un lenguaje de expresioacuten como alternativa a elementos de

programacioacuten escritos con coacutedigo Java y especificaciones anteriores a la JSP 20 Para que

este lenguaje pueda ser interpretado tienen que cumplirse 2 requisitos

1 Que la propiedad isELIgnored de la directriz page valga false

lt page isELIgnored= ldquofalserdquo gt

2 Que el descriptor de despliegue webxml en la carpeta WEB-INF indique doacutende se

localiza el esquema XML para la especificacioacuten Servlet 24 que a su vez utiliza el

esquema XML para la especificacioacuten Java Server Page 20

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

Utilizando el lenguaje de expresioacuten se podriacutea modificar la paacutegina Cuentajsp de la seccioacuten

3212 de este documento como se muestra a continuacioacuten Esta nueva paacutegina

1 Especifica que utilizaraacute la biblioteca core de etiquetas estandar (de la que se hablaraacute maacutes

adelante)

2 La primera vez que sea accedida definiraacute la variable atrCuenta en el aacutembito de la

aplicacioacuten con un valor inicial nulo y la incrementaraacute en una unidad cuando sea accedida

sucesivas veces simplemente incrementaraacute esta variable en una unidad

3 Finalmente mostraraacute una paacutegina con un contenido anaacutelogo al siguiente Esta formado

por una cabecera y una segunda liacutenea compuesta por el valor del paraacutemetro parNombre

enviado con la peticioacuten un texto fijo el valor de la variable atrCuenta y otro texto fijo

dependiente del valor de esta variable

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

El coacutedigo completo es el siguiente

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

3224 VARIABLES Y EXPRESIONES

Para acceder a una simple variable se puede escribir algo como lo siguiente $nombre y

para acceder a una propiedad de un objeto podemos escribir algo como

$paramparNombre

$applicationScopeatrCuenta

$pageContextrequestrequestURI

La primera liacutenea del ejemplo anterior obtiene el valor de la propiedad parNombre del objeto

param la segunda el valor del atributo atrCuenta del objeto applicationScope y la tercera

el URL relativo de la paacutegina JSP solicitada

El lenguaje de expresioacuten es maacutes tolerante con respecto a las variables con valor null y ejecuta

muchas maacutes conversiones de forma automaacutetica sobre el tipo de los datos cuando la expresioacuten

a evaluar asiacute lo requiere Por ejemplo la etiqueta condicional siguiente incluye una expresioacuten

que compara el valor del atributo atrCuenta con aacutembito de aplicacioacuten con 10 (convirtiendo

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

impliacutecitamente el valor del atributo al tipo de la constante para poder realizar la comparacioacuten

El resultado seraacute un valor de tipo boolean

ltcif test=rdquo$applicationScopeatrCuenta gt 10rdquogt

ltcifgt

o bien

ltcif test=rdquo$atrCuenta gt 10rdquogt

ltcifgt

Para que una literal pueda incluir un caracter significativo para el lenguaje dicho caracter

debe ser especificado como una secuencia de escape (caracter) Por ejemplo la siguiente

expresioacuten da lugar al literal ldquovezrdquo o ldquovecesrdquo entre comillas dobles

$(atrCuenta gt 1) iquest ldquordquovecesrdquordquo ldquordquovezrdquordquo

Cualquier objeto o atributo de un objeto definido en algunos de los aacutembitos de una paacutegina

puede ser utilizado como una variable Por ejemplo $atrCuenta+1 es una expresioacuten que

realiza la suma de la variable atrCuenta con 1

Cuando se trate de una propiedad de un objeto para acceder a ella se utilizaraacute el operador

punto o bien la notacioacuten empleada para acceder a un elemento de una matriz Por ejemplo

$paramparNombre

$param[ldquoparNombrerdquo]

Una expresioacuten LE puede aparecer en cualquier lugar donde pueda aparecer un texto fijo Por

tanto para informar al contenedor JSP que se trata de una expresioacuten y no de un texto fijo se

utilizan los delimitadores $ al principio y al final

3225 OPERADORES

OPERADOR DESCRIPCIOacuteN Acceso a la propiedad de un objeto o a un elemento de un Map

[] Acceso al elemento de una matriz o de un objeto List

() Pareacutentesis para alterar la prioridad en la evaluacioacuten de una expresioacuten

If ternario condicion expresion1 expresioacuten 2

+ Suma

- Resta

Producto

oacute div Divisioacuten

oacute mod Moacutedulo o resto de una divisioacuten

== oacute eq Igualdad

= oacute ne Diferente

lt oacute lt Menor que

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt oacute gt Mayor que

lt= oacute le Menor o igual que

gt= oacute ge Mayor o igual que

ampamp oacute and Operacioacuten Loacutegica AND

|| oacute or Operacioacuten Loacutegica OR

oacute not Operacioacuten Loacutegica NOT

empty Verifica si el valor de una variable es null si un String esta vaciacuteo o si una matriz Map

o Collection no tienen elementos

func(args) Llamada a una funcioacuten donde func es el nombre de la funcioacuten y arg representa cero o

maacutes argumentos separados por comas

El ejemplo siguiente muestra una paacutegina JSP compuesta por elementos HTML expresiones

LE y objetos impliacutecitos

lthtmlgt

ltheadgtlttitlegtJSP 20lttitlegtltheadgt

ltbodygt

lth3gtLenguaje de expresioacuten (LE)lth3gt

ltpgtLa siguiente tabla ilustra algunas expresiones LE

ltbrgtltbrgtlttable border=1gt

lttrgt

ltthgtltbgtExpresioacutenltbgtltthgt

ltthgtltbgtValorltbgtltthgt

lttrgt

lttrgt

lttdgt$3 + 6lttdgt

lttdgt$3 + 6lttdgt

lttdgt

lttrgt

lttdgt$(7 gt 4) 7 4lttdgt

lttdgt$(7 gt 4) 7 4lttdgt

lttrgt

lttrgt

lttdgt$header[host]lttdgt

lttdgt$header[host]lttdgt

lttrgt

lttablegt

ltbodygt

lthtmlgt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

323 BIBLIOTECA ESTANDAR DE ETIQUETAS

La biblioteca estaacutendar de etiquetas JSP (JSTL ndash Java Server Page Estaacutendar Tag Library)

incluye una cantidad amplia de etiquetas para diferentes aacutereas de trabajo

Aacuterea baacutesica (su prefijo es c ndash core) y contiene

o Soporte de variables (remove y set)

o Control del flujo (choose when otherwise forEach forTokens if)

o Manejo de URL (import param redirect param y url param)

o Operaciones varias (match y out)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlcore

Aacuterea XML (su prefijo es x) y contiene

o Sentencias baacutesicas (out parse y set)

o Control del flujo (choosehellip whenhellip otherwise forEach e if)

o Transformacioacuten de Documentos (transformhellipparam)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlxml

Aacuterea Internacionalizacioacuten (su prefijo es fmt) Contiene

o Localidad (setLocale y requestEncoding)

o Mensajes (bundle message param y setBundle)

o Formateo de Fechas y nuacutemeros (formatNumber formateacuteate parseDate

parseNumber setTimeZone timeZone)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlfmt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Aacuterea SQL (su prefijo es sql) es el lenguaje estandar para interactuar con bases de datos

relacionales y contiene setDataSource Quero dateParam param transaction y

update dateParam param) El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlsql

Aacuterea Funciones (su prefijo es fn) y contiene

o Longitud de una coleccioacuten (length)

o Manipulacioacuten de String (toUpperCase toLowerCase substring

substringAfter substringBefore trim replace indexOf startsWith

endsWith contains containsIgnoreCase split join y escapeXml)

o El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlfunctions

3231 OPERACIONES CON ETIQUETAS BAacuteSICAS

En un ejemplo pasado teniacuteamos el siguiente coacutedigo

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

En este ejemplo se hace referencia al aacuterea baacutesica de JSTL con el prefijo c y se utiliza la

etiqueta cset para definir la variable atrCuenta Si la variable ya esta definida simplemente

se le asigna el valor especificado

La uacuteltima parte del ejemplo anterior podriacutea haberse escrito de esta otra forma

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcif test=rdquo$atrCuenta gt 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcifgt

$atrCuenta $str

La etiqueta cif permite la ejecucioacuten condicional de su cuerpo en funcioacuten del valor del

atributo de test

La etiqueta cchoose permite la ejecucioacuten del cuerpo de la primera etiqueta cwhen cuyo

atributo test sea evaluado a true Si ninguna de las condiciones se evaluacutea a true entonces se

evaluacutea el cuerpo de la etiqueta cotherwise si estaacute presente El siguiente coacutedigo muestra otra

manera de escribir el ejemplo anterior utilizando estas uacuteltimas etiquetas

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcchoosegt

ltcwhen test=rdquo$atrCuenta == 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcwhengt

ltcotherwisegt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcotherwisegt

ltcchoosegt

$atrCuenta $str

La etiqueta cforEach permite iterar sobre una coleccioacuten de objetos La coleccioacuten se

especifica por medio del atributo iacutetems y el elemento actual de la coleccioacuten estaacute disponible a

traveacutes de la variable establecida por el atributo var Por ejemplo el siguiente fragmento de

coacutedigo visualiza una tabla con las variables definidas a nivel de aacutembito de paacutegina

lttable border=rdquo1rdquogt

ltcforEach var=rdquoitemrdquo iacutetems=rdquo$pageScoperdquogt

lttrgt

lttdgt $item lttdgt

lttrgt

ltcforEachgt

lttablegt

La etiqueta ccatch atrapa una excepcioacuten que ocurra en el cuerpo de la misma Por ejemplo

el siguiente segmento de coacutedigo lanzaraacute una excepcioacuten si el paraacutemetro mes se escribe con

letras en vez de con nuacutemeros

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltbodygt

lthtmlgt

Un URL anaacutelogo al siguiente daraacute lugar a que la excepcioacuten sea lanzada cuando se ejecute la

expresioacuten $nMes 3 de la paacutegina anterior

httplocalhost8080JSP2exceppruebajspmes=marzo

La excepcioacuten indica que ha ocurrido un error al tratar de convertir ldquomarzordquo a un entero de

tipo Long Para cachar esta excepcioacuten y darle un tratamiento adecuado habraacute que modificar

la paacutegina JSP anterior como se indica a continuacioacuten

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltccatch var=rdquoerrorOcurridordquogt

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltccatchgt

ltcif test=rdquo$not empty errorOcurridordquogt

Error el paraacutemetro mes debe ser un nuacutemero ltbgt

ltbrgt Informacioacuten del error dada por el sistema

ltbrgt ltfont color=rdquoFF0000rdquogt $errorOcurrido ltfontgt

ltcifgt

ltbodygt

lthtmlgt

3232 ACCESO A BASES DE DATOS CON JSP

Las etiquetas que proporciona el aacuterea SQL permiten realizar

Conexioacuten con una base de datos

Realizacioacuten de consultas a la base de datos

Acceso al conjunto de resultados

Ejecucioacuten de actualizaciones y transacciones

Todas las etiquetas SQL actuacutean sobre una base de datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

32321 CONEXIOacuteN CON LA BASE DE DATOS

La conexioacuten con la base de datos puede realizarse con la etiqueta sqlsetDataSource Por

ejemplo si se esta utilizando el administrador de bases de datos MySql con el controlador

JDBC se puede realizar una conexioacuten con una base de datos digamos bd_tutorias de la

manera siguiente

ltsqlsetDataSource var=rdquobdrdquo

driver=rdquocommysqljdbcDriverrdquo

url=rdquojdbcmysqllocalhost3306bd_tutoriasrdquo

user=rdquoadminrdquo

password=rdquoadminadminrdquo gt

32322 CONSULTA A LA BASE DE DATOS

La etiqueta sqlQuero permite realizar una consulta a una base de datos Por ejemplo el

siguiente fragmento de coacutedigo realiza una consulta a la base de datos representada por bd y

obtiene un conjunto de resultados representado por cdr

ltsqlquery var=rdquocdrrdquo dataSource=rdquo$bdrdquogt

SELECT professor dia hora alumno

FROM profesores tutorias citas

WHERE profesoresid_profesor=tutoriasid_profesor

AND tutoriasid_tutoria=citasid_tutoria

ltsqlquerygt

32323 MODIFICACIONES SOBRE LA BASE DE DATOS

La etiqueta sqlupdate permite ejecutar una sentencia SQL INSERT UPDATE o DELETE

y cualquier otra sentencia SQL que no retorne ninguacuten valor Por ejemplo

ltsqlupdate var=rdquocontrdquo dataSource=rdquo$bdrdquo gt

UPDATE profesores

SET profesor=

WHERE profesor=

ltsqlparam value=rdquo$paramProfesorrdquo gt

ltsqlparam value=rdquo$paramIDrdquo gt

ltsqlupdategt

Una operacioacuten UPDATE puede utilizar el siacutembolo para indicar que el valor que tendriacutea que

evaluarse en esa posicioacuten seraacute suministrado por una etiqueta sqlparam como por ejemplo

httplocalhost8080JSP2sqlpruebajspProfesor=Mario+Rossainz+LopezampID=514

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3212 LOS SCRIPTLETS JSP

Si se desea hacer algo maacutes complejo que una simple expresioacuten los scriptlets permiten insertar

coacutedigo JAVA en el meacutetodo _jspService del servlet (que es ejecutado por service) La sintaxis

utilizada por los scriptlets es lt coacutedigo java gt Los escriptlets tienen acceso a las

mismas variables definidas de forma automaacutetica como expresiones A manera de ejemplo si

se desea que el resultado aparezca en la paacutegina generada deberiacutea de utilizarse la variable out

como en la siguiente instruccioacuten

lt String datosConsultados= requestgetQueryString()

outprintln(ldquoDatos GET adjuntos ldquo+datosConsultados)

gt

En este ejemplo podriacutea haberse obtenido el mismo resultado utilizando la siguiente expresioacuten

JSP

Datos GET adjuntos lt=requestgetQueryString() gt

En general los scriptlets pueden ejecutar varias tareas que no podriacutean realizarse con las

expresiones Tales tareas incluyen

bull La determinacioacuten de encabezados de respuesta

bull Actualizacioacuten de Bases de Datos

bull Ejecucioacuten de bucles condiciones y otras estructuras complejas

lt for (int i=1 ilt=6 i++)

gt

lth lt=i gtgt Hola Mundo lthlt=i gtgt

lt gt

Como un ejemplo concreto se muestra la siguiente paacutegina JSP llamada Cuentajsp en donde

se observa coacutemo se hace un seguimiento del nuacutemero de veces que un cliente accede a esta

paacutegina a traveacutes de distintas sesiones Para ello supondremos que dicha cuenta es el valor del

atributo atrCuenta del objeto impliacutecito application ya citado La primera vez que el cliente

accede a la paacutegina el valor de atrCuenta seraacute null debido a que auacuten no ha sido fijado este

atributo en este caso se fijaraacute con el valor 1 En los siguientes accesos se leeraacute el valor del

atributo atrCuenta se incrementaraacute en una unidad y se volveraacute a fijar Finalmente se enviacutea

la respuesta al cliente para que se muestre al usuario el valor del contador

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en el objeto impliacutecito application con el nombre

atrCuenta

--gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt

Integer cuenta = (Integer)applicationgetAttribute(atrCuenta)

String s = vez

if (cuenta == null)

cuenta = new Integer(1)

else

cuenta = new Integer(cuentaintValue() + 1)

s = veces

applicationsetAttribute(atrCuenta cuenta)

gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

Has visitado esta paacutegina lt= cuenta gt lt= s gt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional un fragmento de coacutedigo JAVA o scriptlet

expresiones y comentarioshellip

Aquiacute otro ejemplo de la ejecucioacuten de un coacutedigo demasiado complejo para una expresioacuten JSP

Este listado presenta una paacutegina JSP que utiliza el paraacutemetro de peticioacuten colorFondo para

establecer el color de fondo de la paacutegina

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgt

lttitlegt Prueba de Color lttitlegt

ltheadgt

lt

String colorFondo=requestgetParameter(colorFondo)

boolean tieneColorExplicito

if (colorFondo =null)

tieneColorExplicito=true

else

tieneColorExplicito=false

colorFondo=WHITE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt

ltbody bgcolor=lt= colorFondo gtgt

lth2 align=centergt Prueba de color lth2gt

lt

if (tieneColorExplicito)

outprintln(Ha indicado un color de fondo expliacutecito +

colorFondo +)

else

outprintln(Usareacute el color de fondo predeterminado WHITE +

Indique el atributo de peticioacuten

ltigtcolorFondoltigt+

para intentar un color estaacutendar un +

valor RRGGBB o para ver si el navegador Web +

permite el uso de nombres de color X11)

gt

ltbodygt

lthtmlgt

Cuyas posibles salidas son

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3213 DECLARACIONES JSP

Una declaracioacuten JSP permite definir meacutetodos o campos que seraacuten insertados en el cuerpo

principal de la clase del servlet (fuera del meacutetodo _jspService) Una declaracioacuten tiene la

sintaxis lt Coacutedigo Java gt Por ejemplo

lt int i=0 gt

lt

Public void jspinit()

coacutedigo de iniciacioacuten

gt

Una declaracioacuten no genera ninguacuten resultado y se usan junto con las expresiones JSP o los

scriptlets A continuacioacuten se muestra una paacutegina JSP que despliega la cantidad de veces que

se ha solicitado esta paacutegina desde que se arrancoacute el servidor haciendo uso de las

declaraciones JSP

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtDeclaraciones JSPlttitlegtltheadgt

ltbodygt

lth1gtDeclaraciones JSPlth1gt

lt-- Esto es un comentario en JSP --gt

lt private int recuentoAccesos=0 gt

lth2gt Accesos a la paacutegina desde el reinicio del servidor

lt= ++recuentoAccesos gt lth2gt

ltbodygt

lthtmlgt

La salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

322 EL LENGUAJE DE EXPRESION EN JSP 20

Anteriormente se ha visto la necesidad de utilizar fragmentos de coacutedigo java en el desarrollo

de paacuteginas JSP pero con la aparicioacuten de la especificacioacuten JSP 20 ya no hay necesidad de

utilizar fragmentos de coacutedigo Java para nada gracias al nuevo lenguaje de expresioacuten EL

(Expresioacuten Language) a la biblioteca de etiquetas estandar JSTL (JSP Standar Tag Library)

y a las nuevas formas para desarrollar etiquetas personalizadas

El lenguaje de expresioacuten JSP es maacutes un lenguaje de acceso a datos que un lenguaje de

programacioacuten Ya se ha visto que para pasar informacioacuten de un cliente a una paacutegina JSP se

utilizan paraacutemetros en la peticioacuten y atributos en la paacutegina El lenguaje de expresioacuten lo hace

posible sin tener que utilizar scriptlets o expresiones (lt= expresioacuten gt) Por ejemplo las

liacuteneas JSP 12 siguientes escritas utilizando coacutedigo Java

lt= requestgetParameter(ldquoparNombrerdquo) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt veces

bajo la especificacioacuten JSP 20 se pueden escribir de una forma maacutes sencilla como sigue

(ahora no se trata de coacutedigo JAVA)

$paramparNombre has visitado esta paacutegina

$atrCuenta veces

La sintaxis de JSP es sensible a mayuacutesculas y minuacutesculas pero un par de comillas simples es

equivalente a un par de comillas dobles

3221 VARIABLES PREDEFINIDAS (Objetos Impliacutecitos)

El lenguaje de expresioacuten JSP 20 soporta los objetos impliacutecitos siguientes

pageContext Objeto de javaxservletjspPageContext que proporciona acceso a los

datos de una peticioacuten

param Coleccioacuten (objeto de tipo javautilMap) de todos los valores de los paraacutemetros

enviados en una peticioacuten un String por paraacutemetro

paramValues Coleccioacuten de todos los valores de los paraacutemetros enviados en una

peticioacuten una matriz de tipo String por paraacutemetro

header Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten un

String por cabecera

headerValues Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten

una matriz de tipo String por cabecera

cookie Coleccioacuten de todos los valores de las cookies un objeto javaxservlethttpCookie

por cookie

initParam Coleccioacuten de todos los valores de los paraacutemetros de iniciacioacuten de la

aplicacioacuten un String por paraacutemetro

Tambieacuten hay objetos que permiten acceder a variables definidas en diferentes aacutembitos lo que

posibilita compartir informacioacuten

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

pageScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de paacutegina

requestScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

peticioacuten

sessionScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de sesioacuten

applicationScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

aplicacioacuten

3222 DIRECTRICES

Las directrices page incluye y taglib son mensajes para el motor JSP y son siempre incluidas

entre los siacutembolos lt y gt

32221 LA DIRECTRIZ PAGE

Define atributos que se aplican a toda la paacutegina JSP donde es incluida

lt page lista_de_atributos gt

Donde la lista_de_atributos puede contener algunos de los siguientes (aquellos que estaacuten

escritos en negrita son los tomados por omisioacuten)

language= ldquoscriptingLanguagerdquo

extends= rdquoclassNamerdquo

import= ldquoimportListrdquo

session= ldquotrue|falserdquo

buffer= ldquonone|sizeKb

autoflush= ldquotrue|falserdquo

isThreadSafe= rdquotrue|falserdquo

info= rdquoinfo_textrdquo

errorPage= ldquoerror_urlrdquo

isErrorPage= rdquotrue|falserdquo

contentType= rdquoctinfordquo

pageEncoding= rdquopeinfordquo

isELIgnored= ldquotrue|falserdquo

Tiacutepicamente se localiza al principio de la paacutegina JSP y puede haber cualquier nuacutemero de

ellas El lenguaje por omisioacuten es Java Ejemplos

lt page contentType=rdquotexthtmlrdquo language=rdquojavardquo gt

lt page import=rdquojavautil javalangrdquo gt

lt page buffer=rdquo5kbrdquo autoflush=rdquofalserdquo gt

32222 LA DIRECTRIZ INCLUDE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

La directriz include incluye un archivo (html jsp xml o de texto) en una paacutegina JSP Esto

permite dividir el contenido de la paacutegina en trozos maacutes manejables

lt incluye file=rdquoURL_relativordquo gt

El ejemplo siguiente muestra dos archivos el primero incluye al segundo para mostrar la

fecha y hora actuales

lt-- fichero mostrarFechaHorajsp --gt

lthtmlgt

ltheadgtlttitlegtIncluir un ficherolttitlegtltheadgt

ltbody bgcolor=whitegt

ltfont color=bluegt

La fecha y hora actuales son

lt include file=fechaHorajsp gt

ltfontgt

ltbodygt

lthtmlgt

lt-- fichero fechaHorajsp --gt

lt page import=javautil gt

lt= (new javautilDate())toLocaleString() gt

32223 LA DIRECTRIZ TAGLIB

La directriz taglib indica la biblioteca de acciones personalizadas que podremos utilizar en

la codificacioacuten de la paacutegina JSP Para distinguir esas acciones entre otras existentes se utiliza

un prefijo (prefix) Su sintaxis es

lt taglib (uri=rdquoURI_bibliotecardquo|tagdir=rdquoDir_biblioteca_tagrdquo)

prefix=rdquoprefijordquo gt

Cuando se trata de una biblioteca definida mediante una clase Java y un descriptor (archivo

tld) eacutesta se identifica mediante un URI (Uniform Resource Identifier- URL relativos) Por

ejemplo

lt taglib uri=rdquohttpMarioRossainzLopezmiBibliotecardquo

prefix=rdquofunrdquo gt

ltpgtltfunaccion01 gt

La uacuteltima liacutenea del ejemplo tiene dos etiquetas una etiqueta p HTML y otra accion01

perteneciente a la biblioteca miBiblioteca En cambio si la biblioteca se define mediante un

archivo tag entonces se identifica mediante su ruta relativa en el sistema de archivos

lt taglib tagdir=rdquoWEB-INFtagsrdquo prefix=rdquofunrdquo gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpgtltfunaccion01 gt

La directriz taglib debe colocarse antes de utilizar en la paacutegina JSP las acciones

personalizadas definidas por la misma Se puede utilizar maacutes de una directriz pero el prefijo

utilizado debe ser uacutenico para cada una de ellas

3223 ACTIVACION DEL LENGUAJE DE EXPRESION (LE)

La especificacioacuten JSP 20 define un lenguaje de expresioacuten como alternativa a elementos de

programacioacuten escritos con coacutedigo Java y especificaciones anteriores a la JSP 20 Para que

este lenguaje pueda ser interpretado tienen que cumplirse 2 requisitos

1 Que la propiedad isELIgnored de la directriz page valga false

lt page isELIgnored= ldquofalserdquo gt

2 Que el descriptor de despliegue webxml en la carpeta WEB-INF indique doacutende se

localiza el esquema XML para la especificacioacuten Servlet 24 que a su vez utiliza el

esquema XML para la especificacioacuten Java Server Page 20

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

Utilizando el lenguaje de expresioacuten se podriacutea modificar la paacutegina Cuentajsp de la seccioacuten

3212 de este documento como se muestra a continuacioacuten Esta nueva paacutegina

1 Especifica que utilizaraacute la biblioteca core de etiquetas estandar (de la que se hablaraacute maacutes

adelante)

2 La primera vez que sea accedida definiraacute la variable atrCuenta en el aacutembito de la

aplicacioacuten con un valor inicial nulo y la incrementaraacute en una unidad cuando sea accedida

sucesivas veces simplemente incrementaraacute esta variable en una unidad

3 Finalmente mostraraacute una paacutegina con un contenido anaacutelogo al siguiente Esta formado

por una cabecera y una segunda liacutenea compuesta por el valor del paraacutemetro parNombre

enviado con la peticioacuten un texto fijo el valor de la variable atrCuenta y otro texto fijo

dependiente del valor de esta variable

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

El coacutedigo completo es el siguiente

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

3224 VARIABLES Y EXPRESIONES

Para acceder a una simple variable se puede escribir algo como lo siguiente $nombre y

para acceder a una propiedad de un objeto podemos escribir algo como

$paramparNombre

$applicationScopeatrCuenta

$pageContextrequestrequestURI

La primera liacutenea del ejemplo anterior obtiene el valor de la propiedad parNombre del objeto

param la segunda el valor del atributo atrCuenta del objeto applicationScope y la tercera

el URL relativo de la paacutegina JSP solicitada

El lenguaje de expresioacuten es maacutes tolerante con respecto a las variables con valor null y ejecuta

muchas maacutes conversiones de forma automaacutetica sobre el tipo de los datos cuando la expresioacuten

a evaluar asiacute lo requiere Por ejemplo la etiqueta condicional siguiente incluye una expresioacuten

que compara el valor del atributo atrCuenta con aacutembito de aplicacioacuten con 10 (convirtiendo

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

impliacutecitamente el valor del atributo al tipo de la constante para poder realizar la comparacioacuten

El resultado seraacute un valor de tipo boolean

ltcif test=rdquo$applicationScopeatrCuenta gt 10rdquogt

ltcifgt

o bien

ltcif test=rdquo$atrCuenta gt 10rdquogt

ltcifgt

Para que una literal pueda incluir un caracter significativo para el lenguaje dicho caracter

debe ser especificado como una secuencia de escape (caracter) Por ejemplo la siguiente

expresioacuten da lugar al literal ldquovezrdquo o ldquovecesrdquo entre comillas dobles

$(atrCuenta gt 1) iquest ldquordquovecesrdquordquo ldquordquovezrdquordquo

Cualquier objeto o atributo de un objeto definido en algunos de los aacutembitos de una paacutegina

puede ser utilizado como una variable Por ejemplo $atrCuenta+1 es una expresioacuten que

realiza la suma de la variable atrCuenta con 1

Cuando se trate de una propiedad de un objeto para acceder a ella se utilizaraacute el operador

punto o bien la notacioacuten empleada para acceder a un elemento de una matriz Por ejemplo

$paramparNombre

$param[ldquoparNombrerdquo]

Una expresioacuten LE puede aparecer en cualquier lugar donde pueda aparecer un texto fijo Por

tanto para informar al contenedor JSP que se trata de una expresioacuten y no de un texto fijo se

utilizan los delimitadores $ al principio y al final

3225 OPERADORES

OPERADOR DESCRIPCIOacuteN Acceso a la propiedad de un objeto o a un elemento de un Map

[] Acceso al elemento de una matriz o de un objeto List

() Pareacutentesis para alterar la prioridad en la evaluacioacuten de una expresioacuten

If ternario condicion expresion1 expresioacuten 2

+ Suma

- Resta

Producto

oacute div Divisioacuten

oacute mod Moacutedulo o resto de una divisioacuten

== oacute eq Igualdad

= oacute ne Diferente

lt oacute lt Menor que

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt oacute gt Mayor que

lt= oacute le Menor o igual que

gt= oacute ge Mayor o igual que

ampamp oacute and Operacioacuten Loacutegica AND

|| oacute or Operacioacuten Loacutegica OR

oacute not Operacioacuten Loacutegica NOT

empty Verifica si el valor de una variable es null si un String esta vaciacuteo o si una matriz Map

o Collection no tienen elementos

func(args) Llamada a una funcioacuten donde func es el nombre de la funcioacuten y arg representa cero o

maacutes argumentos separados por comas

El ejemplo siguiente muestra una paacutegina JSP compuesta por elementos HTML expresiones

LE y objetos impliacutecitos

lthtmlgt

ltheadgtlttitlegtJSP 20lttitlegtltheadgt

ltbodygt

lth3gtLenguaje de expresioacuten (LE)lth3gt

ltpgtLa siguiente tabla ilustra algunas expresiones LE

ltbrgtltbrgtlttable border=1gt

lttrgt

ltthgtltbgtExpresioacutenltbgtltthgt

ltthgtltbgtValorltbgtltthgt

lttrgt

lttrgt

lttdgt$3 + 6lttdgt

lttdgt$3 + 6lttdgt

lttdgt

lttrgt

lttdgt$(7 gt 4) 7 4lttdgt

lttdgt$(7 gt 4) 7 4lttdgt

lttrgt

lttrgt

lttdgt$header[host]lttdgt

lttdgt$header[host]lttdgt

lttrgt

lttablegt

ltbodygt

lthtmlgt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

323 BIBLIOTECA ESTANDAR DE ETIQUETAS

La biblioteca estaacutendar de etiquetas JSP (JSTL ndash Java Server Page Estaacutendar Tag Library)

incluye una cantidad amplia de etiquetas para diferentes aacutereas de trabajo

Aacuterea baacutesica (su prefijo es c ndash core) y contiene

o Soporte de variables (remove y set)

o Control del flujo (choose when otherwise forEach forTokens if)

o Manejo de URL (import param redirect param y url param)

o Operaciones varias (match y out)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlcore

Aacuterea XML (su prefijo es x) y contiene

o Sentencias baacutesicas (out parse y set)

o Control del flujo (choosehellip whenhellip otherwise forEach e if)

o Transformacioacuten de Documentos (transformhellipparam)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlxml

Aacuterea Internacionalizacioacuten (su prefijo es fmt) Contiene

o Localidad (setLocale y requestEncoding)

o Mensajes (bundle message param y setBundle)

o Formateo de Fechas y nuacutemeros (formatNumber formateacuteate parseDate

parseNumber setTimeZone timeZone)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlfmt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Aacuterea SQL (su prefijo es sql) es el lenguaje estandar para interactuar con bases de datos

relacionales y contiene setDataSource Quero dateParam param transaction y

update dateParam param) El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlsql

Aacuterea Funciones (su prefijo es fn) y contiene

o Longitud de una coleccioacuten (length)

o Manipulacioacuten de String (toUpperCase toLowerCase substring

substringAfter substringBefore trim replace indexOf startsWith

endsWith contains containsIgnoreCase split join y escapeXml)

o El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlfunctions

3231 OPERACIONES CON ETIQUETAS BAacuteSICAS

En un ejemplo pasado teniacuteamos el siguiente coacutedigo

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

En este ejemplo se hace referencia al aacuterea baacutesica de JSTL con el prefijo c y se utiliza la

etiqueta cset para definir la variable atrCuenta Si la variable ya esta definida simplemente

se le asigna el valor especificado

La uacuteltima parte del ejemplo anterior podriacutea haberse escrito de esta otra forma

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcif test=rdquo$atrCuenta gt 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcifgt

$atrCuenta $str

La etiqueta cif permite la ejecucioacuten condicional de su cuerpo en funcioacuten del valor del

atributo de test

La etiqueta cchoose permite la ejecucioacuten del cuerpo de la primera etiqueta cwhen cuyo

atributo test sea evaluado a true Si ninguna de las condiciones se evaluacutea a true entonces se

evaluacutea el cuerpo de la etiqueta cotherwise si estaacute presente El siguiente coacutedigo muestra otra

manera de escribir el ejemplo anterior utilizando estas uacuteltimas etiquetas

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcchoosegt

ltcwhen test=rdquo$atrCuenta == 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcwhengt

ltcotherwisegt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcotherwisegt

ltcchoosegt

$atrCuenta $str

La etiqueta cforEach permite iterar sobre una coleccioacuten de objetos La coleccioacuten se

especifica por medio del atributo iacutetems y el elemento actual de la coleccioacuten estaacute disponible a

traveacutes de la variable establecida por el atributo var Por ejemplo el siguiente fragmento de

coacutedigo visualiza una tabla con las variables definidas a nivel de aacutembito de paacutegina

lttable border=rdquo1rdquogt

ltcforEach var=rdquoitemrdquo iacutetems=rdquo$pageScoperdquogt

lttrgt

lttdgt $item lttdgt

lttrgt

ltcforEachgt

lttablegt

La etiqueta ccatch atrapa una excepcioacuten que ocurra en el cuerpo de la misma Por ejemplo

el siguiente segmento de coacutedigo lanzaraacute una excepcioacuten si el paraacutemetro mes se escribe con

letras en vez de con nuacutemeros

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltbodygt

lthtmlgt

Un URL anaacutelogo al siguiente daraacute lugar a que la excepcioacuten sea lanzada cuando se ejecute la

expresioacuten $nMes 3 de la paacutegina anterior

httplocalhost8080JSP2exceppruebajspmes=marzo

La excepcioacuten indica que ha ocurrido un error al tratar de convertir ldquomarzordquo a un entero de

tipo Long Para cachar esta excepcioacuten y darle un tratamiento adecuado habraacute que modificar

la paacutegina JSP anterior como se indica a continuacioacuten

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltccatch var=rdquoerrorOcurridordquogt

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltccatchgt

ltcif test=rdquo$not empty errorOcurridordquogt

Error el paraacutemetro mes debe ser un nuacutemero ltbgt

ltbrgt Informacioacuten del error dada por el sistema

ltbrgt ltfont color=rdquoFF0000rdquogt $errorOcurrido ltfontgt

ltcifgt

ltbodygt

lthtmlgt

3232 ACCESO A BASES DE DATOS CON JSP

Las etiquetas que proporciona el aacuterea SQL permiten realizar

Conexioacuten con una base de datos

Realizacioacuten de consultas a la base de datos

Acceso al conjunto de resultados

Ejecucioacuten de actualizaciones y transacciones

Todas las etiquetas SQL actuacutean sobre una base de datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

32321 CONEXIOacuteN CON LA BASE DE DATOS

La conexioacuten con la base de datos puede realizarse con la etiqueta sqlsetDataSource Por

ejemplo si se esta utilizando el administrador de bases de datos MySql con el controlador

JDBC se puede realizar una conexioacuten con una base de datos digamos bd_tutorias de la

manera siguiente

ltsqlsetDataSource var=rdquobdrdquo

driver=rdquocommysqljdbcDriverrdquo

url=rdquojdbcmysqllocalhost3306bd_tutoriasrdquo

user=rdquoadminrdquo

password=rdquoadminadminrdquo gt

32322 CONSULTA A LA BASE DE DATOS

La etiqueta sqlQuero permite realizar una consulta a una base de datos Por ejemplo el

siguiente fragmento de coacutedigo realiza una consulta a la base de datos representada por bd y

obtiene un conjunto de resultados representado por cdr

ltsqlquery var=rdquocdrrdquo dataSource=rdquo$bdrdquogt

SELECT professor dia hora alumno

FROM profesores tutorias citas

WHERE profesoresid_profesor=tutoriasid_profesor

AND tutoriasid_tutoria=citasid_tutoria

ltsqlquerygt

32323 MODIFICACIONES SOBRE LA BASE DE DATOS

La etiqueta sqlupdate permite ejecutar una sentencia SQL INSERT UPDATE o DELETE

y cualquier otra sentencia SQL que no retorne ninguacuten valor Por ejemplo

ltsqlupdate var=rdquocontrdquo dataSource=rdquo$bdrdquo gt

UPDATE profesores

SET profesor=

WHERE profesor=

ltsqlparam value=rdquo$paramProfesorrdquo gt

ltsqlparam value=rdquo$paramIDrdquo gt

ltsqlupdategt

Una operacioacuten UPDATE puede utilizar el siacutembolo para indicar que el valor que tendriacutea que

evaluarse en esa posicioacuten seraacute suministrado por una etiqueta sqlparam como por ejemplo

httplocalhost8080JSP2sqlpruebajspProfesor=Mario+Rossainz+LopezampID=514

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt

Integer cuenta = (Integer)applicationgetAttribute(atrCuenta)

String s = vez

if (cuenta == null)

cuenta = new Integer(1)

else

cuenta = new Integer(cuentaintValue() + 1)

s = veces

applicationsetAttribute(atrCuenta cuenta)

gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

Has visitado esta paacutegina lt= cuenta gt lt= s gt

ltbodygt

lthtmlgt

Este ejemplo muestra HTML tradicional un fragmento de coacutedigo JAVA o scriptlet

expresiones y comentarioshellip

Aquiacute otro ejemplo de la ejecucioacuten de un coacutedigo demasiado complejo para una expresioacuten JSP

Este listado presenta una paacutegina JSP que utiliza el paraacutemetro de peticioacuten colorFondo para

establecer el color de fondo de la paacutegina

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgt

lttitlegt Prueba de Color lttitlegt

ltheadgt

lt

String colorFondo=requestgetParameter(colorFondo)

boolean tieneColorExplicito

if (colorFondo =null)

tieneColorExplicito=true

else

tieneColorExplicito=false

colorFondo=WHITE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt

ltbody bgcolor=lt= colorFondo gtgt

lth2 align=centergt Prueba de color lth2gt

lt

if (tieneColorExplicito)

outprintln(Ha indicado un color de fondo expliacutecito +

colorFondo +)

else

outprintln(Usareacute el color de fondo predeterminado WHITE +

Indique el atributo de peticioacuten

ltigtcolorFondoltigt+

para intentar un color estaacutendar un +

valor RRGGBB o para ver si el navegador Web +

permite el uso de nombres de color X11)

gt

ltbodygt

lthtmlgt

Cuyas posibles salidas son

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3213 DECLARACIONES JSP

Una declaracioacuten JSP permite definir meacutetodos o campos que seraacuten insertados en el cuerpo

principal de la clase del servlet (fuera del meacutetodo _jspService) Una declaracioacuten tiene la

sintaxis lt Coacutedigo Java gt Por ejemplo

lt int i=0 gt

lt

Public void jspinit()

coacutedigo de iniciacioacuten

gt

Una declaracioacuten no genera ninguacuten resultado y se usan junto con las expresiones JSP o los

scriptlets A continuacioacuten se muestra una paacutegina JSP que despliega la cantidad de veces que

se ha solicitado esta paacutegina desde que se arrancoacute el servidor haciendo uso de las

declaraciones JSP

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtDeclaraciones JSPlttitlegtltheadgt

ltbodygt

lth1gtDeclaraciones JSPlth1gt

lt-- Esto es un comentario en JSP --gt

lt private int recuentoAccesos=0 gt

lth2gt Accesos a la paacutegina desde el reinicio del servidor

lt= ++recuentoAccesos gt lth2gt

ltbodygt

lthtmlgt

La salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

322 EL LENGUAJE DE EXPRESION EN JSP 20

Anteriormente se ha visto la necesidad de utilizar fragmentos de coacutedigo java en el desarrollo

de paacuteginas JSP pero con la aparicioacuten de la especificacioacuten JSP 20 ya no hay necesidad de

utilizar fragmentos de coacutedigo Java para nada gracias al nuevo lenguaje de expresioacuten EL

(Expresioacuten Language) a la biblioteca de etiquetas estandar JSTL (JSP Standar Tag Library)

y a las nuevas formas para desarrollar etiquetas personalizadas

El lenguaje de expresioacuten JSP es maacutes un lenguaje de acceso a datos que un lenguaje de

programacioacuten Ya se ha visto que para pasar informacioacuten de un cliente a una paacutegina JSP se

utilizan paraacutemetros en la peticioacuten y atributos en la paacutegina El lenguaje de expresioacuten lo hace

posible sin tener que utilizar scriptlets o expresiones (lt= expresioacuten gt) Por ejemplo las

liacuteneas JSP 12 siguientes escritas utilizando coacutedigo Java

lt= requestgetParameter(ldquoparNombrerdquo) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt veces

bajo la especificacioacuten JSP 20 se pueden escribir de una forma maacutes sencilla como sigue

(ahora no se trata de coacutedigo JAVA)

$paramparNombre has visitado esta paacutegina

$atrCuenta veces

La sintaxis de JSP es sensible a mayuacutesculas y minuacutesculas pero un par de comillas simples es

equivalente a un par de comillas dobles

3221 VARIABLES PREDEFINIDAS (Objetos Impliacutecitos)

El lenguaje de expresioacuten JSP 20 soporta los objetos impliacutecitos siguientes

pageContext Objeto de javaxservletjspPageContext que proporciona acceso a los

datos de una peticioacuten

param Coleccioacuten (objeto de tipo javautilMap) de todos los valores de los paraacutemetros

enviados en una peticioacuten un String por paraacutemetro

paramValues Coleccioacuten de todos los valores de los paraacutemetros enviados en una

peticioacuten una matriz de tipo String por paraacutemetro

header Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten un

String por cabecera

headerValues Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten

una matriz de tipo String por cabecera

cookie Coleccioacuten de todos los valores de las cookies un objeto javaxservlethttpCookie

por cookie

initParam Coleccioacuten de todos los valores de los paraacutemetros de iniciacioacuten de la

aplicacioacuten un String por paraacutemetro

Tambieacuten hay objetos que permiten acceder a variables definidas en diferentes aacutembitos lo que

posibilita compartir informacioacuten

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

pageScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de paacutegina

requestScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

peticioacuten

sessionScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de sesioacuten

applicationScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

aplicacioacuten

3222 DIRECTRICES

Las directrices page incluye y taglib son mensajes para el motor JSP y son siempre incluidas

entre los siacutembolos lt y gt

32221 LA DIRECTRIZ PAGE

Define atributos que se aplican a toda la paacutegina JSP donde es incluida

lt page lista_de_atributos gt

Donde la lista_de_atributos puede contener algunos de los siguientes (aquellos que estaacuten

escritos en negrita son los tomados por omisioacuten)

language= ldquoscriptingLanguagerdquo

extends= rdquoclassNamerdquo

import= ldquoimportListrdquo

session= ldquotrue|falserdquo

buffer= ldquonone|sizeKb

autoflush= ldquotrue|falserdquo

isThreadSafe= rdquotrue|falserdquo

info= rdquoinfo_textrdquo

errorPage= ldquoerror_urlrdquo

isErrorPage= rdquotrue|falserdquo

contentType= rdquoctinfordquo

pageEncoding= rdquopeinfordquo

isELIgnored= ldquotrue|falserdquo

Tiacutepicamente se localiza al principio de la paacutegina JSP y puede haber cualquier nuacutemero de

ellas El lenguaje por omisioacuten es Java Ejemplos

lt page contentType=rdquotexthtmlrdquo language=rdquojavardquo gt

lt page import=rdquojavautil javalangrdquo gt

lt page buffer=rdquo5kbrdquo autoflush=rdquofalserdquo gt

32222 LA DIRECTRIZ INCLUDE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

La directriz include incluye un archivo (html jsp xml o de texto) en una paacutegina JSP Esto

permite dividir el contenido de la paacutegina en trozos maacutes manejables

lt incluye file=rdquoURL_relativordquo gt

El ejemplo siguiente muestra dos archivos el primero incluye al segundo para mostrar la

fecha y hora actuales

lt-- fichero mostrarFechaHorajsp --gt

lthtmlgt

ltheadgtlttitlegtIncluir un ficherolttitlegtltheadgt

ltbody bgcolor=whitegt

ltfont color=bluegt

La fecha y hora actuales son

lt include file=fechaHorajsp gt

ltfontgt

ltbodygt

lthtmlgt

lt-- fichero fechaHorajsp --gt

lt page import=javautil gt

lt= (new javautilDate())toLocaleString() gt

32223 LA DIRECTRIZ TAGLIB

La directriz taglib indica la biblioteca de acciones personalizadas que podremos utilizar en

la codificacioacuten de la paacutegina JSP Para distinguir esas acciones entre otras existentes se utiliza

un prefijo (prefix) Su sintaxis es

lt taglib (uri=rdquoURI_bibliotecardquo|tagdir=rdquoDir_biblioteca_tagrdquo)

prefix=rdquoprefijordquo gt

Cuando se trata de una biblioteca definida mediante una clase Java y un descriptor (archivo

tld) eacutesta se identifica mediante un URI (Uniform Resource Identifier- URL relativos) Por

ejemplo

lt taglib uri=rdquohttpMarioRossainzLopezmiBibliotecardquo

prefix=rdquofunrdquo gt

ltpgtltfunaccion01 gt

La uacuteltima liacutenea del ejemplo tiene dos etiquetas una etiqueta p HTML y otra accion01

perteneciente a la biblioteca miBiblioteca En cambio si la biblioteca se define mediante un

archivo tag entonces se identifica mediante su ruta relativa en el sistema de archivos

lt taglib tagdir=rdquoWEB-INFtagsrdquo prefix=rdquofunrdquo gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpgtltfunaccion01 gt

La directriz taglib debe colocarse antes de utilizar en la paacutegina JSP las acciones

personalizadas definidas por la misma Se puede utilizar maacutes de una directriz pero el prefijo

utilizado debe ser uacutenico para cada una de ellas

3223 ACTIVACION DEL LENGUAJE DE EXPRESION (LE)

La especificacioacuten JSP 20 define un lenguaje de expresioacuten como alternativa a elementos de

programacioacuten escritos con coacutedigo Java y especificaciones anteriores a la JSP 20 Para que

este lenguaje pueda ser interpretado tienen que cumplirse 2 requisitos

1 Que la propiedad isELIgnored de la directriz page valga false

lt page isELIgnored= ldquofalserdquo gt

2 Que el descriptor de despliegue webxml en la carpeta WEB-INF indique doacutende se

localiza el esquema XML para la especificacioacuten Servlet 24 que a su vez utiliza el

esquema XML para la especificacioacuten Java Server Page 20

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

Utilizando el lenguaje de expresioacuten se podriacutea modificar la paacutegina Cuentajsp de la seccioacuten

3212 de este documento como se muestra a continuacioacuten Esta nueva paacutegina

1 Especifica que utilizaraacute la biblioteca core de etiquetas estandar (de la que se hablaraacute maacutes

adelante)

2 La primera vez que sea accedida definiraacute la variable atrCuenta en el aacutembito de la

aplicacioacuten con un valor inicial nulo y la incrementaraacute en una unidad cuando sea accedida

sucesivas veces simplemente incrementaraacute esta variable en una unidad

3 Finalmente mostraraacute una paacutegina con un contenido anaacutelogo al siguiente Esta formado

por una cabecera y una segunda liacutenea compuesta por el valor del paraacutemetro parNombre

enviado con la peticioacuten un texto fijo el valor de la variable atrCuenta y otro texto fijo

dependiente del valor de esta variable

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

El coacutedigo completo es el siguiente

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

3224 VARIABLES Y EXPRESIONES

Para acceder a una simple variable se puede escribir algo como lo siguiente $nombre y

para acceder a una propiedad de un objeto podemos escribir algo como

$paramparNombre

$applicationScopeatrCuenta

$pageContextrequestrequestURI

La primera liacutenea del ejemplo anterior obtiene el valor de la propiedad parNombre del objeto

param la segunda el valor del atributo atrCuenta del objeto applicationScope y la tercera

el URL relativo de la paacutegina JSP solicitada

El lenguaje de expresioacuten es maacutes tolerante con respecto a las variables con valor null y ejecuta

muchas maacutes conversiones de forma automaacutetica sobre el tipo de los datos cuando la expresioacuten

a evaluar asiacute lo requiere Por ejemplo la etiqueta condicional siguiente incluye una expresioacuten

que compara el valor del atributo atrCuenta con aacutembito de aplicacioacuten con 10 (convirtiendo

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

impliacutecitamente el valor del atributo al tipo de la constante para poder realizar la comparacioacuten

El resultado seraacute un valor de tipo boolean

ltcif test=rdquo$applicationScopeatrCuenta gt 10rdquogt

ltcifgt

o bien

ltcif test=rdquo$atrCuenta gt 10rdquogt

ltcifgt

Para que una literal pueda incluir un caracter significativo para el lenguaje dicho caracter

debe ser especificado como una secuencia de escape (caracter) Por ejemplo la siguiente

expresioacuten da lugar al literal ldquovezrdquo o ldquovecesrdquo entre comillas dobles

$(atrCuenta gt 1) iquest ldquordquovecesrdquordquo ldquordquovezrdquordquo

Cualquier objeto o atributo de un objeto definido en algunos de los aacutembitos de una paacutegina

puede ser utilizado como una variable Por ejemplo $atrCuenta+1 es una expresioacuten que

realiza la suma de la variable atrCuenta con 1

Cuando se trate de una propiedad de un objeto para acceder a ella se utilizaraacute el operador

punto o bien la notacioacuten empleada para acceder a un elemento de una matriz Por ejemplo

$paramparNombre

$param[ldquoparNombrerdquo]

Una expresioacuten LE puede aparecer en cualquier lugar donde pueda aparecer un texto fijo Por

tanto para informar al contenedor JSP que se trata de una expresioacuten y no de un texto fijo se

utilizan los delimitadores $ al principio y al final

3225 OPERADORES

OPERADOR DESCRIPCIOacuteN Acceso a la propiedad de un objeto o a un elemento de un Map

[] Acceso al elemento de una matriz o de un objeto List

() Pareacutentesis para alterar la prioridad en la evaluacioacuten de una expresioacuten

If ternario condicion expresion1 expresioacuten 2

+ Suma

- Resta

Producto

oacute div Divisioacuten

oacute mod Moacutedulo o resto de una divisioacuten

== oacute eq Igualdad

= oacute ne Diferente

lt oacute lt Menor que

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt oacute gt Mayor que

lt= oacute le Menor o igual que

gt= oacute ge Mayor o igual que

ampamp oacute and Operacioacuten Loacutegica AND

|| oacute or Operacioacuten Loacutegica OR

oacute not Operacioacuten Loacutegica NOT

empty Verifica si el valor de una variable es null si un String esta vaciacuteo o si una matriz Map

o Collection no tienen elementos

func(args) Llamada a una funcioacuten donde func es el nombre de la funcioacuten y arg representa cero o

maacutes argumentos separados por comas

El ejemplo siguiente muestra una paacutegina JSP compuesta por elementos HTML expresiones

LE y objetos impliacutecitos

lthtmlgt

ltheadgtlttitlegtJSP 20lttitlegtltheadgt

ltbodygt

lth3gtLenguaje de expresioacuten (LE)lth3gt

ltpgtLa siguiente tabla ilustra algunas expresiones LE

ltbrgtltbrgtlttable border=1gt

lttrgt

ltthgtltbgtExpresioacutenltbgtltthgt

ltthgtltbgtValorltbgtltthgt

lttrgt

lttrgt

lttdgt$3 + 6lttdgt

lttdgt$3 + 6lttdgt

lttdgt

lttrgt

lttdgt$(7 gt 4) 7 4lttdgt

lttdgt$(7 gt 4) 7 4lttdgt

lttrgt

lttrgt

lttdgt$header[host]lttdgt

lttdgt$header[host]lttdgt

lttrgt

lttablegt

ltbodygt

lthtmlgt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

323 BIBLIOTECA ESTANDAR DE ETIQUETAS

La biblioteca estaacutendar de etiquetas JSP (JSTL ndash Java Server Page Estaacutendar Tag Library)

incluye una cantidad amplia de etiquetas para diferentes aacutereas de trabajo

Aacuterea baacutesica (su prefijo es c ndash core) y contiene

o Soporte de variables (remove y set)

o Control del flujo (choose when otherwise forEach forTokens if)

o Manejo de URL (import param redirect param y url param)

o Operaciones varias (match y out)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlcore

Aacuterea XML (su prefijo es x) y contiene

o Sentencias baacutesicas (out parse y set)

o Control del flujo (choosehellip whenhellip otherwise forEach e if)

o Transformacioacuten de Documentos (transformhellipparam)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlxml

Aacuterea Internacionalizacioacuten (su prefijo es fmt) Contiene

o Localidad (setLocale y requestEncoding)

o Mensajes (bundle message param y setBundle)

o Formateo de Fechas y nuacutemeros (formatNumber formateacuteate parseDate

parseNumber setTimeZone timeZone)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlfmt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Aacuterea SQL (su prefijo es sql) es el lenguaje estandar para interactuar con bases de datos

relacionales y contiene setDataSource Quero dateParam param transaction y

update dateParam param) El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlsql

Aacuterea Funciones (su prefijo es fn) y contiene

o Longitud de una coleccioacuten (length)

o Manipulacioacuten de String (toUpperCase toLowerCase substring

substringAfter substringBefore trim replace indexOf startsWith

endsWith contains containsIgnoreCase split join y escapeXml)

o El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlfunctions

3231 OPERACIONES CON ETIQUETAS BAacuteSICAS

En un ejemplo pasado teniacuteamos el siguiente coacutedigo

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

En este ejemplo se hace referencia al aacuterea baacutesica de JSTL con el prefijo c y se utiliza la

etiqueta cset para definir la variable atrCuenta Si la variable ya esta definida simplemente

se le asigna el valor especificado

La uacuteltima parte del ejemplo anterior podriacutea haberse escrito de esta otra forma

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcif test=rdquo$atrCuenta gt 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcifgt

$atrCuenta $str

La etiqueta cif permite la ejecucioacuten condicional de su cuerpo en funcioacuten del valor del

atributo de test

La etiqueta cchoose permite la ejecucioacuten del cuerpo de la primera etiqueta cwhen cuyo

atributo test sea evaluado a true Si ninguna de las condiciones se evaluacutea a true entonces se

evaluacutea el cuerpo de la etiqueta cotherwise si estaacute presente El siguiente coacutedigo muestra otra

manera de escribir el ejemplo anterior utilizando estas uacuteltimas etiquetas

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcchoosegt

ltcwhen test=rdquo$atrCuenta == 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcwhengt

ltcotherwisegt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcotherwisegt

ltcchoosegt

$atrCuenta $str

La etiqueta cforEach permite iterar sobre una coleccioacuten de objetos La coleccioacuten se

especifica por medio del atributo iacutetems y el elemento actual de la coleccioacuten estaacute disponible a

traveacutes de la variable establecida por el atributo var Por ejemplo el siguiente fragmento de

coacutedigo visualiza una tabla con las variables definidas a nivel de aacutembito de paacutegina

lttable border=rdquo1rdquogt

ltcforEach var=rdquoitemrdquo iacutetems=rdquo$pageScoperdquogt

lttrgt

lttdgt $item lttdgt

lttrgt

ltcforEachgt

lttablegt

La etiqueta ccatch atrapa una excepcioacuten que ocurra en el cuerpo de la misma Por ejemplo

el siguiente segmento de coacutedigo lanzaraacute una excepcioacuten si el paraacutemetro mes se escribe con

letras en vez de con nuacutemeros

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltbodygt

lthtmlgt

Un URL anaacutelogo al siguiente daraacute lugar a que la excepcioacuten sea lanzada cuando se ejecute la

expresioacuten $nMes 3 de la paacutegina anterior

httplocalhost8080JSP2exceppruebajspmes=marzo

La excepcioacuten indica que ha ocurrido un error al tratar de convertir ldquomarzordquo a un entero de

tipo Long Para cachar esta excepcioacuten y darle un tratamiento adecuado habraacute que modificar

la paacutegina JSP anterior como se indica a continuacioacuten

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltccatch var=rdquoerrorOcurridordquogt

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltccatchgt

ltcif test=rdquo$not empty errorOcurridordquogt

Error el paraacutemetro mes debe ser un nuacutemero ltbgt

ltbrgt Informacioacuten del error dada por el sistema

ltbrgt ltfont color=rdquoFF0000rdquogt $errorOcurrido ltfontgt

ltcifgt

ltbodygt

lthtmlgt

3232 ACCESO A BASES DE DATOS CON JSP

Las etiquetas que proporciona el aacuterea SQL permiten realizar

Conexioacuten con una base de datos

Realizacioacuten de consultas a la base de datos

Acceso al conjunto de resultados

Ejecucioacuten de actualizaciones y transacciones

Todas las etiquetas SQL actuacutean sobre una base de datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

32321 CONEXIOacuteN CON LA BASE DE DATOS

La conexioacuten con la base de datos puede realizarse con la etiqueta sqlsetDataSource Por

ejemplo si se esta utilizando el administrador de bases de datos MySql con el controlador

JDBC se puede realizar una conexioacuten con una base de datos digamos bd_tutorias de la

manera siguiente

ltsqlsetDataSource var=rdquobdrdquo

driver=rdquocommysqljdbcDriverrdquo

url=rdquojdbcmysqllocalhost3306bd_tutoriasrdquo

user=rdquoadminrdquo

password=rdquoadminadminrdquo gt

32322 CONSULTA A LA BASE DE DATOS

La etiqueta sqlQuero permite realizar una consulta a una base de datos Por ejemplo el

siguiente fragmento de coacutedigo realiza una consulta a la base de datos representada por bd y

obtiene un conjunto de resultados representado por cdr

ltsqlquery var=rdquocdrrdquo dataSource=rdquo$bdrdquogt

SELECT professor dia hora alumno

FROM profesores tutorias citas

WHERE profesoresid_profesor=tutoriasid_profesor

AND tutoriasid_tutoria=citasid_tutoria

ltsqlquerygt

32323 MODIFICACIONES SOBRE LA BASE DE DATOS

La etiqueta sqlupdate permite ejecutar una sentencia SQL INSERT UPDATE o DELETE

y cualquier otra sentencia SQL que no retorne ninguacuten valor Por ejemplo

ltsqlupdate var=rdquocontrdquo dataSource=rdquo$bdrdquo gt

UPDATE profesores

SET profesor=

WHERE profesor=

ltsqlparam value=rdquo$paramProfesorrdquo gt

ltsqlparam value=rdquo$paramIDrdquo gt

ltsqlupdategt

Una operacioacuten UPDATE puede utilizar el siacutembolo para indicar que el valor que tendriacutea que

evaluarse en esa posicioacuten seraacute suministrado por una etiqueta sqlparam como por ejemplo

httplocalhost8080JSP2sqlpruebajspProfesor=Mario+Rossainz+LopezampID=514

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt

ltbody bgcolor=lt= colorFondo gtgt

lth2 align=centergt Prueba de color lth2gt

lt

if (tieneColorExplicito)

outprintln(Ha indicado un color de fondo expliacutecito +

colorFondo +)

else

outprintln(Usareacute el color de fondo predeterminado WHITE +

Indique el atributo de peticioacuten

ltigtcolorFondoltigt+

para intentar un color estaacutendar un +

valor RRGGBB o para ver si el navegador Web +

permite el uso de nombres de color X11)

gt

ltbodygt

lthtmlgt

Cuyas posibles salidas son

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3213 DECLARACIONES JSP

Una declaracioacuten JSP permite definir meacutetodos o campos que seraacuten insertados en el cuerpo

principal de la clase del servlet (fuera del meacutetodo _jspService) Una declaracioacuten tiene la

sintaxis lt Coacutedigo Java gt Por ejemplo

lt int i=0 gt

lt

Public void jspinit()

coacutedigo de iniciacioacuten

gt

Una declaracioacuten no genera ninguacuten resultado y se usan junto con las expresiones JSP o los

scriptlets A continuacioacuten se muestra una paacutegina JSP que despliega la cantidad de veces que

se ha solicitado esta paacutegina desde que se arrancoacute el servidor haciendo uso de las

declaraciones JSP

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtDeclaraciones JSPlttitlegtltheadgt

ltbodygt

lth1gtDeclaraciones JSPlth1gt

lt-- Esto es un comentario en JSP --gt

lt private int recuentoAccesos=0 gt

lth2gt Accesos a la paacutegina desde el reinicio del servidor

lt= ++recuentoAccesos gt lth2gt

ltbodygt

lthtmlgt

La salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

322 EL LENGUAJE DE EXPRESION EN JSP 20

Anteriormente se ha visto la necesidad de utilizar fragmentos de coacutedigo java en el desarrollo

de paacuteginas JSP pero con la aparicioacuten de la especificacioacuten JSP 20 ya no hay necesidad de

utilizar fragmentos de coacutedigo Java para nada gracias al nuevo lenguaje de expresioacuten EL

(Expresioacuten Language) a la biblioteca de etiquetas estandar JSTL (JSP Standar Tag Library)

y a las nuevas formas para desarrollar etiquetas personalizadas

El lenguaje de expresioacuten JSP es maacutes un lenguaje de acceso a datos que un lenguaje de

programacioacuten Ya se ha visto que para pasar informacioacuten de un cliente a una paacutegina JSP se

utilizan paraacutemetros en la peticioacuten y atributos en la paacutegina El lenguaje de expresioacuten lo hace

posible sin tener que utilizar scriptlets o expresiones (lt= expresioacuten gt) Por ejemplo las

liacuteneas JSP 12 siguientes escritas utilizando coacutedigo Java

lt= requestgetParameter(ldquoparNombrerdquo) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt veces

bajo la especificacioacuten JSP 20 se pueden escribir de una forma maacutes sencilla como sigue

(ahora no se trata de coacutedigo JAVA)

$paramparNombre has visitado esta paacutegina

$atrCuenta veces

La sintaxis de JSP es sensible a mayuacutesculas y minuacutesculas pero un par de comillas simples es

equivalente a un par de comillas dobles

3221 VARIABLES PREDEFINIDAS (Objetos Impliacutecitos)

El lenguaje de expresioacuten JSP 20 soporta los objetos impliacutecitos siguientes

pageContext Objeto de javaxservletjspPageContext que proporciona acceso a los

datos de una peticioacuten

param Coleccioacuten (objeto de tipo javautilMap) de todos los valores de los paraacutemetros

enviados en una peticioacuten un String por paraacutemetro

paramValues Coleccioacuten de todos los valores de los paraacutemetros enviados en una

peticioacuten una matriz de tipo String por paraacutemetro

header Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten un

String por cabecera

headerValues Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten

una matriz de tipo String por cabecera

cookie Coleccioacuten de todos los valores de las cookies un objeto javaxservlethttpCookie

por cookie

initParam Coleccioacuten de todos los valores de los paraacutemetros de iniciacioacuten de la

aplicacioacuten un String por paraacutemetro

Tambieacuten hay objetos que permiten acceder a variables definidas en diferentes aacutembitos lo que

posibilita compartir informacioacuten

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

pageScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de paacutegina

requestScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

peticioacuten

sessionScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de sesioacuten

applicationScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

aplicacioacuten

3222 DIRECTRICES

Las directrices page incluye y taglib son mensajes para el motor JSP y son siempre incluidas

entre los siacutembolos lt y gt

32221 LA DIRECTRIZ PAGE

Define atributos que se aplican a toda la paacutegina JSP donde es incluida

lt page lista_de_atributos gt

Donde la lista_de_atributos puede contener algunos de los siguientes (aquellos que estaacuten

escritos en negrita son los tomados por omisioacuten)

language= ldquoscriptingLanguagerdquo

extends= rdquoclassNamerdquo

import= ldquoimportListrdquo

session= ldquotrue|falserdquo

buffer= ldquonone|sizeKb

autoflush= ldquotrue|falserdquo

isThreadSafe= rdquotrue|falserdquo

info= rdquoinfo_textrdquo

errorPage= ldquoerror_urlrdquo

isErrorPage= rdquotrue|falserdquo

contentType= rdquoctinfordquo

pageEncoding= rdquopeinfordquo

isELIgnored= ldquotrue|falserdquo

Tiacutepicamente se localiza al principio de la paacutegina JSP y puede haber cualquier nuacutemero de

ellas El lenguaje por omisioacuten es Java Ejemplos

lt page contentType=rdquotexthtmlrdquo language=rdquojavardquo gt

lt page import=rdquojavautil javalangrdquo gt

lt page buffer=rdquo5kbrdquo autoflush=rdquofalserdquo gt

32222 LA DIRECTRIZ INCLUDE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

La directriz include incluye un archivo (html jsp xml o de texto) en una paacutegina JSP Esto

permite dividir el contenido de la paacutegina en trozos maacutes manejables

lt incluye file=rdquoURL_relativordquo gt

El ejemplo siguiente muestra dos archivos el primero incluye al segundo para mostrar la

fecha y hora actuales

lt-- fichero mostrarFechaHorajsp --gt

lthtmlgt

ltheadgtlttitlegtIncluir un ficherolttitlegtltheadgt

ltbody bgcolor=whitegt

ltfont color=bluegt

La fecha y hora actuales son

lt include file=fechaHorajsp gt

ltfontgt

ltbodygt

lthtmlgt

lt-- fichero fechaHorajsp --gt

lt page import=javautil gt

lt= (new javautilDate())toLocaleString() gt

32223 LA DIRECTRIZ TAGLIB

La directriz taglib indica la biblioteca de acciones personalizadas que podremos utilizar en

la codificacioacuten de la paacutegina JSP Para distinguir esas acciones entre otras existentes se utiliza

un prefijo (prefix) Su sintaxis es

lt taglib (uri=rdquoURI_bibliotecardquo|tagdir=rdquoDir_biblioteca_tagrdquo)

prefix=rdquoprefijordquo gt

Cuando se trata de una biblioteca definida mediante una clase Java y un descriptor (archivo

tld) eacutesta se identifica mediante un URI (Uniform Resource Identifier- URL relativos) Por

ejemplo

lt taglib uri=rdquohttpMarioRossainzLopezmiBibliotecardquo

prefix=rdquofunrdquo gt

ltpgtltfunaccion01 gt

La uacuteltima liacutenea del ejemplo tiene dos etiquetas una etiqueta p HTML y otra accion01

perteneciente a la biblioteca miBiblioteca En cambio si la biblioteca se define mediante un

archivo tag entonces se identifica mediante su ruta relativa en el sistema de archivos

lt taglib tagdir=rdquoWEB-INFtagsrdquo prefix=rdquofunrdquo gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpgtltfunaccion01 gt

La directriz taglib debe colocarse antes de utilizar en la paacutegina JSP las acciones

personalizadas definidas por la misma Se puede utilizar maacutes de una directriz pero el prefijo

utilizado debe ser uacutenico para cada una de ellas

3223 ACTIVACION DEL LENGUAJE DE EXPRESION (LE)

La especificacioacuten JSP 20 define un lenguaje de expresioacuten como alternativa a elementos de

programacioacuten escritos con coacutedigo Java y especificaciones anteriores a la JSP 20 Para que

este lenguaje pueda ser interpretado tienen que cumplirse 2 requisitos

1 Que la propiedad isELIgnored de la directriz page valga false

lt page isELIgnored= ldquofalserdquo gt

2 Que el descriptor de despliegue webxml en la carpeta WEB-INF indique doacutende se

localiza el esquema XML para la especificacioacuten Servlet 24 que a su vez utiliza el

esquema XML para la especificacioacuten Java Server Page 20

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

Utilizando el lenguaje de expresioacuten se podriacutea modificar la paacutegina Cuentajsp de la seccioacuten

3212 de este documento como se muestra a continuacioacuten Esta nueva paacutegina

1 Especifica que utilizaraacute la biblioteca core de etiquetas estandar (de la que se hablaraacute maacutes

adelante)

2 La primera vez que sea accedida definiraacute la variable atrCuenta en el aacutembito de la

aplicacioacuten con un valor inicial nulo y la incrementaraacute en una unidad cuando sea accedida

sucesivas veces simplemente incrementaraacute esta variable en una unidad

3 Finalmente mostraraacute una paacutegina con un contenido anaacutelogo al siguiente Esta formado

por una cabecera y una segunda liacutenea compuesta por el valor del paraacutemetro parNombre

enviado con la peticioacuten un texto fijo el valor de la variable atrCuenta y otro texto fijo

dependiente del valor de esta variable

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

El coacutedigo completo es el siguiente

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

3224 VARIABLES Y EXPRESIONES

Para acceder a una simple variable se puede escribir algo como lo siguiente $nombre y

para acceder a una propiedad de un objeto podemos escribir algo como

$paramparNombre

$applicationScopeatrCuenta

$pageContextrequestrequestURI

La primera liacutenea del ejemplo anterior obtiene el valor de la propiedad parNombre del objeto

param la segunda el valor del atributo atrCuenta del objeto applicationScope y la tercera

el URL relativo de la paacutegina JSP solicitada

El lenguaje de expresioacuten es maacutes tolerante con respecto a las variables con valor null y ejecuta

muchas maacutes conversiones de forma automaacutetica sobre el tipo de los datos cuando la expresioacuten

a evaluar asiacute lo requiere Por ejemplo la etiqueta condicional siguiente incluye una expresioacuten

que compara el valor del atributo atrCuenta con aacutembito de aplicacioacuten con 10 (convirtiendo

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

impliacutecitamente el valor del atributo al tipo de la constante para poder realizar la comparacioacuten

El resultado seraacute un valor de tipo boolean

ltcif test=rdquo$applicationScopeatrCuenta gt 10rdquogt

ltcifgt

o bien

ltcif test=rdquo$atrCuenta gt 10rdquogt

ltcifgt

Para que una literal pueda incluir un caracter significativo para el lenguaje dicho caracter

debe ser especificado como una secuencia de escape (caracter) Por ejemplo la siguiente

expresioacuten da lugar al literal ldquovezrdquo o ldquovecesrdquo entre comillas dobles

$(atrCuenta gt 1) iquest ldquordquovecesrdquordquo ldquordquovezrdquordquo

Cualquier objeto o atributo de un objeto definido en algunos de los aacutembitos de una paacutegina

puede ser utilizado como una variable Por ejemplo $atrCuenta+1 es una expresioacuten que

realiza la suma de la variable atrCuenta con 1

Cuando se trate de una propiedad de un objeto para acceder a ella se utilizaraacute el operador

punto o bien la notacioacuten empleada para acceder a un elemento de una matriz Por ejemplo

$paramparNombre

$param[ldquoparNombrerdquo]

Una expresioacuten LE puede aparecer en cualquier lugar donde pueda aparecer un texto fijo Por

tanto para informar al contenedor JSP que se trata de una expresioacuten y no de un texto fijo se

utilizan los delimitadores $ al principio y al final

3225 OPERADORES

OPERADOR DESCRIPCIOacuteN Acceso a la propiedad de un objeto o a un elemento de un Map

[] Acceso al elemento de una matriz o de un objeto List

() Pareacutentesis para alterar la prioridad en la evaluacioacuten de una expresioacuten

If ternario condicion expresion1 expresioacuten 2

+ Suma

- Resta

Producto

oacute div Divisioacuten

oacute mod Moacutedulo o resto de una divisioacuten

== oacute eq Igualdad

= oacute ne Diferente

lt oacute lt Menor que

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt oacute gt Mayor que

lt= oacute le Menor o igual que

gt= oacute ge Mayor o igual que

ampamp oacute and Operacioacuten Loacutegica AND

|| oacute or Operacioacuten Loacutegica OR

oacute not Operacioacuten Loacutegica NOT

empty Verifica si el valor de una variable es null si un String esta vaciacuteo o si una matriz Map

o Collection no tienen elementos

func(args) Llamada a una funcioacuten donde func es el nombre de la funcioacuten y arg representa cero o

maacutes argumentos separados por comas

El ejemplo siguiente muestra una paacutegina JSP compuesta por elementos HTML expresiones

LE y objetos impliacutecitos

lthtmlgt

ltheadgtlttitlegtJSP 20lttitlegtltheadgt

ltbodygt

lth3gtLenguaje de expresioacuten (LE)lth3gt

ltpgtLa siguiente tabla ilustra algunas expresiones LE

ltbrgtltbrgtlttable border=1gt

lttrgt

ltthgtltbgtExpresioacutenltbgtltthgt

ltthgtltbgtValorltbgtltthgt

lttrgt

lttrgt

lttdgt$3 + 6lttdgt

lttdgt$3 + 6lttdgt

lttdgt

lttrgt

lttdgt$(7 gt 4) 7 4lttdgt

lttdgt$(7 gt 4) 7 4lttdgt

lttrgt

lttrgt

lttdgt$header[host]lttdgt

lttdgt$header[host]lttdgt

lttrgt

lttablegt

ltbodygt

lthtmlgt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

323 BIBLIOTECA ESTANDAR DE ETIQUETAS

La biblioteca estaacutendar de etiquetas JSP (JSTL ndash Java Server Page Estaacutendar Tag Library)

incluye una cantidad amplia de etiquetas para diferentes aacutereas de trabajo

Aacuterea baacutesica (su prefijo es c ndash core) y contiene

o Soporte de variables (remove y set)

o Control del flujo (choose when otherwise forEach forTokens if)

o Manejo de URL (import param redirect param y url param)

o Operaciones varias (match y out)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlcore

Aacuterea XML (su prefijo es x) y contiene

o Sentencias baacutesicas (out parse y set)

o Control del flujo (choosehellip whenhellip otherwise forEach e if)

o Transformacioacuten de Documentos (transformhellipparam)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlxml

Aacuterea Internacionalizacioacuten (su prefijo es fmt) Contiene

o Localidad (setLocale y requestEncoding)

o Mensajes (bundle message param y setBundle)

o Formateo de Fechas y nuacutemeros (formatNumber formateacuteate parseDate

parseNumber setTimeZone timeZone)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlfmt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Aacuterea SQL (su prefijo es sql) es el lenguaje estandar para interactuar con bases de datos

relacionales y contiene setDataSource Quero dateParam param transaction y

update dateParam param) El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlsql

Aacuterea Funciones (su prefijo es fn) y contiene

o Longitud de una coleccioacuten (length)

o Manipulacioacuten de String (toUpperCase toLowerCase substring

substringAfter substringBefore trim replace indexOf startsWith

endsWith contains containsIgnoreCase split join y escapeXml)

o El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlfunctions

3231 OPERACIONES CON ETIQUETAS BAacuteSICAS

En un ejemplo pasado teniacuteamos el siguiente coacutedigo

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

En este ejemplo se hace referencia al aacuterea baacutesica de JSTL con el prefijo c y se utiliza la

etiqueta cset para definir la variable atrCuenta Si la variable ya esta definida simplemente

se le asigna el valor especificado

La uacuteltima parte del ejemplo anterior podriacutea haberse escrito de esta otra forma

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcif test=rdquo$atrCuenta gt 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcifgt

$atrCuenta $str

La etiqueta cif permite la ejecucioacuten condicional de su cuerpo en funcioacuten del valor del

atributo de test

La etiqueta cchoose permite la ejecucioacuten del cuerpo de la primera etiqueta cwhen cuyo

atributo test sea evaluado a true Si ninguna de las condiciones se evaluacutea a true entonces se

evaluacutea el cuerpo de la etiqueta cotherwise si estaacute presente El siguiente coacutedigo muestra otra

manera de escribir el ejemplo anterior utilizando estas uacuteltimas etiquetas

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcchoosegt

ltcwhen test=rdquo$atrCuenta == 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcwhengt

ltcotherwisegt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcotherwisegt

ltcchoosegt

$atrCuenta $str

La etiqueta cforEach permite iterar sobre una coleccioacuten de objetos La coleccioacuten se

especifica por medio del atributo iacutetems y el elemento actual de la coleccioacuten estaacute disponible a

traveacutes de la variable establecida por el atributo var Por ejemplo el siguiente fragmento de

coacutedigo visualiza una tabla con las variables definidas a nivel de aacutembito de paacutegina

lttable border=rdquo1rdquogt

ltcforEach var=rdquoitemrdquo iacutetems=rdquo$pageScoperdquogt

lttrgt

lttdgt $item lttdgt

lttrgt

ltcforEachgt

lttablegt

La etiqueta ccatch atrapa una excepcioacuten que ocurra en el cuerpo de la misma Por ejemplo

el siguiente segmento de coacutedigo lanzaraacute una excepcioacuten si el paraacutemetro mes se escribe con

letras en vez de con nuacutemeros

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltbodygt

lthtmlgt

Un URL anaacutelogo al siguiente daraacute lugar a que la excepcioacuten sea lanzada cuando se ejecute la

expresioacuten $nMes 3 de la paacutegina anterior

httplocalhost8080JSP2exceppruebajspmes=marzo

La excepcioacuten indica que ha ocurrido un error al tratar de convertir ldquomarzordquo a un entero de

tipo Long Para cachar esta excepcioacuten y darle un tratamiento adecuado habraacute que modificar

la paacutegina JSP anterior como se indica a continuacioacuten

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltccatch var=rdquoerrorOcurridordquogt

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltccatchgt

ltcif test=rdquo$not empty errorOcurridordquogt

Error el paraacutemetro mes debe ser un nuacutemero ltbgt

ltbrgt Informacioacuten del error dada por el sistema

ltbrgt ltfont color=rdquoFF0000rdquogt $errorOcurrido ltfontgt

ltcifgt

ltbodygt

lthtmlgt

3232 ACCESO A BASES DE DATOS CON JSP

Las etiquetas que proporciona el aacuterea SQL permiten realizar

Conexioacuten con una base de datos

Realizacioacuten de consultas a la base de datos

Acceso al conjunto de resultados

Ejecucioacuten de actualizaciones y transacciones

Todas las etiquetas SQL actuacutean sobre una base de datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

32321 CONEXIOacuteN CON LA BASE DE DATOS

La conexioacuten con la base de datos puede realizarse con la etiqueta sqlsetDataSource Por

ejemplo si se esta utilizando el administrador de bases de datos MySql con el controlador

JDBC se puede realizar una conexioacuten con una base de datos digamos bd_tutorias de la

manera siguiente

ltsqlsetDataSource var=rdquobdrdquo

driver=rdquocommysqljdbcDriverrdquo

url=rdquojdbcmysqllocalhost3306bd_tutoriasrdquo

user=rdquoadminrdquo

password=rdquoadminadminrdquo gt

32322 CONSULTA A LA BASE DE DATOS

La etiqueta sqlQuero permite realizar una consulta a una base de datos Por ejemplo el

siguiente fragmento de coacutedigo realiza una consulta a la base de datos representada por bd y

obtiene un conjunto de resultados representado por cdr

ltsqlquery var=rdquocdrrdquo dataSource=rdquo$bdrdquogt

SELECT professor dia hora alumno

FROM profesores tutorias citas

WHERE profesoresid_profesor=tutoriasid_profesor

AND tutoriasid_tutoria=citasid_tutoria

ltsqlquerygt

32323 MODIFICACIONES SOBRE LA BASE DE DATOS

La etiqueta sqlupdate permite ejecutar una sentencia SQL INSERT UPDATE o DELETE

y cualquier otra sentencia SQL que no retorne ninguacuten valor Por ejemplo

ltsqlupdate var=rdquocontrdquo dataSource=rdquo$bdrdquo gt

UPDATE profesores

SET profesor=

WHERE profesor=

ltsqlparam value=rdquo$paramProfesorrdquo gt

ltsqlparam value=rdquo$paramIDrdquo gt

ltsqlupdategt

Una operacioacuten UPDATE puede utilizar el siacutembolo para indicar que el valor que tendriacutea que

evaluarse en esa posicioacuten seraacute suministrado por una etiqueta sqlparam como por ejemplo

httplocalhost8080JSP2sqlpruebajspProfesor=Mario+Rossainz+LopezampID=514

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

3213 DECLARACIONES JSP

Una declaracioacuten JSP permite definir meacutetodos o campos que seraacuten insertados en el cuerpo

principal de la clase del servlet (fuera del meacutetodo _jspService) Una declaracioacuten tiene la

sintaxis lt Coacutedigo Java gt Por ejemplo

lt int i=0 gt

lt

Public void jspinit()

coacutedigo de iniciacioacuten

gt

Una declaracioacuten no genera ninguacuten resultado y se usan junto con las expresiones JSP o los

scriptlets A continuacioacuten se muestra una paacutegina JSP que despliega la cantidad de veces que

se ha solicitado esta paacutegina desde que se arrancoacute el servidor haciendo uso de las

declaraciones JSP

ltpage contentType=texthtmlgt

lthtmlgt

ltheadgtlttitlegtDeclaraciones JSPlttitlegtltheadgt

ltbodygt

lth1gtDeclaraciones JSPlth1gt

lt-- Esto es un comentario en JSP --gt

lt private int recuentoAccesos=0 gt

lth2gt Accesos a la paacutegina desde el reinicio del servidor

lt= ++recuentoAccesos gt lth2gt

ltbodygt

lthtmlgt

La salida es la siguiente

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

322 EL LENGUAJE DE EXPRESION EN JSP 20

Anteriormente se ha visto la necesidad de utilizar fragmentos de coacutedigo java en el desarrollo

de paacuteginas JSP pero con la aparicioacuten de la especificacioacuten JSP 20 ya no hay necesidad de

utilizar fragmentos de coacutedigo Java para nada gracias al nuevo lenguaje de expresioacuten EL

(Expresioacuten Language) a la biblioteca de etiquetas estandar JSTL (JSP Standar Tag Library)

y a las nuevas formas para desarrollar etiquetas personalizadas

El lenguaje de expresioacuten JSP es maacutes un lenguaje de acceso a datos que un lenguaje de

programacioacuten Ya se ha visto que para pasar informacioacuten de un cliente a una paacutegina JSP se

utilizan paraacutemetros en la peticioacuten y atributos en la paacutegina El lenguaje de expresioacuten lo hace

posible sin tener que utilizar scriptlets o expresiones (lt= expresioacuten gt) Por ejemplo las

liacuteneas JSP 12 siguientes escritas utilizando coacutedigo Java

lt= requestgetParameter(ldquoparNombrerdquo) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt veces

bajo la especificacioacuten JSP 20 se pueden escribir de una forma maacutes sencilla como sigue

(ahora no se trata de coacutedigo JAVA)

$paramparNombre has visitado esta paacutegina

$atrCuenta veces

La sintaxis de JSP es sensible a mayuacutesculas y minuacutesculas pero un par de comillas simples es

equivalente a un par de comillas dobles

3221 VARIABLES PREDEFINIDAS (Objetos Impliacutecitos)

El lenguaje de expresioacuten JSP 20 soporta los objetos impliacutecitos siguientes

pageContext Objeto de javaxservletjspPageContext que proporciona acceso a los

datos de una peticioacuten

param Coleccioacuten (objeto de tipo javautilMap) de todos los valores de los paraacutemetros

enviados en una peticioacuten un String por paraacutemetro

paramValues Coleccioacuten de todos los valores de los paraacutemetros enviados en una

peticioacuten una matriz de tipo String por paraacutemetro

header Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten un

String por cabecera

headerValues Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten

una matriz de tipo String por cabecera

cookie Coleccioacuten de todos los valores de las cookies un objeto javaxservlethttpCookie

por cookie

initParam Coleccioacuten de todos los valores de los paraacutemetros de iniciacioacuten de la

aplicacioacuten un String por paraacutemetro

Tambieacuten hay objetos que permiten acceder a variables definidas en diferentes aacutembitos lo que

posibilita compartir informacioacuten

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

pageScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de paacutegina

requestScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

peticioacuten

sessionScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de sesioacuten

applicationScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

aplicacioacuten

3222 DIRECTRICES

Las directrices page incluye y taglib son mensajes para el motor JSP y son siempre incluidas

entre los siacutembolos lt y gt

32221 LA DIRECTRIZ PAGE

Define atributos que se aplican a toda la paacutegina JSP donde es incluida

lt page lista_de_atributos gt

Donde la lista_de_atributos puede contener algunos de los siguientes (aquellos que estaacuten

escritos en negrita son los tomados por omisioacuten)

language= ldquoscriptingLanguagerdquo

extends= rdquoclassNamerdquo

import= ldquoimportListrdquo

session= ldquotrue|falserdquo

buffer= ldquonone|sizeKb

autoflush= ldquotrue|falserdquo

isThreadSafe= rdquotrue|falserdquo

info= rdquoinfo_textrdquo

errorPage= ldquoerror_urlrdquo

isErrorPage= rdquotrue|falserdquo

contentType= rdquoctinfordquo

pageEncoding= rdquopeinfordquo

isELIgnored= ldquotrue|falserdquo

Tiacutepicamente se localiza al principio de la paacutegina JSP y puede haber cualquier nuacutemero de

ellas El lenguaje por omisioacuten es Java Ejemplos

lt page contentType=rdquotexthtmlrdquo language=rdquojavardquo gt

lt page import=rdquojavautil javalangrdquo gt

lt page buffer=rdquo5kbrdquo autoflush=rdquofalserdquo gt

32222 LA DIRECTRIZ INCLUDE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

La directriz include incluye un archivo (html jsp xml o de texto) en una paacutegina JSP Esto

permite dividir el contenido de la paacutegina en trozos maacutes manejables

lt incluye file=rdquoURL_relativordquo gt

El ejemplo siguiente muestra dos archivos el primero incluye al segundo para mostrar la

fecha y hora actuales

lt-- fichero mostrarFechaHorajsp --gt

lthtmlgt

ltheadgtlttitlegtIncluir un ficherolttitlegtltheadgt

ltbody bgcolor=whitegt

ltfont color=bluegt

La fecha y hora actuales son

lt include file=fechaHorajsp gt

ltfontgt

ltbodygt

lthtmlgt

lt-- fichero fechaHorajsp --gt

lt page import=javautil gt

lt= (new javautilDate())toLocaleString() gt

32223 LA DIRECTRIZ TAGLIB

La directriz taglib indica la biblioteca de acciones personalizadas que podremos utilizar en

la codificacioacuten de la paacutegina JSP Para distinguir esas acciones entre otras existentes se utiliza

un prefijo (prefix) Su sintaxis es

lt taglib (uri=rdquoURI_bibliotecardquo|tagdir=rdquoDir_biblioteca_tagrdquo)

prefix=rdquoprefijordquo gt

Cuando se trata de una biblioteca definida mediante una clase Java y un descriptor (archivo

tld) eacutesta se identifica mediante un URI (Uniform Resource Identifier- URL relativos) Por

ejemplo

lt taglib uri=rdquohttpMarioRossainzLopezmiBibliotecardquo

prefix=rdquofunrdquo gt

ltpgtltfunaccion01 gt

La uacuteltima liacutenea del ejemplo tiene dos etiquetas una etiqueta p HTML y otra accion01

perteneciente a la biblioteca miBiblioteca En cambio si la biblioteca se define mediante un

archivo tag entonces se identifica mediante su ruta relativa en el sistema de archivos

lt taglib tagdir=rdquoWEB-INFtagsrdquo prefix=rdquofunrdquo gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpgtltfunaccion01 gt

La directriz taglib debe colocarse antes de utilizar en la paacutegina JSP las acciones

personalizadas definidas por la misma Se puede utilizar maacutes de una directriz pero el prefijo

utilizado debe ser uacutenico para cada una de ellas

3223 ACTIVACION DEL LENGUAJE DE EXPRESION (LE)

La especificacioacuten JSP 20 define un lenguaje de expresioacuten como alternativa a elementos de

programacioacuten escritos con coacutedigo Java y especificaciones anteriores a la JSP 20 Para que

este lenguaje pueda ser interpretado tienen que cumplirse 2 requisitos

1 Que la propiedad isELIgnored de la directriz page valga false

lt page isELIgnored= ldquofalserdquo gt

2 Que el descriptor de despliegue webxml en la carpeta WEB-INF indique doacutende se

localiza el esquema XML para la especificacioacuten Servlet 24 que a su vez utiliza el

esquema XML para la especificacioacuten Java Server Page 20

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

Utilizando el lenguaje de expresioacuten se podriacutea modificar la paacutegina Cuentajsp de la seccioacuten

3212 de este documento como se muestra a continuacioacuten Esta nueva paacutegina

1 Especifica que utilizaraacute la biblioteca core de etiquetas estandar (de la que se hablaraacute maacutes

adelante)

2 La primera vez que sea accedida definiraacute la variable atrCuenta en el aacutembito de la

aplicacioacuten con un valor inicial nulo y la incrementaraacute en una unidad cuando sea accedida

sucesivas veces simplemente incrementaraacute esta variable en una unidad

3 Finalmente mostraraacute una paacutegina con un contenido anaacutelogo al siguiente Esta formado

por una cabecera y una segunda liacutenea compuesta por el valor del paraacutemetro parNombre

enviado con la peticioacuten un texto fijo el valor de la variable atrCuenta y otro texto fijo

dependiente del valor de esta variable

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

El coacutedigo completo es el siguiente

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

3224 VARIABLES Y EXPRESIONES

Para acceder a una simple variable se puede escribir algo como lo siguiente $nombre y

para acceder a una propiedad de un objeto podemos escribir algo como

$paramparNombre

$applicationScopeatrCuenta

$pageContextrequestrequestURI

La primera liacutenea del ejemplo anterior obtiene el valor de la propiedad parNombre del objeto

param la segunda el valor del atributo atrCuenta del objeto applicationScope y la tercera

el URL relativo de la paacutegina JSP solicitada

El lenguaje de expresioacuten es maacutes tolerante con respecto a las variables con valor null y ejecuta

muchas maacutes conversiones de forma automaacutetica sobre el tipo de los datos cuando la expresioacuten

a evaluar asiacute lo requiere Por ejemplo la etiqueta condicional siguiente incluye una expresioacuten

que compara el valor del atributo atrCuenta con aacutembito de aplicacioacuten con 10 (convirtiendo

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

impliacutecitamente el valor del atributo al tipo de la constante para poder realizar la comparacioacuten

El resultado seraacute un valor de tipo boolean

ltcif test=rdquo$applicationScopeatrCuenta gt 10rdquogt

ltcifgt

o bien

ltcif test=rdquo$atrCuenta gt 10rdquogt

ltcifgt

Para que una literal pueda incluir un caracter significativo para el lenguaje dicho caracter

debe ser especificado como una secuencia de escape (caracter) Por ejemplo la siguiente

expresioacuten da lugar al literal ldquovezrdquo o ldquovecesrdquo entre comillas dobles

$(atrCuenta gt 1) iquest ldquordquovecesrdquordquo ldquordquovezrdquordquo

Cualquier objeto o atributo de un objeto definido en algunos de los aacutembitos de una paacutegina

puede ser utilizado como una variable Por ejemplo $atrCuenta+1 es una expresioacuten que

realiza la suma de la variable atrCuenta con 1

Cuando se trate de una propiedad de un objeto para acceder a ella se utilizaraacute el operador

punto o bien la notacioacuten empleada para acceder a un elemento de una matriz Por ejemplo

$paramparNombre

$param[ldquoparNombrerdquo]

Una expresioacuten LE puede aparecer en cualquier lugar donde pueda aparecer un texto fijo Por

tanto para informar al contenedor JSP que se trata de una expresioacuten y no de un texto fijo se

utilizan los delimitadores $ al principio y al final

3225 OPERADORES

OPERADOR DESCRIPCIOacuteN Acceso a la propiedad de un objeto o a un elemento de un Map

[] Acceso al elemento de una matriz o de un objeto List

() Pareacutentesis para alterar la prioridad en la evaluacioacuten de una expresioacuten

If ternario condicion expresion1 expresioacuten 2

+ Suma

- Resta

Producto

oacute div Divisioacuten

oacute mod Moacutedulo o resto de una divisioacuten

== oacute eq Igualdad

= oacute ne Diferente

lt oacute lt Menor que

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt oacute gt Mayor que

lt= oacute le Menor o igual que

gt= oacute ge Mayor o igual que

ampamp oacute and Operacioacuten Loacutegica AND

|| oacute or Operacioacuten Loacutegica OR

oacute not Operacioacuten Loacutegica NOT

empty Verifica si el valor de una variable es null si un String esta vaciacuteo o si una matriz Map

o Collection no tienen elementos

func(args) Llamada a una funcioacuten donde func es el nombre de la funcioacuten y arg representa cero o

maacutes argumentos separados por comas

El ejemplo siguiente muestra una paacutegina JSP compuesta por elementos HTML expresiones

LE y objetos impliacutecitos

lthtmlgt

ltheadgtlttitlegtJSP 20lttitlegtltheadgt

ltbodygt

lth3gtLenguaje de expresioacuten (LE)lth3gt

ltpgtLa siguiente tabla ilustra algunas expresiones LE

ltbrgtltbrgtlttable border=1gt

lttrgt

ltthgtltbgtExpresioacutenltbgtltthgt

ltthgtltbgtValorltbgtltthgt

lttrgt

lttrgt

lttdgt$3 + 6lttdgt

lttdgt$3 + 6lttdgt

lttdgt

lttrgt

lttdgt$(7 gt 4) 7 4lttdgt

lttdgt$(7 gt 4) 7 4lttdgt

lttrgt

lttrgt

lttdgt$header[host]lttdgt

lttdgt$header[host]lttdgt

lttrgt

lttablegt

ltbodygt

lthtmlgt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

323 BIBLIOTECA ESTANDAR DE ETIQUETAS

La biblioteca estaacutendar de etiquetas JSP (JSTL ndash Java Server Page Estaacutendar Tag Library)

incluye una cantidad amplia de etiquetas para diferentes aacutereas de trabajo

Aacuterea baacutesica (su prefijo es c ndash core) y contiene

o Soporte de variables (remove y set)

o Control del flujo (choose when otherwise forEach forTokens if)

o Manejo de URL (import param redirect param y url param)

o Operaciones varias (match y out)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlcore

Aacuterea XML (su prefijo es x) y contiene

o Sentencias baacutesicas (out parse y set)

o Control del flujo (choosehellip whenhellip otherwise forEach e if)

o Transformacioacuten de Documentos (transformhellipparam)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlxml

Aacuterea Internacionalizacioacuten (su prefijo es fmt) Contiene

o Localidad (setLocale y requestEncoding)

o Mensajes (bundle message param y setBundle)

o Formateo de Fechas y nuacutemeros (formatNumber formateacuteate parseDate

parseNumber setTimeZone timeZone)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlfmt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Aacuterea SQL (su prefijo es sql) es el lenguaje estandar para interactuar con bases de datos

relacionales y contiene setDataSource Quero dateParam param transaction y

update dateParam param) El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlsql

Aacuterea Funciones (su prefijo es fn) y contiene

o Longitud de una coleccioacuten (length)

o Manipulacioacuten de String (toUpperCase toLowerCase substring

substringAfter substringBefore trim replace indexOf startsWith

endsWith contains containsIgnoreCase split join y escapeXml)

o El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlfunctions

3231 OPERACIONES CON ETIQUETAS BAacuteSICAS

En un ejemplo pasado teniacuteamos el siguiente coacutedigo

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

En este ejemplo se hace referencia al aacuterea baacutesica de JSTL con el prefijo c y se utiliza la

etiqueta cset para definir la variable atrCuenta Si la variable ya esta definida simplemente

se le asigna el valor especificado

La uacuteltima parte del ejemplo anterior podriacutea haberse escrito de esta otra forma

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcif test=rdquo$atrCuenta gt 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcifgt

$atrCuenta $str

La etiqueta cif permite la ejecucioacuten condicional de su cuerpo en funcioacuten del valor del

atributo de test

La etiqueta cchoose permite la ejecucioacuten del cuerpo de la primera etiqueta cwhen cuyo

atributo test sea evaluado a true Si ninguna de las condiciones se evaluacutea a true entonces se

evaluacutea el cuerpo de la etiqueta cotherwise si estaacute presente El siguiente coacutedigo muestra otra

manera de escribir el ejemplo anterior utilizando estas uacuteltimas etiquetas

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcchoosegt

ltcwhen test=rdquo$atrCuenta == 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcwhengt

ltcotherwisegt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcotherwisegt

ltcchoosegt

$atrCuenta $str

La etiqueta cforEach permite iterar sobre una coleccioacuten de objetos La coleccioacuten se

especifica por medio del atributo iacutetems y el elemento actual de la coleccioacuten estaacute disponible a

traveacutes de la variable establecida por el atributo var Por ejemplo el siguiente fragmento de

coacutedigo visualiza una tabla con las variables definidas a nivel de aacutembito de paacutegina

lttable border=rdquo1rdquogt

ltcforEach var=rdquoitemrdquo iacutetems=rdquo$pageScoperdquogt

lttrgt

lttdgt $item lttdgt

lttrgt

ltcforEachgt

lttablegt

La etiqueta ccatch atrapa una excepcioacuten que ocurra en el cuerpo de la misma Por ejemplo

el siguiente segmento de coacutedigo lanzaraacute una excepcioacuten si el paraacutemetro mes se escribe con

letras en vez de con nuacutemeros

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltbodygt

lthtmlgt

Un URL anaacutelogo al siguiente daraacute lugar a que la excepcioacuten sea lanzada cuando se ejecute la

expresioacuten $nMes 3 de la paacutegina anterior

httplocalhost8080JSP2exceppruebajspmes=marzo

La excepcioacuten indica que ha ocurrido un error al tratar de convertir ldquomarzordquo a un entero de

tipo Long Para cachar esta excepcioacuten y darle un tratamiento adecuado habraacute que modificar

la paacutegina JSP anterior como se indica a continuacioacuten

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltccatch var=rdquoerrorOcurridordquogt

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltccatchgt

ltcif test=rdquo$not empty errorOcurridordquogt

Error el paraacutemetro mes debe ser un nuacutemero ltbgt

ltbrgt Informacioacuten del error dada por el sistema

ltbrgt ltfont color=rdquoFF0000rdquogt $errorOcurrido ltfontgt

ltcifgt

ltbodygt

lthtmlgt

3232 ACCESO A BASES DE DATOS CON JSP

Las etiquetas que proporciona el aacuterea SQL permiten realizar

Conexioacuten con una base de datos

Realizacioacuten de consultas a la base de datos

Acceso al conjunto de resultados

Ejecucioacuten de actualizaciones y transacciones

Todas las etiquetas SQL actuacutean sobre una base de datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

32321 CONEXIOacuteN CON LA BASE DE DATOS

La conexioacuten con la base de datos puede realizarse con la etiqueta sqlsetDataSource Por

ejemplo si se esta utilizando el administrador de bases de datos MySql con el controlador

JDBC se puede realizar una conexioacuten con una base de datos digamos bd_tutorias de la

manera siguiente

ltsqlsetDataSource var=rdquobdrdquo

driver=rdquocommysqljdbcDriverrdquo

url=rdquojdbcmysqllocalhost3306bd_tutoriasrdquo

user=rdquoadminrdquo

password=rdquoadminadminrdquo gt

32322 CONSULTA A LA BASE DE DATOS

La etiqueta sqlQuero permite realizar una consulta a una base de datos Por ejemplo el

siguiente fragmento de coacutedigo realiza una consulta a la base de datos representada por bd y

obtiene un conjunto de resultados representado por cdr

ltsqlquery var=rdquocdrrdquo dataSource=rdquo$bdrdquogt

SELECT professor dia hora alumno

FROM profesores tutorias citas

WHERE profesoresid_profesor=tutoriasid_profesor

AND tutoriasid_tutoria=citasid_tutoria

ltsqlquerygt

32323 MODIFICACIONES SOBRE LA BASE DE DATOS

La etiqueta sqlupdate permite ejecutar una sentencia SQL INSERT UPDATE o DELETE

y cualquier otra sentencia SQL que no retorne ninguacuten valor Por ejemplo

ltsqlupdate var=rdquocontrdquo dataSource=rdquo$bdrdquo gt

UPDATE profesores

SET profesor=

WHERE profesor=

ltsqlparam value=rdquo$paramProfesorrdquo gt

ltsqlparam value=rdquo$paramIDrdquo gt

ltsqlupdategt

Una operacioacuten UPDATE puede utilizar el siacutembolo para indicar que el valor que tendriacutea que

evaluarse en esa posicioacuten seraacute suministrado por una etiqueta sqlparam como por ejemplo

httplocalhost8080JSP2sqlpruebajspProfesor=Mario+Rossainz+LopezampID=514

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

322 EL LENGUAJE DE EXPRESION EN JSP 20

Anteriormente se ha visto la necesidad de utilizar fragmentos de coacutedigo java en el desarrollo

de paacuteginas JSP pero con la aparicioacuten de la especificacioacuten JSP 20 ya no hay necesidad de

utilizar fragmentos de coacutedigo Java para nada gracias al nuevo lenguaje de expresioacuten EL

(Expresioacuten Language) a la biblioteca de etiquetas estandar JSTL (JSP Standar Tag Library)

y a las nuevas formas para desarrollar etiquetas personalizadas

El lenguaje de expresioacuten JSP es maacutes un lenguaje de acceso a datos que un lenguaje de

programacioacuten Ya se ha visto que para pasar informacioacuten de un cliente a una paacutegina JSP se

utilizan paraacutemetros en la peticioacuten y atributos en la paacutegina El lenguaje de expresioacuten lo hace

posible sin tener que utilizar scriptlets o expresiones (lt= expresioacuten gt) Por ejemplo las

liacuteneas JSP 12 siguientes escritas utilizando coacutedigo Java

lt= requestgetParameter(ldquoparNombrerdquo) gt has visitado esta paacutegina

lt= applicationgetAttribute(ldquoatrCuentardquo) gt veces

bajo la especificacioacuten JSP 20 se pueden escribir de una forma maacutes sencilla como sigue

(ahora no se trata de coacutedigo JAVA)

$paramparNombre has visitado esta paacutegina

$atrCuenta veces

La sintaxis de JSP es sensible a mayuacutesculas y minuacutesculas pero un par de comillas simples es

equivalente a un par de comillas dobles

3221 VARIABLES PREDEFINIDAS (Objetos Impliacutecitos)

El lenguaje de expresioacuten JSP 20 soporta los objetos impliacutecitos siguientes

pageContext Objeto de javaxservletjspPageContext que proporciona acceso a los

datos de una peticioacuten

param Coleccioacuten (objeto de tipo javautilMap) de todos los valores de los paraacutemetros

enviados en una peticioacuten un String por paraacutemetro

paramValues Coleccioacuten de todos los valores de los paraacutemetros enviados en una

peticioacuten una matriz de tipo String por paraacutemetro

header Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten un

String por cabecera

headerValues Coleccioacuten de todos los valores de las cabeceras enviadas en una peticioacuten

una matriz de tipo String por cabecera

cookie Coleccioacuten de todos los valores de las cookies un objeto javaxservlethttpCookie

por cookie

initParam Coleccioacuten de todos los valores de los paraacutemetros de iniciacioacuten de la

aplicacioacuten un String por paraacutemetro

Tambieacuten hay objetos que permiten acceder a variables definidas en diferentes aacutembitos lo que

posibilita compartir informacioacuten

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

pageScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de paacutegina

requestScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

peticioacuten

sessionScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de sesioacuten

applicationScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

aplicacioacuten

3222 DIRECTRICES

Las directrices page incluye y taglib son mensajes para el motor JSP y son siempre incluidas

entre los siacutembolos lt y gt

32221 LA DIRECTRIZ PAGE

Define atributos que se aplican a toda la paacutegina JSP donde es incluida

lt page lista_de_atributos gt

Donde la lista_de_atributos puede contener algunos de los siguientes (aquellos que estaacuten

escritos en negrita son los tomados por omisioacuten)

language= ldquoscriptingLanguagerdquo

extends= rdquoclassNamerdquo

import= ldquoimportListrdquo

session= ldquotrue|falserdquo

buffer= ldquonone|sizeKb

autoflush= ldquotrue|falserdquo

isThreadSafe= rdquotrue|falserdquo

info= rdquoinfo_textrdquo

errorPage= ldquoerror_urlrdquo

isErrorPage= rdquotrue|falserdquo

contentType= rdquoctinfordquo

pageEncoding= rdquopeinfordquo

isELIgnored= ldquotrue|falserdquo

Tiacutepicamente se localiza al principio de la paacutegina JSP y puede haber cualquier nuacutemero de

ellas El lenguaje por omisioacuten es Java Ejemplos

lt page contentType=rdquotexthtmlrdquo language=rdquojavardquo gt

lt page import=rdquojavautil javalangrdquo gt

lt page buffer=rdquo5kbrdquo autoflush=rdquofalserdquo gt

32222 LA DIRECTRIZ INCLUDE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

La directriz include incluye un archivo (html jsp xml o de texto) en una paacutegina JSP Esto

permite dividir el contenido de la paacutegina en trozos maacutes manejables

lt incluye file=rdquoURL_relativordquo gt

El ejemplo siguiente muestra dos archivos el primero incluye al segundo para mostrar la

fecha y hora actuales

lt-- fichero mostrarFechaHorajsp --gt

lthtmlgt

ltheadgtlttitlegtIncluir un ficherolttitlegtltheadgt

ltbody bgcolor=whitegt

ltfont color=bluegt

La fecha y hora actuales son

lt include file=fechaHorajsp gt

ltfontgt

ltbodygt

lthtmlgt

lt-- fichero fechaHorajsp --gt

lt page import=javautil gt

lt= (new javautilDate())toLocaleString() gt

32223 LA DIRECTRIZ TAGLIB

La directriz taglib indica la biblioteca de acciones personalizadas que podremos utilizar en

la codificacioacuten de la paacutegina JSP Para distinguir esas acciones entre otras existentes se utiliza

un prefijo (prefix) Su sintaxis es

lt taglib (uri=rdquoURI_bibliotecardquo|tagdir=rdquoDir_biblioteca_tagrdquo)

prefix=rdquoprefijordquo gt

Cuando se trata de una biblioteca definida mediante una clase Java y un descriptor (archivo

tld) eacutesta se identifica mediante un URI (Uniform Resource Identifier- URL relativos) Por

ejemplo

lt taglib uri=rdquohttpMarioRossainzLopezmiBibliotecardquo

prefix=rdquofunrdquo gt

ltpgtltfunaccion01 gt

La uacuteltima liacutenea del ejemplo tiene dos etiquetas una etiqueta p HTML y otra accion01

perteneciente a la biblioteca miBiblioteca En cambio si la biblioteca se define mediante un

archivo tag entonces se identifica mediante su ruta relativa en el sistema de archivos

lt taglib tagdir=rdquoWEB-INFtagsrdquo prefix=rdquofunrdquo gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpgtltfunaccion01 gt

La directriz taglib debe colocarse antes de utilizar en la paacutegina JSP las acciones

personalizadas definidas por la misma Se puede utilizar maacutes de una directriz pero el prefijo

utilizado debe ser uacutenico para cada una de ellas

3223 ACTIVACION DEL LENGUAJE DE EXPRESION (LE)

La especificacioacuten JSP 20 define un lenguaje de expresioacuten como alternativa a elementos de

programacioacuten escritos con coacutedigo Java y especificaciones anteriores a la JSP 20 Para que

este lenguaje pueda ser interpretado tienen que cumplirse 2 requisitos

1 Que la propiedad isELIgnored de la directriz page valga false

lt page isELIgnored= ldquofalserdquo gt

2 Que el descriptor de despliegue webxml en la carpeta WEB-INF indique doacutende se

localiza el esquema XML para la especificacioacuten Servlet 24 que a su vez utiliza el

esquema XML para la especificacioacuten Java Server Page 20

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

Utilizando el lenguaje de expresioacuten se podriacutea modificar la paacutegina Cuentajsp de la seccioacuten

3212 de este documento como se muestra a continuacioacuten Esta nueva paacutegina

1 Especifica que utilizaraacute la biblioteca core de etiquetas estandar (de la que se hablaraacute maacutes

adelante)

2 La primera vez que sea accedida definiraacute la variable atrCuenta en el aacutembito de la

aplicacioacuten con un valor inicial nulo y la incrementaraacute en una unidad cuando sea accedida

sucesivas veces simplemente incrementaraacute esta variable en una unidad

3 Finalmente mostraraacute una paacutegina con un contenido anaacutelogo al siguiente Esta formado

por una cabecera y una segunda liacutenea compuesta por el valor del paraacutemetro parNombre

enviado con la peticioacuten un texto fijo el valor de la variable atrCuenta y otro texto fijo

dependiente del valor de esta variable

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

El coacutedigo completo es el siguiente

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

3224 VARIABLES Y EXPRESIONES

Para acceder a una simple variable se puede escribir algo como lo siguiente $nombre y

para acceder a una propiedad de un objeto podemos escribir algo como

$paramparNombre

$applicationScopeatrCuenta

$pageContextrequestrequestURI

La primera liacutenea del ejemplo anterior obtiene el valor de la propiedad parNombre del objeto

param la segunda el valor del atributo atrCuenta del objeto applicationScope y la tercera

el URL relativo de la paacutegina JSP solicitada

El lenguaje de expresioacuten es maacutes tolerante con respecto a las variables con valor null y ejecuta

muchas maacutes conversiones de forma automaacutetica sobre el tipo de los datos cuando la expresioacuten

a evaluar asiacute lo requiere Por ejemplo la etiqueta condicional siguiente incluye una expresioacuten

que compara el valor del atributo atrCuenta con aacutembito de aplicacioacuten con 10 (convirtiendo

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

impliacutecitamente el valor del atributo al tipo de la constante para poder realizar la comparacioacuten

El resultado seraacute un valor de tipo boolean

ltcif test=rdquo$applicationScopeatrCuenta gt 10rdquogt

ltcifgt

o bien

ltcif test=rdquo$atrCuenta gt 10rdquogt

ltcifgt

Para que una literal pueda incluir un caracter significativo para el lenguaje dicho caracter

debe ser especificado como una secuencia de escape (caracter) Por ejemplo la siguiente

expresioacuten da lugar al literal ldquovezrdquo o ldquovecesrdquo entre comillas dobles

$(atrCuenta gt 1) iquest ldquordquovecesrdquordquo ldquordquovezrdquordquo

Cualquier objeto o atributo de un objeto definido en algunos de los aacutembitos de una paacutegina

puede ser utilizado como una variable Por ejemplo $atrCuenta+1 es una expresioacuten que

realiza la suma de la variable atrCuenta con 1

Cuando se trate de una propiedad de un objeto para acceder a ella se utilizaraacute el operador

punto o bien la notacioacuten empleada para acceder a un elemento de una matriz Por ejemplo

$paramparNombre

$param[ldquoparNombrerdquo]

Una expresioacuten LE puede aparecer en cualquier lugar donde pueda aparecer un texto fijo Por

tanto para informar al contenedor JSP que se trata de una expresioacuten y no de un texto fijo se

utilizan los delimitadores $ al principio y al final

3225 OPERADORES

OPERADOR DESCRIPCIOacuteN Acceso a la propiedad de un objeto o a un elemento de un Map

[] Acceso al elemento de una matriz o de un objeto List

() Pareacutentesis para alterar la prioridad en la evaluacioacuten de una expresioacuten

If ternario condicion expresion1 expresioacuten 2

+ Suma

- Resta

Producto

oacute div Divisioacuten

oacute mod Moacutedulo o resto de una divisioacuten

== oacute eq Igualdad

= oacute ne Diferente

lt oacute lt Menor que

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt oacute gt Mayor que

lt= oacute le Menor o igual que

gt= oacute ge Mayor o igual que

ampamp oacute and Operacioacuten Loacutegica AND

|| oacute or Operacioacuten Loacutegica OR

oacute not Operacioacuten Loacutegica NOT

empty Verifica si el valor de una variable es null si un String esta vaciacuteo o si una matriz Map

o Collection no tienen elementos

func(args) Llamada a una funcioacuten donde func es el nombre de la funcioacuten y arg representa cero o

maacutes argumentos separados por comas

El ejemplo siguiente muestra una paacutegina JSP compuesta por elementos HTML expresiones

LE y objetos impliacutecitos

lthtmlgt

ltheadgtlttitlegtJSP 20lttitlegtltheadgt

ltbodygt

lth3gtLenguaje de expresioacuten (LE)lth3gt

ltpgtLa siguiente tabla ilustra algunas expresiones LE

ltbrgtltbrgtlttable border=1gt

lttrgt

ltthgtltbgtExpresioacutenltbgtltthgt

ltthgtltbgtValorltbgtltthgt

lttrgt

lttrgt

lttdgt$3 + 6lttdgt

lttdgt$3 + 6lttdgt

lttdgt

lttrgt

lttdgt$(7 gt 4) 7 4lttdgt

lttdgt$(7 gt 4) 7 4lttdgt

lttrgt

lttrgt

lttdgt$header[host]lttdgt

lttdgt$header[host]lttdgt

lttrgt

lttablegt

ltbodygt

lthtmlgt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

323 BIBLIOTECA ESTANDAR DE ETIQUETAS

La biblioteca estaacutendar de etiquetas JSP (JSTL ndash Java Server Page Estaacutendar Tag Library)

incluye una cantidad amplia de etiquetas para diferentes aacutereas de trabajo

Aacuterea baacutesica (su prefijo es c ndash core) y contiene

o Soporte de variables (remove y set)

o Control del flujo (choose when otherwise forEach forTokens if)

o Manejo de URL (import param redirect param y url param)

o Operaciones varias (match y out)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlcore

Aacuterea XML (su prefijo es x) y contiene

o Sentencias baacutesicas (out parse y set)

o Control del flujo (choosehellip whenhellip otherwise forEach e if)

o Transformacioacuten de Documentos (transformhellipparam)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlxml

Aacuterea Internacionalizacioacuten (su prefijo es fmt) Contiene

o Localidad (setLocale y requestEncoding)

o Mensajes (bundle message param y setBundle)

o Formateo de Fechas y nuacutemeros (formatNumber formateacuteate parseDate

parseNumber setTimeZone timeZone)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlfmt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Aacuterea SQL (su prefijo es sql) es el lenguaje estandar para interactuar con bases de datos

relacionales y contiene setDataSource Quero dateParam param transaction y

update dateParam param) El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlsql

Aacuterea Funciones (su prefijo es fn) y contiene

o Longitud de una coleccioacuten (length)

o Manipulacioacuten de String (toUpperCase toLowerCase substring

substringAfter substringBefore trim replace indexOf startsWith

endsWith contains containsIgnoreCase split join y escapeXml)

o El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlfunctions

3231 OPERACIONES CON ETIQUETAS BAacuteSICAS

En un ejemplo pasado teniacuteamos el siguiente coacutedigo

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

En este ejemplo se hace referencia al aacuterea baacutesica de JSTL con el prefijo c y se utiliza la

etiqueta cset para definir la variable atrCuenta Si la variable ya esta definida simplemente

se le asigna el valor especificado

La uacuteltima parte del ejemplo anterior podriacutea haberse escrito de esta otra forma

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcif test=rdquo$atrCuenta gt 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcifgt

$atrCuenta $str

La etiqueta cif permite la ejecucioacuten condicional de su cuerpo en funcioacuten del valor del

atributo de test

La etiqueta cchoose permite la ejecucioacuten del cuerpo de la primera etiqueta cwhen cuyo

atributo test sea evaluado a true Si ninguna de las condiciones se evaluacutea a true entonces se

evaluacutea el cuerpo de la etiqueta cotherwise si estaacute presente El siguiente coacutedigo muestra otra

manera de escribir el ejemplo anterior utilizando estas uacuteltimas etiquetas

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcchoosegt

ltcwhen test=rdquo$atrCuenta == 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcwhengt

ltcotherwisegt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcotherwisegt

ltcchoosegt

$atrCuenta $str

La etiqueta cforEach permite iterar sobre una coleccioacuten de objetos La coleccioacuten se

especifica por medio del atributo iacutetems y el elemento actual de la coleccioacuten estaacute disponible a

traveacutes de la variable establecida por el atributo var Por ejemplo el siguiente fragmento de

coacutedigo visualiza una tabla con las variables definidas a nivel de aacutembito de paacutegina

lttable border=rdquo1rdquogt

ltcforEach var=rdquoitemrdquo iacutetems=rdquo$pageScoperdquogt

lttrgt

lttdgt $item lttdgt

lttrgt

ltcforEachgt

lttablegt

La etiqueta ccatch atrapa una excepcioacuten que ocurra en el cuerpo de la misma Por ejemplo

el siguiente segmento de coacutedigo lanzaraacute una excepcioacuten si el paraacutemetro mes se escribe con

letras en vez de con nuacutemeros

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltbodygt

lthtmlgt

Un URL anaacutelogo al siguiente daraacute lugar a que la excepcioacuten sea lanzada cuando se ejecute la

expresioacuten $nMes 3 de la paacutegina anterior

httplocalhost8080JSP2exceppruebajspmes=marzo

La excepcioacuten indica que ha ocurrido un error al tratar de convertir ldquomarzordquo a un entero de

tipo Long Para cachar esta excepcioacuten y darle un tratamiento adecuado habraacute que modificar

la paacutegina JSP anterior como se indica a continuacioacuten

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltccatch var=rdquoerrorOcurridordquogt

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltccatchgt

ltcif test=rdquo$not empty errorOcurridordquogt

Error el paraacutemetro mes debe ser un nuacutemero ltbgt

ltbrgt Informacioacuten del error dada por el sistema

ltbrgt ltfont color=rdquoFF0000rdquogt $errorOcurrido ltfontgt

ltcifgt

ltbodygt

lthtmlgt

3232 ACCESO A BASES DE DATOS CON JSP

Las etiquetas que proporciona el aacuterea SQL permiten realizar

Conexioacuten con una base de datos

Realizacioacuten de consultas a la base de datos

Acceso al conjunto de resultados

Ejecucioacuten de actualizaciones y transacciones

Todas las etiquetas SQL actuacutean sobre una base de datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

32321 CONEXIOacuteN CON LA BASE DE DATOS

La conexioacuten con la base de datos puede realizarse con la etiqueta sqlsetDataSource Por

ejemplo si se esta utilizando el administrador de bases de datos MySql con el controlador

JDBC se puede realizar una conexioacuten con una base de datos digamos bd_tutorias de la

manera siguiente

ltsqlsetDataSource var=rdquobdrdquo

driver=rdquocommysqljdbcDriverrdquo

url=rdquojdbcmysqllocalhost3306bd_tutoriasrdquo

user=rdquoadminrdquo

password=rdquoadminadminrdquo gt

32322 CONSULTA A LA BASE DE DATOS

La etiqueta sqlQuero permite realizar una consulta a una base de datos Por ejemplo el

siguiente fragmento de coacutedigo realiza una consulta a la base de datos representada por bd y

obtiene un conjunto de resultados representado por cdr

ltsqlquery var=rdquocdrrdquo dataSource=rdquo$bdrdquogt

SELECT professor dia hora alumno

FROM profesores tutorias citas

WHERE profesoresid_profesor=tutoriasid_profesor

AND tutoriasid_tutoria=citasid_tutoria

ltsqlquerygt

32323 MODIFICACIONES SOBRE LA BASE DE DATOS

La etiqueta sqlupdate permite ejecutar una sentencia SQL INSERT UPDATE o DELETE

y cualquier otra sentencia SQL que no retorne ninguacuten valor Por ejemplo

ltsqlupdate var=rdquocontrdquo dataSource=rdquo$bdrdquo gt

UPDATE profesores

SET profesor=

WHERE profesor=

ltsqlparam value=rdquo$paramProfesorrdquo gt

ltsqlparam value=rdquo$paramIDrdquo gt

ltsqlupdategt

Una operacioacuten UPDATE puede utilizar el siacutembolo para indicar que el valor que tendriacutea que

evaluarse en esa posicioacuten seraacute suministrado por una etiqueta sqlparam como por ejemplo

httplocalhost8080JSP2sqlpruebajspProfesor=Mario+Rossainz+LopezampID=514

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

pageScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de paacutegina

requestScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

peticioacuten

sessionScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de sesioacuten

applicationScope Coleccioacuten de los nombres de las variables definidas en el aacutembito de

aplicacioacuten

3222 DIRECTRICES

Las directrices page incluye y taglib son mensajes para el motor JSP y son siempre incluidas

entre los siacutembolos lt y gt

32221 LA DIRECTRIZ PAGE

Define atributos que se aplican a toda la paacutegina JSP donde es incluida

lt page lista_de_atributos gt

Donde la lista_de_atributos puede contener algunos de los siguientes (aquellos que estaacuten

escritos en negrita son los tomados por omisioacuten)

language= ldquoscriptingLanguagerdquo

extends= rdquoclassNamerdquo

import= ldquoimportListrdquo

session= ldquotrue|falserdquo

buffer= ldquonone|sizeKb

autoflush= ldquotrue|falserdquo

isThreadSafe= rdquotrue|falserdquo

info= rdquoinfo_textrdquo

errorPage= ldquoerror_urlrdquo

isErrorPage= rdquotrue|falserdquo

contentType= rdquoctinfordquo

pageEncoding= rdquopeinfordquo

isELIgnored= ldquotrue|falserdquo

Tiacutepicamente se localiza al principio de la paacutegina JSP y puede haber cualquier nuacutemero de

ellas El lenguaje por omisioacuten es Java Ejemplos

lt page contentType=rdquotexthtmlrdquo language=rdquojavardquo gt

lt page import=rdquojavautil javalangrdquo gt

lt page buffer=rdquo5kbrdquo autoflush=rdquofalserdquo gt

32222 LA DIRECTRIZ INCLUDE

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

La directriz include incluye un archivo (html jsp xml o de texto) en una paacutegina JSP Esto

permite dividir el contenido de la paacutegina en trozos maacutes manejables

lt incluye file=rdquoURL_relativordquo gt

El ejemplo siguiente muestra dos archivos el primero incluye al segundo para mostrar la

fecha y hora actuales

lt-- fichero mostrarFechaHorajsp --gt

lthtmlgt

ltheadgtlttitlegtIncluir un ficherolttitlegtltheadgt

ltbody bgcolor=whitegt

ltfont color=bluegt

La fecha y hora actuales son

lt include file=fechaHorajsp gt

ltfontgt

ltbodygt

lthtmlgt

lt-- fichero fechaHorajsp --gt

lt page import=javautil gt

lt= (new javautilDate())toLocaleString() gt

32223 LA DIRECTRIZ TAGLIB

La directriz taglib indica la biblioteca de acciones personalizadas que podremos utilizar en

la codificacioacuten de la paacutegina JSP Para distinguir esas acciones entre otras existentes se utiliza

un prefijo (prefix) Su sintaxis es

lt taglib (uri=rdquoURI_bibliotecardquo|tagdir=rdquoDir_biblioteca_tagrdquo)

prefix=rdquoprefijordquo gt

Cuando se trata de una biblioteca definida mediante una clase Java y un descriptor (archivo

tld) eacutesta se identifica mediante un URI (Uniform Resource Identifier- URL relativos) Por

ejemplo

lt taglib uri=rdquohttpMarioRossainzLopezmiBibliotecardquo

prefix=rdquofunrdquo gt

ltpgtltfunaccion01 gt

La uacuteltima liacutenea del ejemplo tiene dos etiquetas una etiqueta p HTML y otra accion01

perteneciente a la biblioteca miBiblioteca En cambio si la biblioteca se define mediante un

archivo tag entonces se identifica mediante su ruta relativa en el sistema de archivos

lt taglib tagdir=rdquoWEB-INFtagsrdquo prefix=rdquofunrdquo gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpgtltfunaccion01 gt

La directriz taglib debe colocarse antes de utilizar en la paacutegina JSP las acciones

personalizadas definidas por la misma Se puede utilizar maacutes de una directriz pero el prefijo

utilizado debe ser uacutenico para cada una de ellas

3223 ACTIVACION DEL LENGUAJE DE EXPRESION (LE)

La especificacioacuten JSP 20 define un lenguaje de expresioacuten como alternativa a elementos de

programacioacuten escritos con coacutedigo Java y especificaciones anteriores a la JSP 20 Para que

este lenguaje pueda ser interpretado tienen que cumplirse 2 requisitos

1 Que la propiedad isELIgnored de la directriz page valga false

lt page isELIgnored= ldquofalserdquo gt

2 Que el descriptor de despliegue webxml en la carpeta WEB-INF indique doacutende se

localiza el esquema XML para la especificacioacuten Servlet 24 que a su vez utiliza el

esquema XML para la especificacioacuten Java Server Page 20

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

Utilizando el lenguaje de expresioacuten se podriacutea modificar la paacutegina Cuentajsp de la seccioacuten

3212 de este documento como se muestra a continuacioacuten Esta nueva paacutegina

1 Especifica que utilizaraacute la biblioteca core de etiquetas estandar (de la que se hablaraacute maacutes

adelante)

2 La primera vez que sea accedida definiraacute la variable atrCuenta en el aacutembito de la

aplicacioacuten con un valor inicial nulo y la incrementaraacute en una unidad cuando sea accedida

sucesivas veces simplemente incrementaraacute esta variable en una unidad

3 Finalmente mostraraacute una paacutegina con un contenido anaacutelogo al siguiente Esta formado

por una cabecera y una segunda liacutenea compuesta por el valor del paraacutemetro parNombre

enviado con la peticioacuten un texto fijo el valor de la variable atrCuenta y otro texto fijo

dependiente del valor de esta variable

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

El coacutedigo completo es el siguiente

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

3224 VARIABLES Y EXPRESIONES

Para acceder a una simple variable se puede escribir algo como lo siguiente $nombre y

para acceder a una propiedad de un objeto podemos escribir algo como

$paramparNombre

$applicationScopeatrCuenta

$pageContextrequestrequestURI

La primera liacutenea del ejemplo anterior obtiene el valor de la propiedad parNombre del objeto

param la segunda el valor del atributo atrCuenta del objeto applicationScope y la tercera

el URL relativo de la paacutegina JSP solicitada

El lenguaje de expresioacuten es maacutes tolerante con respecto a las variables con valor null y ejecuta

muchas maacutes conversiones de forma automaacutetica sobre el tipo de los datos cuando la expresioacuten

a evaluar asiacute lo requiere Por ejemplo la etiqueta condicional siguiente incluye una expresioacuten

que compara el valor del atributo atrCuenta con aacutembito de aplicacioacuten con 10 (convirtiendo

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

impliacutecitamente el valor del atributo al tipo de la constante para poder realizar la comparacioacuten

El resultado seraacute un valor de tipo boolean

ltcif test=rdquo$applicationScopeatrCuenta gt 10rdquogt

ltcifgt

o bien

ltcif test=rdquo$atrCuenta gt 10rdquogt

ltcifgt

Para que una literal pueda incluir un caracter significativo para el lenguaje dicho caracter

debe ser especificado como una secuencia de escape (caracter) Por ejemplo la siguiente

expresioacuten da lugar al literal ldquovezrdquo o ldquovecesrdquo entre comillas dobles

$(atrCuenta gt 1) iquest ldquordquovecesrdquordquo ldquordquovezrdquordquo

Cualquier objeto o atributo de un objeto definido en algunos de los aacutembitos de una paacutegina

puede ser utilizado como una variable Por ejemplo $atrCuenta+1 es una expresioacuten que

realiza la suma de la variable atrCuenta con 1

Cuando se trate de una propiedad de un objeto para acceder a ella se utilizaraacute el operador

punto o bien la notacioacuten empleada para acceder a un elemento de una matriz Por ejemplo

$paramparNombre

$param[ldquoparNombrerdquo]

Una expresioacuten LE puede aparecer en cualquier lugar donde pueda aparecer un texto fijo Por

tanto para informar al contenedor JSP que se trata de una expresioacuten y no de un texto fijo se

utilizan los delimitadores $ al principio y al final

3225 OPERADORES

OPERADOR DESCRIPCIOacuteN Acceso a la propiedad de un objeto o a un elemento de un Map

[] Acceso al elemento de una matriz o de un objeto List

() Pareacutentesis para alterar la prioridad en la evaluacioacuten de una expresioacuten

If ternario condicion expresion1 expresioacuten 2

+ Suma

- Resta

Producto

oacute div Divisioacuten

oacute mod Moacutedulo o resto de una divisioacuten

== oacute eq Igualdad

= oacute ne Diferente

lt oacute lt Menor que

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt oacute gt Mayor que

lt= oacute le Menor o igual que

gt= oacute ge Mayor o igual que

ampamp oacute and Operacioacuten Loacutegica AND

|| oacute or Operacioacuten Loacutegica OR

oacute not Operacioacuten Loacutegica NOT

empty Verifica si el valor de una variable es null si un String esta vaciacuteo o si una matriz Map

o Collection no tienen elementos

func(args) Llamada a una funcioacuten donde func es el nombre de la funcioacuten y arg representa cero o

maacutes argumentos separados por comas

El ejemplo siguiente muestra una paacutegina JSP compuesta por elementos HTML expresiones

LE y objetos impliacutecitos

lthtmlgt

ltheadgtlttitlegtJSP 20lttitlegtltheadgt

ltbodygt

lth3gtLenguaje de expresioacuten (LE)lth3gt

ltpgtLa siguiente tabla ilustra algunas expresiones LE

ltbrgtltbrgtlttable border=1gt

lttrgt

ltthgtltbgtExpresioacutenltbgtltthgt

ltthgtltbgtValorltbgtltthgt

lttrgt

lttrgt

lttdgt$3 + 6lttdgt

lttdgt$3 + 6lttdgt

lttdgt

lttrgt

lttdgt$(7 gt 4) 7 4lttdgt

lttdgt$(7 gt 4) 7 4lttdgt

lttrgt

lttrgt

lttdgt$header[host]lttdgt

lttdgt$header[host]lttdgt

lttrgt

lttablegt

ltbodygt

lthtmlgt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

323 BIBLIOTECA ESTANDAR DE ETIQUETAS

La biblioteca estaacutendar de etiquetas JSP (JSTL ndash Java Server Page Estaacutendar Tag Library)

incluye una cantidad amplia de etiquetas para diferentes aacutereas de trabajo

Aacuterea baacutesica (su prefijo es c ndash core) y contiene

o Soporte de variables (remove y set)

o Control del flujo (choose when otherwise forEach forTokens if)

o Manejo de URL (import param redirect param y url param)

o Operaciones varias (match y out)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlcore

Aacuterea XML (su prefijo es x) y contiene

o Sentencias baacutesicas (out parse y set)

o Control del flujo (choosehellip whenhellip otherwise forEach e if)

o Transformacioacuten de Documentos (transformhellipparam)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlxml

Aacuterea Internacionalizacioacuten (su prefijo es fmt) Contiene

o Localidad (setLocale y requestEncoding)

o Mensajes (bundle message param y setBundle)

o Formateo de Fechas y nuacutemeros (formatNumber formateacuteate parseDate

parseNumber setTimeZone timeZone)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlfmt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Aacuterea SQL (su prefijo es sql) es el lenguaje estandar para interactuar con bases de datos

relacionales y contiene setDataSource Quero dateParam param transaction y

update dateParam param) El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlsql

Aacuterea Funciones (su prefijo es fn) y contiene

o Longitud de una coleccioacuten (length)

o Manipulacioacuten de String (toUpperCase toLowerCase substring

substringAfter substringBefore trim replace indexOf startsWith

endsWith contains containsIgnoreCase split join y escapeXml)

o El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlfunctions

3231 OPERACIONES CON ETIQUETAS BAacuteSICAS

En un ejemplo pasado teniacuteamos el siguiente coacutedigo

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

En este ejemplo se hace referencia al aacuterea baacutesica de JSTL con el prefijo c y se utiliza la

etiqueta cset para definir la variable atrCuenta Si la variable ya esta definida simplemente

se le asigna el valor especificado

La uacuteltima parte del ejemplo anterior podriacutea haberse escrito de esta otra forma

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcif test=rdquo$atrCuenta gt 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcifgt

$atrCuenta $str

La etiqueta cif permite la ejecucioacuten condicional de su cuerpo en funcioacuten del valor del

atributo de test

La etiqueta cchoose permite la ejecucioacuten del cuerpo de la primera etiqueta cwhen cuyo

atributo test sea evaluado a true Si ninguna de las condiciones se evaluacutea a true entonces se

evaluacutea el cuerpo de la etiqueta cotherwise si estaacute presente El siguiente coacutedigo muestra otra

manera de escribir el ejemplo anterior utilizando estas uacuteltimas etiquetas

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcchoosegt

ltcwhen test=rdquo$atrCuenta == 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcwhengt

ltcotherwisegt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcotherwisegt

ltcchoosegt

$atrCuenta $str

La etiqueta cforEach permite iterar sobre una coleccioacuten de objetos La coleccioacuten se

especifica por medio del atributo iacutetems y el elemento actual de la coleccioacuten estaacute disponible a

traveacutes de la variable establecida por el atributo var Por ejemplo el siguiente fragmento de

coacutedigo visualiza una tabla con las variables definidas a nivel de aacutembito de paacutegina

lttable border=rdquo1rdquogt

ltcforEach var=rdquoitemrdquo iacutetems=rdquo$pageScoperdquogt

lttrgt

lttdgt $item lttdgt

lttrgt

ltcforEachgt

lttablegt

La etiqueta ccatch atrapa una excepcioacuten que ocurra en el cuerpo de la misma Por ejemplo

el siguiente segmento de coacutedigo lanzaraacute una excepcioacuten si el paraacutemetro mes se escribe con

letras en vez de con nuacutemeros

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltbodygt

lthtmlgt

Un URL anaacutelogo al siguiente daraacute lugar a que la excepcioacuten sea lanzada cuando se ejecute la

expresioacuten $nMes 3 de la paacutegina anterior

httplocalhost8080JSP2exceppruebajspmes=marzo

La excepcioacuten indica que ha ocurrido un error al tratar de convertir ldquomarzordquo a un entero de

tipo Long Para cachar esta excepcioacuten y darle un tratamiento adecuado habraacute que modificar

la paacutegina JSP anterior como se indica a continuacioacuten

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltccatch var=rdquoerrorOcurridordquogt

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltccatchgt

ltcif test=rdquo$not empty errorOcurridordquogt

Error el paraacutemetro mes debe ser un nuacutemero ltbgt

ltbrgt Informacioacuten del error dada por el sistema

ltbrgt ltfont color=rdquoFF0000rdquogt $errorOcurrido ltfontgt

ltcifgt

ltbodygt

lthtmlgt

3232 ACCESO A BASES DE DATOS CON JSP

Las etiquetas que proporciona el aacuterea SQL permiten realizar

Conexioacuten con una base de datos

Realizacioacuten de consultas a la base de datos

Acceso al conjunto de resultados

Ejecucioacuten de actualizaciones y transacciones

Todas las etiquetas SQL actuacutean sobre una base de datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

32321 CONEXIOacuteN CON LA BASE DE DATOS

La conexioacuten con la base de datos puede realizarse con la etiqueta sqlsetDataSource Por

ejemplo si se esta utilizando el administrador de bases de datos MySql con el controlador

JDBC se puede realizar una conexioacuten con una base de datos digamos bd_tutorias de la

manera siguiente

ltsqlsetDataSource var=rdquobdrdquo

driver=rdquocommysqljdbcDriverrdquo

url=rdquojdbcmysqllocalhost3306bd_tutoriasrdquo

user=rdquoadminrdquo

password=rdquoadminadminrdquo gt

32322 CONSULTA A LA BASE DE DATOS

La etiqueta sqlQuero permite realizar una consulta a una base de datos Por ejemplo el

siguiente fragmento de coacutedigo realiza una consulta a la base de datos representada por bd y

obtiene un conjunto de resultados representado por cdr

ltsqlquery var=rdquocdrrdquo dataSource=rdquo$bdrdquogt

SELECT professor dia hora alumno

FROM profesores tutorias citas

WHERE profesoresid_profesor=tutoriasid_profesor

AND tutoriasid_tutoria=citasid_tutoria

ltsqlquerygt

32323 MODIFICACIONES SOBRE LA BASE DE DATOS

La etiqueta sqlupdate permite ejecutar una sentencia SQL INSERT UPDATE o DELETE

y cualquier otra sentencia SQL que no retorne ninguacuten valor Por ejemplo

ltsqlupdate var=rdquocontrdquo dataSource=rdquo$bdrdquo gt

UPDATE profesores

SET profesor=

WHERE profesor=

ltsqlparam value=rdquo$paramProfesorrdquo gt

ltsqlparam value=rdquo$paramIDrdquo gt

ltsqlupdategt

Una operacioacuten UPDATE puede utilizar el siacutembolo para indicar que el valor que tendriacutea que

evaluarse en esa posicioacuten seraacute suministrado por una etiqueta sqlparam como por ejemplo

httplocalhost8080JSP2sqlpruebajspProfesor=Mario+Rossainz+LopezampID=514

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

La directriz include incluye un archivo (html jsp xml o de texto) en una paacutegina JSP Esto

permite dividir el contenido de la paacutegina en trozos maacutes manejables

lt incluye file=rdquoURL_relativordquo gt

El ejemplo siguiente muestra dos archivos el primero incluye al segundo para mostrar la

fecha y hora actuales

lt-- fichero mostrarFechaHorajsp --gt

lthtmlgt

ltheadgtlttitlegtIncluir un ficherolttitlegtltheadgt

ltbody bgcolor=whitegt

ltfont color=bluegt

La fecha y hora actuales son

lt include file=fechaHorajsp gt

ltfontgt

ltbodygt

lthtmlgt

lt-- fichero fechaHorajsp --gt

lt page import=javautil gt

lt= (new javautilDate())toLocaleString() gt

32223 LA DIRECTRIZ TAGLIB

La directriz taglib indica la biblioteca de acciones personalizadas que podremos utilizar en

la codificacioacuten de la paacutegina JSP Para distinguir esas acciones entre otras existentes se utiliza

un prefijo (prefix) Su sintaxis es

lt taglib (uri=rdquoURI_bibliotecardquo|tagdir=rdquoDir_biblioteca_tagrdquo)

prefix=rdquoprefijordquo gt

Cuando se trata de una biblioteca definida mediante una clase Java y un descriptor (archivo

tld) eacutesta se identifica mediante un URI (Uniform Resource Identifier- URL relativos) Por

ejemplo

lt taglib uri=rdquohttpMarioRossainzLopezmiBibliotecardquo

prefix=rdquofunrdquo gt

ltpgtltfunaccion01 gt

La uacuteltima liacutenea del ejemplo tiene dos etiquetas una etiqueta p HTML y otra accion01

perteneciente a la biblioteca miBiblioteca En cambio si la biblioteca se define mediante un

archivo tag entonces se identifica mediante su ruta relativa en el sistema de archivos

lt taglib tagdir=rdquoWEB-INFtagsrdquo prefix=rdquofunrdquo gt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpgtltfunaccion01 gt

La directriz taglib debe colocarse antes de utilizar en la paacutegina JSP las acciones

personalizadas definidas por la misma Se puede utilizar maacutes de una directriz pero el prefijo

utilizado debe ser uacutenico para cada una de ellas

3223 ACTIVACION DEL LENGUAJE DE EXPRESION (LE)

La especificacioacuten JSP 20 define un lenguaje de expresioacuten como alternativa a elementos de

programacioacuten escritos con coacutedigo Java y especificaciones anteriores a la JSP 20 Para que

este lenguaje pueda ser interpretado tienen que cumplirse 2 requisitos

1 Que la propiedad isELIgnored de la directriz page valga false

lt page isELIgnored= ldquofalserdquo gt

2 Que el descriptor de despliegue webxml en la carpeta WEB-INF indique doacutende se

localiza el esquema XML para la especificacioacuten Servlet 24 que a su vez utiliza el

esquema XML para la especificacioacuten Java Server Page 20

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

Utilizando el lenguaje de expresioacuten se podriacutea modificar la paacutegina Cuentajsp de la seccioacuten

3212 de este documento como se muestra a continuacioacuten Esta nueva paacutegina

1 Especifica que utilizaraacute la biblioteca core de etiquetas estandar (de la que se hablaraacute maacutes

adelante)

2 La primera vez que sea accedida definiraacute la variable atrCuenta en el aacutembito de la

aplicacioacuten con un valor inicial nulo y la incrementaraacute en una unidad cuando sea accedida

sucesivas veces simplemente incrementaraacute esta variable en una unidad

3 Finalmente mostraraacute una paacutegina con un contenido anaacutelogo al siguiente Esta formado

por una cabecera y una segunda liacutenea compuesta por el valor del paraacutemetro parNombre

enviado con la peticioacuten un texto fijo el valor de la variable atrCuenta y otro texto fijo

dependiente del valor de esta variable

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

El coacutedigo completo es el siguiente

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

3224 VARIABLES Y EXPRESIONES

Para acceder a una simple variable se puede escribir algo como lo siguiente $nombre y

para acceder a una propiedad de un objeto podemos escribir algo como

$paramparNombre

$applicationScopeatrCuenta

$pageContextrequestrequestURI

La primera liacutenea del ejemplo anterior obtiene el valor de la propiedad parNombre del objeto

param la segunda el valor del atributo atrCuenta del objeto applicationScope y la tercera

el URL relativo de la paacutegina JSP solicitada

El lenguaje de expresioacuten es maacutes tolerante con respecto a las variables con valor null y ejecuta

muchas maacutes conversiones de forma automaacutetica sobre el tipo de los datos cuando la expresioacuten

a evaluar asiacute lo requiere Por ejemplo la etiqueta condicional siguiente incluye una expresioacuten

que compara el valor del atributo atrCuenta con aacutembito de aplicacioacuten con 10 (convirtiendo

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

impliacutecitamente el valor del atributo al tipo de la constante para poder realizar la comparacioacuten

El resultado seraacute un valor de tipo boolean

ltcif test=rdquo$applicationScopeatrCuenta gt 10rdquogt

ltcifgt

o bien

ltcif test=rdquo$atrCuenta gt 10rdquogt

ltcifgt

Para que una literal pueda incluir un caracter significativo para el lenguaje dicho caracter

debe ser especificado como una secuencia de escape (caracter) Por ejemplo la siguiente

expresioacuten da lugar al literal ldquovezrdquo o ldquovecesrdquo entre comillas dobles

$(atrCuenta gt 1) iquest ldquordquovecesrdquordquo ldquordquovezrdquordquo

Cualquier objeto o atributo de un objeto definido en algunos de los aacutembitos de una paacutegina

puede ser utilizado como una variable Por ejemplo $atrCuenta+1 es una expresioacuten que

realiza la suma de la variable atrCuenta con 1

Cuando se trate de una propiedad de un objeto para acceder a ella se utilizaraacute el operador

punto o bien la notacioacuten empleada para acceder a un elemento de una matriz Por ejemplo

$paramparNombre

$param[ldquoparNombrerdquo]

Una expresioacuten LE puede aparecer en cualquier lugar donde pueda aparecer un texto fijo Por

tanto para informar al contenedor JSP que se trata de una expresioacuten y no de un texto fijo se

utilizan los delimitadores $ al principio y al final

3225 OPERADORES

OPERADOR DESCRIPCIOacuteN Acceso a la propiedad de un objeto o a un elemento de un Map

[] Acceso al elemento de una matriz o de un objeto List

() Pareacutentesis para alterar la prioridad en la evaluacioacuten de una expresioacuten

If ternario condicion expresion1 expresioacuten 2

+ Suma

- Resta

Producto

oacute div Divisioacuten

oacute mod Moacutedulo o resto de una divisioacuten

== oacute eq Igualdad

= oacute ne Diferente

lt oacute lt Menor que

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt oacute gt Mayor que

lt= oacute le Menor o igual que

gt= oacute ge Mayor o igual que

ampamp oacute and Operacioacuten Loacutegica AND

|| oacute or Operacioacuten Loacutegica OR

oacute not Operacioacuten Loacutegica NOT

empty Verifica si el valor de una variable es null si un String esta vaciacuteo o si una matriz Map

o Collection no tienen elementos

func(args) Llamada a una funcioacuten donde func es el nombre de la funcioacuten y arg representa cero o

maacutes argumentos separados por comas

El ejemplo siguiente muestra una paacutegina JSP compuesta por elementos HTML expresiones

LE y objetos impliacutecitos

lthtmlgt

ltheadgtlttitlegtJSP 20lttitlegtltheadgt

ltbodygt

lth3gtLenguaje de expresioacuten (LE)lth3gt

ltpgtLa siguiente tabla ilustra algunas expresiones LE

ltbrgtltbrgtlttable border=1gt

lttrgt

ltthgtltbgtExpresioacutenltbgtltthgt

ltthgtltbgtValorltbgtltthgt

lttrgt

lttrgt

lttdgt$3 + 6lttdgt

lttdgt$3 + 6lttdgt

lttdgt

lttrgt

lttdgt$(7 gt 4) 7 4lttdgt

lttdgt$(7 gt 4) 7 4lttdgt

lttrgt

lttrgt

lttdgt$header[host]lttdgt

lttdgt$header[host]lttdgt

lttrgt

lttablegt

ltbodygt

lthtmlgt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

323 BIBLIOTECA ESTANDAR DE ETIQUETAS

La biblioteca estaacutendar de etiquetas JSP (JSTL ndash Java Server Page Estaacutendar Tag Library)

incluye una cantidad amplia de etiquetas para diferentes aacutereas de trabajo

Aacuterea baacutesica (su prefijo es c ndash core) y contiene

o Soporte de variables (remove y set)

o Control del flujo (choose when otherwise forEach forTokens if)

o Manejo de URL (import param redirect param y url param)

o Operaciones varias (match y out)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlcore

Aacuterea XML (su prefijo es x) y contiene

o Sentencias baacutesicas (out parse y set)

o Control del flujo (choosehellip whenhellip otherwise forEach e if)

o Transformacioacuten de Documentos (transformhellipparam)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlxml

Aacuterea Internacionalizacioacuten (su prefijo es fmt) Contiene

o Localidad (setLocale y requestEncoding)

o Mensajes (bundle message param y setBundle)

o Formateo de Fechas y nuacutemeros (formatNumber formateacuteate parseDate

parseNumber setTimeZone timeZone)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlfmt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Aacuterea SQL (su prefijo es sql) es el lenguaje estandar para interactuar con bases de datos

relacionales y contiene setDataSource Quero dateParam param transaction y

update dateParam param) El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlsql

Aacuterea Funciones (su prefijo es fn) y contiene

o Longitud de una coleccioacuten (length)

o Manipulacioacuten de String (toUpperCase toLowerCase substring

substringAfter substringBefore trim replace indexOf startsWith

endsWith contains containsIgnoreCase split join y escapeXml)

o El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlfunctions

3231 OPERACIONES CON ETIQUETAS BAacuteSICAS

En un ejemplo pasado teniacuteamos el siguiente coacutedigo

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

En este ejemplo se hace referencia al aacuterea baacutesica de JSTL con el prefijo c y se utiliza la

etiqueta cset para definir la variable atrCuenta Si la variable ya esta definida simplemente

se le asigna el valor especificado

La uacuteltima parte del ejemplo anterior podriacutea haberse escrito de esta otra forma

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcif test=rdquo$atrCuenta gt 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcifgt

$atrCuenta $str

La etiqueta cif permite la ejecucioacuten condicional de su cuerpo en funcioacuten del valor del

atributo de test

La etiqueta cchoose permite la ejecucioacuten del cuerpo de la primera etiqueta cwhen cuyo

atributo test sea evaluado a true Si ninguna de las condiciones se evaluacutea a true entonces se

evaluacutea el cuerpo de la etiqueta cotherwise si estaacute presente El siguiente coacutedigo muestra otra

manera de escribir el ejemplo anterior utilizando estas uacuteltimas etiquetas

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcchoosegt

ltcwhen test=rdquo$atrCuenta == 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcwhengt

ltcotherwisegt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcotherwisegt

ltcchoosegt

$atrCuenta $str

La etiqueta cforEach permite iterar sobre una coleccioacuten de objetos La coleccioacuten se

especifica por medio del atributo iacutetems y el elemento actual de la coleccioacuten estaacute disponible a

traveacutes de la variable establecida por el atributo var Por ejemplo el siguiente fragmento de

coacutedigo visualiza una tabla con las variables definidas a nivel de aacutembito de paacutegina

lttable border=rdquo1rdquogt

ltcforEach var=rdquoitemrdquo iacutetems=rdquo$pageScoperdquogt

lttrgt

lttdgt $item lttdgt

lttrgt

ltcforEachgt

lttablegt

La etiqueta ccatch atrapa una excepcioacuten que ocurra en el cuerpo de la misma Por ejemplo

el siguiente segmento de coacutedigo lanzaraacute una excepcioacuten si el paraacutemetro mes se escribe con

letras en vez de con nuacutemeros

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltbodygt

lthtmlgt

Un URL anaacutelogo al siguiente daraacute lugar a que la excepcioacuten sea lanzada cuando se ejecute la

expresioacuten $nMes 3 de la paacutegina anterior

httplocalhost8080JSP2exceppruebajspmes=marzo

La excepcioacuten indica que ha ocurrido un error al tratar de convertir ldquomarzordquo a un entero de

tipo Long Para cachar esta excepcioacuten y darle un tratamiento adecuado habraacute que modificar

la paacutegina JSP anterior como se indica a continuacioacuten

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltccatch var=rdquoerrorOcurridordquogt

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltccatchgt

ltcif test=rdquo$not empty errorOcurridordquogt

Error el paraacutemetro mes debe ser un nuacutemero ltbgt

ltbrgt Informacioacuten del error dada por el sistema

ltbrgt ltfont color=rdquoFF0000rdquogt $errorOcurrido ltfontgt

ltcifgt

ltbodygt

lthtmlgt

3232 ACCESO A BASES DE DATOS CON JSP

Las etiquetas que proporciona el aacuterea SQL permiten realizar

Conexioacuten con una base de datos

Realizacioacuten de consultas a la base de datos

Acceso al conjunto de resultados

Ejecucioacuten de actualizaciones y transacciones

Todas las etiquetas SQL actuacutean sobre una base de datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

32321 CONEXIOacuteN CON LA BASE DE DATOS

La conexioacuten con la base de datos puede realizarse con la etiqueta sqlsetDataSource Por

ejemplo si se esta utilizando el administrador de bases de datos MySql con el controlador

JDBC se puede realizar una conexioacuten con una base de datos digamos bd_tutorias de la

manera siguiente

ltsqlsetDataSource var=rdquobdrdquo

driver=rdquocommysqljdbcDriverrdquo

url=rdquojdbcmysqllocalhost3306bd_tutoriasrdquo

user=rdquoadminrdquo

password=rdquoadminadminrdquo gt

32322 CONSULTA A LA BASE DE DATOS

La etiqueta sqlQuero permite realizar una consulta a una base de datos Por ejemplo el

siguiente fragmento de coacutedigo realiza una consulta a la base de datos representada por bd y

obtiene un conjunto de resultados representado por cdr

ltsqlquery var=rdquocdrrdquo dataSource=rdquo$bdrdquogt

SELECT professor dia hora alumno

FROM profesores tutorias citas

WHERE profesoresid_profesor=tutoriasid_profesor

AND tutoriasid_tutoria=citasid_tutoria

ltsqlquerygt

32323 MODIFICACIONES SOBRE LA BASE DE DATOS

La etiqueta sqlupdate permite ejecutar una sentencia SQL INSERT UPDATE o DELETE

y cualquier otra sentencia SQL que no retorne ninguacuten valor Por ejemplo

ltsqlupdate var=rdquocontrdquo dataSource=rdquo$bdrdquo gt

UPDATE profesores

SET profesor=

WHERE profesor=

ltsqlparam value=rdquo$paramProfesorrdquo gt

ltsqlparam value=rdquo$paramIDrdquo gt

ltsqlupdategt

Una operacioacuten UPDATE puede utilizar el siacutembolo para indicar que el valor que tendriacutea que

evaluarse en esa posicioacuten seraacute suministrado por una etiqueta sqlparam como por ejemplo

httplocalhost8080JSP2sqlpruebajspProfesor=Mario+Rossainz+LopezampID=514

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpgtltfunaccion01 gt

La directriz taglib debe colocarse antes de utilizar en la paacutegina JSP las acciones

personalizadas definidas por la misma Se puede utilizar maacutes de una directriz pero el prefijo

utilizado debe ser uacutenico para cada una de ellas

3223 ACTIVACION DEL LENGUAJE DE EXPRESION (LE)

La especificacioacuten JSP 20 define un lenguaje de expresioacuten como alternativa a elementos de

programacioacuten escritos con coacutedigo Java y especificaciones anteriores a la JSP 20 Para que

este lenguaje pueda ser interpretado tienen que cumplirse 2 requisitos

1 Que la propiedad isELIgnored de la directriz page valga false

lt page isELIgnored= ldquofalserdquo gt

2 Que el descriptor de despliegue webxml en la carpeta WEB-INF indique doacutende se

localiza el esquema XML para la especificacioacuten Servlet 24 que a su vez utiliza el

esquema XML para la especificacioacuten Java Server Page 20

ltxml version=10 encoding=ISO-8859-1gt

ltweb-app

xmlns=httpjavasuncomxmlnsj2ee

xmlnsxsi=httpwwww3org2001XMLSchema-instance

xsischemaLocation=httpjavasuncomxmlnsj2ee web-app_2_4xsd

version=24gt

ltweb-appgt

Utilizando el lenguaje de expresioacuten se podriacutea modificar la paacutegina Cuentajsp de la seccioacuten

3212 de este documento como se muestra a continuacioacuten Esta nueva paacutegina

1 Especifica que utilizaraacute la biblioteca core de etiquetas estandar (de la que se hablaraacute maacutes

adelante)

2 La primera vez que sea accedida definiraacute la variable atrCuenta en el aacutembito de la

aplicacioacuten con un valor inicial nulo y la incrementaraacute en una unidad cuando sea accedida

sucesivas veces simplemente incrementaraacute esta variable en una unidad

3 Finalmente mostraraacute una paacutegina con un contenido anaacutelogo al siguiente Esta formado

por una cabecera y una segunda liacutenea compuesta por el valor del paraacutemetro parNombre

enviado con la peticioacuten un texto fijo el valor de la variable atrCuenta y otro texto fijo

dependiente del valor de esta variable

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

El coacutedigo completo es el siguiente

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

3224 VARIABLES Y EXPRESIONES

Para acceder a una simple variable se puede escribir algo como lo siguiente $nombre y

para acceder a una propiedad de un objeto podemos escribir algo como

$paramparNombre

$applicationScopeatrCuenta

$pageContextrequestrequestURI

La primera liacutenea del ejemplo anterior obtiene el valor de la propiedad parNombre del objeto

param la segunda el valor del atributo atrCuenta del objeto applicationScope y la tercera

el URL relativo de la paacutegina JSP solicitada

El lenguaje de expresioacuten es maacutes tolerante con respecto a las variables con valor null y ejecuta

muchas maacutes conversiones de forma automaacutetica sobre el tipo de los datos cuando la expresioacuten

a evaluar asiacute lo requiere Por ejemplo la etiqueta condicional siguiente incluye una expresioacuten

que compara el valor del atributo atrCuenta con aacutembito de aplicacioacuten con 10 (convirtiendo

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

impliacutecitamente el valor del atributo al tipo de la constante para poder realizar la comparacioacuten

El resultado seraacute un valor de tipo boolean

ltcif test=rdquo$applicationScopeatrCuenta gt 10rdquogt

ltcifgt

o bien

ltcif test=rdquo$atrCuenta gt 10rdquogt

ltcifgt

Para que una literal pueda incluir un caracter significativo para el lenguaje dicho caracter

debe ser especificado como una secuencia de escape (caracter) Por ejemplo la siguiente

expresioacuten da lugar al literal ldquovezrdquo o ldquovecesrdquo entre comillas dobles

$(atrCuenta gt 1) iquest ldquordquovecesrdquordquo ldquordquovezrdquordquo

Cualquier objeto o atributo de un objeto definido en algunos de los aacutembitos de una paacutegina

puede ser utilizado como una variable Por ejemplo $atrCuenta+1 es una expresioacuten que

realiza la suma de la variable atrCuenta con 1

Cuando se trate de una propiedad de un objeto para acceder a ella se utilizaraacute el operador

punto o bien la notacioacuten empleada para acceder a un elemento de una matriz Por ejemplo

$paramparNombre

$param[ldquoparNombrerdquo]

Una expresioacuten LE puede aparecer en cualquier lugar donde pueda aparecer un texto fijo Por

tanto para informar al contenedor JSP que se trata de una expresioacuten y no de un texto fijo se

utilizan los delimitadores $ al principio y al final

3225 OPERADORES

OPERADOR DESCRIPCIOacuteN Acceso a la propiedad de un objeto o a un elemento de un Map

[] Acceso al elemento de una matriz o de un objeto List

() Pareacutentesis para alterar la prioridad en la evaluacioacuten de una expresioacuten

If ternario condicion expresion1 expresioacuten 2

+ Suma

- Resta

Producto

oacute div Divisioacuten

oacute mod Moacutedulo o resto de una divisioacuten

== oacute eq Igualdad

= oacute ne Diferente

lt oacute lt Menor que

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt oacute gt Mayor que

lt= oacute le Menor o igual que

gt= oacute ge Mayor o igual que

ampamp oacute and Operacioacuten Loacutegica AND

|| oacute or Operacioacuten Loacutegica OR

oacute not Operacioacuten Loacutegica NOT

empty Verifica si el valor de una variable es null si un String esta vaciacuteo o si una matriz Map

o Collection no tienen elementos

func(args) Llamada a una funcioacuten donde func es el nombre de la funcioacuten y arg representa cero o

maacutes argumentos separados por comas

El ejemplo siguiente muestra una paacutegina JSP compuesta por elementos HTML expresiones

LE y objetos impliacutecitos

lthtmlgt

ltheadgtlttitlegtJSP 20lttitlegtltheadgt

ltbodygt

lth3gtLenguaje de expresioacuten (LE)lth3gt

ltpgtLa siguiente tabla ilustra algunas expresiones LE

ltbrgtltbrgtlttable border=1gt

lttrgt

ltthgtltbgtExpresioacutenltbgtltthgt

ltthgtltbgtValorltbgtltthgt

lttrgt

lttrgt

lttdgt$3 + 6lttdgt

lttdgt$3 + 6lttdgt

lttdgt

lttrgt

lttdgt$(7 gt 4) 7 4lttdgt

lttdgt$(7 gt 4) 7 4lttdgt

lttrgt

lttrgt

lttdgt$header[host]lttdgt

lttdgt$header[host]lttdgt

lttrgt

lttablegt

ltbodygt

lthtmlgt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

323 BIBLIOTECA ESTANDAR DE ETIQUETAS

La biblioteca estaacutendar de etiquetas JSP (JSTL ndash Java Server Page Estaacutendar Tag Library)

incluye una cantidad amplia de etiquetas para diferentes aacutereas de trabajo

Aacuterea baacutesica (su prefijo es c ndash core) y contiene

o Soporte de variables (remove y set)

o Control del flujo (choose when otherwise forEach forTokens if)

o Manejo de URL (import param redirect param y url param)

o Operaciones varias (match y out)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlcore

Aacuterea XML (su prefijo es x) y contiene

o Sentencias baacutesicas (out parse y set)

o Control del flujo (choosehellip whenhellip otherwise forEach e if)

o Transformacioacuten de Documentos (transformhellipparam)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlxml

Aacuterea Internacionalizacioacuten (su prefijo es fmt) Contiene

o Localidad (setLocale y requestEncoding)

o Mensajes (bundle message param y setBundle)

o Formateo de Fechas y nuacutemeros (formatNumber formateacuteate parseDate

parseNumber setTimeZone timeZone)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlfmt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Aacuterea SQL (su prefijo es sql) es el lenguaje estandar para interactuar con bases de datos

relacionales y contiene setDataSource Quero dateParam param transaction y

update dateParam param) El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlsql

Aacuterea Funciones (su prefijo es fn) y contiene

o Longitud de una coleccioacuten (length)

o Manipulacioacuten de String (toUpperCase toLowerCase substring

substringAfter substringBefore trim replace indexOf startsWith

endsWith contains containsIgnoreCase split join y escapeXml)

o El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlfunctions

3231 OPERACIONES CON ETIQUETAS BAacuteSICAS

En un ejemplo pasado teniacuteamos el siguiente coacutedigo

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

En este ejemplo se hace referencia al aacuterea baacutesica de JSTL con el prefijo c y se utiliza la

etiqueta cset para definir la variable atrCuenta Si la variable ya esta definida simplemente

se le asigna el valor especificado

La uacuteltima parte del ejemplo anterior podriacutea haberse escrito de esta otra forma

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcif test=rdquo$atrCuenta gt 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcifgt

$atrCuenta $str

La etiqueta cif permite la ejecucioacuten condicional de su cuerpo en funcioacuten del valor del

atributo de test

La etiqueta cchoose permite la ejecucioacuten del cuerpo de la primera etiqueta cwhen cuyo

atributo test sea evaluado a true Si ninguna de las condiciones se evaluacutea a true entonces se

evaluacutea el cuerpo de la etiqueta cotherwise si estaacute presente El siguiente coacutedigo muestra otra

manera de escribir el ejemplo anterior utilizando estas uacuteltimas etiquetas

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcchoosegt

ltcwhen test=rdquo$atrCuenta == 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcwhengt

ltcotherwisegt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcotherwisegt

ltcchoosegt

$atrCuenta $str

La etiqueta cforEach permite iterar sobre una coleccioacuten de objetos La coleccioacuten se

especifica por medio del atributo iacutetems y el elemento actual de la coleccioacuten estaacute disponible a

traveacutes de la variable establecida por el atributo var Por ejemplo el siguiente fragmento de

coacutedigo visualiza una tabla con las variables definidas a nivel de aacutembito de paacutegina

lttable border=rdquo1rdquogt

ltcforEach var=rdquoitemrdquo iacutetems=rdquo$pageScoperdquogt

lttrgt

lttdgt $item lttdgt

lttrgt

ltcforEachgt

lttablegt

La etiqueta ccatch atrapa una excepcioacuten que ocurra en el cuerpo de la misma Por ejemplo

el siguiente segmento de coacutedigo lanzaraacute una excepcioacuten si el paraacutemetro mes se escribe con

letras en vez de con nuacutemeros

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltbodygt

lthtmlgt

Un URL anaacutelogo al siguiente daraacute lugar a que la excepcioacuten sea lanzada cuando se ejecute la

expresioacuten $nMes 3 de la paacutegina anterior

httplocalhost8080JSP2exceppruebajspmes=marzo

La excepcioacuten indica que ha ocurrido un error al tratar de convertir ldquomarzordquo a un entero de

tipo Long Para cachar esta excepcioacuten y darle un tratamiento adecuado habraacute que modificar

la paacutegina JSP anterior como se indica a continuacioacuten

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltccatch var=rdquoerrorOcurridordquogt

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltccatchgt

ltcif test=rdquo$not empty errorOcurridordquogt

Error el paraacutemetro mes debe ser un nuacutemero ltbgt

ltbrgt Informacioacuten del error dada por el sistema

ltbrgt ltfont color=rdquoFF0000rdquogt $errorOcurrido ltfontgt

ltcifgt

ltbodygt

lthtmlgt

3232 ACCESO A BASES DE DATOS CON JSP

Las etiquetas que proporciona el aacuterea SQL permiten realizar

Conexioacuten con una base de datos

Realizacioacuten de consultas a la base de datos

Acceso al conjunto de resultados

Ejecucioacuten de actualizaciones y transacciones

Todas las etiquetas SQL actuacutean sobre una base de datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

32321 CONEXIOacuteN CON LA BASE DE DATOS

La conexioacuten con la base de datos puede realizarse con la etiqueta sqlsetDataSource Por

ejemplo si se esta utilizando el administrador de bases de datos MySql con el controlador

JDBC se puede realizar una conexioacuten con una base de datos digamos bd_tutorias de la

manera siguiente

ltsqlsetDataSource var=rdquobdrdquo

driver=rdquocommysqljdbcDriverrdquo

url=rdquojdbcmysqllocalhost3306bd_tutoriasrdquo

user=rdquoadminrdquo

password=rdquoadminadminrdquo gt

32322 CONSULTA A LA BASE DE DATOS

La etiqueta sqlQuero permite realizar una consulta a una base de datos Por ejemplo el

siguiente fragmento de coacutedigo realiza una consulta a la base de datos representada por bd y

obtiene un conjunto de resultados representado por cdr

ltsqlquery var=rdquocdrrdquo dataSource=rdquo$bdrdquogt

SELECT professor dia hora alumno

FROM profesores tutorias citas

WHERE profesoresid_profesor=tutoriasid_profesor

AND tutoriasid_tutoria=citasid_tutoria

ltsqlquerygt

32323 MODIFICACIONES SOBRE LA BASE DE DATOS

La etiqueta sqlupdate permite ejecutar una sentencia SQL INSERT UPDATE o DELETE

y cualquier otra sentencia SQL que no retorne ninguacuten valor Por ejemplo

ltsqlupdate var=rdquocontrdquo dataSource=rdquo$bdrdquo gt

UPDATE profesores

SET profesor=

WHERE profesor=

ltsqlparam value=rdquo$paramProfesorrdquo gt

ltsqlparam value=rdquo$paramIDrdquo gt

ltsqlupdategt

Una operacioacuten UPDATE puede utilizar el siacutembolo para indicar que el valor que tendriacutea que

evaluarse en esa posicioacuten seraacute suministrado por una etiqueta sqlparam como por ejemplo

httplocalhost8080JSP2sqlpruebajspProfesor=Mario+Rossainz+LopezampID=514

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

El coacutedigo completo es el siguiente

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

3224 VARIABLES Y EXPRESIONES

Para acceder a una simple variable se puede escribir algo como lo siguiente $nombre y

para acceder a una propiedad de un objeto podemos escribir algo como

$paramparNombre

$applicationScopeatrCuenta

$pageContextrequestrequestURI

La primera liacutenea del ejemplo anterior obtiene el valor de la propiedad parNombre del objeto

param la segunda el valor del atributo atrCuenta del objeto applicationScope y la tercera

el URL relativo de la paacutegina JSP solicitada

El lenguaje de expresioacuten es maacutes tolerante con respecto a las variables con valor null y ejecuta

muchas maacutes conversiones de forma automaacutetica sobre el tipo de los datos cuando la expresioacuten

a evaluar asiacute lo requiere Por ejemplo la etiqueta condicional siguiente incluye una expresioacuten

que compara el valor del atributo atrCuenta con aacutembito de aplicacioacuten con 10 (convirtiendo

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

impliacutecitamente el valor del atributo al tipo de la constante para poder realizar la comparacioacuten

El resultado seraacute un valor de tipo boolean

ltcif test=rdquo$applicationScopeatrCuenta gt 10rdquogt

ltcifgt

o bien

ltcif test=rdquo$atrCuenta gt 10rdquogt

ltcifgt

Para que una literal pueda incluir un caracter significativo para el lenguaje dicho caracter

debe ser especificado como una secuencia de escape (caracter) Por ejemplo la siguiente

expresioacuten da lugar al literal ldquovezrdquo o ldquovecesrdquo entre comillas dobles

$(atrCuenta gt 1) iquest ldquordquovecesrdquordquo ldquordquovezrdquordquo

Cualquier objeto o atributo de un objeto definido en algunos de los aacutembitos de una paacutegina

puede ser utilizado como una variable Por ejemplo $atrCuenta+1 es una expresioacuten que

realiza la suma de la variable atrCuenta con 1

Cuando se trate de una propiedad de un objeto para acceder a ella se utilizaraacute el operador

punto o bien la notacioacuten empleada para acceder a un elemento de una matriz Por ejemplo

$paramparNombre

$param[ldquoparNombrerdquo]

Una expresioacuten LE puede aparecer en cualquier lugar donde pueda aparecer un texto fijo Por

tanto para informar al contenedor JSP que se trata de una expresioacuten y no de un texto fijo se

utilizan los delimitadores $ al principio y al final

3225 OPERADORES

OPERADOR DESCRIPCIOacuteN Acceso a la propiedad de un objeto o a un elemento de un Map

[] Acceso al elemento de una matriz o de un objeto List

() Pareacutentesis para alterar la prioridad en la evaluacioacuten de una expresioacuten

If ternario condicion expresion1 expresioacuten 2

+ Suma

- Resta

Producto

oacute div Divisioacuten

oacute mod Moacutedulo o resto de una divisioacuten

== oacute eq Igualdad

= oacute ne Diferente

lt oacute lt Menor que

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt oacute gt Mayor que

lt= oacute le Menor o igual que

gt= oacute ge Mayor o igual que

ampamp oacute and Operacioacuten Loacutegica AND

|| oacute or Operacioacuten Loacutegica OR

oacute not Operacioacuten Loacutegica NOT

empty Verifica si el valor de una variable es null si un String esta vaciacuteo o si una matriz Map

o Collection no tienen elementos

func(args) Llamada a una funcioacuten donde func es el nombre de la funcioacuten y arg representa cero o

maacutes argumentos separados por comas

El ejemplo siguiente muestra una paacutegina JSP compuesta por elementos HTML expresiones

LE y objetos impliacutecitos

lthtmlgt

ltheadgtlttitlegtJSP 20lttitlegtltheadgt

ltbodygt

lth3gtLenguaje de expresioacuten (LE)lth3gt

ltpgtLa siguiente tabla ilustra algunas expresiones LE

ltbrgtltbrgtlttable border=1gt

lttrgt

ltthgtltbgtExpresioacutenltbgtltthgt

ltthgtltbgtValorltbgtltthgt

lttrgt

lttrgt

lttdgt$3 + 6lttdgt

lttdgt$3 + 6lttdgt

lttdgt

lttrgt

lttdgt$(7 gt 4) 7 4lttdgt

lttdgt$(7 gt 4) 7 4lttdgt

lttrgt

lttrgt

lttdgt$header[host]lttdgt

lttdgt$header[host]lttdgt

lttrgt

lttablegt

ltbodygt

lthtmlgt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

323 BIBLIOTECA ESTANDAR DE ETIQUETAS

La biblioteca estaacutendar de etiquetas JSP (JSTL ndash Java Server Page Estaacutendar Tag Library)

incluye una cantidad amplia de etiquetas para diferentes aacutereas de trabajo

Aacuterea baacutesica (su prefijo es c ndash core) y contiene

o Soporte de variables (remove y set)

o Control del flujo (choose when otherwise forEach forTokens if)

o Manejo de URL (import param redirect param y url param)

o Operaciones varias (match y out)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlcore

Aacuterea XML (su prefijo es x) y contiene

o Sentencias baacutesicas (out parse y set)

o Control del flujo (choosehellip whenhellip otherwise forEach e if)

o Transformacioacuten de Documentos (transformhellipparam)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlxml

Aacuterea Internacionalizacioacuten (su prefijo es fmt) Contiene

o Localidad (setLocale y requestEncoding)

o Mensajes (bundle message param y setBundle)

o Formateo de Fechas y nuacutemeros (formatNumber formateacuteate parseDate

parseNumber setTimeZone timeZone)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlfmt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Aacuterea SQL (su prefijo es sql) es el lenguaje estandar para interactuar con bases de datos

relacionales y contiene setDataSource Quero dateParam param transaction y

update dateParam param) El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlsql

Aacuterea Funciones (su prefijo es fn) y contiene

o Longitud de una coleccioacuten (length)

o Manipulacioacuten de String (toUpperCase toLowerCase substring

substringAfter substringBefore trim replace indexOf startsWith

endsWith contains containsIgnoreCase split join y escapeXml)

o El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlfunctions

3231 OPERACIONES CON ETIQUETAS BAacuteSICAS

En un ejemplo pasado teniacuteamos el siguiente coacutedigo

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

En este ejemplo se hace referencia al aacuterea baacutesica de JSTL con el prefijo c y se utiliza la

etiqueta cset para definir la variable atrCuenta Si la variable ya esta definida simplemente

se le asigna el valor especificado

La uacuteltima parte del ejemplo anterior podriacutea haberse escrito de esta otra forma

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcif test=rdquo$atrCuenta gt 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcifgt

$atrCuenta $str

La etiqueta cif permite la ejecucioacuten condicional de su cuerpo en funcioacuten del valor del

atributo de test

La etiqueta cchoose permite la ejecucioacuten del cuerpo de la primera etiqueta cwhen cuyo

atributo test sea evaluado a true Si ninguna de las condiciones se evaluacutea a true entonces se

evaluacutea el cuerpo de la etiqueta cotherwise si estaacute presente El siguiente coacutedigo muestra otra

manera de escribir el ejemplo anterior utilizando estas uacuteltimas etiquetas

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcchoosegt

ltcwhen test=rdquo$atrCuenta == 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcwhengt

ltcotherwisegt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcotherwisegt

ltcchoosegt

$atrCuenta $str

La etiqueta cforEach permite iterar sobre una coleccioacuten de objetos La coleccioacuten se

especifica por medio del atributo iacutetems y el elemento actual de la coleccioacuten estaacute disponible a

traveacutes de la variable establecida por el atributo var Por ejemplo el siguiente fragmento de

coacutedigo visualiza una tabla con las variables definidas a nivel de aacutembito de paacutegina

lttable border=rdquo1rdquogt

ltcforEach var=rdquoitemrdquo iacutetems=rdquo$pageScoperdquogt

lttrgt

lttdgt $item lttdgt

lttrgt

ltcforEachgt

lttablegt

La etiqueta ccatch atrapa una excepcioacuten que ocurra en el cuerpo de la misma Por ejemplo

el siguiente segmento de coacutedigo lanzaraacute una excepcioacuten si el paraacutemetro mes se escribe con

letras en vez de con nuacutemeros

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltbodygt

lthtmlgt

Un URL anaacutelogo al siguiente daraacute lugar a que la excepcioacuten sea lanzada cuando se ejecute la

expresioacuten $nMes 3 de la paacutegina anterior

httplocalhost8080JSP2exceppruebajspmes=marzo

La excepcioacuten indica que ha ocurrido un error al tratar de convertir ldquomarzordquo a un entero de

tipo Long Para cachar esta excepcioacuten y darle un tratamiento adecuado habraacute que modificar

la paacutegina JSP anterior como se indica a continuacioacuten

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltccatch var=rdquoerrorOcurridordquogt

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltccatchgt

ltcif test=rdquo$not empty errorOcurridordquogt

Error el paraacutemetro mes debe ser un nuacutemero ltbgt

ltbrgt Informacioacuten del error dada por el sistema

ltbrgt ltfont color=rdquoFF0000rdquogt $errorOcurrido ltfontgt

ltcifgt

ltbodygt

lthtmlgt

3232 ACCESO A BASES DE DATOS CON JSP

Las etiquetas que proporciona el aacuterea SQL permiten realizar

Conexioacuten con una base de datos

Realizacioacuten de consultas a la base de datos

Acceso al conjunto de resultados

Ejecucioacuten de actualizaciones y transacciones

Todas las etiquetas SQL actuacutean sobre una base de datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

32321 CONEXIOacuteN CON LA BASE DE DATOS

La conexioacuten con la base de datos puede realizarse con la etiqueta sqlsetDataSource Por

ejemplo si se esta utilizando el administrador de bases de datos MySql con el controlador

JDBC se puede realizar una conexioacuten con una base de datos digamos bd_tutorias de la

manera siguiente

ltsqlsetDataSource var=rdquobdrdquo

driver=rdquocommysqljdbcDriverrdquo

url=rdquojdbcmysqllocalhost3306bd_tutoriasrdquo

user=rdquoadminrdquo

password=rdquoadminadminrdquo gt

32322 CONSULTA A LA BASE DE DATOS

La etiqueta sqlQuero permite realizar una consulta a una base de datos Por ejemplo el

siguiente fragmento de coacutedigo realiza una consulta a la base de datos representada por bd y

obtiene un conjunto de resultados representado por cdr

ltsqlquery var=rdquocdrrdquo dataSource=rdquo$bdrdquogt

SELECT professor dia hora alumno

FROM profesores tutorias citas

WHERE profesoresid_profesor=tutoriasid_profesor

AND tutoriasid_tutoria=citasid_tutoria

ltsqlquerygt

32323 MODIFICACIONES SOBRE LA BASE DE DATOS

La etiqueta sqlupdate permite ejecutar una sentencia SQL INSERT UPDATE o DELETE

y cualquier otra sentencia SQL que no retorne ninguacuten valor Por ejemplo

ltsqlupdate var=rdquocontrdquo dataSource=rdquo$bdrdquo gt

UPDATE profesores

SET profesor=

WHERE profesor=

ltsqlparam value=rdquo$paramProfesorrdquo gt

ltsqlparam value=rdquo$paramIDrdquo gt

ltsqlupdategt

Una operacioacuten UPDATE puede utilizar el siacutembolo para indicar que el valor que tendriacutea que

evaluarse en esa posicioacuten seraacute suministrado por una etiqueta sqlparam como por ejemplo

httplocalhost8080JSP2sqlpruebajspProfesor=Mario+Rossainz+LopezampID=514

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

impliacutecitamente el valor del atributo al tipo de la constante para poder realizar la comparacioacuten

El resultado seraacute un valor de tipo boolean

ltcif test=rdquo$applicationScopeatrCuenta gt 10rdquogt

ltcifgt

o bien

ltcif test=rdquo$atrCuenta gt 10rdquogt

ltcifgt

Para que una literal pueda incluir un caracter significativo para el lenguaje dicho caracter

debe ser especificado como una secuencia de escape (caracter) Por ejemplo la siguiente

expresioacuten da lugar al literal ldquovezrdquo o ldquovecesrdquo entre comillas dobles

$(atrCuenta gt 1) iquest ldquordquovecesrdquordquo ldquordquovezrdquordquo

Cualquier objeto o atributo de un objeto definido en algunos de los aacutembitos de una paacutegina

puede ser utilizado como una variable Por ejemplo $atrCuenta+1 es una expresioacuten que

realiza la suma de la variable atrCuenta con 1

Cuando se trate de una propiedad de un objeto para acceder a ella se utilizaraacute el operador

punto o bien la notacioacuten empleada para acceder a un elemento de una matriz Por ejemplo

$paramparNombre

$param[ldquoparNombrerdquo]

Una expresioacuten LE puede aparecer en cualquier lugar donde pueda aparecer un texto fijo Por

tanto para informar al contenedor JSP que se trata de una expresioacuten y no de un texto fijo se

utilizan los delimitadores $ al principio y al final

3225 OPERADORES

OPERADOR DESCRIPCIOacuteN Acceso a la propiedad de un objeto o a un elemento de un Map

[] Acceso al elemento de una matriz o de un objeto List

() Pareacutentesis para alterar la prioridad en la evaluacioacuten de una expresioacuten

If ternario condicion expresion1 expresioacuten 2

+ Suma

- Resta

Producto

oacute div Divisioacuten

oacute mod Moacutedulo o resto de una divisioacuten

== oacute eq Igualdad

= oacute ne Diferente

lt oacute lt Menor que

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt oacute gt Mayor que

lt= oacute le Menor o igual que

gt= oacute ge Mayor o igual que

ampamp oacute and Operacioacuten Loacutegica AND

|| oacute or Operacioacuten Loacutegica OR

oacute not Operacioacuten Loacutegica NOT

empty Verifica si el valor de una variable es null si un String esta vaciacuteo o si una matriz Map

o Collection no tienen elementos

func(args) Llamada a una funcioacuten donde func es el nombre de la funcioacuten y arg representa cero o

maacutes argumentos separados por comas

El ejemplo siguiente muestra una paacutegina JSP compuesta por elementos HTML expresiones

LE y objetos impliacutecitos

lthtmlgt

ltheadgtlttitlegtJSP 20lttitlegtltheadgt

ltbodygt

lth3gtLenguaje de expresioacuten (LE)lth3gt

ltpgtLa siguiente tabla ilustra algunas expresiones LE

ltbrgtltbrgtlttable border=1gt

lttrgt

ltthgtltbgtExpresioacutenltbgtltthgt

ltthgtltbgtValorltbgtltthgt

lttrgt

lttrgt

lttdgt$3 + 6lttdgt

lttdgt$3 + 6lttdgt

lttdgt

lttrgt

lttdgt$(7 gt 4) 7 4lttdgt

lttdgt$(7 gt 4) 7 4lttdgt

lttrgt

lttrgt

lttdgt$header[host]lttdgt

lttdgt$header[host]lttdgt

lttrgt

lttablegt

ltbodygt

lthtmlgt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

323 BIBLIOTECA ESTANDAR DE ETIQUETAS

La biblioteca estaacutendar de etiquetas JSP (JSTL ndash Java Server Page Estaacutendar Tag Library)

incluye una cantidad amplia de etiquetas para diferentes aacutereas de trabajo

Aacuterea baacutesica (su prefijo es c ndash core) y contiene

o Soporte de variables (remove y set)

o Control del flujo (choose when otherwise forEach forTokens if)

o Manejo de URL (import param redirect param y url param)

o Operaciones varias (match y out)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlcore

Aacuterea XML (su prefijo es x) y contiene

o Sentencias baacutesicas (out parse y set)

o Control del flujo (choosehellip whenhellip otherwise forEach e if)

o Transformacioacuten de Documentos (transformhellipparam)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlxml

Aacuterea Internacionalizacioacuten (su prefijo es fmt) Contiene

o Localidad (setLocale y requestEncoding)

o Mensajes (bundle message param y setBundle)

o Formateo de Fechas y nuacutemeros (formatNumber formateacuteate parseDate

parseNumber setTimeZone timeZone)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlfmt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Aacuterea SQL (su prefijo es sql) es el lenguaje estandar para interactuar con bases de datos

relacionales y contiene setDataSource Quero dateParam param transaction y

update dateParam param) El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlsql

Aacuterea Funciones (su prefijo es fn) y contiene

o Longitud de una coleccioacuten (length)

o Manipulacioacuten de String (toUpperCase toLowerCase substring

substringAfter substringBefore trim replace indexOf startsWith

endsWith contains containsIgnoreCase split join y escapeXml)

o El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlfunctions

3231 OPERACIONES CON ETIQUETAS BAacuteSICAS

En un ejemplo pasado teniacuteamos el siguiente coacutedigo

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

En este ejemplo se hace referencia al aacuterea baacutesica de JSTL con el prefijo c y se utiliza la

etiqueta cset para definir la variable atrCuenta Si la variable ya esta definida simplemente

se le asigna el valor especificado

La uacuteltima parte del ejemplo anterior podriacutea haberse escrito de esta otra forma

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcif test=rdquo$atrCuenta gt 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcifgt

$atrCuenta $str

La etiqueta cif permite la ejecucioacuten condicional de su cuerpo en funcioacuten del valor del

atributo de test

La etiqueta cchoose permite la ejecucioacuten del cuerpo de la primera etiqueta cwhen cuyo

atributo test sea evaluado a true Si ninguna de las condiciones se evaluacutea a true entonces se

evaluacutea el cuerpo de la etiqueta cotherwise si estaacute presente El siguiente coacutedigo muestra otra

manera de escribir el ejemplo anterior utilizando estas uacuteltimas etiquetas

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcchoosegt

ltcwhen test=rdquo$atrCuenta == 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcwhengt

ltcotherwisegt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcotherwisegt

ltcchoosegt

$atrCuenta $str

La etiqueta cforEach permite iterar sobre una coleccioacuten de objetos La coleccioacuten se

especifica por medio del atributo iacutetems y el elemento actual de la coleccioacuten estaacute disponible a

traveacutes de la variable establecida por el atributo var Por ejemplo el siguiente fragmento de

coacutedigo visualiza una tabla con las variables definidas a nivel de aacutembito de paacutegina

lttable border=rdquo1rdquogt

ltcforEach var=rdquoitemrdquo iacutetems=rdquo$pageScoperdquogt

lttrgt

lttdgt $item lttdgt

lttrgt

ltcforEachgt

lttablegt

La etiqueta ccatch atrapa una excepcioacuten que ocurra en el cuerpo de la misma Por ejemplo

el siguiente segmento de coacutedigo lanzaraacute una excepcioacuten si el paraacutemetro mes se escribe con

letras en vez de con nuacutemeros

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltbodygt

lthtmlgt

Un URL anaacutelogo al siguiente daraacute lugar a que la excepcioacuten sea lanzada cuando se ejecute la

expresioacuten $nMes 3 de la paacutegina anterior

httplocalhost8080JSP2exceppruebajspmes=marzo

La excepcioacuten indica que ha ocurrido un error al tratar de convertir ldquomarzordquo a un entero de

tipo Long Para cachar esta excepcioacuten y darle un tratamiento adecuado habraacute que modificar

la paacutegina JSP anterior como se indica a continuacioacuten

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltccatch var=rdquoerrorOcurridordquogt

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltccatchgt

ltcif test=rdquo$not empty errorOcurridordquogt

Error el paraacutemetro mes debe ser un nuacutemero ltbgt

ltbrgt Informacioacuten del error dada por el sistema

ltbrgt ltfont color=rdquoFF0000rdquogt $errorOcurrido ltfontgt

ltcifgt

ltbodygt

lthtmlgt

3232 ACCESO A BASES DE DATOS CON JSP

Las etiquetas que proporciona el aacuterea SQL permiten realizar

Conexioacuten con una base de datos

Realizacioacuten de consultas a la base de datos

Acceso al conjunto de resultados

Ejecucioacuten de actualizaciones y transacciones

Todas las etiquetas SQL actuacutean sobre una base de datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

32321 CONEXIOacuteN CON LA BASE DE DATOS

La conexioacuten con la base de datos puede realizarse con la etiqueta sqlsetDataSource Por

ejemplo si se esta utilizando el administrador de bases de datos MySql con el controlador

JDBC se puede realizar una conexioacuten con una base de datos digamos bd_tutorias de la

manera siguiente

ltsqlsetDataSource var=rdquobdrdquo

driver=rdquocommysqljdbcDriverrdquo

url=rdquojdbcmysqllocalhost3306bd_tutoriasrdquo

user=rdquoadminrdquo

password=rdquoadminadminrdquo gt

32322 CONSULTA A LA BASE DE DATOS

La etiqueta sqlQuero permite realizar una consulta a una base de datos Por ejemplo el

siguiente fragmento de coacutedigo realiza una consulta a la base de datos representada por bd y

obtiene un conjunto de resultados representado por cdr

ltsqlquery var=rdquocdrrdquo dataSource=rdquo$bdrdquogt

SELECT professor dia hora alumno

FROM profesores tutorias citas

WHERE profesoresid_profesor=tutoriasid_profesor

AND tutoriasid_tutoria=citasid_tutoria

ltsqlquerygt

32323 MODIFICACIONES SOBRE LA BASE DE DATOS

La etiqueta sqlupdate permite ejecutar una sentencia SQL INSERT UPDATE o DELETE

y cualquier otra sentencia SQL que no retorne ninguacuten valor Por ejemplo

ltsqlupdate var=rdquocontrdquo dataSource=rdquo$bdrdquo gt

UPDATE profesores

SET profesor=

WHERE profesor=

ltsqlparam value=rdquo$paramProfesorrdquo gt

ltsqlparam value=rdquo$paramIDrdquo gt

ltsqlupdategt

Una operacioacuten UPDATE puede utilizar el siacutembolo para indicar que el valor que tendriacutea que

evaluarse en esa posicioacuten seraacute suministrado por una etiqueta sqlparam como por ejemplo

httplocalhost8080JSP2sqlpruebajspProfesor=Mario+Rossainz+LopezampID=514

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

gt oacute gt Mayor que

lt= oacute le Menor o igual que

gt= oacute ge Mayor o igual que

ampamp oacute and Operacioacuten Loacutegica AND

|| oacute or Operacioacuten Loacutegica OR

oacute not Operacioacuten Loacutegica NOT

empty Verifica si el valor de una variable es null si un String esta vaciacuteo o si una matriz Map

o Collection no tienen elementos

func(args) Llamada a una funcioacuten donde func es el nombre de la funcioacuten y arg representa cero o

maacutes argumentos separados por comas

El ejemplo siguiente muestra una paacutegina JSP compuesta por elementos HTML expresiones

LE y objetos impliacutecitos

lthtmlgt

ltheadgtlttitlegtJSP 20lttitlegtltheadgt

ltbodygt

lth3gtLenguaje de expresioacuten (LE)lth3gt

ltpgtLa siguiente tabla ilustra algunas expresiones LE

ltbrgtltbrgtlttable border=1gt

lttrgt

ltthgtltbgtExpresioacutenltbgtltthgt

ltthgtltbgtValorltbgtltthgt

lttrgt

lttrgt

lttdgt$3 + 6lttdgt

lttdgt$3 + 6lttdgt

lttdgt

lttrgt

lttdgt$(7 gt 4) 7 4lttdgt

lttdgt$(7 gt 4) 7 4lttdgt

lttrgt

lttrgt

lttdgt$header[host]lttdgt

lttdgt$header[host]lttdgt

lttrgt

lttablegt

ltbodygt

lthtmlgt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

323 BIBLIOTECA ESTANDAR DE ETIQUETAS

La biblioteca estaacutendar de etiquetas JSP (JSTL ndash Java Server Page Estaacutendar Tag Library)

incluye una cantidad amplia de etiquetas para diferentes aacutereas de trabajo

Aacuterea baacutesica (su prefijo es c ndash core) y contiene

o Soporte de variables (remove y set)

o Control del flujo (choose when otherwise forEach forTokens if)

o Manejo de URL (import param redirect param y url param)

o Operaciones varias (match y out)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlcore

Aacuterea XML (su prefijo es x) y contiene

o Sentencias baacutesicas (out parse y set)

o Control del flujo (choosehellip whenhellip otherwise forEach e if)

o Transformacioacuten de Documentos (transformhellipparam)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlxml

Aacuterea Internacionalizacioacuten (su prefijo es fmt) Contiene

o Localidad (setLocale y requestEncoding)

o Mensajes (bundle message param y setBundle)

o Formateo de Fechas y nuacutemeros (formatNumber formateacuteate parseDate

parseNumber setTimeZone timeZone)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlfmt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Aacuterea SQL (su prefijo es sql) es el lenguaje estandar para interactuar con bases de datos

relacionales y contiene setDataSource Quero dateParam param transaction y

update dateParam param) El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlsql

Aacuterea Funciones (su prefijo es fn) y contiene

o Longitud de una coleccioacuten (length)

o Manipulacioacuten de String (toUpperCase toLowerCase substring

substringAfter substringBefore trim replace indexOf startsWith

endsWith contains containsIgnoreCase split join y escapeXml)

o El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlfunctions

3231 OPERACIONES CON ETIQUETAS BAacuteSICAS

En un ejemplo pasado teniacuteamos el siguiente coacutedigo

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

En este ejemplo se hace referencia al aacuterea baacutesica de JSTL con el prefijo c y se utiliza la

etiqueta cset para definir la variable atrCuenta Si la variable ya esta definida simplemente

se le asigna el valor especificado

La uacuteltima parte del ejemplo anterior podriacutea haberse escrito de esta otra forma

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcif test=rdquo$atrCuenta gt 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcifgt

$atrCuenta $str

La etiqueta cif permite la ejecucioacuten condicional de su cuerpo en funcioacuten del valor del

atributo de test

La etiqueta cchoose permite la ejecucioacuten del cuerpo de la primera etiqueta cwhen cuyo

atributo test sea evaluado a true Si ninguna de las condiciones se evaluacutea a true entonces se

evaluacutea el cuerpo de la etiqueta cotherwise si estaacute presente El siguiente coacutedigo muestra otra

manera de escribir el ejemplo anterior utilizando estas uacuteltimas etiquetas

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcchoosegt

ltcwhen test=rdquo$atrCuenta == 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcwhengt

ltcotherwisegt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcotherwisegt

ltcchoosegt

$atrCuenta $str

La etiqueta cforEach permite iterar sobre una coleccioacuten de objetos La coleccioacuten se

especifica por medio del atributo iacutetems y el elemento actual de la coleccioacuten estaacute disponible a

traveacutes de la variable establecida por el atributo var Por ejemplo el siguiente fragmento de

coacutedigo visualiza una tabla con las variables definidas a nivel de aacutembito de paacutegina

lttable border=rdquo1rdquogt

ltcforEach var=rdquoitemrdquo iacutetems=rdquo$pageScoperdquogt

lttrgt

lttdgt $item lttdgt

lttrgt

ltcforEachgt

lttablegt

La etiqueta ccatch atrapa una excepcioacuten que ocurra en el cuerpo de la misma Por ejemplo

el siguiente segmento de coacutedigo lanzaraacute una excepcioacuten si el paraacutemetro mes se escribe con

letras en vez de con nuacutemeros

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltbodygt

lthtmlgt

Un URL anaacutelogo al siguiente daraacute lugar a que la excepcioacuten sea lanzada cuando se ejecute la

expresioacuten $nMes 3 de la paacutegina anterior

httplocalhost8080JSP2exceppruebajspmes=marzo

La excepcioacuten indica que ha ocurrido un error al tratar de convertir ldquomarzordquo a un entero de

tipo Long Para cachar esta excepcioacuten y darle un tratamiento adecuado habraacute que modificar

la paacutegina JSP anterior como se indica a continuacioacuten

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltccatch var=rdquoerrorOcurridordquogt

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltccatchgt

ltcif test=rdquo$not empty errorOcurridordquogt

Error el paraacutemetro mes debe ser un nuacutemero ltbgt

ltbrgt Informacioacuten del error dada por el sistema

ltbrgt ltfont color=rdquoFF0000rdquogt $errorOcurrido ltfontgt

ltcifgt

ltbodygt

lthtmlgt

3232 ACCESO A BASES DE DATOS CON JSP

Las etiquetas que proporciona el aacuterea SQL permiten realizar

Conexioacuten con una base de datos

Realizacioacuten de consultas a la base de datos

Acceso al conjunto de resultados

Ejecucioacuten de actualizaciones y transacciones

Todas las etiquetas SQL actuacutean sobre una base de datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

32321 CONEXIOacuteN CON LA BASE DE DATOS

La conexioacuten con la base de datos puede realizarse con la etiqueta sqlsetDataSource Por

ejemplo si se esta utilizando el administrador de bases de datos MySql con el controlador

JDBC se puede realizar una conexioacuten con una base de datos digamos bd_tutorias de la

manera siguiente

ltsqlsetDataSource var=rdquobdrdquo

driver=rdquocommysqljdbcDriverrdquo

url=rdquojdbcmysqllocalhost3306bd_tutoriasrdquo

user=rdquoadminrdquo

password=rdquoadminadminrdquo gt

32322 CONSULTA A LA BASE DE DATOS

La etiqueta sqlQuero permite realizar una consulta a una base de datos Por ejemplo el

siguiente fragmento de coacutedigo realiza una consulta a la base de datos representada por bd y

obtiene un conjunto de resultados representado por cdr

ltsqlquery var=rdquocdrrdquo dataSource=rdquo$bdrdquogt

SELECT professor dia hora alumno

FROM profesores tutorias citas

WHERE profesoresid_profesor=tutoriasid_profesor

AND tutoriasid_tutoria=citasid_tutoria

ltsqlquerygt

32323 MODIFICACIONES SOBRE LA BASE DE DATOS

La etiqueta sqlupdate permite ejecutar una sentencia SQL INSERT UPDATE o DELETE

y cualquier otra sentencia SQL que no retorne ninguacuten valor Por ejemplo

ltsqlupdate var=rdquocontrdquo dataSource=rdquo$bdrdquo gt

UPDATE profesores

SET profesor=

WHERE profesor=

ltsqlparam value=rdquo$paramProfesorrdquo gt

ltsqlparam value=rdquo$paramIDrdquo gt

ltsqlupdategt

Una operacioacuten UPDATE puede utilizar el siacutembolo para indicar que el valor que tendriacutea que

evaluarse en esa posicioacuten seraacute suministrado por una etiqueta sqlparam como por ejemplo

httplocalhost8080JSP2sqlpruebajspProfesor=Mario+Rossainz+LopezampID=514

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

323 BIBLIOTECA ESTANDAR DE ETIQUETAS

La biblioteca estaacutendar de etiquetas JSP (JSTL ndash Java Server Page Estaacutendar Tag Library)

incluye una cantidad amplia de etiquetas para diferentes aacutereas de trabajo

Aacuterea baacutesica (su prefijo es c ndash core) y contiene

o Soporte de variables (remove y set)

o Control del flujo (choose when otherwise forEach forTokens if)

o Manejo de URL (import param redirect param y url param)

o Operaciones varias (match y out)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlcore

Aacuterea XML (su prefijo es x) y contiene

o Sentencias baacutesicas (out parse y set)

o Control del flujo (choosehellip whenhellip otherwise forEach e if)

o Transformacioacuten de Documentos (transformhellipparam)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlxml

Aacuterea Internacionalizacioacuten (su prefijo es fmt) Contiene

o Localidad (setLocale y requestEncoding)

o Mensajes (bundle message param y setBundle)

o Formateo de Fechas y nuacutemeros (formatNumber formateacuteate parseDate

parseNumber setTimeZone timeZone)

o El identificador de esta biblioteca (URI) es httpjavasuncomjspjstlfmt

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Aacuterea SQL (su prefijo es sql) es el lenguaje estandar para interactuar con bases de datos

relacionales y contiene setDataSource Quero dateParam param transaction y

update dateParam param) El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlsql

Aacuterea Funciones (su prefijo es fn) y contiene

o Longitud de una coleccioacuten (length)

o Manipulacioacuten de String (toUpperCase toLowerCase substring

substringAfter substringBefore trim replace indexOf startsWith

endsWith contains containsIgnoreCase split join y escapeXml)

o El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlfunctions

3231 OPERACIONES CON ETIQUETAS BAacuteSICAS

En un ejemplo pasado teniacuteamos el siguiente coacutedigo

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

En este ejemplo se hace referencia al aacuterea baacutesica de JSTL con el prefijo c y se utiliza la

etiqueta cset para definir la variable atrCuenta Si la variable ya esta definida simplemente

se le asigna el valor especificado

La uacuteltima parte del ejemplo anterior podriacutea haberse escrito de esta otra forma

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcif test=rdquo$atrCuenta gt 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcifgt

$atrCuenta $str

La etiqueta cif permite la ejecucioacuten condicional de su cuerpo en funcioacuten del valor del

atributo de test

La etiqueta cchoose permite la ejecucioacuten del cuerpo de la primera etiqueta cwhen cuyo

atributo test sea evaluado a true Si ninguna de las condiciones se evaluacutea a true entonces se

evaluacutea el cuerpo de la etiqueta cotherwise si estaacute presente El siguiente coacutedigo muestra otra

manera de escribir el ejemplo anterior utilizando estas uacuteltimas etiquetas

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcchoosegt

ltcwhen test=rdquo$atrCuenta == 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcwhengt

ltcotherwisegt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcotherwisegt

ltcchoosegt

$atrCuenta $str

La etiqueta cforEach permite iterar sobre una coleccioacuten de objetos La coleccioacuten se

especifica por medio del atributo iacutetems y el elemento actual de la coleccioacuten estaacute disponible a

traveacutes de la variable establecida por el atributo var Por ejemplo el siguiente fragmento de

coacutedigo visualiza una tabla con las variables definidas a nivel de aacutembito de paacutegina

lttable border=rdquo1rdquogt

ltcforEach var=rdquoitemrdquo iacutetems=rdquo$pageScoperdquogt

lttrgt

lttdgt $item lttdgt

lttrgt

ltcforEachgt

lttablegt

La etiqueta ccatch atrapa una excepcioacuten que ocurra en el cuerpo de la misma Por ejemplo

el siguiente segmento de coacutedigo lanzaraacute una excepcioacuten si el paraacutemetro mes se escribe con

letras en vez de con nuacutemeros

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltbodygt

lthtmlgt

Un URL anaacutelogo al siguiente daraacute lugar a que la excepcioacuten sea lanzada cuando se ejecute la

expresioacuten $nMes 3 de la paacutegina anterior

httplocalhost8080JSP2exceppruebajspmes=marzo

La excepcioacuten indica que ha ocurrido un error al tratar de convertir ldquomarzordquo a un entero de

tipo Long Para cachar esta excepcioacuten y darle un tratamiento adecuado habraacute que modificar

la paacutegina JSP anterior como se indica a continuacioacuten

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltccatch var=rdquoerrorOcurridordquogt

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltccatchgt

ltcif test=rdquo$not empty errorOcurridordquogt

Error el paraacutemetro mes debe ser un nuacutemero ltbgt

ltbrgt Informacioacuten del error dada por el sistema

ltbrgt ltfont color=rdquoFF0000rdquogt $errorOcurrido ltfontgt

ltcifgt

ltbodygt

lthtmlgt

3232 ACCESO A BASES DE DATOS CON JSP

Las etiquetas que proporciona el aacuterea SQL permiten realizar

Conexioacuten con una base de datos

Realizacioacuten de consultas a la base de datos

Acceso al conjunto de resultados

Ejecucioacuten de actualizaciones y transacciones

Todas las etiquetas SQL actuacutean sobre una base de datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

32321 CONEXIOacuteN CON LA BASE DE DATOS

La conexioacuten con la base de datos puede realizarse con la etiqueta sqlsetDataSource Por

ejemplo si se esta utilizando el administrador de bases de datos MySql con el controlador

JDBC se puede realizar una conexioacuten con una base de datos digamos bd_tutorias de la

manera siguiente

ltsqlsetDataSource var=rdquobdrdquo

driver=rdquocommysqljdbcDriverrdquo

url=rdquojdbcmysqllocalhost3306bd_tutoriasrdquo

user=rdquoadminrdquo

password=rdquoadminadminrdquo gt

32322 CONSULTA A LA BASE DE DATOS

La etiqueta sqlQuero permite realizar una consulta a una base de datos Por ejemplo el

siguiente fragmento de coacutedigo realiza una consulta a la base de datos representada por bd y

obtiene un conjunto de resultados representado por cdr

ltsqlquery var=rdquocdrrdquo dataSource=rdquo$bdrdquogt

SELECT professor dia hora alumno

FROM profesores tutorias citas

WHERE profesoresid_profesor=tutoriasid_profesor

AND tutoriasid_tutoria=citasid_tutoria

ltsqlquerygt

32323 MODIFICACIONES SOBRE LA BASE DE DATOS

La etiqueta sqlupdate permite ejecutar una sentencia SQL INSERT UPDATE o DELETE

y cualquier otra sentencia SQL que no retorne ninguacuten valor Por ejemplo

ltsqlupdate var=rdquocontrdquo dataSource=rdquo$bdrdquo gt

UPDATE profesores

SET profesor=

WHERE profesor=

ltsqlparam value=rdquo$paramProfesorrdquo gt

ltsqlparam value=rdquo$paramIDrdquo gt

ltsqlupdategt

Una operacioacuten UPDATE puede utilizar el siacutembolo para indicar que el valor que tendriacutea que

evaluarse en esa posicioacuten seraacute suministrado por una etiqueta sqlparam como por ejemplo

httplocalhost8080JSP2sqlpruebajspProfesor=Mario+Rossainz+LopezampID=514

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

Aacuterea SQL (su prefijo es sql) es el lenguaje estandar para interactuar con bases de datos

relacionales y contiene setDataSource Quero dateParam param transaction y

update dateParam param) El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlsql

Aacuterea Funciones (su prefijo es fn) y contiene

o Longitud de una coleccioacuten (length)

o Manipulacioacuten de String (toUpperCase toLowerCase substring

substringAfter substringBefore trim replace indexOf startsWith

endsWith contains containsIgnoreCase split join y escapeXml)

o El identificador de esta biblioteca (URI) es

httpjavasuncomjspjstlfunctions

3231 OPERACIONES CON ETIQUETAS BAacuteSICAS

En un ejemplo pasado teniacuteamos el siguiente coacutedigo

lt-- paacutegina JSP Cuentajsp --gt

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtPaacutegina JSP cuentalttitlegtltheadgt

ltbodygt

lt--Incrementar el contador para esta paacutegina El valor es

guardado en la variable atrCuenta definida en el aacutembito

de aplicacioacuten

--gt

ltcset var=atrCuenta scope=application value=$atrCuenta + 1gt

lth1gtDemostracioacuten de seguimiento a nivel de aplicacioacutenlth1gt

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

$atrCuenta $(atrCuenta gt 1) veces vez

ltbodygt

lthtmlgt

En este ejemplo se hace referencia al aacuterea baacutesica de JSTL con el prefijo c y se utiliza la

etiqueta cset para definir la variable atrCuenta Si la variable ya esta definida simplemente

se le asigna el valor especificado

La uacuteltima parte del ejemplo anterior podriacutea haberse escrito de esta otra forma

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcif test=rdquo$atrCuenta gt 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcifgt

$atrCuenta $str

La etiqueta cif permite la ejecucioacuten condicional de su cuerpo en funcioacuten del valor del

atributo de test

La etiqueta cchoose permite la ejecucioacuten del cuerpo de la primera etiqueta cwhen cuyo

atributo test sea evaluado a true Si ninguna de las condiciones se evaluacutea a true entonces se

evaluacutea el cuerpo de la etiqueta cotherwise si estaacute presente El siguiente coacutedigo muestra otra

manera de escribir el ejemplo anterior utilizando estas uacuteltimas etiquetas

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcchoosegt

ltcwhen test=rdquo$atrCuenta == 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcwhengt

ltcotherwisegt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcotherwisegt

ltcchoosegt

$atrCuenta $str

La etiqueta cforEach permite iterar sobre una coleccioacuten de objetos La coleccioacuten se

especifica por medio del atributo iacutetems y el elemento actual de la coleccioacuten estaacute disponible a

traveacutes de la variable establecida por el atributo var Por ejemplo el siguiente fragmento de

coacutedigo visualiza una tabla con las variables definidas a nivel de aacutembito de paacutegina

lttable border=rdquo1rdquogt

ltcforEach var=rdquoitemrdquo iacutetems=rdquo$pageScoperdquogt

lttrgt

lttdgt $item lttdgt

lttrgt

ltcforEachgt

lttablegt

La etiqueta ccatch atrapa una excepcioacuten que ocurra en el cuerpo de la misma Por ejemplo

el siguiente segmento de coacutedigo lanzaraacute una excepcioacuten si el paraacutemetro mes se escribe con

letras en vez de con nuacutemeros

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltbodygt

lthtmlgt

Un URL anaacutelogo al siguiente daraacute lugar a que la excepcioacuten sea lanzada cuando se ejecute la

expresioacuten $nMes 3 de la paacutegina anterior

httplocalhost8080JSP2exceppruebajspmes=marzo

La excepcioacuten indica que ha ocurrido un error al tratar de convertir ldquomarzordquo a un entero de

tipo Long Para cachar esta excepcioacuten y darle un tratamiento adecuado habraacute que modificar

la paacutegina JSP anterior como se indica a continuacioacuten

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltccatch var=rdquoerrorOcurridordquogt

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltccatchgt

ltcif test=rdquo$not empty errorOcurridordquogt

Error el paraacutemetro mes debe ser un nuacutemero ltbgt

ltbrgt Informacioacuten del error dada por el sistema

ltbrgt ltfont color=rdquoFF0000rdquogt $errorOcurrido ltfontgt

ltcifgt

ltbodygt

lthtmlgt

3232 ACCESO A BASES DE DATOS CON JSP

Las etiquetas que proporciona el aacuterea SQL permiten realizar

Conexioacuten con una base de datos

Realizacioacuten de consultas a la base de datos

Acceso al conjunto de resultados

Ejecucioacuten de actualizaciones y transacciones

Todas las etiquetas SQL actuacutean sobre una base de datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

32321 CONEXIOacuteN CON LA BASE DE DATOS

La conexioacuten con la base de datos puede realizarse con la etiqueta sqlsetDataSource Por

ejemplo si se esta utilizando el administrador de bases de datos MySql con el controlador

JDBC se puede realizar una conexioacuten con una base de datos digamos bd_tutorias de la

manera siguiente

ltsqlsetDataSource var=rdquobdrdquo

driver=rdquocommysqljdbcDriverrdquo

url=rdquojdbcmysqllocalhost3306bd_tutoriasrdquo

user=rdquoadminrdquo

password=rdquoadminadminrdquo gt

32322 CONSULTA A LA BASE DE DATOS

La etiqueta sqlQuero permite realizar una consulta a una base de datos Por ejemplo el

siguiente fragmento de coacutedigo realiza una consulta a la base de datos representada por bd y

obtiene un conjunto de resultados representado por cdr

ltsqlquery var=rdquocdrrdquo dataSource=rdquo$bdrdquogt

SELECT professor dia hora alumno

FROM profesores tutorias citas

WHERE profesoresid_profesor=tutoriasid_profesor

AND tutoriasid_tutoria=citasid_tutoria

ltsqlquerygt

32323 MODIFICACIONES SOBRE LA BASE DE DATOS

La etiqueta sqlupdate permite ejecutar una sentencia SQL INSERT UPDATE o DELETE

y cualquier otra sentencia SQL que no retorne ninguacuten valor Por ejemplo

ltsqlupdate var=rdquocontrdquo dataSource=rdquo$bdrdquo gt

UPDATE profesores

SET profesor=

WHERE profesor=

ltsqlparam value=rdquo$paramProfesorrdquo gt

ltsqlparam value=rdquo$paramIDrdquo gt

ltsqlupdategt

Una operacioacuten UPDATE puede utilizar el siacutembolo para indicar que el valor que tendriacutea que

evaluarse en esa posicioacuten seraacute suministrado por una etiqueta sqlparam como por ejemplo

httplocalhost8080JSP2sqlpruebajspProfesor=Mario+Rossainz+LopezampID=514

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcif test=rdquo$atrCuenta gt 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcifgt

$atrCuenta $str

La etiqueta cif permite la ejecucioacuten condicional de su cuerpo en funcioacuten del valor del

atributo de test

La etiqueta cchoose permite la ejecucioacuten del cuerpo de la primera etiqueta cwhen cuyo

atributo test sea evaluado a true Si ninguna de las condiciones se evaluacutea a true entonces se

evaluacutea el cuerpo de la etiqueta cotherwise si estaacute presente El siguiente coacutedigo muestra otra

manera de escribir el ejemplo anterior utilizando estas uacuteltimas etiquetas

lt-- Visualizar la cuenta para esta paacutegina --gt

$paramparNombre has visitado esta paacutegina

ltcchoosegt

ltcwhen test=rdquo$atrCuenta == 1rdquogt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovezrdquo gt

ltcwhengt

ltcotherwisegt

ltcset var=rdquostrrdquo scope=rdquoapplicationrdquo value=rdquovecesrdquo gt

ltcotherwisegt

ltcchoosegt

$atrCuenta $str

La etiqueta cforEach permite iterar sobre una coleccioacuten de objetos La coleccioacuten se

especifica por medio del atributo iacutetems y el elemento actual de la coleccioacuten estaacute disponible a

traveacutes de la variable establecida por el atributo var Por ejemplo el siguiente fragmento de

coacutedigo visualiza una tabla con las variables definidas a nivel de aacutembito de paacutegina

lttable border=rdquo1rdquogt

ltcforEach var=rdquoitemrdquo iacutetems=rdquo$pageScoperdquogt

lttrgt

lttdgt $item lttdgt

lttrgt

ltcforEachgt

lttablegt

La etiqueta ccatch atrapa una excepcioacuten que ocurra en el cuerpo de la misma Por ejemplo

el siguiente segmento de coacutedigo lanzaraacute una excepcioacuten si el paraacutemetro mes se escribe con

letras en vez de con nuacutemeros

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltbodygt

lthtmlgt

Un URL anaacutelogo al siguiente daraacute lugar a que la excepcioacuten sea lanzada cuando se ejecute la

expresioacuten $nMes 3 de la paacutegina anterior

httplocalhost8080JSP2exceppruebajspmes=marzo

La excepcioacuten indica que ha ocurrido un error al tratar de convertir ldquomarzordquo a un entero de

tipo Long Para cachar esta excepcioacuten y darle un tratamiento adecuado habraacute que modificar

la paacutegina JSP anterior como se indica a continuacioacuten

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltccatch var=rdquoerrorOcurridordquogt

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltccatchgt

ltcif test=rdquo$not empty errorOcurridordquogt

Error el paraacutemetro mes debe ser un nuacutemero ltbgt

ltbrgt Informacioacuten del error dada por el sistema

ltbrgt ltfont color=rdquoFF0000rdquogt $errorOcurrido ltfontgt

ltcifgt

ltbodygt

lthtmlgt

3232 ACCESO A BASES DE DATOS CON JSP

Las etiquetas que proporciona el aacuterea SQL permiten realizar

Conexioacuten con una base de datos

Realizacioacuten de consultas a la base de datos

Acceso al conjunto de resultados

Ejecucioacuten de actualizaciones y transacciones

Todas las etiquetas SQL actuacutean sobre una base de datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

32321 CONEXIOacuteN CON LA BASE DE DATOS

La conexioacuten con la base de datos puede realizarse con la etiqueta sqlsetDataSource Por

ejemplo si se esta utilizando el administrador de bases de datos MySql con el controlador

JDBC se puede realizar una conexioacuten con una base de datos digamos bd_tutorias de la

manera siguiente

ltsqlsetDataSource var=rdquobdrdquo

driver=rdquocommysqljdbcDriverrdquo

url=rdquojdbcmysqllocalhost3306bd_tutoriasrdquo

user=rdquoadminrdquo

password=rdquoadminadminrdquo gt

32322 CONSULTA A LA BASE DE DATOS

La etiqueta sqlQuero permite realizar una consulta a una base de datos Por ejemplo el

siguiente fragmento de coacutedigo realiza una consulta a la base de datos representada por bd y

obtiene un conjunto de resultados representado por cdr

ltsqlquery var=rdquocdrrdquo dataSource=rdquo$bdrdquogt

SELECT professor dia hora alumno

FROM profesores tutorias citas

WHERE profesoresid_profesor=tutoriasid_profesor

AND tutoriasid_tutoria=citasid_tutoria

ltsqlquerygt

32323 MODIFICACIONES SOBRE LA BASE DE DATOS

La etiqueta sqlupdate permite ejecutar una sentencia SQL INSERT UPDATE o DELETE

y cualquier otra sentencia SQL que no retorne ninguacuten valor Por ejemplo

ltsqlupdate var=rdquocontrdquo dataSource=rdquo$bdrdquo gt

UPDATE profesores

SET profesor=

WHERE profesor=

ltsqlparam value=rdquo$paramProfesorrdquo gt

ltsqlparam value=rdquo$paramIDrdquo gt

ltsqlupdategt

Una operacioacuten UPDATE puede utilizar el siacutembolo para indicar que el valor que tendriacutea que

evaluarse en esa posicioacuten seraacute suministrado por una etiqueta sqlparam como por ejemplo

httplocalhost8080JSP2sqlpruebajspProfesor=Mario+Rossainz+LopezampID=514

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltbodygt

lthtmlgt

Un URL anaacutelogo al siguiente daraacute lugar a que la excepcioacuten sea lanzada cuando se ejecute la

expresioacuten $nMes 3 de la paacutegina anterior

httplocalhost8080JSP2exceppruebajspmes=marzo

La excepcioacuten indica que ha ocurrido un error al tratar de convertir ldquomarzordquo a un entero de

tipo Long Para cachar esta excepcioacuten y darle un tratamiento adecuado habraacute que modificar

la paacutegina JSP anterior como se indica a continuacioacuten

ltpage contentType=texthtmlgt

lt taglib uri=httpjavasuncomjspjstlcore prefix=c gt

lthtmlgt

ltheadgtlttitlegtExcepciones JSPlttitlegtltheadgt

ltbodygt

ltcset var=rdquonMesrdquo value=rdquo$parammesrdquo gt

ltbrgt El valor de nMes es $nMes

ltccatch var=rdquoerrorOcurridordquogt

ltbrgt Ejecutar una multiplicacioacuten $nMes 3

ltccatchgt

ltcif test=rdquo$not empty errorOcurridordquogt

Error el paraacutemetro mes debe ser un nuacutemero ltbgt

ltbrgt Informacioacuten del error dada por el sistema

ltbrgt ltfont color=rdquoFF0000rdquogt $errorOcurrido ltfontgt

ltcifgt

ltbodygt

lthtmlgt

3232 ACCESO A BASES DE DATOS CON JSP

Las etiquetas que proporciona el aacuterea SQL permiten realizar

Conexioacuten con una base de datos

Realizacioacuten de consultas a la base de datos

Acceso al conjunto de resultados

Ejecucioacuten de actualizaciones y transacciones

Todas las etiquetas SQL actuacutean sobre una base de datos

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

32321 CONEXIOacuteN CON LA BASE DE DATOS

La conexioacuten con la base de datos puede realizarse con la etiqueta sqlsetDataSource Por

ejemplo si se esta utilizando el administrador de bases de datos MySql con el controlador

JDBC se puede realizar una conexioacuten con una base de datos digamos bd_tutorias de la

manera siguiente

ltsqlsetDataSource var=rdquobdrdquo

driver=rdquocommysqljdbcDriverrdquo

url=rdquojdbcmysqllocalhost3306bd_tutoriasrdquo

user=rdquoadminrdquo

password=rdquoadminadminrdquo gt

32322 CONSULTA A LA BASE DE DATOS

La etiqueta sqlQuero permite realizar una consulta a una base de datos Por ejemplo el

siguiente fragmento de coacutedigo realiza una consulta a la base de datos representada por bd y

obtiene un conjunto de resultados representado por cdr

ltsqlquery var=rdquocdrrdquo dataSource=rdquo$bdrdquogt

SELECT professor dia hora alumno

FROM profesores tutorias citas

WHERE profesoresid_profesor=tutoriasid_profesor

AND tutoriasid_tutoria=citasid_tutoria

ltsqlquerygt

32323 MODIFICACIONES SOBRE LA BASE DE DATOS

La etiqueta sqlupdate permite ejecutar una sentencia SQL INSERT UPDATE o DELETE

y cualquier otra sentencia SQL que no retorne ninguacuten valor Por ejemplo

ltsqlupdate var=rdquocontrdquo dataSource=rdquo$bdrdquo gt

UPDATE profesores

SET profesor=

WHERE profesor=

ltsqlparam value=rdquo$paramProfesorrdquo gt

ltsqlparam value=rdquo$paramIDrdquo gt

ltsqlupdategt

Una operacioacuten UPDATE puede utilizar el siacutembolo para indicar que el valor que tendriacutea que

evaluarse en esa posicioacuten seraacute suministrado por una etiqueta sqlparam como por ejemplo

httplocalhost8080JSP2sqlpruebajspProfesor=Mario+Rossainz+LopezampID=514

Modelos de Desarrollo WEB Primavera 2020 Dr Mario Rossainz Loacutepez

32321 CONEXIOacuteN CON LA BASE DE DATOS

La conexioacuten con la base de datos puede realizarse con la etiqueta sqlsetDataSource Por

ejemplo si se esta utilizando el administrador de bases de datos MySql con el controlador

JDBC se puede realizar una conexioacuten con una base de datos digamos bd_tutorias de la

manera siguiente

ltsqlsetDataSource var=rdquobdrdquo

driver=rdquocommysqljdbcDriverrdquo

url=rdquojdbcmysqllocalhost3306bd_tutoriasrdquo

user=rdquoadminrdquo

password=rdquoadminadminrdquo gt

32322 CONSULTA A LA BASE DE DATOS

La etiqueta sqlQuero permite realizar una consulta a una base de datos Por ejemplo el

siguiente fragmento de coacutedigo realiza una consulta a la base de datos representada por bd y

obtiene un conjunto de resultados representado por cdr

ltsqlquery var=rdquocdrrdquo dataSource=rdquo$bdrdquogt

SELECT professor dia hora alumno

FROM profesores tutorias citas

WHERE profesoresid_profesor=tutoriasid_profesor

AND tutoriasid_tutoria=citasid_tutoria

ltsqlquerygt

32323 MODIFICACIONES SOBRE LA BASE DE DATOS

La etiqueta sqlupdate permite ejecutar una sentencia SQL INSERT UPDATE o DELETE

y cualquier otra sentencia SQL que no retorne ninguacuten valor Por ejemplo

ltsqlupdate var=rdquocontrdquo dataSource=rdquo$bdrdquo gt

UPDATE profesores

SET profesor=

WHERE profesor=

ltsqlparam value=rdquo$paramProfesorrdquo gt

ltsqlparam value=rdquo$paramIDrdquo gt

ltsqlupdategt

Una operacioacuten UPDATE puede utilizar el siacutembolo para indicar que el valor que tendriacutea que

evaluarse en esa posicioacuten seraacute suministrado por una etiqueta sqlparam como por ejemplo

httplocalhost8080JSP2sqlpruebajspProfesor=Mario+Rossainz+LopezampID=514