Sei sulla pagina 1di 30

PROGRAMACIN WEB JAVA

Servlets
este cap tuLo veremos cmo
es en la prctica una apLicacin web Java.

Aprenderemos qu es un
conf

se

rvlet, Tomcat

iguraremos un

se rvid o r

para realizar pruebas, y codif caremos


aLgu

nos ejem p los.

l,g.ry!e$
gqJgn
i!919

mndql

-*_-_,.,,,28 lolrervlelsl ?!
32

Lrylal

,,

qgft$os
El archvo

ilgrflqq! __

web.xml

q
45

4?

!!.Lpl!9!dojSlr!!.!{14
Un ejemplo

49 50
54

completo
servlets *

its -'
srRvrcr0
0E ATErcr0tl AL

Problemtca de los

--

5i
56

LcroR,

lectores@mpediciones.com

Activdades

PRO6RAIVACIN WEB JAVA

SERVLES
Segn vimos en el primer captulo, para crear una aplicacin web basta con desarrollar un servidor que escuche pedidos y devuelva recursos.
Pero es claro que el desarrollo web no consiste nicamente en eso. Sun Microsystems

cre (dentro del contexto del Jaua Community Process, que permite a cualquier persona del mundo participar en la toma de decisiones) la Java Servlet Technolory, una especificacin que define una serie de clases, paquetes y procedimientos que se utilizan para la creacin de servlets, la base frrndamental del desarrollo web con Java.

Algo a destacar acerca de los servlets es que la tecnologa Java Servlet Technology es una especificacin. Es decir que la tecnologa consta solamente de un documento, muy detallado, donde indica la funcionalidad que se provee y cmo deber ser el software que la implemente, pero no proporciona ningn tipo de soltware en concreto. Si bien Sun desarroll su propia implementacin, la especificacin nos permite trabajar con cualquier implementacin que queramos, en tanto y en cuanto se atenga a la especificacin. Podemos decir que la especificacin define un est.indar que ha de cumplirse por los implementadores.
El hecho de trabajar en base a una especificacin tiene muchas ventajas, pero tambin un problema: la especificacin slo define cmo debe comportarse el software, pero no limita sus capacidades. Por lo tanto, algunos implementadores le agregan muchas funcionalidades a la implementacin que desanollan, de forma tal de cumplir con la especificacin, pero adems soporrar sus propios requerimientos. Eso conlleva el riesgo de que, si usamos funcionalidades extra de una implementacin especfica, despus
ser ms

difcil migrar a cualquier otra implementacin.

Qu son los servlets?


Un servlet es, entonces, un componente de sofware Java que es encargado de generar contenido dinmico en respuesta a pedidos Hf'TP 'Ibdo servlet reside dentro

SERVLETS Y VERSIONES DE ESPECIFICACIN


Actuatmente
La

l.tima versin de ta especficacin es ta 2.. En to que resta de[ [ibro vamos a basar

todos los ejemplos y explicaciones en esta versin. Es muy probabte que en un futuro salgan nuevas

versiones, con ms funcionatidades. Recomendamos visitar [a pqina http://java.sun.com/pro-

ducts/servlet/reference/api/index.htm para mantenerse aI tanto de tos cambios de versin.

28

usr,code

Servleis

de un servlet container, que es una parte del servidor web. El servidor web recibe los pedidos, revisa su sintaxis y los deriva al servlet container, que a su vez determina qu servlet debe invocarse, construye las objetos correspondientes que recibir el servlet, enva el pedido al servlet y ste devuelve la respuesta generada.

Servlet Container

Seguridad

Loggng

Filufa 7, El setvlet contaner es un componente ms dentro del servdor.

La especificacin define una interfaz servlet que define los siguientes mrodos: (ya sea por un pedido o por injcializacin del servidor) , llama a este mtodo para que el servlet pueda ini"cializar los recursos neceaarios durante su vid */ void iDit (gervLetConfig co,nfig) ;
Cuando

/*

el

contenedor crea

el servlet

/*

Mtodo llamado euando e1 contenedo decide

deber libera-r

los recuraos

que tcm

destmi do

*/

destruir el servlet. El servlet y ejecutar acciones sabiendo que ser

rcial als8trqy0 t

/*

Devuelve

el

objeto de configuracin del servlet


(

*/

Servletc@fj.g getgervletc@f ig

usr.code

29

PRIGRANAMI

TB JAA

Luego nos dedicaremos a los detalles, pero podemos ver que, bsicamente, un servlet se inicializa, se le efecttlan pedidos y finalmente se destruy.

La especificacin es lo suficientemente amplia como para sopoftar servlets que respondan a cualquier tipo de pedido. Nosotros vimos que para Intetnet, las comunicaciones se realizan mediante el protocolo HTTP Por lo tanto, es obvio que existen clases especlficas para servlets que responden a pedidos HTTP, ya que son los ms comunes hoy en da.

F rtu'a 2. Daelama de clases de servrets.


usr.code

Se

r!'lers

-a

clase abstracta Httpsewtet define los siguientes mtodos:

protected void doDelete(HttpservletRequeEt, EtbpservletReeponse)


probected void docet(HttpservleERequegt, HttpservletRegpose)

i
;

protected void doHead(IbbpsewletRequest, HttpservletReEpoEse) i protected void dooption6 (HttPservletRequest, lttpservletResponse)


proectd void doPos {HtbpgemtetReguegt. HttpservlebReEporse) ; protecced 1'oid doPut (HbtpservlebRequet, HltpservletRegponse) ;

plotected void dofrace{HbtpservletRequest, HttpservletRsponse) prolected !'oid service(llbtpservletRequeEb, HEtpservletReEponse)

; t

'v!id service(servlelRequest req,

ServletReEpone res) ;
;

protected long getla6t,fodifid(HEtpsrvletRequesb)

GenericServlet, y de ella hereda mtodos, -.r clase HttpServlet, es una subclase de ,:.ributos, eventos y dems propiedades.

''iamos

con ms detalle crno liuciona un servlet, en particular un Httpservlet'

. Un pedido HTTP llega al serviclor. ' El servidor interpreta el pedido y lo reenva al servlet containet' . El servlet container parsea el pedido, crea los objetos correspondientes y crea o . El servlet asignado para manejar ese pedido es, asumamos' un Httpservlet' . EI servlet conainer invoca el mtodo Service con los objetos HttpservletRequest

llama a la instancia del servle t que ha de manejarlo.

. . .

y HttpservletResponse que cre como parmetros.

El servlet inspecciona los objetos tecibidos como parmetros e invoca el mtodo correspondiente, segn el tipo de pedido recibido' EI mtodo se ejecuta y la respuesta cs generada. EI servlet containe envia la respuesta al cliente que origin cl pedido'

SERVLET EN ENTORNOS DE DESARROLLO


veremos que algunos de los mtod05 de los servlets no son utitzados en ta programacin web, sino que sirven para brindar informacin at desarrotlador, principalmente cuando se trabaja con un entorno de desarrolto muy potente. De esta forma en caso de tener muchos serulets, el entorno de desarrotlo nos mostrar informacin exlra Para su mejor manipulacin

usi.code

3l

PROGRATIIACI wEB JAVA

seryice(ServletRequest req, ServletResponse res)

Fru,,a

3.

Cclo de vda de un servlet.

uno de los que vimos en el Captuto I (Tabla i-1). Como mos, hay mtodos definidos para manejar cualquier tipo de pedido.

El tipo de pedido

es

Hola mundo!
Veamos un ejemplo de servlet, el clsico "Hola

Mundo',

Serv ets

paqkage

capltulolt

leort
Llporb

java. lo. Io&rcE)!ont


j ava.

io.

Plintlll!t

iJtsort j avar. servlet. ServletB(qE)tiort iryort j avax. servlel. http. UctpservLett

iq)ort

j avax. j avax.

Eervlet . http. nttpservletRequest t

iryolt

servlet . http. EttpservletRegpaDEe t

* ExEendemos la clase Htlpservlet para definir * nuesLra propa funcionalidad cuando el * servlet sea invocado

public claEs lolalndosewlet extelds Httpservlet {


protected void doceg(lttpservletReguest req, uttpservletRe4)oute !es) thro e ServltErceptior, IoB(ception {
:

/*
I

L1a,amos

al

mtodo doPost, Este

tato a pedidos
doPost

servlet */ GET como PoST

responde de

la

misna nanera

(req, !es);

)
potected void
aloPoEt

(EttpservletReque8t req, EtlpservletReEpoge !eE)

throws sewLet&(ceptlo, Iorception {

/*

obtenemos

el

obieto gue enva texto


t

a] cliente */ Pritwliter orrt res.getwritelo

// i,a respuesta out.pintla('Ho1a udo! ") //


Cerramos e1 stream

out. fluBh 0 t

sr.code

33

PROGRAI\ACIN WEB JAVA

oul. close

]
El servlet es invocado por el contenedor de servlets del servidor, y si el pedido es de tipo POST o GET, el servlet entonces responde con una pgina HTML (aunque no tenga ningn tipo de maca HTML, no deja de ser un documento HTML) que dice "Hola mundo!".

til que digamos, ya que enrega siempre la misma cadena de texto. Aunque es ejecutado como un servicio de contenido dinmico, est devolviendo contenido esttico.
Este servlet no es muy

Antes de pasar a un ejemplo un poco ms til, veamos en qu consisten ses HttpServletRequest y HttpServletResponse.

1as

cla-

HttpSeruletRequest
Esta clase encapsula la informacin que contiene el pedido del cliente. La clase se extiende a partir de SeruletRequest, una clase que contiene opciones de pedidos genricos, y la extiende con informacin especfica del protocolo HTTP Un servlet accede a esta clase para saber qu contenido devolver. Aunque es tericamente posible implementar toda la funcionalidad de un sitio web en un solo servlet, basndose en parmetros del pedido, sera a costa de un cdigo inmanejable, confuso y difcil de mantener. Para evitarlo, esta clase provee mtodos paa acceder a parmetros, encabezados, cookies y opciones de seguridad. Veamos algunos de los mtodos (tanto de la clase HttpServletRequest como de su clase padre SewletRequest) que usaremos ms seguido:

object getAtllibute (string

DaDe)

Enuleauion get,ttributeNanes ()

. ''

void r@vetllibut (string nae) void setAttlibute (string ne, object


Locale gellocale 0 E eeralioD getlocales lfap getParaneteruap
(
(

o)

hteratio getPaaneterNneg ( ) string [1 getPalanetervalue (sting n{le]


Cookie

[]

getcoorieE

34

usr.code

Servlets

Ettpsesgion gtse86i@

ErtpsegEio getse8sion (boolea ceate)

Strig
'-

EelRequegtdIeg6l@Ial

n pedido puede tener asociados objetos, llamados atributos. Estos objetos no , - r asociados al pedido por el navegador web, sino por componentes en el ser.:Jor. Ms adelante veremos cules son los usos de estos attibutos. Los mtodos getAttribute, getAttributeNames, removeAttribute y setAttribute manipulan di-:.os aributos asociados.
navegadores ms recientes permiten al usuario definir el idioma en qlre pre:.:re navegar la tVeb. Esto se traduce en un encabezado llamado Accept-Language que define el o los idiomas preferidos. Si programamos nuestras aplicaciones

-:s

::ra que tomen en cuenta esta informacin, podremos mostar al usuario pgi::s en su idioma, sin interaccin por parte de 1. Los mtodos getlocale y getlo:ales devuelven el o los idiomas preferidos por el usuario, segn el parmetro en-:do por el navegador.

-,:s mtodos getParameterMap, getParameterNames y getParametefvalues nos per:: ien interactuar con Ios parmetros enviados por el navegador. Estos parmetros, . Jiferencia de los atributos, s son establecidos por el navegador cuando el usua:- interacta con la pgina, pulsando un enlace o enviando un formulario web.

:.

mrodo getcookies nos permite obtener las cookies que este cliente tiene alo:das en su computadora.

: por lrimo, los mtodos getsession y getRequestedSessionld nos sirven para te:.ir acceso a la sesin a la cual pertenece este pedido. Notemos que getReques:edsessionld es el indicador de sesin del que hablbamos en el primer captulo, . getsession nos devuelve un objeto Httpsession que contiene toda la informa:ln de sesin en el servidor.

CONTENT-TYPE
los servtets pueden especifcar qu tpo de contendo estn devotviendo fet content-tyge), para que
e[ navegador lo pueda manejar. De esta forma, si un servtet entrega un contenido que no sea HTML,

el navegador puede utilizar atgn ptugin o abr otra aplicacn segn el tpo de contenido que est 'ecibiendo {que podria ser un documento Word, un PDF o cualquier otro tpo que sea necesario}.

- sr.code

35

PFOGRAMACIN WEB JAVA

HttpSeruletResponse
Esta interfaz define datos y mtodos para manipular la informacin que ser devuelta al cliente. Un servlet recibe de parmetro una instancia de este tipo de objeto y es su tarea modificar est objeto segn su funcionalidad para que luego la respuesta le sea enviada al cliente. Veamos algunos de los mtodos que usaremos de esta interfaz y de su superinterfaz: ServletResponse
ServletoutputStrean getoutputStrean
()

Printwriter qetwritet

void addcookie (cookie cookie) void addlteader {string nne, string value) void Eet$eader (string nane, string vaLue)
boolean contai.nEHeader (Scring nalle)

void sendRedirect{stridg location)

Los mtodos get0utputstream0 y getwriter0 nos devuelven objetos en los que podemos escribir el contenido de la respuesta. En el primer caso un OutputStream, til para devolver contenido binario, y en el segundo caso un Printwriter, apro para devolver texto al cliente.

Con arldCookie(cookie c) podemos enviarie una cookie al cliente, que luego podremos obtener e inspeccionar. Es importante notar que el usuario podra definir la opcin de r.ro recibir cookies en su navegado de manera que debemos prever esta situacin y no escribir aplicaciones que dependan del uso de ellas.

Los mtodos addHeader(String name, String value) y setHeader(String name, string value) escriben contenido en el encabezado de la respuesta. l,a diferencia entre estos mtodos consiste en que setHeader escribe el valor en el encabezado, pisando (si hubiere) un valor existente. En cambio, addHeader nos permite asignar mltiples valores a una misma entrada. Para evitar pisar valores, el mtodo
containsHeader(String name) nos permite saber si ya existe un valor asignado co-

lrruouruEs

Y NAVEGADoREs
ion

At iguat que con oiras func

atidades, no podemos depender de que el navegador que use el

usuario nos envie el encabezado Accept-Language, ya que puede suceder Que el navegador s soporte esta funcionatidad pero que e[ usuario no la haya definido o no sepa cmo hacerlo.

36

rJsl-code

Servlets

mo encabezado para un nombre dado. Por ltimo, sendRedirect(String location) se utiliza para indicar al navegador que debe redirigirse a otra direccin web.
Yeamos un pequeo ejemplo. Crearemos un servlet que se fije si el pedido contiene una cookie, caso contrario, la agrega a la respuesta. Luego, dependiendo de si cierto parmetro est contenido en el pedido, responder de distinta forma, y en el idioma en que el usuario lo desee.

public class TestRequegtReE)one er.teErds Ettpservlet { protected void do6e! (HttpservletRequegt req, HttpsewtehResponse re8) thows Serqlethception, Io&(qeption {

/*
]

Llaniamos

al

mtodo dopost. Este


POST t

servlet

responde de

la

nrisma maoera

tanco a oedrctos CET como


doPost

-/

(req, reg)

/* Al recibir

u1

GET

o u

POSI se

ejecula este mlodo "/

proected void doPost(HttpservletRequeEt

eq, HUtpservl,etResponee res) thra Serv:.etb<cE)tion, Iotsception {

/*

Oblenemos

las cookies que envi el cliete

+/

cookie

[]

cookies = eq. getcookies 0 ;

boolear tienecookie = false;

/* lleranos en busca de una cookje de nor,bre pruebacookie */ fo (int i = 0; i < cookiee.length; i++) { Cookie cookie = cookiee lil ; 1f (cookie. getNare ) . equals { "Pruebacookie. ) ) { lie$ecookie = tre;
(

COOKIES QUE VENCEN


Las cookies tienen una fecha de expiracin. Esto puede ser tiI si queremos guardar un dato s-

lo por determrnado periodo de tiempo, por.ejemplo, para recordar a[ usuario poT una semana. El naveqador es e[ encarqado de eLiminar las cookies vencidas.

-i s

r.cod

PROGRAMACIN WEB JAVA

ouf .prjJrtln(\Ja clave eE correta") out.prjtln ("La .clav a correcta");;

I
a!.6 sc , EE / -!.-

.
t

t T out.

prirtln trlhe key is correct");


(

..

else {

if
1

(la(uqe.equal8 ("er") (lagrge.equal8

{ { out.pliDtln ("La ctave eg itrco;lecta")t

el.Be

38

usr.code

Probando los servlets


Hemos visto algunos ejemplos de servlets, pero ahora lleg el momento de verlos en accin. Vamos a configurar un servidor web y a realizar un pedido a los servlets para verlos ejecutndose.
Para los ejemplos de este

libro, vamos a utilizar las siguientes tecnologas:

Eclipse: entorno de desarollo, versin 3.1.1. Si bien no es necesario, todo tipo de desarrollo se simplfica enormemente gracias a este framework.
Eclipse poco a poco se va convirtiendo en la herramienta de desarrollo grfico de facto. Basada en el ejo Visual Age de IBM, ahora de codigo abierto, es un software que emplea plugins en los que se puede agregar funcionalidades y soporte para muchas tareas con poco esfuerzo. De hecho, mediante el uso de pl|gins se puede utilizar Eclipse para desarrollo no slo de Java, sino tambin de PHP y

ouos lenguajes.

. Tomcat

servidor web y servlet container. Tomcat es un pfoyecto open source de muchfsima calidad desarrollado por Apache. IJsaemos la versin 5.5.12 que al momento de redaccin del libro es la ltima versin estable y soporta la especificacin de servlets 2.4 (que es la que seguimos en este libro). Es importante notar que Tomcat necesita de un JDK versin 1,5 o superior para funcionar.

Tomcat es, sin dudas, ei servidor de cdigo abierto ms maduro hoy en dla. Usado por una enorme cantidad de usuarios y empresas de todo el mundo, con muchsimo soporte tanto de la comunidad mmo del mbito empresariai, tiene tanto prestigio que fue el servidor elegido por Sun para ser la implementacin de referencia de las nuevas especificaciones de servlets yJSP que va desarrollando.

. Apache Struts: framework de desarrollo web creado por Apache. Es prcticamente un estndar en la industria, y si bien hay varias alternativas para hacer desarrollos web, este es un framework muy completo, qo. .o"nt".on miles de usuarios, mucho soporte y documentacin.
usr,code

PBOGRAMACI WEB JAVA

Eclipse
Eclipse se puede bajar de httpr//www.eclipse.org/downloads. En este libro usaremos la versin 3.1.1. No ahondaremos mucho sobre las caractersticas de Eclipse en sl, que son muchsimas, sino que simplemente explicaremos los conceptos de desarollo web mediante su uso. lJna vez que hemos descargado Eclipse (hay versiones para Windows y Linux) lo instalamos, y quedar creada una carpeta en la que encontraremos el archivo ejecutable. Eclipse no genera entradas en el registro de \lindows ni crea archivos en otro lugar que no sea la carpeta en la que se encuentra su instalacin.

Ftg|rra

Ecripse es un podercssmo entomo

de desarrollo que se basa en plulns.

PLUG-INS DE ECLIPSE

usr,code

Servlets

Qb,

,nr\ r-]

E 16-

Tomcat: botones para arrancar, detener provistos por el plugin Sysdeo.

y reiniciar Tomcat. Estos botones son

o
o

o o
o

Ejecucin: botones para correr aplicaciones, depurarlas y ejecutar aplicaciones externas. Panel: los paneles son configurables y podemos agregar y quitar cuantas ventanas queramos. En este caso tenemos una vsta de la aplicacin actual. Cdigo: vista del cdigo fuente, usando un editor que resalta la sintaxis propia de Java. Panel: el panel nferior suele ser usado para mostrar mensajes de la aplicacin. En este caso vemos la consola de salida de Tomcat. Vistas: estos botones permiten intercambiar las distintas vistas posibles. La vis:a Java es la ms apropiada para el desarrollo de cdgo.

VISTAS EN ECLIPSE

-:.rse :r::'a

posee varias vistas para faciltar nuestra tarea actua[. Hay vista5 Java {para desarrollarl, !E srocronizacin con repositorjos (CVS, SubVersion), etc. lnctuso, un plug-in puede proveer su

vista.

41

PROGRAIMACIN

WEB JAVA

lnstalar Tomcat
Vamos a usar Tomcat como servidor web y servlet container. La instalacin de Tomcat es sencilla, y vamos a integrarlo con Eclipse.

Descargue Tomcat de http://apache.mesi.com.ar/tomcal/tofiLcat-s1v5,5,12/bir./ apache-tomcat-5.5, 1 2.zip.


S el enlace no funciona, busque algn otro servidor actvo en la pgina de des-

cargas de Tomcai 5.5: http://tomcat.apache.org/dot/vnload-55.cAi#5.5'12.

El El

D"""omprira el contendo del archivo. Supongamos, a modo de ejemplo, que


lo descomprime en C:\tomcat-5.5. I 2.

puru poder usar Tomcat con Eclipse, debe instalarle un plugin a Eclipse. En la direccin http://www.sysdeo.com/eclipse/tomcatplugin podr bajar la versn
3.1 final.

Este archivo es un Zip que contiene una carpeta llamada com,sysdeo,eclipse. tomcat 3.1.0. Esta carpeta es el plugin de Eclipse. Para instalarla, slo basta copiarla (o moverla) dentro de la carpeta plugins de Eclipse.
Ejemplo: si descomprimi Eclipse en C:\eclipse, entonces debe copiar (o mover) la carpeta del plugin a C:\eclipse$tugins\ de forma tal que nos quede la carpe-

ta C:\eclipseblugins\com.sysdeo.eclipse.tomcat-3. 1,0.

Unu u", instalado el plugin Sysdeo, slo basia iniciar (o reinciar) Eclipse para que los cambios tomen efecto.

ECLIPSE
Ectapse es un producio gratuito creado por la Ectipse Foundation, una fundacin sin fines de lucro

apoyada por ms de B0 empresas, entre ellas lBM, Nokia, lntet, BEA, Sybase y Hewlett Packard.

,r'..code

Servlets

Acceda al panel de control de Eclipse yendo a Wintlo@Preferences.

..]EE

Seleccone la opcin Tomcat en el rbol para ver las opciones del plugin. Debe selecconar Version 5.x como versn de Tomcat e ingresar la carpeta de instalacin de Tomcat, por ejemplo: Ct\tomcat-5.5,12.

c."!,.tu li l]*"-d"Md!-dj*

s,*".

. --_--i-:--

R.'*ard,l !r

f-* l .*

43

PROGRAMACIJ I/EB JAVA

3l

tn,"," la ejecucin de Tomcat haciendo clic en el botn correspondiente.

File Edit Nnvigatejearch Project

lm.at tun

Window

Help

r"-

i:RSd 15'tt-t' lttG' *'

Una vez arancado el servidor, por defecto estar configurado para escuchar pedidos en el puerto 8080. Bastar con abir un navegador y escribir la direccin http:// localhost8080 para ver a'Iomcat corriendo.

Ahora que tenemos un servlet container funcionando, vamos a ver qu tenemos que hacer para correr servlets.
Crearemos un nuevo proyecto en Eclipse, del tipo Tomcat Project, al que llamaremos "Servlets". Para esto iremos a File/Ne{Project y elegiremos el wizard Tomcat Project (ver Figura 5). Al resto de las opciones lo de.jamos como viene por defecto.

select vlzard
rrF arp

,u+
r!

oFdt

'uL!.u

iR Jv Prcje.t lrom Exktins Ant Bldlle

.r !

r2ME

:i ll :Ii ill
:l

, d !@ ,i L!

lov tuojed rmm Ertna ant B!ldi le

Plul- n Deve oFment

..

Figlwa 5. EI proyecto de tipo lomcat Prcject trce preconfig,urada una estructura de drcctorios para poder desplelar los servlets y confi,uraciones.
usr-code

144 '-

Servlets

Contextos Un servidor web puede tener corriendo varias aplicaciones web o contextos. Cada contexto puede ser tanto un sitio web completo como un mdulo de una aplicacin. Por ejemplo, nruchos servidores compartidos corren una nica insancia de 'Iomcat y tienen varios contextos que sirven a diferentes c{irecciones .veb. Cuando creamos el proyecto Tomcat en Eclipse, tambin definimos un .ontexto del mismo nombre en el Tomcat. Si hacemos botn derecho sobre el proyecto y elegimos la opcin Tomcat project, veremos que se presentan algunas opciones solre el contexto que el proyecto define. pdate context definition y Remove context definition agegan y quitan, respectivamente, la definicin del contexto que el proyecto define al servidor web. De esta forma, podemos tener una instancia de Tomcat coriendo y cargar y descargar contextos (aplicaciones .i.eb) del mismo sin necesidad de detener el servidor.
El archivo web.xml La especificacin define que la carpeta WEB-INF es donde debe ir toda la informa;in relativa a la aplicacin. En particular, define que dentro de ella debe existir el archivo web.xml. Este archivo es el deployment descriptor, un archivo xML que .ontiene toda la inlormacin de configuracin de la aplicacin.

{hora echemos un vistazo a las funcionalidades ms importantes que usaremos en este libro:
<?s version="l.0" encoding="rs0- 8859<web-app )q.n6=" htbp
r

1"

>

//j
.

ava. grm.

co/tul/rs / j2ee"

rdllns I xs i="http : //sww

w3 .

org/

20

01/:Gif,schqla- i.nstase"

xsi: EchsElocation="hbbp: //iava. Eun. ccn/o/ng/j 2 ee http: ,//j ava. su. cm/:orl,/ns/j 2eelweb-app 2 4.xsd"
version="2.4">
<di6p1ay-!ri>A Sj-rple Applicati.on</display-nane> <context -paari>
<param-na$e>t,lebmas ter< /paran-nane> <param-value>wehtas ter@iycorp. ccK/param-vaLue>
<

/conterat -paraE>

<fi1tef,> < f ilter-nahe>Inage Fi1!er</f ilte-nane> <f ilte-class>coor. acne. Inageservle</f itter-cLa6s>

</filter>

.r:.code

45

<servlet-naine>catalog</servlet-nane> <6erulet-claas>ccrn.nycorp. Catalogservlet</Erv1et-cIaE6> <init -paaD


<paa!-nae>catalog</parao-narne> <param-value>E)ting< /paran-value>

</inil'para> </servlet>
<servlet -napping> <aer!let-nane>catalog</Eervlet-nane>

<url-pa!tern>/catalog/*</url -patlern> < /servlet -rralping>


</web-app>

display-name define el nombre que le queramos dar a nuestra aplicacin. context-param contiene un par nombre-valor y define un parmetro de inicializacin dentro del contexto. Pueden definirse 0 o ms elementos context-param. Cual_ quier servlet podr acceder a estos parmerros.

filter y filter-mapping definen los filtros. En el captulo de filtros veremos a fon_ do esta configuracin.
servlet y servlet-mapping contienen la definicin de los servlet._ En servlet definimos los servlets que residirn en el contexto. Todo sevlet que que_ ramos usar debe estar declarado en el descriptor. cada elemento d.b. .o.ri.rr.. ,,.,

DYNAMIC CLASS LOADING


Tomcat soporta ta carga de ciases dinmica. Esto signfica que al modificar una clase que est actualmente cargada y corriendo lpor ejemplo, un servietl, Tomcat detecta el cambio y, de
seT necesario, reinicia eI contexto.

ttt-.cod

Servlets

rvlet-name, que es el nombre con que ser referenciado el servlet dentro del con--\to, y un servlet-class, que es el nombre completo de la clase del servlet. Opcio:rlmente se puede definir uno o ms init-param, que, similarmente al elemento context-pafam, consiste en un par pafam-name y param-value, especificando nom'cre y valor del parmetro a defini respectivamente. Estos parmetros de inicializacin slo pueden ser vistos por el servlet en donde son definidos. servlet-mapping define una relacin entre un servlet y un patrn de direcciones web. Es el que especi0ca qu servlet ha de cargarse segn a qu direccin web (o URI, Uniform Resource Locator) se haya accedido. servlet-name indica a qu servlet se le est definiendo la relacin (segn el nombre definido previamente en el elemento servlet), y url-pattern especifica el patrn de direcciones web asociado.
Veamos entonces un ejemplo. Definamos un descriptor con dos servlets: GompraServlet y Ventasewlet. A cada uno le cargamos unos parmettos iniciales con los precios mximos a cuales comprar o vender y luego los asociamos a distintos pa-

rones de direcciones web.


<servlet>

<l-

E1

servlet Conq)raservlet *>


/

<aervle! -laE>cqrra< <6erv1et-class>


c@I. uEes
.

aeIet -aae>

Ccq)raselvLet

</servlet-cLaa6>

<init-pare> <l- Definircs la rib1e


<parati-value>50
0<

preciotrtaxino cor

valor 500 lDra

e1

sewlet Cwprasewlet ->

<pa@-!e>pecioila.nie</para-nane>
/paan-value>

</irit -par>
</aerelet> <aervlet>

<!- El servlet Ventaservlet ->


<aervlet-nne>venta</9ew1et-lane>
<ae1e!-q1a9e>
ccdl.

users . Ventaservlet

</EervLet-claEa>
<iDi l-paraE>

<!- Definimos la variable precio4inino

con

valor 200 para el selv1et Ventasewlet ->

{r

5f.code

47

PROGRAMACIN WEB JAVA

</6ervlet -nappiIg

<!<

Asociamos VenEaservlet

a la direccion

web /ventarj ->

Eervl et -napping>

<gevlet-nae>ve!ta</aervlet-n6e>

<ur1-pattern>/ventas</utl-pattem>
</Eervlet-llapping>

Vimos que en el descriptor se pueden definir parmetros de inicializacin, tanto para el contexto en general como para cada servlet en particular. Cmo podemos ac, ceder a esta informacin desde un servlet? En la clase Httpservlet tenemos algunos mtodos interesantes:
getlnitParameter(String str) nos devuelve un string con el valor del parmetro de inicializacin de nombre str, o null si no existe dicho parmetro.

ge nitParameterNames0

devuelve un Enumeration con todos los nombres de los parmetros de inicializacin que este serulet posee. Usando este Enumeration podemos fcilmente acceder a los parmetros, como lo e.jemplifica el siguiente cdigo:

ltr.ereratiotr e = getlnitParaeeterNanes

while

(e,hasMoreBl[ts

{
parmetro

// El nombre de1 prximo

String paraNane = (Strtng) e.ner(tElent0; // E\ vaTor del parmetro String pararValue = getlnitparaneter (paramllame) ;

$9r.code

Servlets

,\

su vez, usando el mtodo getServletGontext0 podemos acceder a una clase ServletGontext que encapsula los datos que posee el contexto al que pertenece el servlet. -\lgunos de los mtodos de ServletGontext son:

Objeqt getAttrbute (Strlng nane) EDtEerato! getttrjuteNaoeE ()

voi eovelttlibut (Strlng nane) void setAltrlbute (Strtg tran, object object) Itputst!ae getReEourceAsgtre@(Stltg pat)

strirg getlnitParaeter(Stlng naE) &rlneatlon getItrItJaaleterNas 0

getlnitParameter(String name) y getlnitParameterNames0 se comporran del mismo :rodo que los mtodos de la clase servlet que vimos previamente. 3etAttribute(String name), getAttributeNames0, removeAttribute(Stdng name) v serAttrbute (Stdng name, 0bject object) s;rvcn para obtener', quitar y agregar objetos :- contexto asociados a un nombre, como si fuera un diccionario. Esto hace las ve, ::s de diccionario global accesible para cualquier servlet del conrexro.

lrteractuando con el servlet


?:ra poder crear una aplicacin web, es menester que podamos binda interaccin - rn el usuario. El servlet debe poder recibir informacin de entrada, procesarla y dsrlver una respuesta acorde. Cmo enviarle datos al servlet? Bsicamente hay dos for:as, dependiendo de si usamos GET o P0ST como tipo de pedido HTTP (o ambos). J.:cordemos que GET en teora se usaba nicamente para pedir un recurso, sin embar: ,:. podemos usarlo para enviar cieto tipo limitado de infomacin al servidor.
- n pedido GET no es ni ms ni menos que una direccin web enviada al servidor (co::.o vimos en el Captulo 1). Cuando escribimos en el navegador una dieccin web, -=-.ramos generando un pedido GET. Podemos tambin agregarle parmetros a1 pedi:-r. r'stos sern recibidos por el servidor. Para enviar parmetros, debemos agrega ::go de la direccin, el query string, que se consrruye de la siguier.rte forma:

. . .

un'?'indicando que comienza la seccir de parmetros; un par nombre y va1or, separados por un'='; en caso de qr.re haya ms de un parmetro, stos se separan mediante nn'&'.

- :lr ejemplo, si quiero pasar los parmetros "nombre" y "edad ", con valores Juan '' 16 " respectivamente, la direccin web resulrante sera:

-: -.code

49

PROGRAI\4ACIN

WEB JAVA

http://<sitio>/<recurso>?nombte=Juan&edad= 16

El protocolo HTTP no impone ninguna restriccin al largo de las direcciones


web que pueden ser enviadas, sin embargo, los servidores s. Aunque existen servidores que aceptan tamaos ms grandes, por compatibilidad se recomienda que el tamao total no supere los 256 caracteres.

Un pedido PosT

se crea

utilizando formularios HTML. A1 enviarse el formulario a la

direccin especificada en el tag .form' (asumiendo que METI{OD="POST"), el navegador crea un pedido HTTP POST y lo enva a esa direccin. Veamos un ejemplo:

La clase HttpSewletRequest abstrae el tipo de pedido que recibi el servlet, y sus mtodos getParameter(String name), getParameterMap 0 , getParameterNamesQ y getParametervalues(String nane) sirven tanto para pedidos GET como POST.

Un eiemplo completo Vamos a desarrollar un ejemplo completo que abarque todo lo que vimos en el capltulo. Desarrollaremos un juego de El Ahorcado. La pgina HTML mostrar las letras elegidas, las acertadas y las chances restantes.

El servlet deber hacer uso de la sesin para guardar qu letras ya arriesg el usuario y sobre qu palabra est adivinando (habr varias). El nmero de chances ser

un parmetro de inicializacin.

Veamos el cdigo fuente:

50

usr.code

Servlets

protected void

req, HttpservletResponse res) thlowE Sewte&<ception, Ioe<cE)tian {


d.oPoEt

(HttpservletRequesE

Httpsesslorl sesloEr = leq.getsegElon0 t

int

axlntentoE = Integer.parEelnt {gehlnitparanehe! {.trrIntentos,,

))

l/ La palatra sobre la que est adivinando String pal.abra = (String) esion. getAttibule ( "plabra" ) i
Las letras gue acert Sting aciertoE;

//

// ],as leLras que no acert String erradoEi /. if


Prjmera vez del usuario, no tiene palabr asignad (palabra == nulll {
Raddr rand = flew Randcq0;

*/

/*

Le agregamos rma
PAIABRAI

al

azar de las disponibles


(PAABRAS.

*/

palabra =
. --+^-

frad. ne{EInt

length) I ;

- s/.

errados =

"";

51

PROGBAMAClN WEB JAVA

/*

Grardamos

los datos iniciales en "sesion" */

BEion. setAEtribute ("paLa.bra", palabxa) ;

seeion, setAttibut ( "aciertos"

aciertos);

("er!adoE", erados);

]
elee {

los daLos de este usuario de "seslon" */ aclertog = {string) Eesion. getAitri-bute ( "acierto" ) t elrailoE = (Slritrg) Eeson. getAttribute "errados" ) ;

/*

obtenenos

/* Verificairos si 1a letra gue ar.riesg pertenece o no a la Strg letra = req.getParanete "Leera" ) ; if {patabra. irdexof (letra) >= 0) {
{

palabra

*/

aciertos += letrat

]
erse

t
Eadog +* leblat

//

Guaroamos

los

daLoE actua-Lizados en "sesio']"

Ee6io.setALtribute{"aciertoE", aciertoE) ;
Eeeion. EetAttribute (\errados"

erradoE) ;

//

Ipimimos e1 resultado

Prtntwriter out = reE.getwriter0;


out.pinlln ( "<htI>" ) ; out. prirtln { "<head>' ), out. println ("<tt1e>AgORClDo</blt1e>" out. priDtln ("</head>" ) , out.println ("<body>") t out.println ( "<h1>" ) ;

lteramos por 1as letras de 1a palabra. si ya Dstramos, si no, moslramos un "_" ./ for (int i = 0; i < palaba,length 0 ; i+r) {

/*

la acert, la

String letla e palabra. substring

(t, t+1);
{

if
52

(acietos, inderf

{letra)

>=

0)

r!Jr-.code

out.plrtln (" h + letra) t

]
elEe {

out.PrlDtln(', _,,), )
)

out.prirttn("</h1>") ; our. priotln { "<br/>" ) t

/*

Nos

fijarcs si yerr

ms

de 1os intentos perlilidos


(

*/

if

(ar<IrtentoE > elrados.lergth

//

Todava est en juego

our.pinlln ("Ioteqtos out.pintln ( "<br/>" ) ;

" + {na*IteDtoe -

erradoa. leogth0 ) ) ;

// Las cllances restanLes for (cha c = A" c <= 'z't c+{) { if (ciertos.ldarof (eraracte!. togtri.ng(c) )
&& errados. inde:.of (character.

== -1
(c)

tostring

==

-1)

no fue arriesgada arln */ ou!.print1n("<a href=\"ahorcado?1eta=" + c + \\">" + c + "</a>"\

/*

Mostramos

letra

como opcin

si

]
)

]
etee

{ // juo

redrinado

MANEJO DE ERRORES
-- sjempto
del. ahorcado hace poco y nada respecto

al manejo de errores. En una apticacin web

:5 c.uciaI manejar datos inesperados, sesiones cerTadas, etc.

'.code

53

PROGRAI\4ACIN

WEB JAVA

/*
1

Le damos La oportunidad de que juegue de iuevo */ out. prj,ntln ( "<a href=\"ahocado\">Jtgar de nuevo</a>");
); );

t out.println ("<Aodp" out. prlntln ("</htL>"

_EN__N-I,
r

r, -,t,a!J ji-.!t1if )I

:r':

rrrIr t:i:

Fiura 6,

El

Ahotcado est compuesto por un solo servlet

Como vemos, el juego usa mucho la sesin para guardar las letras que el usuario fue arriesgando. El juego va contando las letras arriesgadas por el jugador y cuando superan el mximo nmero permitido, ayisa al usuario que perdi.
Sin embargo, no est realizada la funcionalidad para cuando el usuario acierta la palabra completa y gana. Es un buen ejercicio para el lectorl

Problemtica de los servlets


Los servlets son la piedra fundamental en el desarrollo de aplicaciones web con Java, y es muy importante que sepamos qu son y cmo funcionn.

Sin embargo, los servlets no son la herramienta ms adecuada para el desarrollo web. Hacer una aplicacin entera slo usando servlets es lento, engoroso y resulta muy difcil de mantener. Los servlets plantean una problemtica funda, mental: no separan la presentacin del contenido.
54

1l!r.code

Servlets

Hemos yisto que en e\ serv\er renemos que imprlmir el esu\tado completo, y es:o incluye contenido HTML y contenido propio de la aplicacin. Esto dificulta -as cosas. Si quisiramos cambiar el diseo grfico de la aplicacin, tendramos :ue tocar el cdigo fuente y recompilar.

lo ms importante, un diseador grfico que generalmente no sabe progra:nar Java tendra que modificar el contenido del servlet para agregarle diseo, :oencialmente daando el cdigo y generando problemas.
Pero

En el prximo captulo veremos una altenativa para esro, JavaServer Pages.

RESUMEN
En este captu[o pudimos ver [a parte prctica de Los conceptos desarrotlados en e[

Captulo

1.

Los servlets son [a tecnotoga fundamental sobre [a que se basa todo tipo de desarro[o web con Java. Vimos atgunas apticacones, configuraciones y armamos un entino de desarrotto. Tambin pudimos ver que los serviets oor si sotos plantean una problemtrca que hemos de resolver

:s r.code

ACTIVIDADES

I
2 3

0u define ta especificacin Java

Servtet y' Escriba un servlet

que muestre todos los

Technotogy?
Qu objetos recbe un servtet at nvocarse?

parmetros, tanto de contexto como de iniciatizacn, con su nombre y vaior.

y' Modifique
,;Para qu se usa e[ mtodo aelLocateli

et servtet TestRequestResponse

de
y'

para que responda en otro idioma de su


eteccin, adems de ingts y espaol.

Http5ervLetRequest?
4 Dnde debe residir et deptoyment
crptor dentro de una aplicacin

desweb?

Qu pasa cLando cp e..cdo e rrn sprvlpt con un mtodo HTTP que et servtet no so-

porta? Escriba un servtet sin et mtodo do-

5 0u informacrn contiene et
descrptor?

deployment
t/

Gety pruebeLo.
Modifique et Ahorcadoservlet para que tome

la lista de.palabras disponibles de un

Parmetro de iniciatizacin

r/

Modifique el Ahorcadoservlt para que avise ai usuario cundo gan.

|'e

Modifque et Ahorcadoservlet para que no

repita nunca [as patabras sobre las que


sesin?

el'

usuario ya arriesg. Es necesario usar [a

y'

l'4odifique ei Ahorcadoservlet para que en-

ve un formutario fun pedido P0STJ con

La

letra en vez de acceder mdiante un enlace

56

usr.code

Potrebbero piacerti anche