Está en la página 1de 47

Desarrollo con

Servlets

Resumen




Introduccin
Interfaz
Ciclo de vida


HttpRequest





HelloWorld
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()  consulta (no cambia estado, idempotente)


doPost()  modifica datos (cambia estado)

Modelo de datos desde service()


WebContainer
ContentType[W]
Attributes[R/W/D]

Writer[W]

Parameters[R]

OutputStream[W]

Session[R/W/D]

Cookies[W]

Cookies [R]

Redirect[W]

HttpServeltRequest

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.


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





El caso ms habitual ser devolver HMTL, aunque tb


podemos devolver, por ejemplo, una imagen
generada en tiempo de ejecucin.

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
action=http://
=http://localhost:8888/dasdi/HolaMundo
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)


setAttribute(nombre_variable, referencia )


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.

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




Realizar tareas de autentificacin




Ej: Aadir una fecha, preprocesado de


etiquetas, aadir firma, etc
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

También podría gustarte