Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Introduccion Servlets JSP
Introduccion Servlets JSP
moncho.mendez@uvigo.es
1/50
ndice de contidos
1 Servlets.......................................................................................................4
1.1 Introduccin...........................................................................................4
1.2 Instalacin.............................................................................................4
1.3 Formas de ejecutar un servlet...................................................................5
1.4 Caractersticas de los servlets...................................................................6
Los paquetes javax.servlet y javax.servlet.http..............................................7
El paquete javax.servlet..........................................................................7
El paquete javax.servlet.http....................................................................8
1.5 Ejemplos bsicos.....................................................................................9
TimeServlet.............................................................................................10
EchoRequest............................................................................................10
HTMLServlet............................................................................................12
Lectura de cabeceras de solicitud................................................................13
Cookies...................................................................................................15
Crear un objeto cookie..........................................................................15
Establecer los atributos de la cookie........................................................16
Envo de la cookie.................................................................................16
Recogida de cookies..............................................................................17
Obtener el valor de una Cookie...............................................................17
Manejo de Sesiones (Session Tracking)........................................................18
Reescritura de URLs.................................................................................20
Manejo de cdigos de Estado en HTTP.........................................................21
Cdigos de Estado HTTP 1.1 y sus significados..........................................22
1.6 Ejemplo: Motor de bsqueda...................................................................24
1.7 Subida de ficheros al servidor.................................................................26
1.8 Generar imgenes desde servlets............................................................27
2 JSP............................................................................................................30
2.1 Introduccin.........................................................................................30
Beneficios que aporta JSP..........................................................................30
Mejoras en el rendimiento......................................................................31
Soporte de componentes reutilizables......................................................31
Separacin entre cdigo de presentacin y cdigo de implementacin..........31
Divisin del trabajo...............................................................................31
Cmo trabaja JSP?..................................................................................31
Salida con buffer......................................................................................33
Manejo de sesiones..................................................................................34
2.2 Sintaxis del lenguaje..............................................................................34
Directivas................................................................................................35
Elementos de script..................................................................................36
Declaraciones.......................................................................................37
Expresiones.........................................................................................37
Scriptlets.............................................................................................38
Comentarios............................................................................................38
Comentarios de contenido......................................................................39
Comentarios JSP...................................................................................39
Comentarios del lenguaje de Script.........................................................39
Acciones.................................................................................................39
moncho.mendez@uvigo.es
2/50
Objetos implcitos................................................................41
2.3 Ejemplos bsicos...................................................................................41
Factoriales...............................................................................................41
Manejo de excepciones.............................................................................42
Envo de e-mails......................................................................................43
Acceso a bases de datos............................................................................44
3 Tendencias actuales.....................................................................................46
moncho.mendez@uvigo.es
3/50
1 Servlets
1.1 Introduccin
Fueron introducidos por Sun en 1996 como pequeas aplicaciones Java para aadir
funcionalidad dinmica a los servidores web. Los Servlets, al igual que los scripts CGI,
reciben una peticin del cliente y generan los contenidos apropiados para su
respuesta, aunque el esquema de funcionamiento es diferente.
Todos los servlets asociados con un servidor se ejecutan dentro de un proceso simple.
Cada vez que llega una peticin, la JVM (Java Virtual Machine) crea un hilo Java para
manejar la peticin, reduciendo as la sobrecarga del sistema (ver Figura 1).
Recibe
solicitud
Servidor HTTP
Lanza un
thread
Contenedor SERVLET
Genera la
respuesta
SERVLET
Enva
la respuesta
1.2 Instalacin
moncho.mendez@uvigo.es
4/50
Apache.
Netscape FastTrack o Enterprise.
Microsoft IIS.
Weblogic Tengah.
Lotus Domino Go Webserver.
IBM Internet Connection Server.
etc.
5/50
En este caso el programador debe llamar explcitamente desde otro servlet los
mtodos del servlet que quiere ejecutar. Habitualmente los mtodos service(),
doPost(), doGet(), ..., etc. son llamados automticamente cuando el servidor
HTTP recibe una solicitud de servicio de un formulario introducido en una pgina
HTML.
comentado
anteriormente,
los
servlets
poseen
las
siguientes
6/50
GenericServlet
ServletInputStream
ServletOutputStream
Servlet: debe ser implementada por todos los servlets. El servidor invoca a los
mtodos init() y destroy() para iniciar y detener un servlet. Los mtodos
getServletConfig() y getServletInfo() se implementan para devolver informacin
acerca de un servlet. Al mtodo service() lo invoca el servidor, de forma que el
servlet pueda realizar su servicio. Contiene dos parmetros: uno de la interfaz
ServletRequest y otro de la interfaz ServletResponse.
moncho.mendez@uvigo.es
7/50
El paquete javax.servlet.http
El paquete javax.servlet.http se usa para definir servlets especficos de HTTP. Define
las siguientes clases e interfaces:
Interfaces
Clases
HttpServletRequest
HttpServletResponse
HttpSession
HttpSessionBindingListener
HttpSessionContext
Cookie
moncho.mendez@uvigo.es
8/50
HttpServlet
HttpSessionBindingEvent
HttpUtils
Cookie: esta clase representa un cookie HTTP. Las cookies se utilizan para
mantener el estado de sesin sobre solicitudes HTTP mltiples. Se trata de
valores de datos con nombre que se crean en el servidor web y se almacenan
en los navegadores cliente de cada usuario. La clase Cookie proporciona
mtodos para obtener y establecer valores de cookie y de otros atributos.
agrega
moncho.mendez@uvigo.es
9/50
TimeServlet
A continuacin se lista el cdigo del servlet TimeServlet.java, que muestra en el
navegador del cliente la fecha y la hora a la que se ha conectado con el servidor.
importjavax.servlet.*;
importjava.util.*;
importjava.io.*;
publicclassTimeServletextendsGenericServlet
{
publicStringgetServletInfo()
{
return"TimeServlet";
}
publicvoidservice(ServletRequestpeticion,ServletResponserespuesta)throwsServletException,IOException
{
Stringfecha=newDate().toString();
PrintStreamoutputStream=newPrintStream(respuesta.getOutputStream());
outputStream.println(fecha);
};
10/50
Enumerationparams=peticion.getParameterNames();
if(params!=null)
{
while(params.hasMoreElements())
{
Stringparametro=(String)params.nextElement();
Stringvalor=peticion.getParameter(parametro);
outputStream.println(parametro+"="+valor);
}
}
};
moncho.mendez@uvigo.es
11/50
moncho.mendez@uvigo.es
12/50
Significado
Accept
Accept-Charset
Accept-Encoding
Accept-Language
Authorization
Connection
Content-Length
Cookie
From
Host
If-Modified-Since
Pragma
Referer
User-Agent
UA-Pixels, UA-Color,
UA-OS, UA-CPU
moncho.mendez@uvigo.es
13/50
Stringnombre=(String)e.nextElement();
Stringvalor=peticion.getHeader(nombre);
out.println("<tr><td>"+nombre+"</td><td>"+valor+"</td></tr>");
}
out.println("</table>");
out.println("</BODY>");
out.println("</HTML>");
}
}
moncho.mendez@uvigo.es
14/50
15/50
CookiemiCookie=newCookie("Compra",IdObjetoAComprar);
Si un navegador presenta esta cookie al usuario, el cometido de la cookie ser descrito mediante
este comentario.
Establece el patrn de dominio a quien permitir el acceso a la informacin contenida en la cookie.
Por ejemplo .yahoo.com.
Establece el tiempo de caducidad de la cookie en segundos. Un valor 1 indica al navegador que
borre la cookie cuando se cierre. Un valor 0 borra la cookie de inmediato.
Establece la ruta de acceso del directorio de los servlets que tienen acceso a la cookie. Por
defecto es aquel que origin la cookie.
Indica al navegador que la cookie slo debe ser enviada utilizando un protocolo seguro (HTTPS).
Establece el valor de la cookie.
Establece la versin del protocolo de la cookie.
Envo de la cookie
Las cookies son enviadas como parte de la cabecera de la respuesta al cliente. Por
ello, tienen que ser aadidas a un objeto HttpServletResponse mediante el mtodo
moncho.mendez@uvigo.es
16/50
Recogida de cookies
Los clientes devuelven las cookies como parte integrante del header de la peticin al
servidor. Por este motivo, las cookies enviadas debern ser recogidas del objeto
HttpServletRequest mediante el mtodo getCookies(), que devuelve un array de
objetos Cookie. A continuacin se muestra un ejemplo donde se recoge la primera
cookie del array de cookies:
CookiemiCookie=null;
Cookie[]arrayCookies=req.getCookies();
miCookie=arrayCookies[0];
Hay que tener cuidado, pues tal y como se ha mencionado con anterioridad, puede
haber ms de una cookie con el mismo nombre, por lo que habr que detectar de
alguna manera cul es la cookie que se necesita.
Obtener el valor de una Cookie
Para obtener el valor de una cookie se utiliza el mtodo getValue() de la clase Cookie.
El siguiente ejemplo supone que se tiene una tienda virtual de libros, y que un usuario
ha decidido eliminar un libro del carro de la compra. Se tienen dos cookies con el
mismo nombre (compra), pero con dos valores (libro1, libro2). Si se quiere eliminar el
valor libro1 es necesario el siguiente cdigo:
//...
StringlibroABorrar=req.getParameter("Borrar");
//...
if(libroABorrar!=null)
{
Cookie[]arrayCookies=req.getCookies();
for(i=0;i<arrayCookies.length;i++)
{
CookiemiCookie=arrayCookies[i];
if(miCookie.getName().equals("compra")&&miCookie.getValue.equals(libroABorrar)
{
miCookie.setMaxAge(0);//Eliminalacookie
}//findelif
}//findelfor
}//findelif
//...
La pgina .html mostrada en la Figura 7 permite establecer las cookies que son
enviadas posteriormente al navegador cliente.
moncho.mendez@uvigo.es
17/50
//Sevisualizanlacookiesexistentes
Cookie[]cookies=peticion.getCookies();
if(cookies!=null)
for(inti=0;i<cookies.length;i++)
{
Cookiec=cookies[i];
nombre=c.getName();
valor=c.getValue();
out.println(nombre+"="+valor+"<BR>");
}
//Seaadelacookierecibidaalarespuesta
nombre=peticion.getParameter("NombreCookie");
if(nombre!=null&&nombre.length()>0)
{
valor=peticion.getParameter("ValorCookie");
Cookiec=newCookie(nombre,valor);
respuesta.addCookie(c);
}
}
publicvoiddoPost(HttpServletRequestpeticion,HttpServletResponserespuesta)throwsIOException,ServletException
{
doGet(peticion,respuesta);
}
}
moncho.mendez@uvigo.es
18/50
out.println("<H3>EjemplodeSesiones</H3>");
//Secrealasesionsiesnecesario
HttpSessionsession=peticion.getSession(true);
moncho.mendez@uvigo.es
19/50
out.println("<hr>");
out.println("<b>ID:</b>"+session.getId()+"<br>");
out.println("<b>Fechadecreacin:</b>"+created+"<br>");
out.println("<b>Fechadeltimoacceso:</b>"+accessed+"<br>");
out.println("<hr><p>");
//SealmacenanuevainformacionelelobjetoHttpSession
StringnombreDato=peticion.getParameter("NombreDato");
if(nombreDato!=null&&nombreDato.length()>0)
{
StringvalorDato=peticion.getParameter("ValorDato");
session.setAttribute(nombreDato,valorDato);
}
out.println("<b><i>Lossiguientesdatosestnentusesin:</b></i><br>");
//Visualizarobjetoscontenidosenlasesionactual
Enumeratione=session.getAttributeNames();
while(e.hasMoreElements())
{
Stringnombre=(String)e.nextElement();
Stringvalor=session.getAttribute(nombre).toString();
out.println(nombre+"="+valor+"<BR>");
}
}
}
20/50
//...continuacindelcdigoanterior
//Visualizarobjetoscontenidosenlasesionactual
Enumeratione=session.getAttributeNames();
intcontValores=1;
while(e.hasMoreElements())
{
++contValores;
Stringnombre=(String)e.nextElement();
Stringvalor=session.getAttribute(nombre).toString();
out.println(nombre+"="+valor+"<BR>");
}
out.print("<p><ahref=\"");
out.print(respuesta.encodeURL("SetSession?NombreDato=nombre"+
contValores+"&ValorDato=valor"+contValores));
out.println("\">URLencoded</a>");
}
21/50
Mensaje
Asociado
Continue
Switching
Protocols
OK
201
202
203
Created
Accepted
Non-Authoritative
Information
204
No Content
205
Reset Content
206
Partial Content
300
Multiple Choices
301
Moved
Permanently
302
Found
Significado
Contina con peticin parcial (nuevo en HTTP 1.1).
El servidor cumplir con la cabecera Upgrade y cambiar a un protocolo diferente
(nuevo en HTTP 1.1).
Todo est bien. Los documentos enviados por peticiones GET y POST. Este es el valor
por defecto para los servlets a menos que se utilice setStatus().
El servidor cre un documento. La cabecera Location indica la URL.
La peticin se est realizando, el proceso no se ha completado.
El documento est siendo devuelto normalmente, pero algunas cabeceras de
respuesta podran ser incorrectas porque se est usando una copia del documento
(nuevo en HTTP 1.1).
No hay un documento nuevo. El navegador continua mostrando el documento
anterior. Esto es til si el usuario recarga peridicamente una pgina y existe la
posibilidad de determinar que la pgina anterior ya est actualizada. Sin embargo,
esto no funciona para pginas que se recargan automticamente mediante cabeceras
de respuesta Refresh o su equivalente
<META HTTP-EQUIV="Refresh" ...>, ya que al devolver este cdigo de estado se
pararn futuras recargas.
No hay documento nuevo, pero el navegador debera resetear el documento. Usado
para forzar al navegador a borrar los contenidos de los campos de un formulario CGI
(nuevo en HTTP 1.1).
El cliente enva una peticin parcial con una cabecera Range, y el servidor la ha
completado (nuevo en HTTP 1.1).
El documento pedido se puede encontrar en varios sitios. Sern listados en el
documento devuelto. Si el servidor tiene una opcin preferida, debera listarse en la
cabecera de respuesta Location.
El documento pedido est en algn lugar, y la URL se da en la cabecera de respuesta
Location. Los navegadores deberan seguir automticamente el enlace a la nueva
URL.
Similar a 301, excepto que la nueva URL debera ser interpretada como reemplazada
temporalmente, no permanentemente.
El mensaje era Moved Temporarily en HTTP 1.0, y la constante en
HttpServletResponse es SC_MOVED_TEMPORARILY, no
SC_FOUND.
Cabecera muy til, ya que los navegadores siguen automticamente el enlace a la
moncho.mendez@uvigo.es
22/50
303
See Other
304
Not Modified
305
Use Proxy
307
Temporary
Redirect
400
401
Bad Request
Unauthorized
403
Forbidden
404
Not Found
405
406
407
Method Not
Allowed
Not Acceptable
408
409
Proxy
Authentication
Required
Request Timeout
Conflict
410
Gone
411
Length Required
412
Precondition
Failed
Request Entity
Too Large
413
414
Este cdigo de estado es usado algunas veces de forma intercambiada con 301. Por
ejemplo, si errneamente se pide http://host/~user (olvidando la ltima barra),
algunos servidores enviarn 301 y otros 302. Tcnicamente, se supone que los
navegadores siguen automticamente la redireccin si la peticin original era GET.
Ver cabecera 307 para ms detalles.
Igual que 301/302, excepto que si la peticin original era POST, el documento
redirigido (dado en la cabecera Location) debera ser recuperado mediante GET
(nuevo en HTTP 1.1).
El cliente tiene un documento en la cach y realiza una peticin condicional
(normalmente suministrando una cabecera If-Modified-Since indicando que slo
quiere documentos posteriores a la fecha especificada). El servidor le especifica al
cliente que el viejo documento de su cach todava est en uso.
El documento pedido debera recuperarse mediante el proxy listado en la cabecera
Location (nuevo en HTTP 1.1).
Es idntica a 302 (Found o Temporarily Moved). Fue aadido a HTTP 1.1 ya que
muchos navegadores siguen errneamente la redireccin de una respuesta 302
incluso si el mensaje original fue un POST, y slo se debe seguir la redireccin de una
peticin POST en respuestas 303. Esta respuesta es algo ambigua: sigue el
redireccionamiento para peticiones GET y POST en el caso de respuestas 303, y en el
caso de respuesta 307 slo sigue la redireccin de peticiones GET.
Nota: por alguna razn no existe una constante en HttpServletResponse que
corresponda con este cdigo de estado (nuevo en HTTP 1.1).
Mala sintaxis de la peticin.
El cliente intenta acceder a una pgina protegida por password sin la autorizacin
apropiada. La respuesta debera incluir una cabecera WWW-Authenticate que el
navegador debera usar para mostrar la caja de dilogo usuario/password, que viene
de vuelta con la cabecera Authorization.
El recurso no est disponible, sin importar la autorizacin. Normalmente indica la
falta permisos de fichero o directorios en el servidor.
No se pudo encontrar el recurso en esa direccin. La respuesta estndar es no such
page.
El mtodo sendError(message) de HttpServletResponse est disponible para este
cdigo de error. La ventaja de sendError() sobre setStatus() es que con el primero el
servidor genera automticamente una pgina que muestra un mensaje de error.
El mtodo de la peticin (GET, POST, HEAD, DELETE, PUT, TRACE, ..., etc.) no estaba
permitido para este recurso particular (nuevo en HTTP 1.1).
El recurso indicado genera un tipo MIME incompatible con el especificado por el
cliente mediante su cabecera Accept (nuevo en HTTP 1.1).
Similar a 401, pero el servidor proxy debera devolver una cabecera ProxyAuthenticate (nuevo en HTTP 1.1).
El cliente tarda demasiado en enviar la peticin (nuevo en HTTP 1.1).
Usualmente asociado con peticiones PUT. Usado para situaciones como la carga de
una versin incorrecta de un fichero (nuevo en HTTP 1.1).
El documento se ha ido. No se conoce la direccin de reenvo. Difiere de la 404 en
que se sabe que el documento se ha ido permanentemente, no slo no est
disponible por alguna razn desconocida como en 404 (nuevo en HTTP 1.1).
El servidor no puede procesar la peticin a menos que el cliente enve una cabecera
Content-Length (nuevo en http 1.1).
Alguna condicin previa especificada en la peticin era falsa (nuevo en HTTP 1.1).
El documento pedido es mayor que lo que el servidor puede manejar ahora. Si el
servidor cree que puede manejarlo ms tarde, debera incluir una cabecera RetryAfter (nuevo en HTTP 1.1).
La URI es demasiado larga (nuevo en HTTP 1.1).
moncho.mendez@uvigo.es
23/50
501
Long
Unsupported
Media Type
Request Range
Not Satisfiable
Expectation
Failed
Internal Server
Error
Not Implemented
502
Bad Gateway
503
Service
Unavailable
504
Gateway Timeout
505
415
416
417
500
moncho.mendez@uvigo.es
24/50
packagehall;
importjava.io.*;
importjavax.servlet.*;
importjavax.servlet.http.*;
importjava.net.*;
publicclassSearchEnginesextendsHttpServlet
{
publicvoiddoGet(HttpServletRequestpeticion,HttpServletResponserespuesta)throwsServletException,IOException
{
StringsearchString=URLEncoder.encode(peticion.getParameter("searchString"));
StringnumResults=peticion.getParameter("numResults");
StringsearchEngine=peticion.getParameter("searchEngine");
SearchSpec[]commonSpecs=SearchSpec.getCommonSpecs();
for(inti=0;i<commonSpecs.length;i++)
{
SearchSpecsearchSpec=commonSpecs[i];
if(searchSpec.getName().equals(searchEngine))
{
Stringurl=respuesta.encodeURL(searchSpec.makeURL(searchString,numResults));
respuesta.sendRedirect(url);
return;
}
}
respuesta.sendError(respuesta.SC_NOT_FOUND,
"Motordebsquedaespecificadonoreconocido.");
}
publicvoiddoPost(HttpServletRequestpeticion,HttpServletResponserespuesta)throwsServletException,IOException
{
doGet(peticion,respuesta);
}
Figura 10: Pgina web creada para realizar una bsqueda en Internet
moncho.mendez@uvigo.es
25/50
moncho.mendez@uvigo.es
26/50
27/50
Para codificar la imagen (Objeto Image), se puede usar una clase que se puede
descargar gratuitamente de
http://www.acme.com/java/software/Acme.JPM.Encoders.GifEncoder.html. Esta clase
es GifEncoder y permite codificar imgenes en formato GIF. De la misma forma, se
podra emplear las clases JPEGCodec, JPEGEncodeParam y JPEGImageEncoder del
paquete com.sun.image.codec.jpeg que se distribuye con el propio JavaSE. Es
importante recordar que si se escoge esta opcin el tipo de respuesta del servlet ser
image/jpeg y que no es necesario descargar ningn software adicional.
JPEGImageEncoderencoder=JPEGCodec.createJPEGEncoder(out);
JPEGEncodeParamparam=encoder.getDefaultJPEGEncodeParam(image);
param.setQuality(1.0f,false);
encoder.setJPEGEncodeParam(param);
encoder.encode(image);
out.flush();
out.close();
A continuacin se muestra el cdigo fuente del servlet creado para construir la imagen
as como una pgina web que permite su prueba.
importjava.awt.*;
importjava.awt.image.*;
importjava.io.*;
importjavax.servlet.*;
importjavax.servlet.http.*;
importjava.util.*;
moncho.mendez@uvigo.es
28/50
GraphicscontextoGrafico=null;
try{
//Construiruncontextodegrficosmedianteuna
//bufferedimage
intw=200;
inth=50;
BufferedImageimage=newBufferedImage(w,h,BufferedImage.TYPE_3BYTE_BGR);
contextoGrafico=image.getGraphics();
contextoGrafico.setFont(newFont("Arial",Font.BOLD|Font.ITALIC,20));
contextoGrafico.draw3DRect(0,0,w1,h1,true);
Dateahora=newDate();
SimpleDateFormatformateador=newSimpleDateFormat("ddMMyyyyHH:mm");
contextoGrafico.drawString(formateador.format(ahora),20,30);
//EncodetheoffscreengraphicsintoaGIFandsendittotheclient
res.setContentType("image/jpeg");
JPEGImageEncoderencoder=JPEGCodec.createJPEGEncoder(bufferSalida);
JPEGEncodeParamparam=encoder.getDefaultJPEGEncodeParam(image);
param.setQuality(1.0f,false);
encoder.setJPEGEncodeParam(param);
encoder.encode(image);
bufferSalida.flush();
bufferSalida.close();
}finally{
if(contextoGrafico!=null)contextoGrafico.dispose();
}
}
/**HandlestheHTTP<code>GET</code>method.
*@paramrequestservletrequest
*@paramresponseservletresponse
*/
protectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,java.io.IOException{
processRequest(request,response);
}
/**HandlestheHTTP<code>POST</code>method.
*@paramrequestservletrequest
*@paramresponseservletresponse
*/
protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,java.io.IOException{
processRequest(request,response);
}
}
moncho.mendez@uvigo.es
29/50
2 JSP
2.1 Introduccin
JSP es una tecnologa basada en Java que simplifica el proceso de desarrollo de sitios
web dinmicos. Las Java Server Pages son ficheros de texto (normalmente con
extensin .jsp) que sustituyen a las pginas HTML tradicionales. Los ficheros JSP
contienen etiquetas HTML y cdigo embebido que permite al diseador de la pgina
web acceder a datos desde cdigo Java que se ejecuta en el servidor.
Cuando la pgina JSP es requerida por un navegador a travs de una peticin HTTP,
las etiquetas HTML permanecen inalterables, mientras que el cdigo que contiene
dicha pgina es ejecutado en el servidor, generando contenido dinmico que se
combina con las etiquetas HTML antes de ser enviado al cliente. Este modo de operar
implica una separacin entre los aspectos de presentacin de la pgina y la lgica de
programacin contenida en el cdigo.
Es una tecnologa hbrida basada en template systems. Al igual que ASP, SSJS y PHP
puede incorporar scripts para aadir cdigo Java directamente a las pginas .jsp, pero
tambin implementa, al estilo de ColdFusion, un conjunto de etiquetas que
interaccionan con los objetos Java del servidor, sin la necesidad de aparezca cdigo
fuente en la pgina.
JSP se implementa utilizando la tecnologa Servlet. Cuando un servidor web recibe
una peticin de una pgina .jsp, la redirecciona a un proceso especial dedicado a
manejar la ejecucin de servlets (servlet container). En el contexto de JSP, este
proceso se llama JSP container.
Beneficios que aporta JSP
Los beneficios ofrecidos por JSP, como alternativa a la generacin de contenido
dinmico para la web, se resumen a continuacin:
moncho.mendez@uvigo.es
30/50
Mejoras en el rendimiento
Presentacin
Implementacin
JavaBeans
31/50
32/50
Recibe
solicitud
Compilador de Pginas
Existe
servlet
No
Escanear
pgina JSP
S
Est en
memoria?
No
Cargar
servlet JSP
Generar
respuesta
Generar cdigo
fuente servlet
JSP
Contenedor
Servidor JSP
HTTP
Compilar
servlet JSP
Enva
la respuesta
33/50
moncho.mendez@uvigo.es
34/50
Directivas
Se usan para enviar informacin especial sobre la pgina al contenedor JSP
(especificar el lenguaje de script, incluir contenido de otra pgina, o indicar que la
pgina usa una determinada librera de etiquetas). Las directivas JSP van encerradas
entre <%@ y %>.
page
<%@ page atributo1=valor1 atributo2=valor2 atributo3=... %>
o tambin en formato XML:
<jsp:directive.page
atributo1=valor1
atributo2=valor2
atributo3=... />
Los posibles valores de los atributos se muestran en la Tabla 5.
Atributo
Valor
info
language
contentType
Cadena de texto.
Nombre del lenguaje de script.
Tipo MIME y conjunto de caracteres.
extends
import
Nombre de clase.
Nombres de clases y/o paquetes.
session
buffer
autoFlush
isThreadSafe
errorPage
isErrorPage
Booleano.
Tamao del buffer o none.
Booleano.
Booleano.
URL local.
Booleano.
Valor por
defecto
java
text/html
ISO-8859-1
Ninguno
java.lang,
java.servlet,
javax.servlet.http,
javax.servlet.jsp
true
8kb
true
true
Ninguno
false
<TITLE>LaprimerapginaconJSP</TITLE>
</HEAD>
<BODYBGCOLOR="#FFFFFF">
<%@pageinfo=ProbandoJSP...%>
<%@pagelanguage=java%>
moncho.mendez@uvigo.es
35/50
include
<%@ include file=localURL %>
Permite incluir el contenido de otra pgina .html o .jsp. El fichero es identificado
mediante una URL y la directiva tiene el efecto de remplazarse a s misma con el
contenido del archivo especificado. Puede ser utilizada para incluir cabeceras y pies de
pginas comunes a un desarrollo dado.
taglib
<%@ taglib uri=tagLibraryURI prefix=tagPrefix %>
Esta directiva se utiliza para notificar al contenedor JSP que la pgina utilizar una o
ms libreras de etiquetas personalizadas. Una librera de etiquetas es una coleccin
de etiquetas personalizadas, que pueden ser utilizadas para extender la funcionalidad
bsica de JSP.
El valor del atributo uri indica la localizacion del TLD (Tag Library Descriptor),
mientras que el atributo prefix especifica el identificador del espacio de nombres en
XML que ser anexado a todas la etiquetas de esa librera que se utilicen en la pgina
.jsp.
Por razones de seguridad, la especificacin JSP permite utilizar solamente TLDs del
sistema de archivos local.
Elementos de script
Las etiquetas de este tipo permiten encapsular cdigo Java en una pgina .jsp. JSP
proporciona tres tipos diferentes de etiquetas de script: declaraciones, scriptlets y
expresiones.
Las declaraciones permiten definir variables y mtodos para una pgina. Los scriptlets
son bloques de cdigo preparados para ejecutarse y las expresiones son lneas
simples de cdigo cuya evaluacin es insertada en la salida de la pgina en el lugar de
la expresin original.
moncho.mendez@uvigo.es
36/50
Declaraciones
Las declaraciones se usan para definir variables y mtodos especficos para una
pgina .jsp. Las variables y los mtodos declarados son accesibles por cualquier otro
elemento de script de la pgina, aunque estn codificados antes que la propia
declaracin. La sintaxis es:
<%! declaracion (es) %>
Algunos ejemplos se muestran a continuacin:
<%!privateintx=0,y=0;privateStringunidad=cm;%>
<%!staticpublicintcontador=0;%>
<%!publiclongfactorial(longnumero)
{
if(numero==0)return1;
elsereturnnumero*factorial(numero1);
}%>
moncho.mendez@uvigo.es
37/50
Scriptlets
<% scriptlet %>
Los scriptlets pueden contener cualquier tipo de sentencias Java, pudiendo dejar
abiertos uno o ms bloques de sentencias que debern ser cerradas en etiquetas de
scritplets posteriores.
Se pueden incluir sentencias condicionales if-else if-else,
<%if(numero<0){%>
<p>Nosepuedecalcularelfactorialdeunnmeronegativo.</p>
<%}elseif(numero>20){%>
<p>Argumentosmayoresque20causanundesbordamientodepila.</p>
<%}else{%>
<palign=center><%=x%>!=<%factorial(x)%></p>
<%}%>
<TITLE>LasegundapginaconJSP</TITLE>
</HEAD>
<BODYBGCOLOR="#FFFFFF">
<%!publiclongfactorial(longnumero)throwsIllegalArgumentException
{
if((numero<0)||(numero>20))
thrownewIllegalArgumentException("FueradeRango");
if(numero==0)return1;
elsereturnnumero*factorial(numero1);
}%>
<%try{
longresultado=factorial(x);%>
<palign=center><%=x%>!=<%=resultado%> </p>
<%}catch(IllegalArgumentExceptione){%>
<p>Elargumentoparacalcularelfactorialestafueraderango.</p>
<%}%>
</BODY>
</HTML>
Comentarios
moncho.mendez@uvigo.es
38/50
Comentarios JSP
Los comentarios JSP son independientes del tipo de contenido producido por la pgina
y del lenguaje de script utilizado, Estos comentarios slo pueden ser vistos
examinando la pgina .jsp original. La sintaxis es:
<%-- comentario --%>
El cuerpo del comentario es ignorado por el contenedor JSP.
Comentarios del lenguaje de Script
Pueden ser introducidos dentro de los scriptlets o las expresiones JSP, utilizando los
comentarios nativos de la sintaxis del lenguaje de script. La sintaxis es.
<% /* comentario */ %>
Estos comentarios no sern visibles para el cliente, pero s aparecern en el servlet
correspondiente a la pgina .jsp.
Acciones
Las acciones permiten la transferencia de control entre pginas, soportan la
especificacin applets de Java de un modo independiente al navegador del cliente,
capacitan a las pginas .jsp, para interaccionar con componentes JavaBeans
residentes en el servidor y permiten la creacin y uso de libreras de etiquetas
personalizadas.
moncho.mendez@uvigo.es
39/50
forward
<jsp:forward page=localURL />
Se usa para transferir el control de una pgina .jsp a otra localizacin. Cualquier
cdigo generado hasta el momento se descarta, y el procesado de la peticin se inicia
en la nueva pgina. El navegador cliente sigue mostrando la URL de la pgina .jsp
inicial.
El valor del parmetro page, puede ser un documento esttico, un CGI, un servelt u
otra pgina JSP. Para aadir flexibilidad a este parmetro, se puede construir su valor
como concatenacin de valores de variables.
<jsp:forward page=<%=message+statusCode+.html%>/>
Puede resultar til pasar pares parmetro/valor al destino de la etiqueta. Para ello se
utiliza <jsp:param ... />.
<jsp:forward page=factorial.jsp
<jsp:param name=numerovalue=25/>
...
</jsp:forward>
include
<jsp:include page=localURL flush=true />
Proporciona una forma sencilla de incluir contenido generado por otro documento local
en la salida de la pgina actual. En contraposicin con la etiqueta forward, include
transfiere el control temporalmente.
El valor del atributo flush, determina si se debe vaciar el buffer de la pgina actual
antes de incluir el contenido generado por el programa incluido.
Como en el caso anterior, se puede completar esta etiqueta con el uso de
<jsp:param> para proporcionar informacin adicional al programa llamado.
<jsp:include page=localURLflush=true
<jsp:param name=nombreParametro1value=valorParametro1/>
...
<jsp:param name=nombreParametroNvalue=valorParametroN/>
</jsp:include>
Plug-in
La finalidad de esta etiqueta es generar cdigo HTML especfico para el navegador del
cliente cuando se invocan applets que utilizan el Plug-in de Sun.
Beans
JSP proporciona tres acciones diferentes para interaccionar con JavaBeans del lado del
servidor: <jsp:useBean>, <jsp:setProperty> y <jsp:getProperty>.
moncho.mendez@uvigo.es
40/50
Objetos implcitos
El contenedor JSP exporta un nmero de objetos internos para su uso desde las
pginas .jsp. Estos objetos son asignados automticamente a variables que pueden
ser accedidas desde elementos de script de JSP. La Tabla 6 muestra los objetos
disponibles y la API a la que pertenecen.
Objeto
page
Clase o Interfaz
Descripcin
javax.servlet.jsp.HttpJspPage
Descripcin
Asocia un atributo con su valor correspondiente.
Retorna los nombres de todos los atributos asociados con la
sesin.
Retorna el valor del atributo asociado con key.
Borra el atributo asociado con key.
moncho.mendez@uvigo.es
41/50
if((numero<0)||(numero>20))
thrownewIllegalArgumentException("FueradeRango");
if(numero==0)
return1;
else
returnnumero*factorial(numero1);
}%>
<%try{
longresultado=factorial(x);%>
<palign=center><%=x%>!=<%=resultado%></p>
moncho.mendez@uvigo.es
42/50
Envo de e-mails
El cdigo de la pgina JSP mostrada a continuacin permite enviar los campos de
cualquier formulario por e-mail a una direccin especificada.
<HTML>
<HEAD>
<%@pageimport="java.util.*"%>
<%@pageimport="javax.mail.*"%>
<%@pageimport="javax.mail.event.*"%>
<%@pageimport="javax.mail.internet.*"%>
<%!StringHOST="lsi2.ei.uvigo.es";%>
<%!StringREMITENTE="user1@lsi2.ei.uvigo.es";%>
<%!StringDESTINATARIO="friverola@yahoo.com";%>
<%!StringASUNTO="REGISTROVIAWEBDEFORMULARIOS";%>
<%!StringCONTENIDO;%>
<%!StringcadError="";%>
<%!StringnomParam;%>
<%!StringvalParam;%>
<%!Enumerationparametros;%>
<%
parametros=request.getParameterNames();
for(CONTENIDO="";parametros.hasMoreElements();)
{
nomParam=parametros.nextElement().toString();
valParam=request.getParameter(nomParam);
CONTENIDO+="<STRONG>"+nomParam+"</STRONG>:<i>"+valParam+"</i><BR>";
}
%>
<%!
classConnectionHandlerextendsConnectionAdapter
{
publicvoidopened(ConnectionEvente)
{//System.out.println("Connectionopened.");}
publicvoiddisconnected(ConnectionEvente)
{//System.out.println("Connectiondisconnected.");}
publicvoidclosed(ConnectionEvente)
{//System.out.println("Connectionclosed.");}
}
%>
<%!
classTransportHandlerextendsTransportAdapter
{
publicvoidmessageDelivered(TransportEvente)
{//System.out.println("Messagedelivered.");}
publicvoidmessageNotDelivered(TransportEvente)
{//System.out.println("MessageNOTdelivered.");}
publicvoidmessagePartiallyDelivered(TransportEvente)
{//System.out.println("Messagepartiallydelivered.");}
}
%>
<%//Envaelmensajealadireccinespecificadaconlosparmetrosquelelleguen.%>
<%//TRUEsitodovabien,FALSEsiseproducealgnerror. %>
<%!publicbooleanSendMessage()
{
Propertiesproperties=newProperties();
properties.put("mail.smtp.host",HOST);
properties.put("mail.from",REMITENTE);
Sessionsession=Session.getInstance(properties,null);
try
{
Messagemessage=newMimeMessage(session);
InternetAddress[]address={newInternetAddress(DESTINATARIO)};
message.setRecipients(Message.RecipientType.TO,address);
moncho.mendez@uvigo.es
43/50
moncho.mendez@uvigo.es
44/50
<%//TRUEsitodovabien,FALSEsiseproducealgnerror. %>
<%!publicbooleanconsultaDNI()
{
StringconsultaSQL;
try{
Class.forName("org.gjt.mm.mysql.Driver");
ConnectionmiCon=DriverManager.getConnection("jdbc:mysql://localhost/notas");
Statementsentencia=miCon.createStatement();
consultaSQL="SELECTcount(*)from"+MI_TABLA+"wheredni='"+DNI+"'";
ResultSetmiRes=sentencia.executeQuery(consultaSQL);
miRes.next();
if(!((miRes.getString(1)).equalsIgnoreCase("1")))
{
cadError="DNIINCORRECTO";
returnfalse;
}
else
{
consultaSQL="SELECT*from"+MI_TABLA+"wheredni='"+DNI+"'";
miRes=sentencia.executeQuery(consultaSQL);
ResultSetMetaDatameta=miRes.getMetaData();
intcolumnas=meta.getColumnCount();
intfila=0;
miRes.next();
Titulos.removeAllElements();
Valores.removeAllElements();
for(inti=1;i<=columnas;i++)
{
Titulos.addElement(meta.getColumnLabel(i).toUpperCase());
Valores.addElement(miRes.getObject(i));
}
}
miRes.close();
sentencia.close();
miCon.close();
}catch(ClassNotFoundExceptione){
cadError="ControladorJDBCnoencontrado";
returnfalse;
}catch(SQLExceptione){
cadError="ExcepcincapturadadeSQL"+e;
returnfalse;
}returntrue;
}%>
</HEAD>
<BODYBGCOLOR="#BBBBBB">
<%if(!consultaDNI()){%>
<FONTcolor="#1F5EB1"size="4"face="Tahoma"><STRONG><%=cadError%> !</STRONG></FONT>
<imgsrc="imagenes/duke_405.gif"align="left"border="0"hspace="0">
<%}else{%>
<HR>
<CENTER><TABLEborder="1"width=75%>
<TR>
<%for(intx=0;x<Titulos.size();x++){%>
<TH><%=Titulos.elementAt(x)%> </TH>
<%}%>
</TR>
<TR>
<%for(intx=0;x<Valores.size();x++){%>
<TD>
<CENTER><FONTcolor="#1F5EB1"><%=Valores.elementAt(x)%> </FONT></CENTER>
</TD>
<%}%>
</TR>
</TABLE></CENTER>
<HR>
<%}%>
</BODY>
</HTML>
moncho.mendez@uvigo.es
45/50
</FORM>
</BODY>
</HTML>
<INPUTtype="submit"value="BUSCAR">
<INPUTtype="reset"value="BORRAR">
3 Tendencias actuales
Modelo Vista Controlador (MVC) es un patrn de arquitectura de software que separa
los datos de una aplicacin, la interfaz de usuario, y la lgica de control en tres
componentes distintos. El patrn MVC se emplea frecuentemente en aplicaciones web,
donde la vista es la pgina HTML XHTML.
El modelo es la representacin especfica del dominio de la informacin sobre la cual
funciona la aplicacin. El modelo es otra forma de llamar a la capa de dominio. La
lgica de dominio aade significado a los datos; por ejemplo, calculando si hoy es el
cumpleaos del usuario o los totales, impuestos o portes en un carrito de la compra.
Por otro lado, la vista presenta el modelo en un formato adecuado para interactuar,
moncho.mendez@uvigo.es
46/50
moncho.mendez@uvigo.es
47/50
moncho.mendez@uvigo.es
48/50
JPA es "default driven" lo que significa que todos los comportamientos se entienden
por defecto. En este sentido no hace falta emplear gran cantidad de anotaciones para
configurar el comportamiento concreto de los beans sin que se escogern unos
comportamientos habituales como los por defecto y slo habr que configurar aquellos
que resulten ms particulares. De las anotaciones empleadas en el cdigo fuente
nicamnete @Entity y @Id son necesarias para determinar el comportamiento del
bean.
Una vez creado el bean se debe crear un fichero de configuracin que se colocar en
el directorio WEB-INF del fichero .jar que se emplee para guardar los beans
persistentes y que deber tener el nombre de persistence.xml. Este fichero de
configuracin determina propiedades como el nombre de la base de datos, el servidor,
el usuario o la clave de acceso. Este fichero tiene una configuracin similar a esta:
<persistence> <!-- Colocalo en el directorio META-INF del fichero .jar y llmalo persistence.xml -->
<persistence-unit name="manager1" transaction-type="RESOURCE_LOCAL">
<class>es.ei.uvigo.User</class>
<class>es.ei.uvigo.Cars</class>
<!-- enumera todas las clases persistentes -->
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
<property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver"/>
<property name="hibernate.connection.username" value="sa"/>
<property name="hibernate.connection.password" value=""/>
<property name="hibernate.connection.url" value="jdbc:hsqldb:."/>
<property name="hibernate.max_fetch_depth" value="3"/>
moncho.mendez@uvigo.es
49/50
Como se puede ver, en el fichero de configuracin debe existir una entrada <class>
</class> para cada uno de los beans persistentes. Una vez creado el fichero de
configuracin, para realizar la persistencia de un bean, el cdigo necesario es muy
sencillo y se expone en la siguiente a continuacin:
// Use persistence.xml configuration
EntityManagerFactory
emf = Persistence.createEntityManagerFactory("manager1");
// Retrieve an application managed entity manager
EntityManager em = emf.createEntityManager();
User u=new User();
u.setUsername(moncho);
u.setClave(xjmon764d);
em.persist(u);
em.close();
emf.close(); //close at application end
moncho.mendez@uvigo.es
50/50