Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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
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
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
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
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
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
/*
deber libera-r
los recuraos
que tcm
destmi do
*/
rcial als8trqy0 t
/*
Devuelve
el
*/
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.
Se
r!'lers
-a
i
;
; t
ServletReEpone res) ;
;
GenericServlet, y de ella hereda mtodos, -.r clase HttpServlet, es una subclase de ,:.ributos, eventos y dems propiedades.
''iamos
. 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
. . .
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'
usi.code
3l
Fru,,a
3.
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
io.
Plintlll!t
iq)ort
j avax. j avax.
iryolt
* ExEendemos la clase Htlpservlet para definir * nuesLra propa funcionalidad cuando el * servlet sea invocado
/*
I
L1a,amos
al
tato a pedidos
doPost
responde de
la
misna nanera
(req, !es);
)
potected void
aloPoEt
/*
obtenemos
el
out. fluBh 0 t
sr.code
33
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:
DaDe)
Enuleauion get,ttributeNanes ()
. ''
o)
[]
getcoorieE
34
usr.code
Servlets
Ettpsesgion gtse86i@
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
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)
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
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
servlet
responde de
la
nrisma maoera
-/
(req, reg)
/* Al recibir
u1
GET
o u
POSI se
/*
Oblenemos
+/
cookie
[]
/* 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;
(
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
I
a!.6 sc , EE / -!.-
.
t
t T out.
..
else {
if
1
el.Be
38
usr.code
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
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
PLUG-INS DE ECLIPSE
usr,code
Servlets
Qb,
,nr\ r-]
E 16-
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.
El El
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
..]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
3l
lm.at tun
Window
Help
r"-
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
.r !
r2ME
:i ll :Ii ill
:l
, d !@ ,i L!
..
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"
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
</inil'para> </servlet>
<servlet -napping> <aer!let-nane>catalog</Eervlet-nane>
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.. ,,.,
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-
<l-
E1
aeIet -aae>
Ccq)raselvLet
</servlet-cLaa6>
preciotrtaxino cor
e1
<pa@-!e>pecioila.nie</para-nane>
/paan-value>
</irit -par>
</aerelet> <aervlet>
users . Ventaservlet
</EervLet-claEa>
<iDi l-paraE>
con
{r
5f.code
47
</6ervlet -nappiIg
<!<
Asociamos VenEaservlet
a la direccion
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
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:
voi eovelttlibut (Strlng nane) void setAltrlbute (Strtg tran, object object) Itputst!ae getReEourceAsgtre@(Stltg pat)
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.
. . .
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
Un pedido PosT
se crea
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.
50
usr.code
Servlets
protected void
(HttpservletRequesE
int
))
l/ La palatra sobre la que est adivinando String pal.abra = (String) esion. getAttibule ( "plabra" ) i
Las letras gue acert Sting aciertoE;
//
*/
/*
Le agregamos rma
PAIABRAI
al
*/
palabra =
. --+^-
frad. ne{EInt
length) I ;
- s/.
errados =
"";
51
/*
Grardamos
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
Ee6io.setALtribute{"aciertoE", aciertoE) ;
Eeeion. EetAttribute (\errados"
erradoE) ;
//
Ipimimos e1 resultado
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
(t, t+1);
{
if
52
(acietos, inderf
{letra)
>=
0)
r!Jr-.code
]
elEe {
out.PrlDtln(', _,,), )
)
/*
Nos
fijarcs si yerr
ms
*/
if
//
" + {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)
/*
Mostramos
letra
como opcin
si
]
)
]
etee
{ // juo
redrinado
MANEJO DE ERRORES
-- sjempto
del. ahorcado hace poco y nada respecto
'.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>");
); );
_EN__N-I,
r
r, -,t,a!J ji-.!t1if )I
:r':
rrrIr t:i:
Fiura 6,
El
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
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
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
Technotogy?
Qu objetos recbe un servtet at nvocarse?
y' Modifique
,;Para qu se usa e[ mtodo aelLocateli
et servtet TestRequestResponse
de
y'
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-
5 0u informacrn contiene et
descrptor?
deployment
t/
Gety pruebeLo.
Modifique et Ahorcadoservlet para que tome
Parmetro de iniciatizacin
r/
|'e
el'
y'
La
56
usr.code