Vous êtes sur la page 1sur 72

Construccin de Aplicaciones

Empresariales con el Lenguaje


de Programacin Java
Unidad 3: Servlets

Temario

3. Servlets

Qu es un Servlet?
La jerarqua de Servlets
HttpServletRequest y HttpServletResponse
Mapping de Servlets
Ciclo de vida de un Servlet
Inicializacin de Servlets
Manejo de parmetros
Manejo de sesiones
Manejo de threads
Redireccionamiento
Eventos y listeners
Filtros

Servlets

J2EE 1.4 utiliza la especificacin de servlets


2.4, aparecida en noviembre del 2003
De acuerdo a la especificacin:

"A servlet is a Java technology-based Web


component, managed by a container, that
generates dynamic content. Like other Java
technology-based components, servlets are
platform-independent Java classes that are
compiled to platform-neutral byte code that can
be loaded dynamically into and run by a Java
technology-enabled Web server. Containers,
sometimes called servlet engines, are Web server
extensions that provide servlet functionality.
Servlets interact with Web clients via a
request/response paradigm implemented by the
servlet container."
3

Servlet Container

De acuerdo a la especificacin:

"The servlet container is a part of a Web server or


application server that provides the network
services over which requests and responses are
sent, decodes MIME-based requests, and formats
MIME-based responses. A servlet container also
contains and manages servlets through their
lifecycle.
All servlet containers must support HTTP as a
protocol for requests and responses, but
additional request/response-based protocols such
as HTTPS (HTTP over SSL) may be supported."

Servlets

Un servlet es un programa escrito en Java


que extiende la funcionalidad de un servidor
Web
Un servlet es una clase que implementa la
interfaz javax.servlet.Servlet
Tpicamente, un servlet es una clase derivada
de javax.servlet.http.HttpServlet
Normalmente usado para generar HTML de
manera dinmica
Puede compararse con un programa CGI
5

Tareas de un Servlet

Leer data enviada por el usuario (por ejemplo a


travs de un Form de una pgina Web)
Obtener otra informacin del requerimiento
(browser utilizado, cookies, direccin IP cliente,
etc.)
Generar el resultado
Formatear el resultado en un documento
(tpicamente una pgina HTML)
Establecer parmetros de respuesta (tipo de
documento retornado, cookies, etc.)
Enviar la respuesta al cliente (formato text/html,
image/gif, etc.)
6

Ventajas de Servlets

Eficiente

Conveniente

Herramientas de Java, posibilidad de compartir


informacin entre servlets

Portable

Provee mecanismos para recuperar parmetros,


manejar encabezados, cookies, sesiones

Poderoso

Utiliza threads, es compilado, se carga una vez en


memoria (cdigo y objeto)

Write Once, Run Anywhere (especificacin J2EE)

Seguro

Seguridad provista por Java


7

La Jerarqua de Servlets

javax.servlet
javax.servlet.http
8

Servlet

interface javax.servlet.Servlet

Servlet

10

GenericServlet

class javax.servlet.GenericServlet

11

HttpServlet

class javax.servlet.http.HttpServlet

12

HttpServlet

13

HttpServlet

14

Una Plantilla para Servlets


import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class ServletTemplate extends HttpServlet
{
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
// usar "request" para leer HTTP headers
// (por ejemplo cookies) y Form data
// usar "response" para establecer status de respuesta
// y headers (content type, cookies)
PrintWriter out = response.getWriter();
// usar "out" para enviar contenido al browser
}
}

15

Ejemplo

16

HttpServletRequest

interface javax.servlet.http.HttpServletRequest

17

HttpServletRequest

La interfaz javax.servlet.http.HttpServletRequest
provee mtodos para:

Recuperar parmetros del request: getParameter,


getParameter
getParameterName,
getParameterName getParameterValues
Manipular atributos del request: getAttribute,
getAttribute getAttributeNames,
getAttributeNames
setAttribute
Manipular encabezados del request: getHeader,
getHeader getHeaders,
getHeaders
getHeaderNames
Obtener elementos del path: getContextPath,
getContextPath getServletPath,
getServletPath
getPathInfo
Manipular cookies: getCookies
Obtener informacin SSL: isSecure
Obtener informacin de internacionalizacin: getLocale,
getLocale getLocales
Manipular la codificacin: getCharacterEncoding,
getCharacterEncoding
setCharacterEncoding
18

HttpServletResponse

interface javax.servlet.http.HttpServletResponse

19

HttpServletResponse

La interfaz javax.servlet.http.HttpServletResponse
provee mtodos para:

