Está en la página 1de 28

Qu es una Sesin?

Una sesin es una serie de comunicaciones entre un cliente y un servidor en la que se


realiza un intercambio de informacin.

Por medio de una sesin se puede hacer un seguimiento de un usuario a travs de la


aplicacin.

El tiempo de vida de una sesin comienza cuando un usuario se conecta por primera vez
a un sitio web pero su finalizacin puede estar relacionada con tres circunstancias:

o Cuando se abandona el sitio web.

o Cuando se alcanza un tiempo de inactividad que es previamente establecido, en


este caso la sesin es automticamente eliminada. Si el usuario siguiera
navegando se creara una nueva sesin.

o Se ha cerrado o reiniciado el servidor.

APLICACIN DE LAS SESIONES (I)

Una posible aplicacin de las sesiones es en el comercio electrnico.

En este caso una sesin permite ir eligiendo una serie de productos e irlos aadiendo a
nuestro carrito y as hasta finalizar la compra. Sin el uso de sesiones no se podra hacer
porque al ir navegando de una pgina a otra se ira perdiendo toda la informacin.

Tambin se utilizan para la identificacin de usuarios, en la que se deben de introducir


un login y un password.

Despus de haber hecho esto el usuario tendr una serie de permisos sobre las pginas
que va a visitar, de tal forma que si un usuario intenta pasar a una pgina si haberse
identificado, el sistema comprobar que no se ha identificado y sera redireccionado a
la pgina de identificacin.

CONFIGURAR LA PGINA JSP

Para poder hacer uso de las sesiones en JSP hay que poner el atributo session de la directiva
page a true, de esta forma se notifica al contenedor que la pgina interviene en un proceso que
utiliza las sesiones del protocolo HTTP:

<%@page session=true%>

El manejo de las sesiones impide el intercambio de datos entre ellas ya que se trata informacin
especfica para cada usuario e incluso si se trata del mismo usuario

ORGANIZACIN DEL EQUIPO


Nombre
Ttulo

Nombre Nombre
Ttulo Ttulo

Nombre Nombre Nombre


Ttulo Ttulo Ttulo
Manejo de las sesiones (I)

En JSP las acciones que se pueden realizar sobre las sesiones se lleva a cabo mediante
la interface HttpSession y los mtodos que implementa.

Esta interfaz est incluida dentro del paquete javax.servlet.http y es utilizada por el
contenedor de pginas JSP para crear una sesin entre el servidor y el cliente.

Para obtener la sesin de un usuario se utiliza el mtodo getSession() que devuelve una
interfaz de tipo HttpSession.

<%HttpSession sesion=request.getSession();%>

Una vez creado el objeto de tipo sesin es posible acceder a una serie de datos sobre la
misma. Uno de estos datos es idSession que devuelve un identificador nico asociado a
una sesin:

<%HttpSession sesion=request.getSession(); out.println(IdSesion: +sesion.getId()); %>

Es posible conocer el momento en el que se cre la sesin:

<%@page import=java.util.* session=true%>

<% HttpSession sesion=request.getSession(); out.println(Creacin:


+sesion.getCreationTime());

Date momento=new Date(sesion.getCreationTime()); out.println(Creacin:


+momento); %>

Tambin se puede conocer la fecha y hora de la ltima vez que el cliente accedi al
servidor con el que se cre la sesin, utilizando el mtodo getLastAccesedTime():

<% Date acceso=new Date(sesion.getLastAccessedTime()); out.println(ltimo acceso:


+acceso+); %>

Teniendo en cuenta el momento en el que ser cre la sesin y la ltima vez que se
accedi al servidor, se puede conocer el tiempo que lleva el cliente conectado al
servidor, o lo que es lo mismo el tiempo que lleva el usuario navegando por las pginas
JSP:

<% long longDuracion= sesion.getLastAccessedTime(); sesion.getCreationTime();

Date duracion=new Date(longDuracion);

out.println(Duracion:+duracion.getMinutes()+min.+ duracion.getSeconds()+seg);
%>

La interfaz HttpSession ofrece el mtodo isNew() mediante el cual es posible saber si la


sesin creada es nueva o se est tomando de una previamente creada:

<% HttpSession sesion=request.getSession(); out.println(nueva: +sesion.isNew()); %>

Si se ejecuta el ejemplo la primera vez el mtodo devolver true, ya que previamente


