You are on page 1of 39

1. INTRODUCCIN 1.1. Qu es JSP?

Java Server Pages (JSP, para abreviar) es una tecnologa basada en Java que si pli!ica el desarrollo de p"ginas #eb con contenido din" ico. $on JSP, los dise%adores #eb pueden incorporar ele entos din" icos dentro de la p"gina utili&ando tanto porciones de c'digo Java incrustadas, co o unas cuantas etiquetas. (s, las p"ginas JSP tienen el aspecto de una p"gina tradicional )*+,, a la que se le -a introducido parte de c'digo Java .unto con unas etiquetas. /e esta !or a, cuando una p"gina es solicitada por un usuario 0 procesada por un servidor )**P, el c'digo )*+, pasar" directa ente al usuario, ientras que las porciones de c'digo Java ser"n e.ecutadas en el servidor cuando la solicitud -a0a sido recibida, para generar el contenido din" ico de la p"gina. $uando el usuario acceda al c'digo de la p"gina que le llega s'lo ver" )*+,, sin poder acceder al c'digo JSP sub0acente.

1.1. 2voluci'n tecnol'gica


2l -ec-o de que una p"gina contenga contenido din" ico, e3ige que el servidor #eb realice alg4n traba.o de procesado que en el caso de p"ginas est"ticas no era necesario. ,a !or a de reali&ar este procesado -a ido ca biando con el tie po, 0 as vere os a-ora un peque%o resu en de c' o -a ido evolucionando. 5nicial ente la generaci'n de contenido din" ico se -aca !uera de los servidores. $uando llegaba una solicitud, esta era procesada en el servidor, 0 cuando era necesario se lla aba a un proceso, !uera del servidor, que generaba el contenido din" ico 0 lo devolva al servidor. ,os odelos basados en el Common Gateway Interface ($65) seguan esta idea. Sus principales proble as eran7 necesidad de overhead para la co unicaci'n entre proceso 0 servidor, consu o de recursos de siste a por parte del proceso... Posterior ente se opt' por siste as que introdu.eran porciones de c'digo de lengua.e tradicionales incrustados dentro de la p"gina usando etiquetas, de !or a que el estilo de la sinta3is !uera "s consistente 0 sencillo. 2ste odelo lo -an seguido entre otros7 Microsoft Active Server Pages (ASP), Server Side JavaScript (SSJS), Java Server Pages (JSP) 0 otros. 2n JSP el lengua.e que se utili&ar" para la generaci'n de contenido din" ico es, tpica ente, Java, 0 provee un con.unto de etiquetas que interact4an con ob.etos Java en el servidor de !or a que no es estricta ente necesario que apare&ca c'digo Java en la p"gina.

1.8. 9ene!icios
JSP o!rece varios bene!icios co o siste a de generaci'n de contenido din" ico. (l estar basado en Java, presenta las venta.as que este lengua.e o!rece con respecto a la portabilidad entre plata!or as 0 las derivadas de la orientaci'n a ob.etos de este lengua.e.

Realizacin. ,as peticiones de p"ginas JSP son nor al ente i ple entadas ediante servlets, de !or a que el contenedor servlet, al que lla are os contenedor JSP, ane.a 4ltiples solicitudes a la ve&, requiriendo enor overhead, 0 por tanto requiriendo enos recursos. 2sto -ace que JSP sea uc-o "s e!iciente que otros odelos co o los progra as $65 . Componentes reutilizables. 2sta caracterstica deriva de la orientaci'n a ob.etos de Java. JSP per ite i ple entar contenido din" ico inclu0endo c'digo Java directa ente en la p"gina. Sin e bargo, ta bin o!rece una serie de etiquetas que le per iten actuar sobre ob.etos Java residentes en el servidor. 2stos ob.etos se co portan co o ca.as negras a las que la p"gina accede sin tener que conocer co o !uncionan interna ente, 0 por tanto, liberando al creador de la p"gina de la progra aci'n en Java. 2stos ob.etos, ade "s podr"n ser reutili&ados sin "s que conocer su !uncionalidad. Separacin de presentacin e implementacin. 2sta venta.a proviene directa ente de la anterior. 2l -ec-o de que la i ple entaci'n del progra a puede ser llevada a cabo por los ob.etos Java, pode os separar lo que es la presentaci'n en s, en la p"gina, 0 el c'digo encargado de generar la in!or aci'n necesaria que aparecer" en la p"gina. Divisin de labor. ,a separaci'n de presentaci'n e i ple entaci'n per itir" desligar las labores encargadas de desarrollar a bas. (s, alguien que no sepa nada de Java, podra encargarse de la parte de la p"gina relacionada con la presentaci'n, le bastara conocer las propiedades que les o!rece un con.unto de ob.etos, 0 as accediendo a ellos conseguiran la in!or aci'n necesaria. /el is o odo, un progra ador Java, siguiendo una serie de nor as a la -ora de crear los ob.etos, se encargara de crear el c'digo que generar" la in!or aci'n din" ica, despreocup"ndose de los proble as de presentaci'n de la p"gina.

2 FUNDAMEN !S
1.1 2scribiendo tu pri era JSP.
2n pri er lugar -a0 que decir que el contenedor JSP acepta las etiquetas )*+,, de !or a que la solicitud a un contenedor JSP local del siguiente !ic-ero, al que -abre os dado su correspondiente e3tensi'n (nor al ente ..sp), sera per!ecta ente procesado, 0 por lo tanto sera un !ic-ero JSP v"lido.
<HTML> <BODY>

Hola, mundo! </BODY> </HTML>

Veamos ahora un ejemplo ms interesante:


<HTML> <BODY> <% String visitante = request.getParameter("nombre"); if (visitante==null) visitante = "mundo"; %> Hola, <%= visitante%>! </BODY> </HTML>