Obtener el objeto Writer o OutputStream sobre el cual generar la


respuesta: getWriter,
getWriter getOutputStream
Manipular el buffering: getBufferSize,
getBufferSize setBufferSize,
setBufferSize isCommited,
isCommited
reset,
reset resetBuffer,
resetBuffer flushBuffer
Manipular encabezados de la respuesta: setHeader,
setHeader addHeader
Manipular cookies: addCookie
Manejar internacionalizacin: setLocale
Manipular la codificacin: getCharacterEncoding,
getCharacterEncoding
setCharacterEncoding

20

Mapping de Servlets

Para dar acceso a un servlet, se crea en el archivo


web.xml (el deployment descriptor) un mapping
que asocia la clase a un nombre usado en el URL:

21

Mapping de Servlets

El URL utilizado para invocar al servlet


es:
http://servidor:puerta/webapp/mapping
En el ejemplo, el mapping /holamundo
se asocia a la clase
cl.servlets.ServletHolaMundo

22

El Deployment Descriptor

Archivo <webapp>/WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?>


<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<servlet></servlet>
<servlet-mapping></servlet-mapping>

</web-app>
23

Ciclo de Vida de un Servlet

24

Ciclo de Vida de un Servlet

init

service

Invocado en un nuevo thread, generado por el


servidor. Invoca a doGet(), doPost(), etc., segn
el comando HTTP recibido. No hacer override de
este mtodo!

doGet, doPost, doXxx

Ejecutado una vez, cuando el servlet es cargado.


No se invoca para cada request.

Mtodos que manejan requerimientos de tipo


GET, POST, etc. Hacer override segn se requiera.

destroy

Invocado cuando el servidor elimina la instancia


(porque el servidor se est deteniendo o porque
25
necesita memoria).

Inicializacin de Servlets

Inicializacin de referencias a EJBs,


conexiones a bases de datos, etc.
Se usa ServletConfig.getInitParameter
para leer parmetros de inicializacin
Los parmetros de inicializacin se
establecen en el deployment descriptor
(archivo web.xml)
web.xml

26

Inicializacin de Servlets

27

Inicializacin de Servlets

28

Inicializacin de Servlets

29

Resultado ServletInicializacion

30

Manejo de Parmetros

Envo de parmetros:

En un URL:

Form data:

http://www.discos.cl/discos/busqueda?
autor=Les+Luthiers&desde=1995&hasta=2000
<form action="http://www.discos.cl/discos/buscar">
<input type="text" name="tipo" size="20"
maxlength="40">
<input type="submit" name="Aceptar"
value="Aceptar">
</form>

En un link:

<a href=
"http://java.sun.com/j2ee/1.4/download.html#samples"
>BluePrints in the J2EE 1.4 SDK Samples bundle</a>

31

Envo de Parmetros

32

Envo de Parmetros

33

Envo de Parmetros

34

Recepcin de Parmetros

request.getParameter("parametro")

request.getParameterValues("parametro")

Retorna primera ocurrencia del parmetro


indicado en el query string
Opera para request GET y POST
Retorna null si el parmetro no se encuentra en el
query string
Retorna un arreglo con los valores del parmetro
indicado (null si el parmetro no est)

request.getParameterNames()

Retorna un Enumeration con los nombres de los


parmetros

35

Recepcin de Parmetros

36

Resultado ServletParametros

37

Manejo de Sesin

Por qu manejar sesiones?

Cuando un cliente de un sitio de comercio


electrnico indica que desea comprar lo
que ha dejado en el carro, cmo sabe el
servidor de qu cliente se trata, y qu hay
en su carro?

38

El API para Manejo de Sesin

Las sesiones de diferentes usuarios son manejadas


en objetos HttpSession (interfaz
javax.servlet.http.HttpSession)
javax.servlet.http.HttpSession que viven en el
servidor
Para obtener el objeto sesin del cliente:

HttpSession session = request.getSession();

getSession() retorna el objeto sesin correspondiente


al usuario, o crea uno nuevo en caso que an no
haya sido creado
HttpSession provee un mecanismo de tipo Map para
almacenar objetos de cualquier tipo

setAttribute() asocia un objeto a una llave


getAttribute() retorna el objeto asociado a una llave

39

HttpSession

javax.servlet.http.HttpSession

40

Identificacin de Sesiones

Cuando un servlet inicia una sesin, el


servidor genera un identificador para ella
Este identificador es intercambiado entre el
cliente y el servidor a travs de uno de los
siguientes mecanismos

