Vous êtes sur la page 1sur 47

Desarrollo con Servlets

Resumen
Introduccin Interfaz Ciclo de vida
HelloWorld

HttpRequest
Parmetros de usuario

Gestin de la sesin Contexto de aplicacin

Servlets: Introduccin
Mdulos que amplan los servidores orientados a peticin/respuesta. La respuesta en el lenguaje Java a los CGIs (Common Gateway Interface) para construir pginas en el momento.
Poder basarse en datos del usuario. La informacin vara en el tiempo. Usar informacin de una base de datos.

Servlet vs CGI

Servlets: Ventajas sobre los CGIs


Eficiencia: JVM. Facilidad de uso y aprendizaje. Potentes: Comunicacin directa con el servidor. Portables. Baratos, porque hay programadores Java Las del Lenguaje Java

Aplicaciones con Servlets

Servlet API

Servlets: Ciclo de vida

Servlets: Jerarqua
La jerarqua de clases java es...

Nosotros heredamos de HttpServlet!

Mtodos y herencia en Servlet

Tipos de peticiones HTTP


Un navegador puede enviar la informacin al servidor de varias formas: GET: Paso de parmetros en la propia URL de acceso al servicio o recurso del servidor. Mtodo doGet del servlet POST: Lo mismo que GET pero los parmetros no van en la lnea de URL sino en otra lnea a parte. El manejo es idntico. Mtodo doPost del servlet. PUT,

Mtodo service() en HTTPServlet

Separa la peticin en funcin del mtodo HTTP

Servlets: Mtodos doGet y doPost


Son llamados desde el mtodo service(). Reciben interfaces instanciadas:
HttpServletRequest canal de entrada con informacin enviada por el usuario HttpServletResponse canal de salida (pgina web)
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, java.io.IOException { . . . } protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, java.io.IOException { . . . }

doGet() doPost()

consulta (no cambia estado, idempotente) modifica datos (cambia estado)

Modelo de datos desde service()


WebContainer ContentType[W] Attributes[R/W/D] Parameters[R] Session[R/W/D] Cookies [R] HttpServeltRequest Writer[W] OutputStream[W] Cookies[W] Redirect[W]

HttpServletResponse

service() service()

Servlets: Respondiendo en HTML


La salida del servlet ser, habitualmente, un documento HTML. 2 pasos:
Indicar la cabecera de la respuesta el tipo de contenido que vamos a retornar.
El caso ms habitual ser devolver HMTL, aunque tb podemos devolver, por ejemplo, una imagen generada en tiempo de ejecucin.

Al ser un proceso tan comn existe un mtodo que nos lo soluciona directamente: setContentType de HttpServletResponse. Crear y enviar cdigo HTML vlido. Ej: HolaMundoServlet

HolaMundo Servlet

Taller prctico. Mi Primer Servlet


Desarrollar el servlet HolaMundo Arrancamos eclipse y crear proyecto Configurar ANT como herramienta externa de compilacin. Aadir la clase uo.dasdi.servlet.HolaMundoServlet
Extiende la clase javax.servlet.http.HttpServlet

Taller prctico. Mi Primer Servlet


Tenemos ya el esqueleto del servlet que vamos a desarrollar. La lgica del servlet debe ser implementada en los mtodos doGet y/o doPost, dependiendo si queremos que nuestro servlet responda a peticiones de uno, otro o ambos tipos. En primer lugar implementamos el doGet().
public void doGet( HttpServletRequest req, HttpServletResponse res ) throws IOException, ServletException { res.setContentType("text/html"); PrintWriter out = res.getWriter(); out.println("<HTML>"); out.println("<HEAD><TITLE>Hola Mundo!</TITLE></HEAD>"); out.println("<BODY>"); out.println("Bienvenido a mi primera pgina Gev!"); out.println("</BODY></HTML>"); }

Taller prctico. Mi Primer Servlet


