Beruflich Dokumente
Kultur Dokumente
ANEXO JSP
Pasar datos entre JSPs y Servlets. Page, Request, Session y
Application scope
Veamos aquí cómo pasar datos entre las páginas JSP y los Servlets.
Aprovechamos para comentar los cuatro tipos posibles de scope (alcance) de las
variables.
Page Scope
Son variables que solo se ven dentro de nuestro JSP o Servlet mientras se está
ejecutando. Una vez construída y enviada la respusta al navegador, desaparecen. Su
única utilidad es ayudarnos a construir la página que queremos mostrar en el navegador.
Dentro del JSP serían variables normales de JSP
y dentro de un Servlet no serían más que variables locales de nuestros métodos doGet()
o doPost().
Request Scope
Estas variables son más útiles. Las guardamos en la petición que nuestro JSP/Servlet
van a hacer a otro JSP/Servlet de nuestra aplicación, y este segundo JSP/Servlet puede
recogerlos para hacer cosas con ellas.
Dentro del objeto request, podríamos fijar estas variables con setParameter() o con
setAttribue(). y obtener los valores ocn los getParameter() o getAttribute().
En principio no debemos usar este método. Está reservado para los form de html de
nuestras páginas jsp. Cuando pulsemos el botón "submit" del formulario, él se encargará
de rellenar los setParameter()
<form action="destino.jsp">
<input type="text" name="variable" />
<input type="submit value="Enviar" />
</form>
En la página jsp de destino podemos recoger los valores del formulario de esta forma
Un detalle a tener en cuenta es que estos "parameter" sólo pueden guardar valores de
tipo "String".
Dentro de request, los attribute son lo que nosotros como programadores podemos usar
a gusto. Podemos guardar y recibir cualquier Object java que queramos sin más que
ponerles un nombre. Sin embargo, el request desaparece en cuanto terminamos de
procesar la página/Servlet actual, así que la única forma de pasar estos attributes a la
siguiente es haciendo un fordward() desde nuestro request. Por ejemplo, en una página
jsp podemos poner
Session scope
Las variables Session scope se mantienen durante lo que se conoce como una sesión.
Cuando un usuario visita nuestra aplicación por primera vez, automáticamente se crea
una sesión para ese usuario. Esta sesión suele estar abierta mientras el usuario va
navegando por las páginas de nuestra aplicación y desaparece cuando el usuario deja de
navegar por nuestra aplicación durante un tiempo predeterminado.
Dicho de otra forma, cualquier valor que guardemos en la sesión del usuario, sólo será
visible por las páginas que visite ese usuario y mientras el usuario esté activo. Son las
variables típicas donde guardar si un usuario ha entrado en sesión, su nombre, su carrito
de la compra si nuestra aplicación es de comercio electrónico, etc.
En una página JSP guardaríamos los objetos java que queramos por medio de la
variable session ya predefinida
Y en un Servlet, igual de fácil obteniendo la session del request que nos llega como
parámetro
y para leer
Application scope
Estas variables son válidas para la aplicación. Permanecen hasta que repleguemos
nuestra aplicación del servidor o echemos el servidor abajo. Son compartidas para todos
los usuarios que visiten nuestra página web.
Dentro de un JSP podemos fijarlas o leerlas con la variable application que viene
predefinida en cualquier JSP, usando los conocidos métodos setAttribute() y
getAttribute().
jsp:useBean
Ya hemos visto como guardar variables en distintos sitios para pasarlas de un jsp/servlet
a otro jsp/servlet y si queremos que esta variable sólo sea válida durante el paso de una
página a otra (request), para un usuario en cualquier página (session) o para todos los
usuarios mientras el servidor siga levantado (application).
Imagina ahora que estamos haciendo una aplicación que lleva un listado de personas.
Esas personas tienen varios atributos como nombre, apellido, teléfono, dirección, etc,
etc. Puede ser un poco tedioso y sobre todo poco elegante tener que meter todos esos
atributos uno a uno en los sitios (request, session, application) que necesitemos. Una
solución más elegante es hacer un bean Persona con esos atributos. Algo como esto
(solo un par de atributos para simplificar)
package com.campusfp.ejemplos;
Tanto en el servlet como en un jsp podemos guardar este bean en cualquiera de los
sitios indicados con setAttribute() y obtenerlo con getAttribute(). Por ejemplo, en un jsp
Sin embargo, en jsp tenemos unos tag especiales que nos permiten trabajar con estos
bean más al estilo de una página html, sin meter el código java directamente. Estos tag
son <jsp:useBean>, <jsp:getProperty> y <jsp:setProperty>
Aquí ponemos en scope dónde queremos guardar o recoger el bean, es decir, "page",
"request", "session" o "application". El id es el nombre que usábamos antes como
nombre de atributo, es decir "unaPersona". Si ese bean ya existe lo obtenemos, si no
existe se crea y se guarda ahí. Finalmente, en class debemos indicar la clase del bean
con paquete y todo, en nuestro caso "com.campusfp.ejemplos.Persona".
Dentro del jsp y una vez obtenido el bean, podemos meter valores en sus propiedades o
acceder a ellas
Esta vez name es el nombre del bean, que en jsp:useBean era el id. En property se pone
el nombre de la propiedad (nombre, apellido, etc) y en value, en el caso del setProperty,
lo que queremos que valga. Java es listo y si el atributo de la clase es de tipo boolean,
entero, etc, java convertirá automáticament la cadena de texto al tipo adecuado. Por
ejemplo, si nombre fuese booelan, podríamos poner value="true" y se haría la
conversión automáticamente.
<form action="salva.jsp">
Nombre : <input type="text" name="nombre"/><br/>
Apellido : <input type="text" name="apellido"/><br/>
<input type="submit" value="Salvar"/>
</form>
Pues bien, en la página salva.jsp que recibe este formulario, podemos crear el bean y
rellenar sus valores así
Es decir, en vez de value, indicamos param, siendo param el nombre del campo en el
formulario.
Si el nombre del param y del property coinciden, podemos no poner param, que por
defecto valdrá lo mismo que property. Al ser el caso anterior, podríamos escribir
y existe aun una facilidad más. Si todos los nombres de los campos coindicen con todos
los nombres de los atributos del bean, entonces con un property="*" los rellenamos
todos de un plumazo, tal que así