Cookies: se maneja la cookie JSESSIONID, de


manera transparente (no hay que programar nada
para ello, slo habilitar el manejo de cookies en el
browser)
URL rewriting: la aplicacin debe preocuparse de
agregar el identificador en cada URL utilizado,
para lo cual puede utilizar el mtodo encodeURL
del objeto HttpServletResponse:
HttpServletResponse

out.print("<a href=' " +


response.encodeURL("/miwebapp/prueba") +
41
" '>" + ... );

Uso de Informacin de Sesin

42

Uso de Informacin de Sesin

43

Threads

Cuando diferentes usuarios ejecutan


requerimientos simultneos sobre un
servlet, una misma instancia del servlet
solicitado atiende los requerimientos de
manera concurrente, utilizando threads
Por lo tanto, se debe ser cuidadoso con
el uso de variables de instancia y static
en un servlet, ya que estas variables
son compartidas por threads
concurrentes
44

Threads

45

Threads

46

Redireccionamiento

En ocasiones se requiere que un servlet transfiera el


control a otro recurso (otro servlet, o una pgina
JSP)
Un servlet puede realizar un forward de dos
maneras:

HttpServletResponse.sendRedirect:
HttpServletResponse.sendRedirect retorna una respuesta de
tipo redirect al cliente, lo que genera un nuevo request
request.sendRedirect("reportes/reporte1");

RequestDispatcher.forward:
RequestDispatcher.forward no involucra interaccin con el
cliente, el forward generado forma parte del mismo request
RequestDispatcher dispatcher =
request.getRequestDispatcher("reportes/reporte1");
dispatcher.forward(request, response);
47

Compartiendo Informacin

Dejando disponible informacin para:

otros recursos involucrados en el mismo


request (producto de
RequestDispatcher.forward)
RequestDispatcher.forward

otros recursos correspondientes a la misma


sesin

request.setAttribute("nombre", valor);

session.setAttribute("nombre", valor);

otros recursos correspondientes a la misma


aplicacin

servletContext.setAttribute("nombre", valor);

48

ServletContext

La interfaz javax.servlet.ServletContext define


un conjunto de mtodos que el servlet puede
utilizar para interactuar con el Servlet
Container (obtener el tipo MIME de un
archivo, realizar un forward de un request,
etc.)
Existe un ServletContext por aplicacin Web
El mtodo GenericServlet.getServletContext()
permite obtener el objeto ServletContext
asociado a un servlet

49

Listeners

Es posible registrar clases listeners, que reciben


notificaciones de eventos de la aplicacin
Un listener debe implementar una o ms de las
siguientes interfaces, que se encuentran en el
paquete javax.servlet:
javax.servlet

ServletContextListener:
ServletContextListener recibe notificaciones de cambios de
estado en el ServletContext de la aplicacin Web
ServletContextAttributeListener:
ServletContextAttributeListener recibe notificaciones de
cambios en la lista de atributos del ServletContext de la
aplicacin Web
ServletRequestListener:
ServletRequestListener recibe notificaciones de cambios de
estado en un ServletRequest
ServletRequestAttributeListener:
ServletRequestAttributeListener recibe notificaciones de
cambios en la lista de atributos de un ServletRequest

50

ServletContextListener
Configuracin de un ServletContextListener en archivo web.xml

Implementacin de un ServletContextListener

51

ServletContextListener

52

ServletContextListener

53

Filtros

Un filtro es un objeto que puede encadenarse


a recursos Web, y que se ejecuta cuando los
recursos son requeridos
Los filtros pueden realizar las siguientes
tareas

Consultar el request
Bloquear el acceso al recurso
Modificar el encabezado y la data del request
(mediante un wrapper)
Modificar el encabezado y la data del response
(mediante un wrapper)
54

Encadenamiento de Filtros

Un recurso Web puede tener asociado


un conjunto de filtros, que se ejecutan
secuencialmente (en el orden en que se
definen en el deployment descriptor)

55

Aplicaciones de Filtros

Los filtros pueden ser utilizados para:

Autenticacin
Log
Conversin de imgenes
Compresin de datos
Encriptacin
Transformaciones XML
...

56

La Interfaz Filter

Un filtro debe implementar la interfaz


javax.servlet.Filter
Los filtros tienen un ciclo de vida equivalente al de
los servlets
Al ejecutar un filtro, el Web Container invoca el
mtodo doFilter, el cual es el responsable de invocar
el resto de la cadena:

chain.doFilter(request, response);

57

La Interfaz FilterChain

Un FilterChain (interfaz javax.servlet.FilterChain)