no haba ninguna sesin y ha sido creada en ese instante. Si se recarga la pgina
devolver false ya que la sesin ya ha sido creada.
Las sesiones no necesitan ningn tipo de mantenimiento, una vez creadas no es
necesario utilizarlas de forma obligatoria o tener que refrescar los datos asociados a las
mismas, se deben ver como una variable ms con la diferencia que pueden ser utilizadas
en cualquier pgina independientemente del lugar en el que hayan sido creadas.

Guardar objetos en una Sesin

Para guardar un objeto en una sesin se utiliza el mtodo setAttribute(), que ha


sustituido al mtodo putValue().

Este mtodo utiliza dos argumentos:

-El primero es el nombre que identificar a esa variable.


-El segundo es el dato que se va a guardar.

setAttribute(java.lang.String name, java.lang.Object value)

Un ejemplo de cmo guardar una cadena de texto en la sesin:

<%@page import=java.util.* session=true %>

<% HttpSession sesion=request.getSession(); sesion.setAttribute(trabajo,Paginas


de JSP); %>

Si se quiere pasar un parmetro que no sea un objeto es necesario realizar una


conversin:

<%@page import=java.util.* session=true %>

<% HttpSession sesion=request.getSession(); Integer edad=new Integer(26);


sesion.setAttribute(edad,edad); %>

Si se hubiera utilizado el valor entero en vez del objeto Integer, el resultado habra sido
similar al siguiente:

Incompatible type for meted. Cant convert int to java.lang.Object.

En el primer ejemplo esto no sucede puesto que una cadena es un objeto de tipo String,
no as un entero. As habra sido igual si en el primer caso ponemos:

<%@page import=java.util.* session=true %>

HttpSession sesion=request.getSession();

String nombre=new String(Paginas de JSP); sesion.setAttribute(trabajo,nombre);


%>
En una sesin, tambin se podran almacenar objetos de tipo Vector (parecido a un array
con dos diferencias: la primera es que puede almacenar todo tipo de objetos, y la
segunda es que no es necesario establecer de forma previa el tamao que va a tener).

Por ejemplo, vamos a guardar los nombres de los 7 das de la semana en un vector.

Guardar objetos en una Sesin

El cdigo sera el siguiente:

<%@page import=java.util.* session=true %>

<% HttpSession sesion=request.getSession();

Vector v=new Vector();

v.addElement(new String(Lunes));

v.addElement(new String(Martes));

v.addElement(new String(Miercoles));

v.addElement(new String(Jueves));

v.addElement(new String(Viernes));

v.addElement(new String(Sbado));

v.addElement(new String(Domingo));

sesion.setAttribute(diasSemana,v);

%>

Recuperar datos de la sesin

Los datos que se guardan en la sesin permanecen ah a la espera de ser utilizados. Para
ello es necesario realizar el proceso contrario a cuando se graban, comenzando por la
recuperacin del objeto de la sesin para empezar a ser tratado.

Para poder realizar este paso se utiliza el mtodo getAttribute() (anteriormente se


utilizaba el mtodo getValue(), pero este mtodo se encuentra en desuso), utilizando
como argumento el nombre que identifica al objeto que se quiere recuperar.
getAttribute(java.lang,String nombre)

Ejemplo de recuperacin de datos

Un ejemplo de recuperacin de objetos almacenados en la sesin:

<% HttpSession sesion=request.getSession(); sesion.getAttribute(nombre); %>

Cuando este mtodo devuelve el objeto no establece en ningn momento de qu tipo de objeto
se trata (String, Vector...)
Por ello si se conoce previamente el tipo de objeto que puede devolver tras ser
recuperado de la sesin es necesario realizar un casting, para convertir el objeto de tipo
genrico al objeto exacto que se va a usar. Para realizar esta operacin se aade el tipo
de objeto al lado de tipo HttpSession que utiliza el mtodo getAttribute() para obtener
el objeto que devuelve:

<% HttpSession sesion=request.getSession();

String nombre=

(String)sesion.getAttribute(nombre);

out.println(Contenido de nombre: +nombre); %>

Manejo de errores

Si no existe ningn objeto almacenado en la sesin bajo el identificador que se utiliza en


el mtodo getAttribute(), el valor devuelto ser null. Por ello habr que prestar especial
atencin ya que si se realiza el casting de un valor null el contenedor JSP devolver un
error. Lo mejor en estos casos es adelantarse a los posibles errores que pueda haber.

<% if(sesion.getAttribute(nombre)!=null) {

String nombre=

(String)sesion.getAttribute(nombre);

out.println(Contenido de nombre: +nombre);

} %>