El mtodo doGet() ser invocado por el service() cuando la peticin que llegue sea de tipo GET. Con mucha frecuencia se hace que el doPost delegue tambin en el doGet () es esto correcto?
public void doPost( HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { doGet(req, res); }

Taller prctico. Mi Primer Servlet


Ya tenemos el servlet implementado. Eclipse sealar y propondr los imports que son necesarios para poder compilar el cdigo del servlet. Una vez aadidos, el servlet est terminado, aunque an no podemos acceder a el desde el navegador. Porqu?
Es necesario darlo de alta en el descriptor de despliegue de la aplicacin: el web.xml.

Taller prctico. Mi Primer Servlet


Insertamos en el web.xml la declaracin del servlet y del servlet-mapping
<servlet> HolaMundo</servlet-name> <servlet-name>HolaMundo <servlet-class>com.dasdi.HelloWorld com.dasdi.HelloWorld</servlet-class> </servlet> <!-- Standard Action Servlet Mapping --> <servlet-mapping> <servlet-name>HolaMundo HolaMundo</servlet-name> <url-pattern>/HolaMundoCordial /HolaMundoCordial</url-pattern> </servlet-mapping>

http://<server>/HolaMundoCordial HelloWorld.class

Taller prctico. Mi Primer Servlet. FIN.


Desplegamos la aplicacin y probamos el servlet accediendo desde el navegador mediante http://localhost:8888/dasdi/HolaMundoCordial Debemos obtener la pgina web generada por el servlet como respuesta. Examinar el cdigo fuente de la misma desde el Internet Explorer mediante Ver/Cdigo Fuente.

HttpServletRequest: Recogiendo informacin de usuario.


En CGI, recoger parmetros de un usuario era muy tedioso. Con servlets, trabajamos SIEMPRE con objetos java. Los parmetros nos llegan en la request, que representa el objeto de tipo HttpServletRequest que recibimos en la invocacin del doXXX().

Object HttpServletRequest.getParameter(nombre) devuelve:


(si no hay valor) null (si no existe). El valor en caso de haber sido establecido.

<form> y request.getParameter()

Servlets: Polticas de acceso concurrente (threading)


Los servlets estn diseados para soportar mltiples accesos simultneos por defecto. Ojo! El problema puede surgir cuando se hace uso de un recurso compartido. Ej, abrimos un fichero desde un servlet. Solucin,
Hacer que el recurso sea el que posea la poltica de acceso concurrente. Ej: Las bases de datos estn preparadas para ello.

Servlets: Ciclo de vida

Servlets: Ciclo de vida


INICIALIZACIN: Una nica llamada al metodo init por parte del servidor.
public void init(ServletConfig config) throws ServletException

Se pueden recoger unos parametros concretos con getInitParameter de ServletConfig. Estos parmetros se especifican en el descriptor de despliegue de la aplicacin: web.xml DESTRUCCIN: Cuando todas las llamadas desde el cliente cesen o un temporizador del servidor as lo indique. Se deben liberar recursos retenidos desde init()
public void destroy()

Ejemplo Servlet con parmetros:


HolaMundo Personalizado
Creamos index.html, pgina con un formulario que nos pasa el parmetro Nombre:
<html> <head> <title>Ejemplo "Mi Primer Servlet"</title> </head> <body> <form action=http://localhost:8888/dasdi/HolaMundo action=http://localhost:8888/dasdi/HolaMundo method=POST> method=POST> Introduzca un texto y pulse "Submit"<BR> <input type=text name=NOMBRE> <input type=submit> <input type=reset> </form> </form> </body> </html>

Ejemplo Servlet con parmetros:


HolaMundo Personalizado
// MiPrimerServlet.java import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class HolaMundoServlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { out.println("Bienvenido + (String) req.getParameter("NOMBRE") + " a mi primera pgina Gev!"); } }

Gestin de la Sesin.
Mantenimiento del estado de la sesin.
El protocolo HTTP no posee la capacidad de almacenar estados. Se complican mucho las tareas de guardar las acciones (Ej, las Compras) de un usuario. Posibles soluciones:
Cookies. Aadir informacin en la URL Usar campos ocultos de formularios (HIDDEN) Empleo del objeto HttpSession del servlet.

(Ejemplo: Carrito de la Compra)

Servlets: Seguimiento de sesin


Los servlets proporcionan una solucin tcnica: La API HttpSession. Una interfaz de alto nivel construida sobre los cookies y la reescritura de las urls (pero transparente para el desarrollador). Permite almacenar objetos.

Servlets: Seguimiento de sesin


BUSCAR EL OBJETO HttpSession ASOCIADO A UNA PETICIN:
Se usa el mtodo getSession() de HttpServletRequest que devuelve null si no hay una sesin asociada. Entonces podramos crear una pero al ser una tarea sumamente comn, se pasa true y l mismo se encarga de crear una.

Interfaz HttpSession

Deprecated methods

Servlets: Seguimiento de sesin


AADIR y RECUPERAR INFORMACION DE UNA SESION getAttribute(nombre_variable)
Devuelve una instancia de Object en caso de que la sesin ya tenga algo asociado a la etiqueta nombre_variable null en caso de que no se haya asociado nada an.

setAttribute(nombre_variable, referencia )
Coloca el objeto referenciado por referencia en la sesin del usuario bajo el nombre nombre_variable. A partir de este momento, el objeto puede ser recuperado por este mismo usuario en sucesivas peticiones. Si el objeto ya existiera, lo sobrescribe.

getAttributesNames()
Retorna una Enumeration con los nombres de todos los atributos establecidos en la sesin del usuario.

Servlets: Seguimiento de sesin


getId(). Devuelve un identificador nico generado para cada sesin. isNew(). True si el cliente (navegador) nunca ha visto la sesin. False para sesin preexistente. getCreationTime(). Devuelve la hora, en milisegundos desde 1970, en la que se creo la sesin. getLastAccessedTime(). La hora en que la sesin fue enviada por ltima vez al cliente.

Servlets: Seguimiento de sesin


CADUCIDAD DE LA SESION:
Peculiaridad de las Aplicaciones WEB: No sabemos cuando el usuario se desconecta del servidor Automticamente el servidor web invalida tras un periodo de tiempo (p.e., 30) sin peticiones o manualmente usando el mtodo invalidate.

OJO!
SOBRECARGAR LA SESIN ES PELIGROSO! Los elementos almacenados no se liberan hasta que no salta el timeout o session.invalidate()

Servlets: Contexto de la aplicacin


Se trata de un saco comn a todas las sesiones de usuario activas en el servidor. Nos permite compartir informacin y objetos entre los distintos usuarios. Se accede por medio del objeto ServletContext. . public ServletContext getServletContext()
(Ejemplo: Contador de Visitas)
Se hereda de GenericServlet

Interfaz ServletContext()

Servlets: Contexto de la aplicacin


Para colocar o recuperar objetos del contexto
Aadir un atributo: Se usa el mtodo setAttribute de ServletContext. El control de que varios servlets manejen un mismo atributo es responsabilidad del desarrollador. Recoger un atributo: Se usa el mtodo getAttribute de ServletContext. Hay que convertir el objeto que devuelve al tipo requerido (Retorna un tipo Object!) Ejemplo Contador de Visitas.

Duracin de Session y ServletContext

Taller prctico Registro de visitas


Partiendo de la prctica anterior, vamos a aadir un registro de visitas que se base en almacenar un Integer en la sesin del usuario. Editamos el servlet y modificamos su cdigo de tal forma que al final de la pgina muestre la lista de personas ya saludadas durante la sesin del usuario actual. Para ello:
Buscaremos en la sesin un atributo del tipo java.util.Vector que se llame listado. En caso de que no exista, lo instanciamos.

//Buscamos el listado en la sesin, y en caso de que no // exista, lo instanciamos Vector listado = (Vector)req.getSession() .getAttribute("listado"); if ( listado == null ){ listado = new Vector(); }

Taller prctico Registro de visitas


Al recuperar el nombre de la persona a saludar desde la request, aadimos dicho nombre al vector.
//Aadimos el visitante al listado if ( (String)req.getParameter("NOMBRE") != null ){ listado.addElement((String)req.getParameter("NOMBRE")); }

Aadimos el objeto listado a la sesin


//Para el caso de que el listado no estuviera en sesin //(primer acceso) lo aadimos req.getSession().setAttribute("listado",listado);

Taller prctico Registro de visitas


Al recuperar el nombre de la persona a saludar desde la request, aadimos dicho nombre al vector.

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


out.println("<br>"+(String)listado.elementAt(i));

} out.println("<center><a href=\"index.html\">volver</a></center>");

Taller prctico Registro de visitas

Taller prctico Ejercicio


Modificar el piloto anterior (terminado en trabajo 0.3) para que los registros en lugar de ser por cada instancia del explorer sea uno para todos los usuarios del sistema. Para ello, en lugar de guardarlo en la sesin, debemos almacenarlo en el contexto de la aplicacin. Podemos obtener una referencia al contexto mediante el mtodo getServletContext() de la sesin del usuario. (Solucin en trabajo 0.4)

Servlets: Encadenamiento de Servlets


Un servlet puede tomar como entrada la salida de otro servlet, y no le importa mucho a donde va la que el genera. Servlet Chaining: El servidor gua la request a travs de diferentes servlets que van enriquecindola, y al final la redirige al cliente.

Servlet 1

Servlet 2

Servlet 3

Servlets: Encadenamiento de Servlets


Para que vale?
Evitar repeticin de tareas
Ej: Aadir una fecha, preprocesado de etiquetas, aadir firma, etc

Realizar tareas de autentificacin


Control de si el usuario est o no autentificado.

Realizar un diseo modular de la capa de presentacin: un Servlet, una accin


Maximiza la reutilizacin