javax.servlet.FilterChain es
un objeto provisto por el Web Container al
programador para entregarle acceso a la cadena de
invocacin de un recurso
El mtodo doFilter() invoca el siguiente filtro de la
cadena, o el recurso si este filtro es el ltimo

58

Un Ejemplo con Dos Filtros

Los dos filtros utilizados invocan a


FilterChain.doFilter
El segundo FilterChain invoca al recurso
final (en el ejemplo, Servlet.doGet

59

Un Filtro Sencillo

60

Mapping de un Filtro

61

Modificaciones

Adems de realizar tareas como logging, un


filtro puede modificar el request y/o el
response
Las modificaciones al request pueden incluir
operaciones simples, como agregar un
atributo (HttpServletRequest.setAttribute),
HttpServletRequest.setAttribute y
operaciones ms complejas, como agregar un
parmetro, lo que requiere crear una nueva
clase (HttpServletRequest no provee un
mtodo setParameter)
setParameter
Las modificaciones al response normalmente
requerirn crear un nuevo tipo de Writer y/o
OutputStream
62

Customizacin de un Request

Para "customizar" un request, debe extenderse la


clase javax.servlet.http.HttpServletRequestWrapper,
javax.servlet.http.HttpServletRequestWrapper
y modificar los mtodos que corresponda
La clase HttpServletRequestWrapper implementa
HttpServletRequest,
HttpServletRequest y sus mtodos simplemente
invocan a los mtodos de un objeto
HttpServletRequest recibido en el constructor (patrn
de diseo Decorator)

63

Ejemplo: Agregando un Parmetro

El Wrapper
public class MyWrapper extends HttpServletRequestWrapper {
public MyWrapper(HttpServletRequest request) {
super(request);
}
// agrega el parmetro version="1.1"
public String getParameter(String name) {
return name.equals("version") ? "1.1" : super.getParameter(name);
}
}

El Filtro
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException
{
chain.doFilter(new MyWrapper((HttpServletRequest)req), res);
}

64

Customizacin de un Response

Para "customizar" un response, debe extenderse la


clase javax.servlet.http.HttpServletResponseWrapper,
javax.servlet.http.HttpServletResponseWrapper
y modificar los mtodos que corresponda
Tpicamente ser necesario construir una clase
derivada de ServletOutputStream o de PrintWriter
Al modificar un response, adems deben modificarse
los encabezados que sea necesario, tpicamente
Content-Length y Content-Type

65

Ejemplo: Compresin

El siguiente ejemplo implementa un filtro que


comprime el texto, en caso que el cliente lo
soporte
El diseo incluye 3 clases:

GZipResponseStream:
GZipResponseStream una especializacin de
ServletOutputStream que comprime al escribir,
para lo cual redefine los mtodos write()
GZipResponseWrapper:
GZipResponseWrapper una especializacin de
HttpServletResponseWrapper,
HttpServletResponseWrapper cuyos mtodos
getWriter() y getOutputStream() generan un
objeto GZipResponseStream
GZipFilter:
GZipFilter una implementacin de Filter,
Filter cuyo
mtodo doFilter() enmascara la respuesta en un
objeto GZipResponseWrapper
66

Diseo de GZipFilter

67

Clase GZipResponseStream

68

Clase GZipResponseWrapper

69

Clase GZipFilter

70

Resumen

La forma ms comn de construir un servlet es


extender la clase HttpServlet
Los servlets se "mapean" en el deployment
descriptor: WEB-INF/web.xml
Los mtodos principales de un servlet son init(),
init()
doGet(),
doGet() doPost(),
doPost() y destroy()
El mtodo ServletRequest.getParameter() entrega el
valor de un parmetro
El mtodo ServletResponse.getWriter() entrega un
PrintWriter para generar la pgina
El mtodo HttpServletRequest.getSession() entrega
un objeto para manejar la sesin del usuario
Los mtodos setAttribute() y getAttribute() del objeto
HttpSession permiten asociar objetos a la sesin del
usuario
71

Resumen

El mtodo RequestDispatcher.forward() permite


redireccionar un request de un recurso a otro
Los mtodos setAttribute() y getAttribute() del objeto
ServletRequest permiten compartir objetos al
redireccionar un request
Es posible definir listeners para atrapar los eventos
de una aplicacin (por ejemplo, la inicializacin)
Es posible definir filtros para realizar determinadas
tareas, o modificar el request o el response, y
asignarlos a recursos de la aplicacin Web

72

Vous aimerez peut-être aussi