En el caso de tipos primitivos deben de ser convertidos a objetos previamente a su


integracin a la sesin de tal forma que su proceso de extraccin viene a ser similar:

<% HttpSession sesion=request.getSession(); Integer


edad=(Integer)sesion.getAttribute(edad); out.println(Edad: +edad.intValue()); %>

En esta ocasin el objeto devuelto y convertido a Integer no es del todo vlido ya que
es necesario obtener de l el valor entero. Para ello se utiliza el mtodo intValue() que
devuelve el valor que realmente se haba guardado previamente en la sesin.
Recuperar datos de vectores

El ejemplo del vector guardado en la sesin tiene un tratamiento similar al de los casos
anteriores. El primer paso es recuperar el objeto de la sesin:

<%@page import=java.util.* session=true %> <% HttpSession


sesion=request.getSession(); sesion.getAttribute(diasSemana); %>

Como se sabe que el objeto es de tipo Vector se puede recuperar y convertir en un solo
paso:

Vector v= (Vector) sesion.getAttribute(diasSemana);

A partir de este momento se puede acceder a los elementos del vector


independientemente de si vena de una sesin o ha sido creado. Para ello se utiliza el
mtodo size() que devuelve el tamao del vector para ir leyendo cada uno de sus
elementos:

<% for(int i=0; i<v.size();i++) {

out.println(Dia: +(String)v.get(i)+); } %>

Se ha realizado otro proceso de conversin que sin ser necesario, ayuda a entender
mejor el funcionamiento. Cuando se recupera un elemento de un vector (que se trata
de un objeto) es necesario realizar el casting y convertirlo a su tipo de objeto definitivo.

Agregar elementos a un vector

<%@page contentType="text/html; charset=iso-8859-1" session="true"


language="java" import="java.util.*" %> <% HttpSession sesion=request.getSession();

String nombre=Prctica de Sesiones;

Vector v=new Vector();

v.addElement(new String("Lunes"));

v.addElement(new String("Martes")); v.addElement(new String("Miercoles"));


v.addElement(new String("Jueves"));

v.addElement(new String("Viernes")); v.addElement(new String("Sbado"));


v.addElement(new String("Domingo")); sesion.setAttribute("diasSemana",v);
sesion.setAttribute("nombre",nombre); %>
Recuperar todos los objetos

Para recuperar todos los objetos de una sesin se puede hacer uso tambin del mtodo
getAttributeNames() de la interfaz HttpSession.

Para recoger todos los objetos almacenados en la sesin se recorre el objeto


Enumeration que contiene el nombre de todos los objetos que contiene la sesin y que
ha sido devuelto por el mtodo getAttributeNames(). Cada nombre de atributo de la
sesin se utiliza en la llamada a cada mtodo getAttribute(), que devolver el objeto
correspondiente.

Con el siguiente cdigo se recuperan los objetos:

<%@page import="java.util.*" session="true" %>

<% HttpSession sesion=request.getSession();

Enumeration enum=sesion.getAttributeNames();

String nombreAtributo;