Sin entrar en detalles, este !ic-ero JSP declara una variable Java String lla ada visitante, 0 luego la intenta iniciali&ar con un par" etro que busca en la solicitud )**P. 2n caso de no encontrarlo, le da el valor m ndo, 0 posterior ente inserta el valor de esta variable en la salida )*+, de esta p"gina. (su ire os que el :;, para esta p"gina JSP es "ttp#$$local"ost#%&''$(ola.)sp 0 as, si un navegador buscara esta :;, ediante una solicitud G!" el contenedor JSP procesara esta p"gina 0 respondera con lo siguiente.
Hola, mundo!

2n e!ecto, al no encontrar ning4n par" etro en la solicitud, le dara a la variable visitante el valor m ndo. Si, por el contrario, accedira os a dic-a p"gina, ediante un G!" a "ttp#$$local"ost#%&''$(ola.)sp*nombre+ oni, estara os pasando un valor al par" etro no bre de valor "oni, 0 as la variable visitante valdra "oni. Por lo tanto, la respuesta a esta petici'n sera7
Hola, Toni!

2n el c'digo JSP del e.e plo anterior, -e os puesto en negrita el c'digo pura ente JSP. $o o 0a co enta os anterior ente, este c'digo es e.ecutado en el lado del servidor, gener"ndose el contenido din" ico, de !or a que el usuario al ver el c'digo de la respuesta 4nica ente vera7
<HTML> <BODY> Hola, Toni! </BODY> </HTML>

$on este si ple e.e plo 0a -e os visto la caracterstica central de las p"ginas con contenido din" ico7 dependiendo del valor de los par" etros en la solicitud, el resultado de la is a es distinto. <tro aspecto i portante es el -ec-o de que el navegador no tiene constancia del c'digo JSP de la p"gina. 2ste c'digo se e.ecuta en el contenedor JSP, generando contenido )*+,, 0 devolvindolo co pleto al servidor )**P, que lo devuelve al navegador sin de.ar ninguna constancia de toda esta labor. Por 4lti o, es interesante rese%ar

que en este e.e plo el contenido din" ico se -a obtenido en la p"gina de scripting, puro lengua.e Java.

ediante la inclusi'n

2n el captulo anterior -abla os de que uno de los bene!icios que o!rece JSP es la posibilidad de usar ob.etos Java, a los que lla are os Java#ean en el servidor, per itiendo la separaci'n entre las labores de presentaci'n e i ple entaci'n. =ea os c' o pode os -acer esto, para ello suponga os que tene os el siguiente #ean.
public class Holabean{ St in! nomb e" public Holabean#${ t%is&nomb e'(mundo(" ) public St in! !et*omb e#${ etu n nomb e" ) public +oid set*omb e#St in! nomb e${ t%is&nomb e'nomb e" ) )

2n principio, no se trata "s que de una clase Java nor al 0 corriente, pero el -ec-o de que -a0a cu plido una serie de nor as la convierten en un #ean, accesible desde una p"gina JSP que lo lla e. (s, 0 sin entrar en detalles, una p"gina JSP co o la que sigue estara accediendo a dic-o #ean.
<HTML> <BODY> <jsp usebean id="!ola" "lass="#olabean"$> <jsp setPropert% name="!ola" propert%="nombre" param="nombre"$> Hola <jsp getPropert% name="!ola" propert%="nombre"$>! </BODY> </HTML>

2n esta p"gina, pri ero se declara que se va a acceder a $ola#ean al que se le lla ar" hola. /espus se accede en escritura a la propiedad nom#re de dic-o #ean asign"ndole el valor que venga en el par" etro nom#re de la solicitud. Por 4lti o se accede a la is a propiedad, pero a-ora en lectura, para conocer cu"l es su valor e introducirlo en la salida de la p"gina.

1.1 >or ato de las etiquetas.


:na ve& que -e os visto unos e.e plos que nos uestran la !or a que to an los docu entos JSP, llega el o ento de clasi!icar las etiquetas que se utili&an en este lengua.e. 2stas etiquetas quedan englobadas de dos tipos de !or ato7 las etiquetas orientadas a scripting 0 las basadas en ?+,. 1.@ <rientadas a scripting. Son etiquetas derivadas del (SP (Microsoft Active Server Page) 0 to an el

!or ato de e pie&ar por ABCA 0 ter inar por ACDA. :n car"cter especial puede aparecer despus del ABCA inicial, tal co o7 E , F , G 0 sirven para a%adir signi!icado a la etiqueta.
<%& double radio='.(; %> <%)page in"lude file=""op%rig!t.!tml" %>

1.@ 9asadas en ?+,.. 2l segundo tipo de etiqueta viene de la sinta3is utili&ada en ?+, 0 sus convenciones. 2sta sinta3is es u0 parecida a la de )*+,, pero a%adiendo unas pocas reglas tales co o di!erenciar entre a04sculas 0 in4sculas. 2 pie&an por B 0 ter inan por HD.
<jsp usebean id="login" "lass=""om.taglib.*djsp.fundamentals"$>

(l contrario que las anteriores, estas etiquetas pueden tener un cuerpo, 0 to an el siguiente !or ato7
<jsp usebean id="login" "lass=""om.taglib.*djsp.fundamentals"> <jsp setPropert% name="login" propert%="group" value="admin"$> <$jsp usebean>

2n este caso, el cuerpo de la etiqueta es otra etiqueta. 2sto es un caso u0 !recuente cuando al noti!icar el uso de un #ean iniciali&a os sus propiedades. JSP soporta el anida iento de etiquetas una dentro de otra. (s, cualquier etiqueta JSP puede estar dentro de las etiquetas )*+, del docu ento, per itiendo generar contenido din" ico de las propias etiquetas. 5gual ente, JSP per ite contener, ba.o ciertas restricciones, etiquetas JSP dentro de otras etiquetas JSP. (qu tene os un e.e plo7
<jsp setPropert% name="login" propert%="visitantes" value="<% visitasPrevias + ,%>"$>

1.8. 2.ecutando JSP


$on lo que -e os visto, debera os tener una idea general de qu es lo que JSP puede -acer. (-ora vere os c' o lo -ace.

1.8.1. ;equisitos para JSP.


,o pri ero que necesita os para traba.ar con JSP es un servidor #eb. $uando -abla os de servidor, nos re!eri os tanto a una parte hardware co o a una parte sofware. ,a parte hardware es nor al ente un ordenador accesible desde 5nternet o desde una red corporativa, ientras que la parte sofware es un servidor )**P e.ecut"ndose en el hardware.

(de "s del servidor )**P, es necesario un sofware que i ple ente un contenedor JSP. +uc-os servidores inclu0en este contenedor. 2n otros, ser" necesario incluir este contenedor. (ctual ente, la a0ora de proveedores de servidores )**P o!recen (P5 (Application Programming Interfaces) para incorporar la generaci'n de contenido din" ico a la !uncionalidad )**P. :na ve& que tene os el servidor instalado 0 con!igurado, a%adire os los !ic-eros JSP a la .erarqua nor al de docu entos del servidor, 0 se distinguir"n del resto por su e3tensi'n, nor al ente ..sp aunque no sie pre es esta. ,as clases Java, 0a co piladas, que son re!eridas por nuestros docu entos JSP necesitan ser instaladas en el pat- de las clases Java que utili&a el contenedor Java.

1.8.1. $' o traba.a JSP?..


2l proceso de e.ecuci'n de un docu ento JSP e pie&a con la solicitud del is o. 2stas solicitudes est"n indicadas por el :;, que e plea una e3tensi'n especial, que 0a di.i os que general ente era %&sp pero podra ser otra. Servlets ,a a0ora de las i ple entaciones de JSP est"n basadas en los servlets. Por ello, el pri er paso para co prender c' o traba.a JSP, es co prender c' o traba.an los servlets. ,os servlets son progra as basados en Java, an"logos a los progra as $65, i ple entados ediante un contenedor servlet asociado a un servidor )**P. 2l !unda ento de los servlets es el siguienteI un con.unto de :;,s son con!igurados para ser ad inistrados por el contenedor servlet, de !or a que sie pre que llegue una solicitud para una de estos :;,s en el servidor, este lo enva al contenedor servlet para que lo procese. ,a !or a de enviarlo es creando un ob.eto Java que e paquete todos los datos de la solicitud. :n ob.eto Java ta bin es creado representando la respuesta. ( bos ob.etos tendr"n sus todos de acceso, de esta !or a, el contenedor servlet accede a los datos de la solicitud para reali&ar las operaciones necesarias sobre los is os 0 as construir la respuesta. 2l c'digo )*+, generado co o respuesta (no -a0 que olvidar que el contenido din" ico generado es c'digo )*+,) es escrito en la cadena de salida asociada al ob.eto respuesta, 0 este ob.eto es enviado al servidor )**P, el cual la devuelve al navegador que -i&o la solicitud en pri er lugar. 2n el caso de que e3istan 4ltiples solicitudes para un servlet, est"n son ad inistradas e.ecutando cada lla ada a los todos de los servlets en di!erentes t-reads. JavaServer Pages% 2l co ponente principal de una i ple entaci'n de JSP basada en servlets es un servlet especial lla ado co pilador de p"gina. 2l contenedor est" con!igurado para lla ar a este servlet sie pre que llega una solicitud a una p"gina JSP. 2s este co pilador de p"gina 0 su clase Java asociada el que

vuelve al contenedor servlet en un contenedor JSP. 2l procedi iento es el que sigue. $uando llega al servidor )**P una solicitud de una p"gina JSP, esta solicitud es enviada al contenedor JSP, el cual invoca al co pilador de p"gina para que se encargue de la is a. 2l co pilador anali&a el contenido de la p"gina buscando etiquetas JSP, traduciendo su contenido en el c'digo Java equivalente que, al ser e.ecutado, generar" el contenido din" ico. +e&clando el contenido est"tico de la p"gina original .unto con el c'digo Java del contenido din" ico, se generar" un servlet con sus todos de servicio. :na ve& que todo el c'digo del servlet -a sido construido, el co pilador de p"gina lla a al co pilador Java para co pilar este c'digo 0 a%adir el !ic-ero de clase Java resultante al directorio apropiado en el pat- de las clases del contenedor JSP. *odo este proceso s'lo se reali&a la pri era ve& que se solicita una p"gina JSP, el resto de solicitudes son re itidas directa ente al servlet co pilado. (s cuando se lla a a una p"gina JSP el co pilador de p"gina invoca a este servlet para generar la respuesta para la solicitud original. ;esu iendo, pode os decir que las solicitudes del navegador llegan al servidor )**P 0 las p"ginas JSP son enviadas al servlet co pilador de p"ginas que corre en el contenedor JSP. Si el servlet para la p"gina actual est" actuali&ado lo genera 0 co pila, carg"ndolo en el contenedor servlet. 2n caso contrario el control es trans!erido al servlet de la p"gina JSP que se encarga de ane.ar la solicitud generando la respuesta 0 envi"ndola al servidor )**P el cual la re itir" al navegador.

8. Progra ando JSP script.


8.1 ,engua.es de scripting.
Por de!ecto, el lengua.e scripting para JSP es Java. 2n el te a anterior, vi os c' o poda os insertar dentro de una p"gina JSP porciones de c'digo Java con el uso de deter inadas etiquetas. ( estas porciones de c'digo Java es a lo que lla a os scripts. *eniendo en cuenta que JSP es un lengua.e orientado a co ponentes, la opci'n de usar scripts parece enos aconse.able que el uso de 'eans, sin e bargo en uc-os casos no son soluciones en!rentadas 0 ade "s nos pueden resultar u0 4tiles. Por ello en este te a pretende os estudiar las posibilidades que nos o!recen los scripts cuando traba.a os con JSP.

8.1 2tiquetas JSP.

(5r al ndice)

JSP o!rece cuatro tipos principales de etiquetas7 1. - Directivas: estas etiquetas servirn para dar al contenedor JSP de instrucciones especfica de la p ina so!re c"mo el documento va a ser procesado. #as directivas no afectan al manejo de solicitudes individuales$ sino que afectan a las propiedades lo!ales de la p ina JSP.

%. - &lementos sc iptin!: se utili'an para insertar instrucciones de pro ramaci"n escritas en el len uaje sc iptin! de la p ina ( eneralmente Java)$ las cuales sern ejecutadas cada ve' que la p ina sea procesada por una solicitud. *. - +omentarios:se usan para a,adir cadenas de comentarios a la p ina JSP. &-isten varias formas de introducir comentarios en JSP. .l unos de ellos se vern en la salida$ otros s"lo se vern en el documento ori inal JSP o en el c"di o fuente del se +let en el que la p ina es traducida. /. - .cciones: al i ual que los sc iptin! son procesadas cada ve' que la p ina es solicitada. #as acciones pueden transferir el control entre p inas$ especificar applets e interactuar con componentes ,a+aBeans en el servidor.

8.8 /irectivas.

(5r al ndice)

,as directivas son usadas para llevar in!or aci'n del procesado especial al contenedor JSP. Por e.e plo, se pueden usar para especi!icar el lengua.e scripting para la p"gina, incluir contenidos de otra p"gina. ,as directivas no producen directa ente ninguna salida visible para los usuarios cuando la p"gina es solicitada, en lugar de eso, generan e!ectos laterales que odi!ican el odo en el que el contenedor JSP procesa la p"gina.

8.8.1. /irectiva page.


,a directiva page soporta un a plio abanico de atributos, lo cual la convierte en una de las directivas "s co plicadas. ,a sinta3is b"sica de esta directiva es7
<-. pa!e at ibuto/'(+alo /( at ibuto0'(+alo 0(&&&->

=ea os los atributos de la directivia page7 - in1o: permite a,adir informaci"n en forma de cadena de caracteres a la p ina que resume su funci"n. 0o tiene nin una restricci"n con respecto al tama,o de la cadena 1 no es o!li atoria.
<-. pa!e in1o'(Mi p2!ina pa ticula , 3op4 i!%t 0555 po 6ntonio 7al2n( ->

- lan!ua!e: especifica el len uaje sc iptin! que se va a utili'ar en los elementos sc iptin! de la p ina. Por defecto$ este len uaje es el Java 1a que todos los contenedores JSP de!en soportar Java.
<-. pa!e lan!ua!e'(8a+a( ->

- e9tends: identifica la superclase que ser usada por el contenedor JSP cuando la p ina JSP sea traducida a un se +let Java. Su uso es mu1 poco com2n.
<-. pa!e e9tends'(com&lib e :a&mi;a!ina,sp( ->

- impo t: sirve para especificar el conjunto de clases Java que sern utili'adas en la p ina. Para especificar correctamente una clase ha1 que especificar correctamente el paquete que la contiene.
<-. pa!e impo t'(8a+a&util&List( ->

(parte de estos atributos, e3isten varios "s, que se pueden consultar en el anual de JSP que proporciona Sun Microsystem.

8.8.1. /irectiva incl de.


,a directiva incl de per ite al creador de una p"gina JSP incluir el contenido de un !ic-ero en otro. 2l !ic-ero incluido ser" identi!icado por su :;,, 0 la directiva tiene el e!ecto de colocarlo en nuestra p"gina en el punto en el que aparece la directiva, antes de que la p"gina sea traducida a c'digo !uente 0 co pilado en un servlet.
<-. include 1ile'(local<=L( ->

:na p"gina JSP puede incluir otra JSP sie pre 0 cuando esta utilice el lengua.e scripting que aquella.

is o

8.8.8. /irectiva tagli#.


Se usa para in!or ar al contenedor JSP que la p"gina utili&a una o libreras de etiquetas de cliente. Su utili&aci'n es co o sigue7
<-. ta!lib u i'(lib e ia>ti?ueta<=@( p e1i9'(p e1i8o>ti?ueta( ->

"s

:n !unciona iento "s detallado de esta directiva puede verse en el de JSP que Sun Microsystem proporciona.

anual

8.J 2le entos de scripting.

(5r al ndice)

(l contrario que las directivas, los ele entos scripting per iten insertar directa ente c'digo que generan salida para que la vea el usuario. 23isten tres tipos de ele entos scripting7 declaraciones, scriptlets 0 e3presiones.

8.J.1 /eclaraciones.
Se usan para de!inir variables 0 todos espec!icos de una p"gina JSP. 2stas variables 0 todos pueden ser re!erenciados por otros ele entos scripting en la is a p"gina. ,a sinta3is para las declaraciones es7
<-! decla acion#s$ ->

/eclaraci'n de variables. ,as variables de!inidas con las declaraciones se convierten en variables de ob.eto en la clase servlet en la que la p"gina es traducida 0 co pilada. (s, si declara os7
<%& private int -=./ %=.; private String unidades="m"; %>

2stare os creando tres variables de ob.eto en el servlet creado para la p"gina JSP que pueden ser re!erenciadas por cualquier ele ento scripting de la p"gina, incluso aquellos que apare&can antes de la declaraci'n. 2s i portante recordar cuando declara os variables de ob.eto JSP, la posibilidad de que 4ltiples threads accedan si ult"nea ente a la p"gina JSP, representando varias solicitudes de la p"gina. (s, si un ele ento scripting de la p"gina odi!ica el valor de una variable de ob.eto, todas las re!erencias posteriores a esa variable usar"n el nuevo valor. Si deseas crear variables cu0o valor sea local al proceso de una 4nica solicitud, tendr"s que -acerlo en un scriplet. 2stas declaraciones son 4tiles para declarar variables de clase ediante el uso de static, si bien, co o el contenedor JSP suele crear un 4nico ob.eto de la clase servlet para representar una p"gina particular, no -a0 uc-as di!erencias entre declarar variables ob.eto o variables de clase. /eclaraci'n de todos.

,os todos de!inidos ediante las declaraciones se convierten en todos de la clase servlet en la que la p"gina JSP es co pilada. *odo lo dic-o sobre la declaraci'n de variables puede ser aplicado para la declaraci'n de todos.

8.J.1. 23presiones.
,as e3presiones est"n e3plcita ente pro0ectadas para generar salida. Su sinta3is es la siguiente7
<-' e9p esion ->

,a e3presi'n debe ser una e3presi'n v"lida 0 co pleta en cualquiera de los lengua.es scripting que -a0an sido especi!icados para la p"gina. 2l e!ecto de este ele ento es evaluar la e3presi'n especi!icada 0 sustituir el resultado en la salida de la p"gina en el lugar donde est" el ele ento en cuesti'n. (lgunas e3presiones v"lidas son7
<-' Mat%&;@ -> <-' ABC ->

Si la p"gina inclu0era la declaraci'n de un todo lla ado factorial(int n mero) que devolviera el !actorial del entero que se le pasa co o argu ento, podra os escribir la siguiente e3presi'n7

<-' 1acto ial#D$ ->

2stos tres e.e plos devuelven valores nu ricos, pero N! (A, RES R-CC-!NES para los tipos de valores que puede devolver una e3presi'n, as puede devolver n4 eros, caracteres, #ooleans... *odos los resultados de las e3presiones son convertidas a cadena de caracteres antes de ser a%adidas a la salida de la p"gina.

8.J.8. Scriptlets.
:n scriptlet puede contener sentencias del lengua.e scripting v"lido para la p"gina que son evaluadas por sus e!ectos laterales 0a que no generan auto "tica ente salida co o las e3presiones. Su sinta3is es la siguiente7
<- sc iptlet ->

:n scriptlet puede de.ar abierto uno o "s bloques de sentencias, los cuales deben ser cerrados en scriptlets posteriores en la is a p"gina. 2n el caso de que el lengua.e scripting sea Java, los bloques de sentencias son abiertas ediante KLK 0 cerradas ediante el KMK. :n scriptlet de una p"gina se e.ecutar" para cada solicitud recibida de esa p"gina. (s, si en un scriptlet se crea un ob.eto, se crear" un ob.eto por cada solicitud de esa p"gina, 0 se podr" acceder a l, al igual que a cualquier variable de!inida en un scriptlet, en subsiguientes scriptlet 0 e3presiones en la is a p"gina. 2s posible controlar el alcance de una variable aprovec-"ndose de la posibilidad que o!rece JSP de de.ar bloques de c'digo abierto a lo largo de uc-os scriptlets. =ea os esto con un e.e plo.
<%tml> <bod4> <%/>6le ta @nt uso</%/> <p>>nt ada no auto iEada, cu sando econocedo es&&&</p> <% 0ame0rid grid=0ame0rid.get0ame0rid(); 1 2e"ono"edor r, = ne* 2e"ono"edor(ne* 3oordinates(grid/./.)); 2e"ono"edor r4 = ne* 2e"ono"edor(ne* 3oordinates(grid/,../,..)); r,.en"uentraPrograma("5oni"); r4.en"uentraPrograma("5oni"); %> <%0>>stado</%0> <ul> <li>; ime =econocedo F<%= r,.informe6stado() %> <li>Se!undo =econocedo F<%= r4.informe6stado()%> </ul> <% 7 %> *i+el de ale taF<% grid.nivel8lerta() %> </bod4> </%tml>

2n este e.e plo, los ob.etos r( 0 r) creados en el pri er scriptlet s'lo son accesibles desde que son creados -asta el pen4lti o scriptlet donde se cierra el bloque en el que se -allan. 2sto ocurre debido a c' o es traducido el contenido de una p"gina JSP en el c'digo !uente del servlet. 2l contenido est"tico, co o el c'digo )*+,, es traducido en sentencias Java que i pri en

ese te3to co o salida del servlet. 5gual ente las e3presiones son traducidas en sentencias Java que eval4an la e3presi'n, convierten el resultado en una cadena, e i pri en ese valor co o salida del servlet. $on los scriptlets ocurre que no -ace ninguna traducci'n 0 son directa ente insertados en el c'digo del servlet.

ELEMENTOS SCRIPTING EN JSP


Tipos de scripting Sintaxis Declaraciones &-presiones Qu acen! 345 declaraci"n 46 3 48 e-presi"n 46 Definen varia!les 1 m7todos del se +let. Pueden ser accesi!les desde cualquier punto de la p ina. 0o eneran salida. &val2an la e-presi"n 1 envan el valor resultante a la salida. 9eneran salida. :acen uso de m7todos 1 varia!les definidos anteriormente en otro sc iptleto en cualquier parte de la p ina en una declaraci"n. Pueden enerar salida.

Sc iptlets

34 sc iptlet 46

8.N $ontrol de !lu.o.


2sta capacidad de los scriptlets de introducir bloques de sentencia sin cerrarlos puede ser usada en las p"ginas JSP para a!ectar al !lu.o de control a travs los diversos ele entos, est"ticos o din" icos, que gobiernan la salida de la p"gina.

8.N.1. $ondiciones.
Pode os usar las sentencias if, con las cl"usulas opcionales else if 0 else para introducir condiciones en el c'digo de la p"gina. =e" oslo con un e.e plo7
<% if (-<.) 1 %> <p> Lo siento, no puedo calcula el 1acto ial de un nGme o ne!ati+o&</p> <% 7 else if (->4.) 1 %> <p> Lo siento, los a !umentos ma4o es de 05 pueden causa un e o de (o+e 1loH(</p> <% 7 else 1 %> <p ali!n'cente ><%= -%>! ' <%= fa"t(-) %><$p> <% 7 %>

2n este e.e plo ve os que el uso de sentencias de condici'n en los scriptlet per ite gobernar que c'digo est"tico )*+, va a ser pasado a la salida de la p"gina.

8.N.1. 5teraci'n.
/el is o odo pode os utili&ar en los scriptlets las sentencias de iteraci'n for, while 0 do*while, para a%adir contenido iterativo a una p"gina JSP, ve" oslo con un e.e plo donde se crea una tabla.
<table> <t ><t%><i>9</i></t%><t%><@>9</@>! </t%></t > <% for (long -=.; -<=,9; -++) 1 %> 3tr63td6 <%= - %> </td><td> <%= fa"t(-) %> </td></t > <% 7 %> </table>

8.O $o entarios.
,os co entarios son lneas de te3to que se inclu0en en el c'digo de un progra a para aclarar qu es lo que se pretende -acer. 2n JSP tene os tres aneras di!erentes de introducir co entarios.

8.O.1. $o entarios contenidos.


Son co entarios que aparecen en la salida de la p"gina. Su sinta3is es la siguiente7
<!IIcomment II>

Podemos incluir contenido dinmico en estos comentarios.


<!II>l 1acto ial de 05 es <%= fa"t(4.) %> II>

8.O.1. $o entarios JSP.


,os co entarios JSP son independientes del tipo de contenido producido por la p"gina. *a bin son independientes del lengua.e scripting usado por la p"gina. 2stos co entarios pueden ser vistos 4nica ente e3a inando el !ic-ero JSP, 0 su sinta3is es7
<-II comment II>

&l cuerpo de este comentario es i norado por el contenedor JSP. +uando la p ina es compilada en un servlet, cualquier cosa que apare&ca entre estos dos deli itadores es obviada ientras se traduce la p"gina en el c'digo !uente del servlet.

8.O.8. $o entarios del lengua.e scripting.


Pode os utili&ar los scriptlets para introducir co entarios del tipo del lengua.e scripting que se est utili&ando. Para el caso "s corriente de lengua.e Java, la sinta3is quedara7
<- /B comment B/ ->

&stos comentarios no aparecern en la salida de la p ina$ pero aparecern en el c"di o fuente enerado para el servlet. ;na e-presi"n JSP que conten a s"lo un comentario$ pero nin una e-presi"n en len uaje scripting, no ser" v"lida 0 nos dar" un error de co pilaci'n. Java nos o!rece una segunda !or a de poner un co entario ediante los

caracteres HH que to a por co entario todo lo que -a0 desde este deli itador -asta el !in de la lnea.
Dos al cuad ado es i!ual a <% = 4:4 %> // Ja4a e8emplo estGpido!!

TIPOS "E COMENT#RIOS EN JSP


Tipos de co$entarios Sintaxis +ontenidos Del len uaje sc iptin! De JSP

Scope %d&nde aparecen' 35-- comentario --6 3 4-- comentario -6 3 4 => comentario >= 6

<orman parte de la salida. S"lo aparecen en el c"di o JSP (los i nora el contenedor JSP). .parecen en el c"di o JSP 1 en el se +let&

J.1 <b.etos i plcitos.


&l contenedor JSP ofrece un conjunto de o!jetos internos a la p ina del autor. Se les llaman o!jetos implcitos porque su disponi!ilidad en una p ina JSP es automtica? el creador de una p ina puede asumir que estos o!jetos estn presentes 1 accesi!les mediante elementos sc iptin! JSP. @s concretamente$ estos o!jetos sern automticamente asi nados a nom!res de varia!les especficas en el len uaje sc iptin! de la p ina. .dems cada o!jeto implcito de!e unirse a la correspondiente .PA en forma de una clase Java especfica o definici"n de interface. #as clases correspondientes se pueden consultar en el manual que provee Sun ;i"ros%stems. @s concretamente$ estos o!jetos sern automticamente asi nado a nom!res de varia!les especficos en el len uaje sc iptin! de la p ina. JSP ofrece nueve o!jetos implcitos a rupados en cuatro cate oras principales: - B!jetos relacionados con el se +let de la p ina: pa!e, con1i!. - B!jetos relacionados con la salida o entrada de la p ina: e?uest, esponse, out. - B!jetos que proporcionan informaci"n del conte-to dentro del cual la p ina est siendo procesada: session, application, pa!e3onte9t. - B!jetos resultantes de errores: e9ception. Andependientemente de esta clasificaci"n$ cuatro de estos o!jetos implcitos: e?uest, session, application 1 pa!e3onte9t tienen al o en com2n: la capacidad de almacenar 1 devolver valores de atri!utos. .s$ mediante el acceso en lectura 1 escritura de estos atri!utos$ estos o!jetos son capaces de transferir informaci"n entre p inas JSP 1 se +lets como un simple mecanismo de almacenamiento de datos. Para las clases e interfaces de estos cuatro o!jetos e-isten una serie de m7todos estndar para el manejo

de los atri!utos nom!rados anteriormente$ 1 aparecen en la ta!la si uiente:

Mtodos de $ane(o de atri)utos*


Mtodo "escripci&n

set6tt ibute#Ke4, +alue$ .socia el valor de un atri!uto con una clave (Ce1). !et6tt ibute*ames#$ Devuelve los nom!res de todos los atri!utos asociados con la sesi"n. !et6tt ibute#Ke4$ Devuelve el valor del atri!uto asociado a la clave (Ce1). emo+e6tt ibute#Ke4$ &limina el valor del atri!uto asociado a la clave (Ce1).

J.1.1 <b.etos relacionados con el servlet.


,os dos ob.etos i plcitos en esta categora est"n !unda entados en la i ple entaci'n de las p"ginas JSP en un se +let. &l o!jeto implcito pa!e representa el el se +let mismo$ mientras que el o!jeto implcito con1i! almacena los parmetros de iniciali'aci"n del se +let$ en caso de que e-ista al uno.

<b.eto page.
;epresenta un ob.eto de la clase se +let en la que la p ina ha sido traducida$ 1 como tal$ puede ser usado para llamar a cualquiera de los m7todos definidos para esta clase. &s un o!jeto raramente utili'ado 1 por lo tanto no diremos nada ms de 7l.

<b.eto config.
2s un ob.eto que al acena datos de con!iguraci'n del se +let en el que la p ina JSP es compilada. &ste o!jeto tampoco se utili'a mucho por lo que no entraremos ms en 7l.

J.1.1 <b.etos relacionados con la salida o la entrada de la p"gina.


2stos ob.etos est"n en!ocados en la entrada 0 salida de una p"gina JSP. +"s concreta ente, el ob.eto e?uest representa los datos que vienen en la p ina$ mientras que esponse representa su resultado. &l o!jeto out representa la actual cadena de salida asociada con esponse$ en la que el contenido de la p ina es escrito.

<b.eto re+ est.


;epresenta la solicitud que lan&' el proceso de la actual p"gina. Para las solicitudes )**P, este ob.eto proporciona acceso a toda la in!or aci'n asociada con una solicitud, inclu0endo su !uente, el :;, solicitado, 0 cualquier cabecera, cooKie o parmetro asociado con la solicitud. &s uno de los cuatro o!jetos que soportan atri!utos mediante los si uientes m7todos:

Mtodos para acceder a +os par,$etros de+ re-uest


Mtodo "escripci&n !et;a amete *ames#$ Devuelve el nom!re de todos los parmetros de la solicitud. !et;a amete #name$ Devuelve el primer valor de un parmetro de la solicitud. !et;a amete Jalues#name$ Devuelve todos los valores de los parmetros de la solicitud. &-isten ms m7todos asociados a este o!jeto$ 1 se pueden ver en el manual de Sun ;i"ros%stems.

<b.eto response.
;epresenta el la respuesta que ser" enviada al usuario co o resultado del procesado de la p"gina JSP. 23isten uc-os todos asociados a este ob.eto 0 de nuevo re ito al anual.

<b.eto o t.
;epresenta la cadena de salida de la p"gina. 2s un ob.eto particular ente interesante 0a que nos per ite acceder a la salida que ve el usuario. )ereda todos los todos est"ndar H ite#$ proporcionado por 8a+a&io&L ite 1 tam!i7n implementa todos los m7todos p int#$ 1 p intln#$ definidos por 8a+a&io&; intL ite . ;n ejemplo de uso del o!jeto out sera el si uiente.
<;>3ontando %ue+os <% int "ontados=.;

Dhile (carton.ten aBtro()) E contadosFF? out.print(G.G)? H 46


<B=> Ha4 <%= "ontados %> %ue+os&

&l sc iplet en este ejemplo va contando huevos 1 a medida que cuenta uno$ accede al o!jeto out con el m7todo p int#$ para escri!ir un punto en la cadena de salida de la p ina. ;na importante ventaja de este o!jeto es la posi!ilidad de enerar salida sin tener que salir del cuerpo de un sc iptlet. :asta ahora no era posi!le enerar salida desde un sc iptlet$ pero accediendo al o!jeto implcito out$ 1 ms concretamente a sus m7todos$ esto 1a ser posi!le. De nuevo e-isten numerosos m7todos ms de los vistos que pueden ser consultados en el manual.

J.1.8.@ <b.etos conte3tuales. (5r al ndice)


2stos son ob.etos que per ite a la p"gina acceder al conte3to en el cual est" siendo procesada. 2l ob.eto session representa el conte-to para la solicitud a la cual la p ina est respondiendo$ mientras que application$ es un o!jeto que representa el conte-to referente al servidor en el que la p ina se est ejecutando. Por 2ltimo$ el o!jeto pa!e3onte9t est centrado en el conte-to de la p ina en s mismo.

<b.eto session.
;epresenta una sesi'n actual de usuario. *odas las solicitudes -ec-as por un usuario que son parte de una 4nica serie de interacciones con el servidor, se considera que son parte de una sesi'n. +ientras que nuevas peticiones de ese usuario sigan siendo recibidas por el servidor, la sesi'n persiste. Si, sin e bargo, pasa un periodo de tie po sin ninguna solicitud desde el usuario, la sesi'n ter ina. #os m7todos asociados a este o!jeto nos permitirn acceder a: el identificador de la sesi"n$ la hora en la que la sesi"n empe'"$ la hora a la cual se reci!i" la 2ltima petici"n$... Junto con el o!jeto e9ception$ son los 2nicos que no estn automticamente disponi!les para todas las p inas JSP. &l acceso a este o!jeto est restrin ido a las p inas que participan en la administraci"n de sesi"n. &sto se indica por medio del atri!uto session de la directiva pa!e. +ierto es$ que por defecto$ todas las p inas participan en la administraci"n de sesi"n$ pero si el atri!uto session de la directiva pa!e est fijado como null$ no se podr acceder a el o!jeto session.

<b.eto application.
;epresenta la aplicaci'n a la que la p"gina JSP pertenece, re!erente al servidor en el que la p"gina est" siendo e.ecutada. #os m7todos asociados a este o!jeto$ nos permitirn acceder a diversa informaci"n referente al contenedor se +let$ a los recursos del servidor representados como nom!res de ficheros 1 ;I#s... #a lista de m7todos se puede consultar en el manual.

<b.eto pageConte,t.
2ste ob.eto proporciona acceso a todos los otros ob.etos i plcitos. Para los ob.etos que soportan atributos, el ob.eto pa!e3onte9t proporciona m7todos para acceder a dichos atri!utos. .dems implementa m7todos para transferir el control desde la p ina actual a otra p ina. #os m7todos para acceder a los otros o!jetos son los si uientes:

Mtodos de +a c+ase pageContext para e+ acceso a o)(etos JSP


Mtodo "escripci&n !et;a!e#$ Devuelve el o!jeto se +let de la p ina actual

!et=e?uest#$ Devuelve el o!jeto request que inici" el proceso de la p ina actual. !et=esponse#$ Devuelve el o!jeto esponse de la p ina actual. !etOut#$ Devuelve el o!jeto out de la p ina actual. !etSession#$ Devuelve el o!jeto session asociado a la p ina actua !etSe +let3on1i!#$ Devuelve el o!jeto con1i! del se +let actual. !etSe +let3onte9t#$ Devuelve el o!jeto application asociado al se +let de la p ina. !et>9ception#$ Para errores de p ina devuelve la e9ception pasada a la p ina. #os m7todos para transferir el control sern: Mtodo "escripci&n 1o Ha d#pat%$ &nva el proceso a otro ;I# local. include#pat%$ Anclu1e a la salida del proceso otro ;I# local. .dems e-isten otros m7todos relacionados con el acceso a los atri!utos 1 que podemos consultar en el manual.

Mtodos de +a c+ase pageContext para trans.erir e+ contro+*

J.1.J <b.etos para el

ane.o de errores.

2sta categora tiene un 4nico ob.eto i plcito, e9ception$ 1 proporciona m7todos para el manejo de errores dentro de JSP.

<b.eto e,ception.
Junto con el atributo session son los 2nicos o!jetos implcitos que no son automticamente accesi!les por cualquier p ina JSP. S"lo aquellas que ha1an sido desi nadas como e o pa!es usando el atri!uto is> o ;a!e de la directiva pa!e. #os m7todos asociados a este o!jeto nos permitirn acceder a la informaci"n referente a los posi!les errores que ha1an podido sur ir.

Mtodos asociados a+ o)(eto exception*


Mtodo "escripci&n !etMessa!e#$ Devuelve un mensaje descriptivo del error asociado a la e-cepci"n. toSt in!#$ Devuelve un st in! com!inando el nom!re de la clase de la e-cepci"n con su mensaje de error.

J.1 (cciones.

(5r al ndice)

,as acciones eran la cuarta 0 4lti a categora principal de las etiquetas JSP. ,as otras tres eran las directivas, ele entos sc iptin! 1 los comentarios. #as acciones tienen tres caractersticas principales. #a primera es que nos permiten transferir el control entre p inas. #a se unda es que soportan las especificaciones para los applets de Java de una manera independiente del nave ador. Por 2ltimo$ las acciones permiten a las p inas JSP interactuar con los o!jetos ,a+aBean que residen en el servidor.

J.1.1 forward.
,a acci'n <8spF1o Ha d> se usa para transferir el control de una p ina JSP a otra locali'aci"n del servidor local. #a sinta-is es la si uiente:
<8spF1o Ha d pa!e'(local<=L( />

&l atri!uto pa!e se usa para especificar la locali'aci"n a la que se le transferir el control$ de forma que si en una p ina JSP se lle a a una acci"n 1o Ha d cualquier contenido enerado por la p ina actual ser descartado$ 1 el proceso de la solicitud empe'ar de nuevo en la locali'aci"n alternativa. +on la acci"n 1o Ha d tenemos la posi!ilidad de dar valores de atri!uto en tiempo de respuesta mediante el uso de e-presiones.
<8spF1o Ha d pa!e'< <%= "mensaje"+ "odigo6stado + ".!tml" %> M />

+ada ve' que la p ina sea procesada$ esta e-presi"n ser evaluada por el contenedor JSP. Para el caso de que el control sea transferido a otra p ina JSP$ el contenedor JSP asi nar automticamente un nuevo o!jeto pa!e3onte9t a esta p ina. #os o!jetos e?uest 1 session$ sin em!ar o$ sern los mismos para am!as p inas. &l o!jeto application puede o no puede ser el mismo dependiendo de si am!as p inas pertenecen a la misma aplicaci"n. +omo el o!jeto e?uest es i ual para am!as p inas$ es posi!le especificar nuevos parmetros que sean disponi!les para la p ina a la que se le transfiere el control a trav7s del uso de <8spFpa am> dentro de cuerpo de la acci"n <8spF1o Ha d>.
<8spF1o Ha d pa!e'(local<=L(> <8spFpa am name'(pa amet o/( +alue'(+alo ;a amet o/( /> <8spFpa am name'(pa amet o0( +alue'(+alo ;a amet o0( />

&&&&&&& <8spFpa am name'(pa amet o*( +alue'(+alo ;a amet o*( /> </8spF1o Ha d>

J.1.1 incl de.


2sta acci'n per itir" incorporar el contenido generado por otro docu ento local a la salida de la p"gina actual.
<8spFinclude pa!e'(local<=L( 1lus%'(t ue(/>

&n este caso$ al lle ar a una acci"n include en nuestra p ina JSP$ el control es transferido a la p ina se,alada por el atri!uto pa!e$ se inclu1e el contenido enerado por esta p ina 1 se devuelve el control a la p ina principal justo despu7s de donde apareci" la etiqueta <8spFinclude>. &sta acci"n tam!i7n permite dar valores al atri!uto pa!e en tiempo de respuesta. .l i ual que con las p inas que se acceden va <8spF1o Ha d>$ a las p inas JSP procesadas a partir de un <8spFinclude> se les asi nar un nuevo o!jeto pa e+onte-t$ pero compartirn los mismos o!jetos e?uest 1 session. A ualmente al o!jeto e?uest tam!i7n se le pueden a,adir nuevos parmetros mediante la etiqueta <8spFpa am>.
<8spFinclude pa!e'(local<=L( 1lus%'(t ue(> <8spFpa am name'(pa amet o/( +alue'(+alo ;a amet o/( /> <8spFpa am name'(pa amet o0( +alue'(+alo ;a amet o0( /> <8spFpa am name'(pa amet o*( +alue'(+alo ;a amet o*( /> </8spFinclude>

J.1.1 pl g-in.
,a acci'n <8spFplu!in> se usa para enerar :J@# especfico del nave ador para especificar applets Java. De!ido a que JSP est centrado en el lado del servidor$ no entraremos en los detalles de esta acci"n que est orientada al lado del cliente.

J.1.1 2tiquetas de 'eans.


JSP proporciona tres di!erentes acciones para interactuar con ,a+aBeans en residentes en el servidor <8spFuseBean>$ <8spFset; ope t4>$ <8spF!et; ope t4>. &stas acciones son mu1 importantes pues nos permiten reali'ar un dise,o centrado en los componentes$ 1 por lo tanto separar la l" ica de presentaci"n de la l" ica de aplicaci"n. #os dos pr"-imos temas se centrarn en los beans 1 en estas acciones.
(Ar al ndice)

.. USAND! C!M/!NEN ES DE 0S/


&l uso de los sc iptlets 1 de las e-presiones vistos en el tema anterior nos permitirn a,adir contenido dinmico a una p ina De!. Sin em!ar o$ el uso de estos elementos$ carece de la ele ancia de una separaci"n entre la presentaci"n 1 la implementaci"n 1a que e-i e conocimientos de Java a los dise,adores. JSP proporciona un m7todo centrado en los componentes$ de dise,o de p inas De! dinmicas. JSP nos permite interactuar con o!jetos Java sin tener que sa!er nada de Java$ simplemente con el uso de etiquetas.

N.1 2l

odelo de co ponentes de JSP.

&l modelo de componentes de JSP est centrado en unos componentes so1tHa e llamados ,a+aBeans. .ntes de entrar en detalle en estos ,a+aBeans vamos a ver un poco en qu7 consiste la arquitectura !asada en componentes. &n una arquitectura !asada en componentes$ estos componentes son elementos so1tHa e autocontenidos 1 reutili'a!les. De cara al e-terior se comportan como cajas ne ras de la que conocemos qu7 hace pero no c"mo lo hace. &sta caracterstica$ convierte a los componentes en elementos reutili'a!les no especficos de nin una p ina en concreto. #a principal ventaja de este tipo de arquitectura es la separaci"n entre los aspectos meramente de presentaci"n 1 los relacionados con la implementaci"n. #os dise,adores de p inas De! pueden reali'ar p inas de contenido dinmico$ sin tener que tener un conocimiento e-haustivo del len uaje sc iptin! que est7 utili'ando la p ina (normalmente Java). @ientras que un pro ramador s"lo tendr que ir desarrollando componentes$ indicando c"mo se puede acceder a ellos. +omo vemos$ una arquitectura !asada en componentes permitir la divisi"n de la!ores en el tra!ajo de desarrollo de una p ina De! de contenido dinmico.

N.1 >unda entos de los Java'eans%


#os ,a+aBeans son componentes soft*are escritos en Java que deben cumplir una serie de especificaciones detalladas en la =ava>ean 8P?. ;sando una serie de etiquetas que nos proporciona JSP$ podremos acceder a estos Beans 1 por lo tanto a las utilidades que nos ofrecen sin tener que conocer nada de Java.

$ontenedor 'ean.
&l contenedor Bean es una aplicaci"n$ len uaje de pro ramaci"n o entorno que permite a los dise,adores llamar a los Beans$ confi urarlos 1 acceder a su informaci"n 1 comportamiento. &s este contenedor el que permitir el uso de los Beans en una p ina JSP.

Propiedades de los 'eans.


#os Beans estn caracteri'ados por una serie de atri!utos a los que llamamos propiedades. &l contenedor Bean nos permitir acceder a ellos en tiempo de ejecuci"n para controlar el comportamiento del Bean. &stas propiedades sern el 2nico mecanismo que el contenedor Bean usa para e-poner el Bean al e-terior. Kui' se vea todo esto ms claro con un ejemplo. Supon amos que tenemos un peque,o pro rama en Java que ha cumplido todos los requisitos para ser un Bean. &ste pro rama servir para dar la predicci"n de la temperatura en los pr"-imos cinco das: m-ima temperatura pronosticada 1 mnima temperatura pronosticada. +ada uno de estos datos ser una propiedad de nuestro Bean al que llamaremos ; edicBean: ma9Temp 1 minTemp Btra propiedad ser el c"di o postal de la 'ona del pas de la que queremos conocer los pron"sticos$ codi!o;ostal. #a naturale'a de las propiedades (p ope t4) depender de cada Bean 1 as encontraremos propiedades a las que s"lo podremos acceder en lectura$ o s"lo en escritura$ o incluso en lectura 1 escritura. &n nuestro ejemplo$ es l" ico pensar que las propiedades ma9Temp 1 minTemp sern confi uradas como de s"lo lectura$ mientras

que codi!o;ostal ser confi urada o como de s"lo escritura$ o como de escritura 1 lectura.

Propiedades trigger 0 lin.ed.


.l unas propiedades son usadas para lan'ar el comportamiento de un Bean. Son propiedades tales que al acceder a ellas (!ien sea en lectura o en escritura) provocan que el Bean realice una operaci"n. &n el ejemplo ; edicBean una propiedad t i!!e sera codi!o;ostal$ al modificarla$ el Bean respondera hallando la predicci"n (no nos importa c"mo lo hace) para la 'ona de ese c"di o postal. .dems$ diremos que las propiedades ma9Temp 1 minTemp junto con la propiedad codi!o;ostal son propiedades linKed$ 1a que al modificar esta 2ltima$ se modifican las dos primeras.

Propiedades inde,ed.
Son propiedades que almacenan una colecci"n de valores. #a forma de acceder a ellas ser a partir de un ndice$ de ah que se llamen propiedades inde9ed. &n nuestro caso$ como la predicci"n es la de los pr"-imos cinco das$ am!as propiedades relativas a la temperatura sern propiedades inde9ed cu1o ndice ir de L a /$ apuntando a cada uno de los cinco das. +on respecto a las propiedades inde9ed ha1 que decir que no todos los contenedores Bean proporcionan mecanismos que nos permitan tra!ajar con estas propiedades mediante etiquetas normales. &sto no si nifica que no podamos utili'arlas$ sino que para poder hacerlo tendremos que recurrir a los sc iptlets JSP$ las e-presiones JSP o las etiquetas de cliente.

*ipos de datos de las propiedades.


#as propiedades de los Beans pueden almacenar cualquier tipo de dato primitivo de Java como int o double$ as como o!jetos Java tales que St in!s o Dates. Ancluso pueden almacenar o!jetos definidos por el usuario e incluso otros Bean. +on los sc iptlets JSP 1 las e-presiones JSP referenciamos las propiedades por el tipo de dato Java. Si una propiedad almacena un entero$ nosotros le enviaremos enteros 1 leeremos enteros. Sin em!ar o$ con las etiquetas Bean$ trataremos a las propiedades como si almacenaran un st in!. +uando accedemos a una propiedad en escritura$ le pasamos un st in!$ 1 cuando leemos el contenido$ estamos le1endo un st in!.

Andependientemente del tipo de dato que almacene una propiedad de un Bean$ cuando accedemos a ellos mediante etiquetas Bean &SJ.@BS .++&DA&0DB . D.JBS D& JAPB st in!.
&l contenedor JSP reali'a automticamente todas las conversiones de tipo necesarias. +uando accedemos en escritura a una propiedad que almacena un entero$ el contenedor JSP reali'a las llamadas Java necesarias para convertir las series de caracteres num7ricos que le damos$ en un valor entero. ;na opci"n inteli ente que puede tomar el dise,ador de Beans es controlar el valor de

las propiedades$ aceptando valores st in! para propiedades no st in! 1 reali'ar ellos mismos la conversi"n. &sto ser o!li atorio para valores que no correspondan a un tipo primitivo Java.

N.8 2tiquetas 'eans de JSP.


;na ve' que hemos entendido en qu7 consiste la arquitectura !asada en componentes es el momento de entrar en detalle en los ,a+aBeans 1 ms concretamente en las etiquetas JSP que nos permiten acceder a las propiedades de estos. &stas etiquetas se conocen como &tiquetas Bean de JSP.

N.8.1 (ccediendo a los co ponentes JSP.


#o primero que tenemos que hacer para poder utili'ar un Bean en la p ina JSP$ es decirle a 7sta d"nde encontrar el fichero Java class que define al Bean 1 asi narle un nom!re. 0o ha1 que perder de vista que un Bean no es ms que una clase Java que por el hecho de cumplir una serie de especificaciones el contenedor Bean permitir a la p ina JSP acceder a ellos$ o ms !ien$ a los valores almacenados en sus propiedades$ mediante una serie de etiquetas similares al resto de etiquetas de JSP. Veamos cul es la etiqueta que nos permitir hacer esto.

,a etiqueta7 /&sp0 se'ean1


#a etiqueta <8spFuseBean> dice a la p ina que queremos hacer a un Bean disponi!le para la misma. &sta etiqueta aparece de dos formas? la primera en forma de una etiqueta vaca:
<8spFuseBean id8Gnom!re del BeanG class8Gnom!re de la clase del BeanG = 6

#a se unda en forma de dos etiquetas$ una de comien'o 1 otra de final$ que encierran a un cuerpo que puede ser usado para especificar informaci"n adicional de confi uraci"n:
<8spFuseBean id8Gnom!re del BeanG class8Gnom!re de la clase del BeanG6 c"di o de iniciali'aci"n </ 8spFuseBean>

Atributos de la etiqueta: <jsp use>ean> 2l atributo id. 2l atributo id sirve para especi!icar el no bre que va os a utili&ar en la p"gina JSP para re!erirnos al 'ean. /ebe cu plir que7 &l nom!re de!e ser 2nico en la p ina. &l primer caracter de!e ser una letra. 0o puede contener espacios$ s"lo letras$ n2meros 1 su! uiones (M). &s sensi!le a las min2sculas 1 ma12sculas. Suelen empe'ar por min2scula. 2l atributo class. 2ste atributo especi!ica el no bre de la clase del Java'ean. )a0 que per itir que la p"gina tenga acceso a esa clase, para ello o bien al re!erirnos a esta clase lo -ace os con su no bre co pleto, inclu0endo el no bre de los

paquetes (pac.age) de clase 0 el no bre de la clase en cuesti'n. Por e.e plo, si la clase de nuestro 'ean, lla ada 2 estro'ean pertenece al pac.age li#reria'eans que a su ve& pertenece al pac.age componentes, su no bre co pleto sera7
componentes&lib e iaBeans&*uest oBean

<tra !or a posible de re!erirnos a la clase del 'ean sin tener que dar el no bre co pleto, es utili&ar el atributo import de la directiva page. (s, si declara os7
<- .pa!e impo t'(componentes&lib e iaBeans&*uest oBean&class( ->

2ntonces podre os re!erirnos a la clase 2 estro'ean en el resto de la p"gina sin tener que re!erenciar los paquetes a los que pertenece. =ea os a-ora algunos aspectos interesantes relativos a este atributo. ,as p"ginas JSP debe os incluirlas en alg4n directorio espec!ico del servidor. 5gual ocurrir" con las clases que utilicen estas p"ginas JSP, si no especi!ica os al servidor que -aga otra cosa, ir" a buscarlas a un directorio espec!ico, 0 por lo tanto las clases deber"n estar en ese directorio. <tro aspecto a recalcar es que las clases que eta os en el directorio en cuesti'n tendr"n que estar 0a co piladas 0 por lo tanto con su e3tensi'n correspondiente %class. Por 4lti o, rese%ar que el -ec-o de que pode os utili&ar varios ob.etos de una is a clase sin "s que utili&ar id distintos para cada uno de ellos. 2l cuerpo de la etiqueta. Pa vi os que se trata de algo opcional cuando usa os la etiqueta /&sp0 se'ean1. 9"sica ente su isi'n consiste en iniciali&ar el 'ean, 0 "s concreta ente sus propiedades. $o o resu en de esta i portantsi a etiqueta, dire os que si escribi os lo siguiente7
<8spFuseBean id'(p onostico( class'(componentes&Lib e iaBeans&; onosticoBean( />

2stare os creando un ob.eto del 'ean dado por la clase Pronostico'ean asign"ndole un identi!icador lla ado pronostico.

#tri)utos de +a eti-ueta /(sp0use1ean2


#tri)uto "escripci&n id class scope #e da un nom!re al o!jeto de la clase Bean que servir para referenciarlo a lo lar o de la vida del Bean. &specifica la clase Java que implementa al Bean &specifica el alcance que tendr el Bean. Puede tomar los valores: pa!e, session, e?uest, application

,a etiqueta7 /&sp0getProperty1
;na ve' que hemos informado a la p ina que vamos a utili'ar un Bean querremos acceder a sus propiedades. Para ello utili'aremos la etiqueta <8spF!et; ope t4>$ que tiene la si uiente sinta-is:
<8spF!et; ope t4 name'(nomb e del Bean( p ope t4'(nomb e de la p opiedad( />

+on esta etiqueta$ accederemos en lectura a la propiedad indicada por el atri!uto

p ope t4 del Bean dado en el atri!uto name. &l valor dado en el atri!uto name de!e coincidir con el se,alado en el atri!uto id de la etiqueta <8spFuseBean> en la que se declara el Bean. #a etiqueta <8spFuseBean> enera contenido en la p ina de salida. Iecordemos que aunque las propiedades de los Beans pueden almacenar cualquier tipo de datos$ al acceder a ellas en lectura mediante etiquetas Bean$ estas nos devolvern un st in!. Supon amos que tenemos una p ina JSP que hace uso del Bean mi%o a$ el cual posee una propiedad de s"lo lectura llamada %o a que nos devuelve la hora actual. #a forma de acceder a este Bean es como si ue.
<jsp use>ean id="mi!ora" "lass=""omponentes.@ibreria>eans.#ora>ean"> <%tml> <bod4> >l Bean dice ?ue la %o a actual esF < jsp getPropert% name="mi!ora" propert%="!ora" $> <%tml> <bod4>

&ste c"di o JSP enerara el si uiente c"di o :J@# en el lado del usuario.
<%tml> <bod4> >l Bean dice ?ue la %o a actual esF //FA/ am <%tml> <bod4>

;n aspecto mu1 importante de las etiquetas Bean es que podemos usarlas para controlar atri!utos de :J@#$ 1 as$ si contramos con un Bean con una propiedad andomcolo que al acceder a ella$ nos devolviera un c"di o I9N aleatorio (una forma de determinar un color es mediante el c"di o I9N)$ sera totalmente vlido hacer el si uiente acceso a esa propiedad:
<bod4 b!colo '(<jsp getPropert% name=""olor" propert%="random"olor" $>( >

#tri)utos de +a eti-ueta /(sp0getPropert32


#tri)uto "escripci&n name p ope t4 0om!re con el que referenciamos al Bean al que pretendemos acceder. De!e coincidir con el atri!uto id de la etiqueta <8spFuseBean> en la que se declar" el Bean. &specifica la propiedad del Bean a la que queremos acceder en lectura.

,a etiqueta7 /&sp0setProperty1
&sta etiqueta nos servir para modificar el valor de las propiedades de los Beans. Para ello utili'aremos la etiqueta <8spFset; ope t4>$ que tiene la si uiente sinta-is:
<8spFset; ope t4 name'(nomb e del Bean( p ope t4'(nomb e de la p opiedad( +alue'(+alo ?ue pasamos( />

#os atri!utos name 1 p ope t4 tienen el mismo si nificado que para la etiqueta <8spF!et; ope t4>. &l atri!uto +alue es te-to que pasamos a la propiedad$ 1 tam!i7n puede ser calculado en tiempo de ejecuci"n mediante e-presiones JSP. Veamos esto con dos ejemplos i ualmente vlidos.
<8spFset; ope t4 name'(usua io( p ope t4'(%o ast aba8o( +alue'(D5( /> <8spFset; ope t4 name'(usua io( p ope t4'(%o ast aba8o( +alue'(<-' /C B 0 ->( />

;na ve' que un Bean ha sido introducido en una p ina JSP$ la etiqueta <8spFset; ope t4> puede ser utili'ada en cualquier punto del documento$ 1 en tiempo de ejecuci"n se evaluarn secuencialmente. &s importante tener en cuenta que modificar el valor de una propiedad puede dar lu ar a una serie de acciones en el Bean$ esto tiene que ver con lo que vimos so!re propiedades t i!!e $ por ello hemos de ser cuidadosos 1 conocer en detalle c"mo el Bean reacciona ante accesos en escritura de cualquiera de sus propiedades.

#tri)utos de +a eti-ueta /(sp0setPropert32


#tri)uto "escripci&n name p ope t4 +alue 0om!re con el que referenciamos al Bean al que pretendemos acceder. De!e coincidir con el atri!uto id de la etiqueta <8spFuseBean> en la que se declar" el Bean. &specifica la propiedad del Bean a la que queremos acceder en lectura. &s te-to que queremos pasarle como valor a la propiedad. Puede ser directamente te-to$ o incluso una e-presi"n JSP que se evaluar en tiempo de ejecuci"n. Sirve tam!i7n para pasarle un valor a la propiedad$ pero el valor lo toma de los parmetros que se le pasan a la p ina desde la solicitud. &s equivalente a <-' e?uest&!et;a amete #(nomb e del pa 2met o($ ->

pa am

Propiedades inde,ed.
Oa hemos ha!lado de la posi!ilidad de que al una propiedad almacenara un colecci"n de valores. Jam!i7n dijimos que las etiquetas >ean no pueden manejar propiedades indexadas. &sto no si nifica que no podamos contar con ellas$ sino que para su manejo tendremos que hacer uso de los sc iptlets$ e-presiones o etiquetas de cliente JSP. &n este caso$ accederemos al Bean no como un Bean sino como el o!jeto que creamos con la etiqueta <8spFuseBean>. Veamos esto con un ejemplo. Supon amos una clase Bean$ llamada >?uipoBean$ que entre sus propiedades cuenta con una inde-ada llamada 8u!ado es que representa a los once ju adores del equipo inicial. &sta propiedad ser tanto de escritura como de lectura. Anicialmente declararemos al Bean:
<8spFuseBean id'(e?uipo( class'(>?uipoBean( />

+on esto he creado un o!jeto llamado e?uipo de la clase >?uipoBean. Do1 por hecho que se ha definido la clase de forma que el contenedor Bean la reconoce como tal$ 1 por esto$ 1 porque la propiedad inde-ada 8u!ado es es de escritura 1 lectura$ la clase >?uipoBean tendr definida dos m7todos que sern: (1a veremos como esto es as) !et,u!ado es#$ : de acceso en lectura a la lista de once ju adores. set,u!ado es#$ : de acceso en escritura a la lista de once ju adores. Veamos ahora un ejemplo de c"mo acceder en lectura a esta propiedad.
<%tml> <bod4> <8spFuseBean id'(e?uipo( class'(>?uipoBean( /> >l e?uipo inicial esF<b > <<L> <% for(int indi"e=.; indi"e<,,; indi"e++) 1 %>

<li><%= equipo.get=ugadores(indi"e)%> <% 7 %> </<L> </bod4> </%tml>

Sin em!ar o 1a veremos como se pueden dise,ar los Beans para tra!ajar ms fcilmente con las propiedades inde-adas sin tener que hacer uso de los sc iptlets. Para ello los Beans incluirn propiedades que nos permitirn tratar las propiedades inde-adas c"mo si fuera un st in! simple mediante la separaci"n con comas u otro delimitador.

N.8.1 5niciali&ando 'eans.


+uando se e-plic" la sinta-is de la etiqueta <8spFuseBean> vimos c"mo e-istan dos posi!ilidades. &n una de ellas la etiqueta tena un cuerpo que dijimos se utili'a!a para iniciali'ar el Bean.
<8spFuseBean id8Gnom!re del BeanG class8Gnom!re de la clase del BeanG6 c"di o de iniciali'aci"n </ 8spFuseBean>

&sta iniciali'aci"n ocurre s"lamente la primera ve' que el Bean es creado. Por defecto$ esta iniciali'aci"n tendr lu ar cada ve' que se accede a la p ina 1a que un Bean se crea por cada solicitud. Sin em!ar o 1a veremos como un Bean puede ser almacenado 1 retomado desde el entorno del servidor De!$ en cu1o caso no ser necesario que se reinicialice. &l proceso de iniciali'aci"n suele consistir en dar valores a las propiedades mediante la etiqueta <8spFset; ope t4>. +ualquier comando que forma parte del cuerpo es procesado inmediatamente despu7s de que el Bean es creado 1 antes de que sea disponi!le para el resto de la p ina. Por ejemplo:
<8spFuseBean id'(nomb e del Bean( class'(nomb e de la clase del Bean(> <8spFset; ope t4 name'(nomb e del Bean( p ope t4'(nomb e de la p opiedad( +alue'(+alo (> </ 8spFuseBean>

&n el cuerpo de iniciali'aci"n del Bean podemos incluir etiquetas propias de :J@# o !ien sc iptlets JSP. &ste :J@# ser mostrado como parte de la p ina s"lo si el Bean es creado$ si 1a e-istiera no se mostrara.

5niciali&ando 'eans desde la solicitud de la p"gina.


;na importante caracterstica de la etiqueta <8spFset; ope t4> es la posi!ilidad de acceso en escritura a las propiedades en tiempo de ejecuci"n. &sto nos va a permitir iniciali'ar los Beans dinmicamente racias a datos de usuario o sucesos relativos a la solicitud de la p ina. .s$ cumpliendo una serie de re las ser posi!le usar un formulario :J@# para permitir a los usuarios de una forma c"moda dar valores a las propiedades. Veamos c"mo podemos dar valores a propiedades de un Bean a trav7s de un formulario mediante un ejemplo simple. Kueremos calcular el la cantidad anual de dinero que hemos de pa ar al solicitar un pr7stamo. Para ello tenemos que conocer la cantidad prestada$ el inter7s anual 1 el n2mero de a,os a pa ar. &n primer lu ar crearemos el formulario que pide todos estos datos. ; estamo&%tml
<%tml> <bod4> <1o m action'(=esultado; estamo&8sp(> 3antidad de dine o pedidaF<input t4pe'(te9t( name'(p estamo(> Tasa de inte NsF<input t4pe'(te9t( name'(tasa@nte es(> 6Oos de pa!oF<input t4pe'(te9t( name'(anos;a!o(> <input t4pe'(submit( +alue'(3alcula(>

</1o m> </bod4> </%tml>

&ste formulario har una llamada a la p ina JSP =esultado; estamo&8sp pasndole como parmetros: p estamo, tasa@nte es 1 anos;a!o. Si$ por ejemplo$ si se hu!iera rellenado un formulario como el que si ue: +antidad 1QQQQQ de dinero pedida:
N

Jasa de inter7s: 1Q .,os de pa o:


$alcula

&s como si hu!i7ramos hecho la si uiente solicitud:


%ttpF//&&&/=esultado; estamo&8spPp estamo'/55555Qname'CQanos;a!o'/5

.s$ pasaremos los datos o!tenidos en el formulario a la p ina JSP =esultado; estamo. &n esta p ina JSP$ 1 usando la arquitectura !asada en componentes$ llamaremos a un Bean que se encar ar de hacer los clculos. 0osotros no entraremos en c"mo hace estos clculos el Bean 1 nos limitaremos a conocer las propiedades que posee. Tabla de propiedades de Prestamo>ean Nombre Tipo de acceso Tipo Java Ejemplo lectura=escritur p estamo double 1LL.P a tasa@nte e lectura=escritur double .1 s a lectura=escritur anos;a!o int 1L a pa!o6nua lectura St in! 1LL.P l #a propiedad pa!o6nual es una propiedad linKed a las otras$ de forma que ; estamoBean nos devolver la cantidad de dinero anual que hemos de pa ar mediante esa propiedad. Veamos c"mo sera la p ina JSP que manejara este formulario 1 llamara a ; estamoBean para reali'ar los clculos.&s interesante fijarse en c"mo pasa los valores a las propiedades.

=esultado; estamo&8sp
<%tml> <bod4> <%) page import=""omponentes.@ibreria>eans.:" %> <jsp use>ean id="prestamo" "lass="Prestamo>ean" $> <jsp setPropert% name="prestamo" propert%="prestamo" param="prestamo" $> <jsp setPropert% name="prestamo" propert%="tasa?nteres" param="tasa?nteres" $> <jsp setPropert% name="prestamo" propert%="anosPago" param="anosPago" $>

La cantidad de dine o ?ue tienes ?ue pa!a du ante los p R9imo/s <jsp setPropert% name="prestamo" propert%="anosPago" $> aOo/s es de <jsp setPropert% name="prestamo" propert%="pago8nual" $> pesetas& </bod4> </%tml>

Vemos que hemos utili'ado el atri!uto pa am' de la etiqueta <8spFset; ope t4> para pasarle los valores al Bean. &ste atri!uto es equivalente al sc iptlet JSP <-' e?uest&!et;a amete #$>. &n este caso hemos llamado i ual a las propiedades que a los parmetros pasados desde la solicitud. &SJB 0B &S BN#A9.JBIAB$ pero permite una forma de pasar los parmetros ms fcil 1 c"moda$ consistente en omitir el parmetro:
<8spFset; ope t4 name'(p estamo( p ope t4'(p estamo( /> <8spFset; ope t4 name'(p estamo( p ope t4'(tasa@nte es( /> <8spFset; ope t4 name'(p estamo( p ope t4'(anos;a!o( />

Ancluso si$ como es nuestro caso$ tenemos varios campos del formulario que se GmapeanG directamente so!re propiedades Bean podemos hacer uso del caracter QBQ.
<8spFset; ope t4 name'(p estamo( p ope t4'(B( />

&l uso del asterisco indica que toda aquella propiedad del Bean cu1o nom!re se corresponda con el nom!re de un parmetro de la solicitud$ tome el valor de este.

N.8.8 $ontrolando el alcance de los 'eans.


Oa sa!emos que cada ve' que una p ina es solicitada$ se crea un o!jeto Bean. Sin em!ar o$ un Bean puede continuar e-istiendo ms all del alcance de la solicitud de una p ina. &stos Beans se almacenan en el entorno del servidor$ 1 son reutili'ados en varias solicitudes de la misma p ina. &sto nos permitir crear un Bean una ve'$ 1 acceder a 7l a trav7s de la visita de un usuario a nuestro sitio$ 1 as cualquier modificaci"n de una propiedad permanecer mientras el Bean e-ista. &l alcance de un Bean se controla racias al atri!uto scope de la etiqueta <8spFuseBean>. #a ta!la si uiente muestra los posi!les valores que puede tomar este atri!uto.

Valores del atri!uto scope.


Jalo pa!e 6ccesibilidad P ina actual s"lamente. P ina actual 1 cualquier p ina incluida (include) o a la que se le pasa (1o Ha d) el control. Tiempo de +ida :asta que la p ina sea mostrada o el control pasado(1o Ha d) a otra p ina. :asta que la solicitud ha1a sido completamente procesada 1 la respuesta ha1a sido enviada al usuario.

e?uest

#a actual solicitud 1 cualquiera de session las si uientes solicitudes desde la #a vida de la sesi"n del usuario. misma ventana del nave ador. #a actual solicitud 1 futuras applicati solicitudes que sean parte de la #a vida de la aplicaci"n. on misma aplicaci"n De!. 0o entrar7 ms en detalle so!re este aspecto de los Beans. Para profundi'ar ms se puede consultar el manual de usuario de Sun ;i"ros%stem.

&n este captulo se pretende a1udar a crear sus propios Beans para usarlos como componentes as como ense,ar c"mo se implementan.

6. DESA JS%

!""! DE #!$%!NENTES DE

O.1 Qu -ace a un 'ean ser un 'ean?


Oa en en captulo anterior vimos c"mo los Beans no eran ms que clases Java que cumplan una serie de requisitos para que el contenedor Bean los reconociese como un Bean. .s$ las propiedades no eran ms que los m7todos de la clase$ 1 vimos como era posi!le acceder a estos m7todos como se acceden a los m7todos de las clases Java$ 1 as para tratar con propiedades inde-adas$ una posi!ilidad era acceder a ellas como un m7todo:
<li><%= equipo.get=ugadores(indi"e)%>

&n definitiva$ un Bean no es ms que una clase simple Java que si ue una serie de normas simples en el nom!rado de sus m7todos 1 unas convenciones de dise,o perfiladas por las especificaciones de los ,a+aBeans. Si una clase si ue estas normas 1 la tratamos como un Bean$ entonces es un Bean.

O.1.1 $onvenciones 'ean.


#as convenciones ,a+aBean son las que nos capacitarn a usar los Bean 1a que son las que permiten al contenedor Bean anali'ar una clase Java como un Bean e interpretar sus m7todos como propiedades.

,a (P5 Java'ean.
Si se uimos las convenciones especificadas por la .PA ,a+aBean$ permitiremos al contenedor JSP interactuar con los Beans a un nivel pro ramtico$ incluso aunque la aplicaci"n que lo contiene no ten a una comprensi"n real de lo que el Bean hace o c"mo tra!aja. Para JSP$ nos interesar los aspectos de la .PA que dictan c"mo accederemos a las propiedades.

,os 'eans son ob.etos.


Si hemos dicho que un Bean es una clase Java$ entonces una instancia de un Bean no es ms que un o!jeto Java$ 1 por tanto$ siempre tendremos la opci"n de acceder a sus m7todos a trav7s de c"di o Java en otras clases o a trav7s de elementos sc iptin! JSP.

;na instancia de un Bean es un o!jeto Java$ 1 por tanto: SA&@PI& PBDI&@BS .++&D&I . S;S @RJBDBS . JI.V&S D& &#&@&0JBS S3=@;T@*7.

Ror as en el no brado de las clases de los 'eans.


:asta ahora$ a las hora de nom!rar clases Beans hemos introducido la pala!ra Bean en su nom!re$ como: p edicBean$ Ho aBean 1 >?uipoBean. &ste es un m7todo com2n que permitir distin uir aquellas clases que son creadas si uiendo las re las de los Bean. Sin em!ar o$ esto no es o!li atorio.

0o es o!li atorio introducir la pala!ra Bean en el nom!re de la clase.

O.1.1 $onstructores 'ean.


#a primera re la es que el Bean de!e implementar un constructor que no tome nin 2n ar umento. &ste ser el constructor que el contenedor JSP utilice para instanciar el Bean a trav7s de la etiqueta <8spFuseBean>. &n el caso de que la clase no especifique nin 2n constructor$ entonces se asumir un constructor sin ar umentos por defecto.

O.1.8 /e!iniendo una propiedad de un 'ean.


;n aspecto importante de los Beans son sus propiedades 1 so!re todo la forma de acceder a ellas? es lo que llamamos como m7todos de acceso$ tanto en escritura como en lectura. #a forma de definir propiedades de los Beans consiste en crear m7todos public con el nom!re de la propiedad que deseamos definir con el prefijo !et o set dependiendo si es el acceso en lectura o escritura respectivamente. #os m7todos !ette o de acceso en lectura de!eran devolver el tipo apropiado de dato$ mientras que el correspondiente m7todo sette de!era ser declarado +oid 1 aceptar un ar umento del tipo apropiado.
public +oid set; ope t4*ame#; ope T4pe +alue$" public ; ope t4T4pe !et; ope t4*ame#$"

&s o!li atorio declarar public a los m7todos de acceso a las propiedades.

Vamos a ver con un ejemplo todo esto que estamos diciendo. Para ello crearemos el Bean Ho a6ctualBean que nos permitir mostrar la hora actual en nuestra p ina. Ho a6ctualBean&8a+a
pacKa!e com&ta!lib&H8sp&components" impo t 8a+a&util&B" public class Ho a6ctualBean{ p i+ate int %o as" p i+ate int minutos" public Ho a6ctualBean#${ 3alenda noH'3alenda &!et@nstance#$" t%is&%o as'noH&!et#3alenda &HO<=SOTSD6Y$" t%is&minutos'noH&!et#3alenda &M@*<T>$"

) public int !etHo as#${ etu n %o as" ) public int !etMinutos#${ etu n minutos" ) )

Oa est creado nuestro Bean. :emos creado dos propiedades a las que s"lo se puede acceder en lectura$ 1 como hemos se uido las re las ,a+aBean para llamar a los m7todos de acceso$ hemos definido dos propiedades que son accesi!les a trav7s de etiquetas Bean JSP. Por lo tanto es totalmente vlido lo si uiente:
<jsp use>ean id="!ora" "lass="#ora8"tual>ean" $> <%tml> <bod4> Son las <jsp getPropert% name="!ora" propert%="!oras"> 4 <jsp getPropert% name="!ora" propert%="minutos"> minutos </bod4> </%tml>

Ror as en el no brado de las propiedades.


9eneralmente los nom!res de propiedades suelen comen'ar con min2sculas 1 en ma12scula la primera letra de cada pala!ra en el nom!re de la propiedad. Sin em!ar o$ a la hora de llamar a los nom!res de los m7todos de acceso$ se les antepone el prefijo set o !et se uido por el nom!re de la propiedad pero comen'ando en ma12sculas.

O.1.J Propiedades inde3adas.


Oa hemos ha!lado de los pro!lemas que plantean a las etiquetas Bean el uso de propiedades inde-adas. Jam!i7n vimos c"mo tratar este tipo de propiedades$ consistente en tratar al Bean como la clase Java que es 1 acceder a sus propiedades como los m7todos que son. Jenemos dos opciones a la hora de definir una propiedad inde-ada. #a primera consiste en crear un m7todo de acceso que devuelva el conjunto entero de propiedades como un a a4. #a forma de declararlo sera la si uiente:
public Tipo; opiedadUV !et; opiedad#$

#a se unda opci"n es que el acceso no sea a la lista entera$ sino s"lo a uno de los elementos del conjunto$ el indicado por un ndice:
public Tipo; opiedad !et; opiedad#int indice$

&n principio es conveniente declarar am!as formas 1a que no representa mucho ms tra!ajo 1 a,ade la posi!ilidad de un trato ms fle-i!le de las propiedades. &videntemente$ para el acceso en escritura tendramos tam!i7n dos posi!ilidades:
public +oid set; opiedad#int indice, Tipo; opiedad +alo $ public +oid set; opiedad#Tipo; opiedadUV$

;n m7todo particularmente 2til 1 que eneralmente es implementado 1 reconocido por los contenedores Bean es: siEe#$ que nos servir para determinar el tama,o de una propiedad inde-ada:
public int !et; opiedadSiEe#$

+omo las etiquetas Bean JSP manejan e-clusivamente propiedades escalares$ ser preciso valerse de los elementos sc iptin! JSP para tratar con este tipo de propiedades.

O.1.N Propiedades #ooleans.


;na norma a la hora de declarar propiedades que almacenan valores de GverdaderoG o GfalsoG en sus m7todos !ette es anteponerle la pala!ra is:
public boolean is; ope t4#$"

#os m7todos de acceso sette de una propiedad boolean$ sin em!ar o$ no se diferencian de los m7todos sette para otras propiedades.
public +oid set; ope t4#boolean b$"

O.1.O $onversi'n de tipo JSP.


;na propiedad de un componente JSP no est limitada a valores St in!$ pero es importante comprender que todos los valores de propiedades a las que se accede mediante una etiqueta <8spF!et; ope t4> sern convertido en un St in!.

;n m7todo !ette no necesitar devolver un St in! e-plcitamente$ sin em!ar o$ el contenedor JSP convertir automticamente el valor de retorno en un St in!.

Para los tipos primitivos Java$ la conversi"n es manejada por los m7todos mostrados en la si uiente ta!la:

Con4ersi&n de tipo para /(sp0getPropert32


Tipo de +a propiedad Con4ersi&n a String boolean b4te c%a double int 1loat 8a+a&lan!&Boolean&toSt in!#boolean $ 8a+a&lan!&B4te&toSt in!#b4te$ 8a+a&lan!&3%a acte &toSt in!#c%a $ 8a+a&lan!&Double&toSt in!#double$ 8a+a&lan!&@nte!e &toSt in!#int$ 8a+a&lan!&Tloat&toSt in!#1loat$

lon!

8a+a&lan!&Lon!&toSt in!#lon!$

Del mismo modo$ todos los m7todos de acceso sette accedidos con una etiqueta <8spFset; ope t4> ser automticamente convertido de un St in! al tipo nativo apropiado por el contenedor JSP. &sto es llevado a ca!o mediante los m7todos si uientes:

Con4ersi&n de tipo para /(sp0setPropert32


Tipo de +a propiedad Con4ersi&n desde String boolean " Boolean b4te " B4te c%a " 3%a acte double " Double int " @nte!e 1loat " Tloat lon! " Lon!

8a+a&lan!&Boolean&+alueO1#St in!$ 8a+a&lan!&B4te&+alueO1#St in!$ 8a+a&lan!&3%a acte &+alueO1#St in! $ 8a+a&lan!&Double&+alueO1#St in!$ 8a+a&lan!&@nte!e &+alueO1#St in!$ 8a+a&lan!&Tloat&+alueO1#St in!$ 8a+a&lan!&Lon!&+alueO1#St in!$

#as propiedades no estn restrin idas a tipos primitivos. Si utili'ramos o!jetos$ ser preciso$ si es que no e-iste el m7todo Java que lo ha a$ que declaremos m7todos para pasar el o!jeto a St in! 1 viceversa.

+ane.ando propiedades con valores nulos.


#os m7todos !ette para tipos primitivos Java como int o double no pueden devolver un valor null$ esto s"lo es vlido para m7todos que devuelven o!jetos. Sin em!ar o ha1 situaciones en las que el valor de una propiedad realmente est indefinido. SKu7 podemos hacerT. ;na opci"n es crear un m7todo que devuelva un valor boolean que di a si el valor que almacena la propiedad es vlido. .s$ si definimos un m7todo de lectura !etLectu aTempe atu a 1 otro isJalidaLectuTempe que devuelva t ue en caso de que el valor almacenado por la propiedad Lectu aTempe atu a sea vlido$ nos !astar acceder al valor boolean para sa!er si el valor almacenado por la propiedad Lectu aTempe atu a es vlido.

O.1.S $on!igurando 'eans.


@uchas veces un Bean requerir ser confi urado en tiempo de ejecuci"n por la p ina que lo est iniciali'ando antes de que realice adecuadamente su tarea. ;na forma de hacer esto es aprovechando el cuerpo de la etiqueta <8spFuseBean>:
<8spFuseBean id8Gnom!re del BeanG class8Gnom!re de la clase del BeanG6 c"di o de iniciali'aci"n

</ 8spFuseBean>

Btra posi!ilidad es acceder en escritura a la propiedad en cualquier punto de la p ina pero siempre antes de que sea accedida en lectura. Ancluso podramos definir un constructor de Bean que tome ar umentos. &n este caso no podramos acceder al Bean mediante las etiquetas Bean$ sino mediante sc iptlets JSP.
<% 5ermometro t= ne* 5ermometro('(); %> >l te momet o ma ca una tempe atu a de < t.get5emperatura() %> ! ados&

Btra t7cnica !astante 2til es proporcionar un m7todo simple que maneje todos los pasos de la confi uraci"n. &ste m7todo puede ser llamado por el constructor que toma ar umentos para usar fuera de las etiquetas Bean 1 tam!i7n por los m7todos de acceso a la propiedad una ve' que todas las propiedades necesarias han sido confi uradas. Para el ejemplo anterior$ vamos a ver como pondremos dos constructores para la clas Te momet o$ adems de un m7todo init#$ que manejara cualquier confi uraci"n interna. &l constructor sin ar umentos nos servir para poder acceder mediante etiquetas Bean$ llamando al constructor$ que toma una temperatura inicial como ar umento por defecto. Te momet oBean&8a+a
public class Te momet oBean{ p i+ate int temp" p i+ate int ma9Temp" p i+ate int minTemp" p i+ate int tipoTuel" public Te momet oBean#${ t%is#WC$" ) public int Te momet oBean#int temp${ t%is&temp'temp" init#$" ) public +oid setTemp#int temp${ t%is&temp'temp" init#$" ) public int !etTemp#${ etu n temp" ) p i+ate +oid init#${ ma9Temp't%is&tempX/5" minTemp't%is&tempI/C" i1 #ma9Temp> /C5$ tipoTuel'Tuels&D@L@TH><M" else TipoTuel'Tuels&*6T<=6L76S" ) )

O.1 2.e plos.


(5r al ndice)

O.1.1 2.e plo 1. +edia de dos n4 eros.


Vamos a ver un ejemplo mu1 simple consistente en una p ina JSP que utili'a un Bean para que le calcule la media de un par de n2meros que le pasa. &n primer lu ar construir7 el Bean cumpliendo todas las normas. MediaBean
public class MediaBean{ p i+ate double nume o/" p i+ate double nume o0" p i+ate double media" public double !etMedia#${ media'#nume o/Xnume o0$/0" etu n media" ) public +oid setnume o/#int num/${ nume o/'num/" ) public double !etnume o/#${ etu n nume o/" ) public double !etnume o0#${ etu n nume o0" ) public +oid setnume o0#int num0${ nume o0'num0" ) )

Vemos como se trata de un ejemplo e-tremadamente sencillo. +onsta de tres propiedades$ dos de escritura 1 lectura$ nume o/ 1 nume o0$ 1 otra de s"lo lectura$ media. ;na p ina JSP que hace uso de este Bean podra ser la si uiente: Media&8sp
<jsp use>ean id="media" "lass=";edia>ean"> <jsp setPropert% name="media" propert%="numero," value="A4" $> <jsp setPropert% name="media" propert%="numero4" value="B" $> <$jsp use>ean> <%tml> <bod4>

La media de los nGme osF<jsp getPropert% name="media" propert%="numero,"$> 4 <jsp getPropert% name="media" propert%="numero4"$> +aleF <jsp getPropert% name="media" propert%="media"$> </%tml> </bod4>

O.1.1 2.e plo 1. :so de propiedades inde3adas. +edia de cinco n4 eros.


&n este caso vamos a ver c"mo se van a tratar propiedades inde-adas. Vamos a utili'ar un Bean que toma un a a4 de cinco doubles para calcularles la media. >stadBean&8a+a
impo t 8a+a&util&B" public class >stadBean { p i+ate doubleUV nume os'neH doubleUCV" public +oid set*ume os#doubleUV nume os${ t%is&nume os'nume os" ) public double !etMedia#${ double sum'5" 1o #int i'5"i<nume os&len!t% "iXX $ sumX'nume osUiV" etu n sum/nume os&len!t%" ) public doubleUV !et*ume os#${ etu n nume os" ) ) >n cuanto a la p2!ina ,S;, ?ueda :a como si!ueF

Media&,S;
<%) page import="java.lang.:" %>> <%) page import="java.util.:" %>> <jsp use>ean id="estad" "lass="6stad>ean"> <%doubleCD num=ne* doubleCBD; num=1B/4/E/F/(7; estad.setGumeros(num); <$jsp use>ean> <HTML> <BODY> La media de los si!uientes nGme osF <% doubleCD numeros=estad.getGumeros(); for(int i=.;i<numeros.lengt!;i++)1 if(i&=numeros.lengt!)

out.print(numerosCiD + "/"); else out.println(""+numerosCiD); 7 %> <b >J6L>F<%= estad.get;edia()%> </BODY> </HTML>

Vemos que$ por el hecho de utili'ar propiedades inde-adas$ vamos a acceder al Bean como si fuera una clase$ accediendo a las propiedades como m7todos de una clase Java normal. . pesar de todo$ hemos utili'ado la etiqueta < 8spFuseBean> 1$ a efectos de nuestra p ina JSP$ un o!jeto estad de la clase >stadBean ha sido creado.

O.1.8 2.e plo 8. =alores pasados co o par" etros de un !or ulario )*+,.
&ste ejemplo es mu1 parecido al anterior$ la 2nica diferencia estri!a en el hecho de que los valores de los n2meros a los que vamos a hacerle la media son pasados a trav7s de un formulario :J@#. &n este caso el Bean va a se uir siendo el mismo que en el ejemplo anterior. &ste es un claro ejemplo de la arquitectura orientada a componentes$ el Bean es reutili'a!le por otra p ina JSP. >stadBean&8a+a
impo t 8a+a&util&B" public class >stadBean { p i+ate doubleUV nume os'neH doubleUCV" public +oid set*ume os#doubleUV nume os${ t%is&nume os'nume os" ) public double !etMedia#${ double sum'5" 1o #int i'5"i<nume os&len!t% "iXX $ sumX'nume osUiV" etu n sum/nume os&len!t%" ) public doubleUV !et*ume os#${ etu n nume os" ) ) >l 1o mula io HTML se :a e9t ao dina iamente sencilloF

To mula io&%tml
<HTML> <BODY>

<TO=M 63T@O*'(Media0&,S;(> ; ime nGme oF<@*;<T TY;>'T>YT *6M>'(num/(><B=> Se!undo nGme oF<@*;<T TY;>'T>YT *6M>'(num0(><B=> Te ce nGme oF<@*;<T TY;>'T>YT *6M>'(numD(><B=> 3ua to nGme oF<@*;<T TY;>'T>YT *6M>'(numA(><B=> Zuinto nGme oF<@*;<T TY;>'T>YT *6M>'(numC(><B=><B=> <@*;<T TY;>'S<BM@T J6L<>'(>*J@6=(> </TO=M> </BODY> </HTML>

&n cuanto a la p ina JSP en s$ va a presentar varios cam!ios respecto a la p ina Media&,S; del apartado anterior. &stos cam!ios van a derivar del hecho de c"mo le son pasado los n2meros$ mediante parmetros en la solicitud. Para o!tenerlos nos apo1aremos en el o!jeto implcito e?uest$ 1 ms concretamente en su propiedad !et;a amete que nos da el parmetro en cuesti"n pero en forma de St in!. Por ello tendremos que pasar este St in! a un tipo double. Veamos ahora la p ina Media0&,S; que va a utili'ar este Bean: Media0&,S;
<%) page import="java.lang.:" %>> <%) page import="java.util.:" %>> <jsp use>ean id="estad" "lass="6stad>ean"> <%doubleCD num=ne* doubleCBD; numC.D=Houble.valueIf(request.getParameter("num,")).doubleJalue(); numC,D=Houble.valueIf(request.getParameter("num4")).doubleJalue(); numC4D=Houble.valueIf(request.getParameter("numA")).doubleJalue(); numCAD=Houble.valueIf(request.getParameter("numE")).doubleJalue(); numCED=Houble.valueIf(request.getParameter("numB")).doubleJalue(); estad.setGumeros(num); <$jsp use>ean> <HTML> <BODY> La media de los si!uientes nGme osF <% doubleCD numeros=estad.getGumeros(); for(int i=.;i<numeros.lengt!;i++)1 if(i&=numeros.lengt!) out.print(numerosCiD + "/"); else out.println(""+numerosCiD); 7 %> <b >J6L>F<%= estad.get;edia()%> </BODY> </HTML>

You might also like