3. HERRAMIENTAS PARA EL DESARROLLO DE...
Transcript of 3. HERRAMIENTAS PARA EL DESARROLLO DE...
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