while (enum.hasMoreElements()) {

nombreAtributo=(String)enum.nextElement();

out.println("Atributo:"+nombreAtributo);

if(nombreAtributo.equals("diasSemana")) {

Vector v= (Vector);

sesion.getAttribute("diasSemana");

for(int i=0; i<v.size();i++) {

out.println("Dia:"+(String)v.get(i));

} else

out.println(""+sesion.getAttribute(nombreAtributo)+""); } %>
Cookies

Un cookie es un archivo pequeo que enva el servidor web al disco duro del cliente que
lo visita con informacin sobre sus preferencias y pautas de navegacin.

Uno de los objetivos de utilizar cookies es poder reconocer al usuario en el momento en


el que se conecta al servidor. Una de las pginas que recoge la peticin del usuario
puede comprobar si existe un cookie que ha dejado anteriormente, si es as, sabe que
ese usuario ya ha visitado ese website y por lo tanto puede leer valores que le
identifiquen.

Otro de los usos de los cookies es ofrecer una personalizacin al usuario.

En muchos sitos web es posible elegir el color de fondo, el tipo de letra utilizado, etc...
Estos valores pueden ser almacenados en cookies de forma que cuando acceda de
nuevo al web y se compruebe la existencia de esos valores, sern recuperados para
utilizarlos en la personalizacin de la pgina tal y como el usuario estableci en su
momento.

Un ejemplo que se ha podido encontrar en muchas webs es en el momento de realizar


un registro. En muchas ocasiones existe un checkbox que cuando se selecciona permite
recordar el nombre de usuario, de modo que solo debe escribir la clave.

Utilizando tambin el identificador idSession que se genera en un sesin como ya hemos


visto y guardndolo en el cookie se pueden mostrar mensajes personalizados en el
momento en el que el usuario acceda de nuevo al website.

La clase Cookie

Para trabajar con cookies se utiliza la clase Cookie que est disponible en el paquete
javax.servlet.http.

Por medio de esta clase se pueden crear cookies, establecer sus valores y nombres,
alguna de sus propiedades, eliminarlas, leer valores que almacenan, etc.

Creacin de cookies

Un cookie almacenado en el ordenador de un usuario est compuesto por un nombre y


un valor asociado al mismo. Adems, asociada a este cookie pueden existir una serie de
atributos que definen datos como su tiempo de vida, alcance, dominio, etc.

Cabe sealar que los cookies, no son ms que ficheros de texto, que no pueden superar
un tamao de 4Kb, adems los navegadores tan slo pueden aceptar 20 cookies de un
mismo servidor web (300 cookies en total).

Para crear un objeto de tipo Cookie se utiliza el constructor de la clase Cookie que
requiere su nombre y el valor a guardar.

<% Cookie miCookie= new Cookie(nombre,objetos); %>

Este ejemplo permite crear un objeto Cookie que contiene el nombre nombre y el
valor objetos.
Tambin es posible crear cookies con contenido que se genere de forma dinmica. El
siguiente cdigo muestra un cookie que guarda un texto que est concatenado a la
fecha/hora en ese momento:

<%@page contentType="text/html; charset=iso-8859-1" session="true" language="java"


import="java.util.*" %>

<% Cookie miCookie=null; Date fecha=new Date(); String texto= Este es el texto que vamos a
guardar en el cookie+fecha;

miCookie=new Cookie(nombre,texto); %>

En esta ocasin el contenido del valor a guardar en el cookie est en la variable texto.

Tambin se pueden guardar valores o datos que provengan de pginas anteriores y que
hayan sido introducidas a travs de un formulario:

<% Cookie miCookie=null;

String ciudad=

request.getParameter(formCiudad); miCookie=new Cookie(ciudadFavorita,ciudad);


%>

Configuracin de un cookie

Una vez que se ha creado un cookie, es necesario establecer una serie de atributos para
poder ser utilizado. El primero de esos atributos es el que se conoce como tiempo de
vida.

Por defecto, cuando creamos un cookie, se mantiene mientras dura la ejecucin del
navegador. Si el usuario cierra el navegador, los cookies que no tengan establecido un
tiempo de vida sern destruidos.

Por tanto, si se quiere que un cookie dure ms tiempo y est disponible para otras
situaciones es necesario establecer un valor de tiempo (en segundos) que ser la
duracin o tiempo de vida del cookie. Para establecer este atributo se utiliza el mtodo
setMaxAge().

Configuracin de un cookie

El siguiente ejemplo establece un tiempo de 31 das de vida para el cookie unCookie:

<% unCookie.setMaxAge(60*60*24*31); %>

Si se utiliza un valor positivo, el cookie ser destruido despus de haber pasado ese
tiempo, si el valor es negativo el cookie no ser almacenado y se borrar cuando el
usuario cierre el navegador. Por ltimo si el valor que se establece como tiempo es cero,
el cookie ser borrado.
Otros de los atributos que se incluye cuando se crea un cookie es el path desde el que
ser visto, es decir, si el valor del path es / (raz), quiere decir que en todo el site se
podr utilizar ese cookie, pero si el valor es /datos quiere decir que el valor del cookie
slo ser visible dentro del directorio datos. Este atributo se establece mediante el
mtodo setPath().

<% unCookie.setPath(/); %>

Para conocer el valor de path, se puede utilizar el mtodo getPath().

<% out.println(cookie visible en: +unCookie.getPath()); %>

Existe un mtodo dentro de la clase Cookie que permite establecer el dominio desde el
cual se ha generado el cookie. Este mtodo tiene su significado porque un navegador
slo enva al servidor los cookies que coinciden con el dominio del servidor que los
envi.

Si en alguna ocasin se requiere que estn disponibles desde otros subdominios se


especifica con el mtodo setDomain(). Por ejemplo, si existe el servidor web en la pgina
www.paginasjsp.com , pero al mismo tiempo tambin existen otros subdominios como
usuario1.paginasjsp.com, usuario2.paginasjsp.com, etc.

Si no se establece la propiedad domain se entiende que el cookie ser visto slo desde
el dominio que lo cre, pero sin embargo si se especifica un nombre de dominio se
entender que el cookie ser visto en aquellos dominios que contengan el nombre
especificado.

En el siguiente ejemplo hace que el cookie definido en el objeto unCookie est


disponible para todos los dominios que contengan el nombre .paginasjsp.com. Un
nombre de dominio debe comenzar por un punto.

<% unCookie.setDomain(.paginasjsp.com); %>

Igualmente, para conocer el dominio sobre el que acta el cookie, basta con utilizar el
mtodo getDomain() para obtener esa informacin.

Creacin del cookie

Una vez que se ha creado el objeto Cookie, y se ha establecido todos los atributos
necesarios es el momento de crear realmente, ya que hasta ahora slo se tena un
objeto que representa ese cookie.

Para crear el fichero cookie real, se utiliza el mtodo addCookie() de la interfaz


HttpServletResponse:

<% response.addCookie(unCookie); %>


Configuracin de un cookie

Una vez ejecutada esta lnea es cuando el cookie existe en el disco del cliente que ha
accedido a la pgina JSP.

Es importante sealar que si no se ejecuta esta ltima lnea el cookie no habr sido
grabado en el disco, y por lo tanto, cualquier aplicacin o pgina que espere encontrar
dicho cookie no lo encontrar.

Recuperacin de cookies

El proceso de recuperar un cookie determinado puede parecer algo complejo, ya que


no hay una forma de poder acceder a un cookie de forma directa. Por este motivo es
necesario recoger todos los cookies que existen hasta ese momento e ir buscando aqul
que se quiera, y que al menos, se conoce su nombre.

Para recoger todos los cookies que tenga el usuario guardados se crea un array de tipo
Cookie, y se utiliza el mtodo getCookies() de la interfaz HttpServletRequest para
recuperarlos:

<% Cookie [] todosLosCookies=request.getCookies();

/*El siguiente paso es crear un bucle que vaya leyendo todos los cookies.*/

for(int i=0; i<todosLosCookies.length;i++) {

Cookie unCookie=todosLosCookies[i];

/*A continuacin se compara los nombres de cada uno de los cookies con el que se est
buscando. Si se encuentra un cookie con ese nombre se ha dado con el que se est
buscando, de forma que se sale del bucle mediante break. */

if(unCookie.getName().equals(nombre))

break; }

/*Una vez localizado tan slo queda utilizar los mtodos apropiados para obtener la
informacin necesaria que contiene.*/

Recuperacin de cookies

out.println(Nombre: +unCookie.getName()+);

out.println(Valor: +unCookie.getValue()+);

out.println(Path: +unCookie.getPath()+);

out.println(Tiempo de vida:+unCookie.getMaxAge()+);

out.println(Dominio: +unCookie.getDomain()+); %>


SERVLETS Y JSP

1. SERVLETS
1. Introduccin.

2. Objeto Request.

3. Objeto Response.

4. Cookies.

5. Sesiones.

Qu son los Servlets?

Los Servlets son la alternativa Java a los CGIs.


Actan como capa intermedia entre:
Peticin proveniente de un Navegador Web u otro cliente HTTP
Bases de Datos o Aplicaciones en el servidor HTTP

Son aplicaciones Java especiales, que extienden la funcionalidad del servidor HTTP,
dedicadas a:

Leer los datos enviados por el cliente.

Extraer cualquier informacin til incluida en la cabecera HTTP o en el cuerpo del


mensaje de peticin enviado por el cliente.

Generar dinmicamente resultados.

Formatear los resultados en un documento HTML.

Establecer los parmetros HTTP adecuados incluidos en la cabecera de la respuesta (por


ejemplo: el tipo de documento, cookies, etc.)

Enviar el documento final al cliente.


Qu son los Servlets?

Los objetos servlets cumplen los siguientes requisitos:

Estn basados en el marco de Servlets.

Utilizan el Servlet Application Programming Interface(SAPI)

El interfaz SAPI define una manera estndar para que las peticiones HTTP sean
procesadas por esta clase Java (independiente del servidor).

Asociados a la URL de la peticin, son manejados por el contenedor de servlets con


una arquitectura simple.

El contenedor provee el entorno de ejecucin para todos los servlets basados en los
anteriores requisitos.

Disponibles para la gran mayora de servidores web.

Son independientes de la plataforma y del servidor.

Ventajas de los Servlets

Eficiencia.

Cada peticin por parte de un cliente crea un hilo, no un nuevo proceso como
ocurra con los CGIs tradicionales.

Potencia.

Son programados en Java, por lo que se puede emplear todas las clases y
herramientas disponibles para esta plataforma.

Seguridad.

Controlada por la mquina virtual de Java.

La mayora de problemas de seguridad que tienen los CGIs no aparecen en los


Servlets.

Portabilidad.

Puede ser utilizados sobre cualquier SO. y en la mayora de servidores Web.

Precio.

Normalmente todo el software necesario es gratis.


Arquitectura de los Servlets

Para implementar los servlets se hace uso de:

javax.servlet: entorno bsico

javax.servlet.http: extensin para servlets http.

Estructura bsica
Ejemplo

Compilando e Invocando el Servlet

EL principal servidor (gratuito) de servlets y JSP es Tomcat de Apache


(http://jakarta.apache.org/tomcat)

Pasos a seguir para el servidor Tomcat:

Verificar que el servidor est corriendo

Compilar el servlet:

> javac classpath dir_instalacion/lib/servlet.jar nom_servlet

Situar el servlet compilado en una direccin adecuada:

Invocar el servlet desde el browser:

(El puerto se configura en el archivo server.xml.

Ciclo de vida de un Servlet

El servidor recibe una peticin que ha de ser manejada por un servlet.

El servidor comprueba si existe una instancia creada en memoria de la clase servlet


correspondiente. Si no, la crea.

Las peticiones posteriores de otros usuarios utilizarn la misma instancia.

El objeto servlet permanece en memoria mientras el servidor siga en funcionamiento.


Diagrama del ciclo de vida

Mtodos implicitos

init

Se ejecuta una vez, la primera vez que es invocado el servlet (el servlet se carga en memoria y
se ejecuta slo la primera vez que es invocado. El resto de peticiones generan un hilo).

service (no debe sobreescribirse)

Se ejecuta cada vez que se produce una nueva peticin.

Dentro de esta funcin se invoca a doGet o a doPost.

doGet y doPost

Manejan las peticiones GET y POST.

Incluyen el cdigo principal del servlet

La ejecucin del servlet finalizar cuando termine la jecucin de estos mtodos.

destroy

Se invoca cuando el servidor decide eliminar el servlet de la memoria (NO despus de


cada peticin).
Ciclo de ejecucin de los mtodos

Objetos implcitos (I)

Existen una serie de objetos implcitos, disponibles dentro de nuestros servlets


(instanciados por el propio contenedor de servlets y JSP).

Objeto request

Es una instancia de HttpServletRequest

Recoge la informacin enviada desde el cliente.

Objeto response

Es una instancia de HttpServletResponse

Organiza los datos enviados al cliente.

Objeto session

Es una instancia de HttpSession

Almacena informacin con mbito de sesin.

Objeto application

Es una instancia de ServletContenxt (javax.servlet.ServletContext)

Almacena informacin con mbito de aplicacin.

Objeto out

Es una instancia de PrintWriter (java.io.PrintWriter)

Escribe contenido dentro de la pgina HTML.

Objeto config

Es una instancia de ServletConfig (javax.servlet.ServletConfig)

Contiene informacin relacionada con la configuracin del servlet.


El objeto request: Datos enviados desde el cliente

El objeto request contiene todos los datos enviados desde el cliente al servidor.

Todos los servlets implementan la interfaz ServletRequest, que define mtodos para
acceder a:

Los parmetros enviados por el cliente dentro de la URL o dentro del cuerpo del
mensaje (p.e. a partir de un formulario)

Los valores de la cabeceras HTTP del mensaje

Cookies

Informacin sobre el protocolo

Content-Type

Si la peticin fue realizada sobre un canal seguro SSL

etc.

Los datos de otras entradas.

El objeto request: Datos de un formulario (I)

La forma de leer los datos enviados desde un formulario es independiente del mtodo
de envo (GET o POST).

String request.getParameter(nom_var)

Devuelve el valor (decodificado URL-encoded) encontrado en la primera ocurrencia de


la variable dentro de los datos enviados por el cliente.

Devuelve null si la variable no ha sido enviada.

String[] request.getParameterValues(nom_var)

Devuelve un array de valores (decodificados URL-encoded) con todos los valores


asociados a la variable (SELECT multiple). Si slo aparece un vez, devuelve un array
de un elemento.

Devuelve null si la variable no ha sido enviada.

Enumeration request.getParameterNames()

Devuelve una enumeracin con los nombres de las variables enviadas.


Datos de un formulario (form.html)

El objeto request. Ejemplo

Cabecera HTTP (I)

Existe dos funciones de propsito general para extraer cualquier parmetro de la


cabecera HTTP enviada por el cliente:

String getHeader ( String parametro_HTTP )

Devuelve una cadena con el valor del parmetro.

Devuelve null, si el parmetro no est incluido en la cabecera.

Enumeration getHeaders ( String parametro_HTTP )

Similar a la anterior. Permite recoger los valores de aquellos parmetros que se


repiten varias veces dentro de la cabecera.

Para averiguar todos los parmetros enviados en la cab.:

Enumeration getHeaderNames()
Devuelve una enumeracin con los nombres de todos los parmetros incluidos en la
cabecera.

Existen un conjunto de funciones para extraer los valores de algunos parmetros


particulares:

Cookie[] getCookies ()

Extrae las cookies enviadas por el cliente.

String getMethod ()

Mtodo utilizado en la peticin (GET o POST).

String getContentLength ()

Longitud de los datos enviados por el cliente (utilizando el mtodo POST) tras la
cabecera HTTP.

String getContentType ()

Devuelve el tipo MIME de los datos enviados tras la cabecera

String getProtocol ()

Devuelve la versin del protocolo HTTP (HTTP/1.0 o

HTTP/1.1) utilizado por el cliente en la peticin.

Cabecera HTTP. Ejemplo


El objeto response: Datos enviados al cliente

El objeto response representa los datos enviados desde el servidor al cliente. Se


emplea, no slo para escribir el contenido de la pgina enviada al cliente, sino
tambin para organizar la cabecera HTTP, enviar cookies, etc.

Todos los servlets implementan el interfaz de ServletResponse, que permite:

Acceder al canal de salida

Indicar el tipo de contenido del mensaje de respuesta

Indicar si existe buffer de salida

Establecer la localizacin de la informacin

HttpServletResponse extiende a ServletResponse:

Cdigo de estado del mensaje de respuesta

Cookies

El objeto response: Estado de la respuesta

La primera lnea de la cabecera HTTP describe el estado de la respuesta.

Para manipular directamente este parmetro: setStatus( int)

donde codigo es el nmero del cdigo del estado. En vez de utilizar el nmero se puede
emplear las constantes prefinidas:

SC_OK , que representa el estado: 200 Ok

SC_MOVED_PERMANENTLY: 301 Moved Permanently

SC_MOVED_TEMPORALY : 302 Found

SC_BAD_REQUEST : 400 Bad Request

SC_UNAUTHORIZED : 401 Unauthorized


SC_NOT_FOUND : 404 Not Found

SC_INTERNAL_SERVER_ERROR : 500 .. Etc.

sendError ( int codigo, String mensaje)

Manda un cdigo de estado de error (4XX), y escribe el contenido de mensaje en el


cuerpo del documento HTML.

sendRedirect (String url)

Redirecciona el navegador del cliente hacia la direccin url.

Manda un cdigo de estado SC_MOVED_TEMPORALY, y asigna al parmetro


Location de la cabecera HTTP la direccin url.

Estado de la respuesta . Ejemplo

Parmetros de la cabecera HTTP

Para fijar cualquier parmetro de la cabecera:

setHeader (String nombre_param, String valor_param)

response.setHeader("Cache-Control", "no-cache");

Para ciertos parmetros, existen funciones especiales:

setContentType ( String codigo_MIME )

Fija el cdigo MIME de la respuesta (Content-Type)

response.setContentType("text/html");

addCookie (Cookie la_cookie)

Enva una cookie al cliente.


Cuerpo del mensaje

El cuerpo del mensaje es generado a partir de los objetos:

PrintWriter

La referencia se extrae con response.getWriter()

Cuando el cdigo generado es texto HTML (o XML o plano)

PrintWriter out = response.getWriter();

out.println("..."); out.flush(); out.close();

ServletOutputStream

La referencia se extrae con response.getOutputStream()

Cuando el cdigo generado es binario (p.e. una imagen)

ServletOutputStream out = response.getOutputStream();

Ejemplo: Descargar un archivo MP3 (I)


Formas de seguir la trayectoria de los
usuarios

HTTP es un protocolo sin estado

Cada vez que un cliente pide una pgina Web, abre una conexin separada con el
servidor Web y el servidor no mantiene automticamente informacin contextual
acerca del cliente.

Servlets

Permiten obtener y mantener una determinada informacin acerca de un cliente.

Informacin accesible a diferentes servlets o entre diferentes ejecuciones de un mismo


servlet.

Tres soluciones tpicas

Cookies

Seguimiento de sesiones ( session tracking)

Reescritura de URLs

Enviando Cookies

Para enviar cookies al cliente se crea un objeto de la clase Cookie, y se invoca el


mtodo addCookie del objeto response pasndole como parmetro dicha cookie.

Cookie c = new Cookie("nombre", "valor");

c.setMaxAge(...); // Segundos de vida del cookie

response.addCookie(c);
Recibiendo Cookies

Para leer las cookies se emplea el mtodo getCookies del objeto request. ste
devuelve un array con todos las cookies recibidas del cliente.

Cookie[] cookies_recb = request.getCookies();

if (cookies_recb != null) {

for(int i=0; i<cookies_recb.length; i++) {

if (cookies_recb[i].getName().equals(alquiler"))

&& (cookies_recb[i].getValue().equals(coche))

{cookies_recb[i].setMaxAge(0);//Elimina la cookie

} //fin del for

Mtodos del objeto Cookie

public String getName() /

public void setName ( String nombre_cookie )

Extrae / fija el nombre del cookie. El mtodo setName() raramente se utiliza, ya que el
nombre de la nueva cookie normalmente se fija en el constructor del objeto.

public String getValue() / public void setValue ( String valor_cookie )

Extrae / fija el valor de la cookie. El mtodo setValue() normalmente no se utiliza (el


valor se fija en el constructor).

public int getMaxAge() / public void setMaxAge ( int segundos_vida )

Extrae / fija el nmero de segundos que la cookie permanece guardado en el disco del
cliente.

public String getDomain() / public void setDomain

Extrae/fija el dominio de los servidores con acceso a la cookie

public String getPath() /public void setPath

Extrae / fija el directorio raz (virtual) de las pginas con acceso a la cookie.

public boolean getSecure() / public void setSecure

Extrae / fija el parmetro de seguridad. Si flag_seguridad vale true, la cookie slo ser
enviada si la conexin es segura (SSL).
Ejemplo UtilidadesCookies

Objeto HttpSession (I)

Las sesiones se implementan a travs de objetos de la clase HttpSession, creados por


el contenedor cuando se inicia una sesin para un nuevo usuario.

Para extraer la referencia a este objeto desde un servlet:

HttpSession mi_sesion = request.getSession(true);

Las sesiones se asocian al cliente, bien va cookies, o bien rescribiendo la URL.

API del objeto sesin (I)

public void setAttribute (String nombre, Object valor)

Registra una nueva variable dentro de la sesin (nombre y valor son el nombre y el valor de la
variable).

public Object getAttribute ( String nombre )

Extrae el valor de una variable previamente registrada.


public void removeAttribute (String nombre)

Borra una variable de la sesin previamente registrada.

public Enumeration getAttributeNames ( )

Extrae el nombre de todas las variables registradas en la sesin

public String getId ( )

Devuelve el identificador de la sesin.

public boolean isNew ( )

Devuelve true si la sesin comienza en esta pgina.

public long getCreationTime ( )

Momento de la creacin de la sesin (expresado en milisegundos transcurridos desde el 1 de


enero de 1970)

public long getLastAccessedTime ( )

Momento del ltimo acceso a una pgina de la sesin (milisegundos transcurridos desde el 1
de enero de 1970).

public int getMaxInactiveInterval ( ) / public void setMaxInactiveInterval ( int


segundos )

Extrae / fija los segundos que deben transcurrir desde el ltimo acceso para que la sesin sea
cerrada.

Ejemplo 1
Ejemplo 2

Reescritura de URLs (I)

Puede suceder que ciertos clientes no soporten cookies o bien las rechacen

Solucin: Sesiones + Reescritura de URLs

El cliente aade ciertos datos extra que identifican la sesin al final de cada URL

http://host/path/servlet/name?jsessionid=1234

El servidor asocia ese identificador con datos que ha guardado acerca de la sesin

Mtodos: encodeURL() y encodeRedirect()

Leen un String ( URL o URL de redireccin) y si es necesario lo reescriben aadiendo el


identificativo de la sesin.

Algunas Desventajas:

Se deben codificar todas las URLs referentes al sitio propio

Todas las pginas deben generarse dinmicamente

También podría gustarte