Professional Documents
Culture Documents
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.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>
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.
!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 + ,%>"$>
(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.
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.
(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.
=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.
:na p"gina JSP puede incluir otra JSP sie pre 0 cuando esta utilice el lengua.e scripting que aquella.
is o
"s
:n !unciona iento "s detallado de esta directiva puede verse en el de JSP que Sun Microsystem proporciona.
anual
(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
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.
Sc iptlets
34 sc iptlet 46
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.
&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.
&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!!
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&
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).
<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.
<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=.;
&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.
<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:
!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.
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.
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>
&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.
N.1 2l
&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.
$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.
que codi!o;ostal ser confi urada o como de s"lo escritura$ o como de escritura 1 lectura.
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.
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.
#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.
,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( />
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" $>( >
,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.
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 %>
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.
&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.
&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
.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.
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
&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.
,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.
;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.
&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>
#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.
#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$"
;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:
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:
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.
</ 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" ) )
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>
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>