Está en la página 1de 15

SERVLETS

Aplicaciones Distribuidas

Contenido

Definicin.

Framework Servlet.

Ciclo de vida.

Ejemplo.

Procesamiento Peticin.

Generacin de la Respuesta.

Sesiones.

Cookies.

Colaboracin entre servlets.

Otros aspectos de inters.

Definicin

Un Servlet es un componente Java que puede ser instalado en un servidor para ampliar su
funcionalidad:

Peticiones: HTTP
Respuesta: HTML, XML o WML.

Se ejecutan dentro de un contenedor de servlets.

Tecnologa Java que sustituye a la programacin CGI.

Situada en el nivel mdulos ejecutables.

Hasta JSP, nico modo de generar pginas web dinmicas.

Ahora:

Controlador en la arquitectura Modelo/Vista/Control


Preprocesamiento de peticiones.
...

Framwork Servlets
<<Interface>>
javax.servlet.Servlet
init(config : ServletConfig)
destroy()
service(peticion : ServletRequest, respuesta : ServletResponse)

Especificacin Servlet define un framework de programacin


Peticin/Respuesta.

javax.servlet.GenericServlet
init()
destroy()
getInitParameter()
...()
service()

Especializacin protocolo HTTP.


javax.servlet.http.HttpServlet
service(peticion : ServletRequest, respuesta : ServletResponse)
service(peticion : HttpServletRequest, respuesta : HttpServletResponse)
doGet(peticion : HttpServletResquest, respuesta : HttpServletResponse)
doPost(peticion : HttpServletRequest, respuesta : HttpServletResponse)
...()

Paquetes:
javax.servlet.
javax.servlet.http.

Ciclo de Vida

Se instancia el objeto

Primera peticin

Ejecucin en un Thread

init

doGet
Siguientes peticiones
service

service

doPost
El contenedor
destroy
libera recursos

Modelo de Ejecucin

Un solo objeto instanciado por Servlet.

Cada peticin se ejecuta en un thread diferente.

Programacin thread-safe:
Uso de variables locales y parmetros.
Acceso a atributos en modo consulta.
private int codigo;
Bloques de sincronizacin
...
para las actualizaciones.

public void doPost (...) {


...
synchronize (this) {
codigo ++;
...
}

Interface marca
SingleThreadModel

Ejemplo Hola Mundo


import java.io.*;!
import javax.servlet.*;!
import javax.servlet.http.*;!
!
public class HolaMundoServlet extends HttpServlet {!
public void doGet (HttpSevletRequest request,
!
!
!
!
HttpServletResponse response)!
throws ServletException, IOException {
!
PrintWriter out = reponse.getWriter();!
out.println("Hola Mundo");!
}!
public void doPost (HttpSevletRequest request,
HttpServletResponse response)!
!
!throws ServletException, IOException {
doGet(request, response);!
}!
}
7

Procesamiento de una Peticin

Informacin peticin: HttpServletRequest.

Recoger parmetros de la peticin:

Organizados en un diccionario multivaluado de cadenas.


Ejemplos:
String nombre = request.getParameter(nombre).
Enumeration preferencias = request.getParameterValues(preferencias);
Parmetros peticin:
getParameterNames(): Enumeration

Recoger cabeceras HTTP:

String referer = request.getHeader(referer);

A tener en cuenta:

Los parmetros siempre son String.


Cuando un parmetro no ha sido definido, devuelve null. Ejemplo: checkbox no
marcado.

Generacin de la Respuesta

Informacin Respuesta: HttpServletResponse.

La salida siempre se genera siguiendo la estructura de una respuesta


HTTP:
Cdigo de estado:

setStatus(valor)
Por defecto, OK (SC_OK).

Cabeceras:

Tipo MIME: setContentType(), text/html, image/gif


Otras: refresco, cach.

response.setHeader(refresh, 10; index.html);

Respuesta:

Se genera a un stream de salida.


Ejemplo:
PrintWriter out = response.getWriter()

Respuestas directas:

out.println(Hola Mundo);

sendError(int sc, String msg)


sendRedirect(String url)

Sesiones
El contenedor de servlets implementa un mecanismo de
seguimiento de sesiones.
Informacin sesin: HttpSession.
El contenedor ofrece al servlet la sesin asociada a la peticin:
HttpSession sesion = request.getSession();

Manejar informacin de la sesin:

Tabla (String-Object)
Cliente c = (Cliente) sesion.getAttribute(cliente);
sesion.setAttribute(fallos, new Integer(0));

Tiempo de vida limitado.


Configurable en web.xml de la aplicacin web.
<session-config>
<session-timeout>20</session-timeout>
</session-config>
10

Sesiones Reescritura URL


Problema:
El seguimiento de la sesin basado en cookies puede ser
deshabilitado.

Solucin: reescritura de URLs


Aadir a todas las URLs a mdulos ejecutables de la aplicacin
(servlets, JSP) un parmetro que identifique a la sesin.

Consecuencia:
Generacin dinmica de URLs.

Reescritura:
String nuevaUrl = response.encondeURL(url);
El mtodo realiza la reescritura si es necesario.
11

Cookies
Problema:
El mecanismo de seguimiento est limitado a la sesin del
navegador.

Solucin:
Enviar una cookie y mantener la informacin de sesin
persistente.
til para personalizar sitios web.

Las cookies se aaden a la respuesta.


Cookie c = new Cookie(id, identificador);
response.addCookie(c);

Las cookies se recuperan de la peticin:


Cookie[] cookies = request.getCookies();
if (cookies[0].getName().equals(id)) {
out.println(cookies[0].getValue();
12

Colaboracin entre Servlets


Tipos:

Un servlet invoca a otro servlet.


Un servlet guarda informacin para otros servlets.

Invocacin de un servlet: RequestDispatcher


ResquestDispatcher rd = request.getResquestDispatcher
(servlet/Hola);
Tipos de invocacin:
forward: reenvo de la llamada
rd.forward(request, response);

include: para incluir el contenido de una pgina (SSI)


rd.include(request, response);

A tener en cuenta:
Los dos servlets comparten la peticin (ServletRequest).
La invocacin no est restringida a servlets: HTML, JSP, ...
13

Colaboracin entre Servlets


RequestDispatcher (continuacin):

Intercambio de informacin a travs de la peticin:


request.setAttribute(usuarios, lista);
List usuarios = (List) request.getAttribute(usuarios);

Comunicacin a travs del Contexto.

Los servlets comparten un objeto ServletContext.


Compartir informacin:
contexto.setAttribute(factoriaDAO, factoriaDAO);
FactoriaDAO f = (FactoriaDAO) contexto.getAttribute
(factoriaDAO);

Contexto accesible a travs de ServletConfig:

ServletContext contexto = getServletConfig


().getServletContext();
14

Otros aspectos de inters


Tipos de URL:

Absoluta: http://localhost/isi/servlet/Hola
Relativa: ../index.jsp, servlet/Hola
Relativa al contexto:
Aade el nombre de la aplicacin.
/ad/servlet/Hola

En la prctica:

Utilizar URL relativas.

Parmetros inicio de un servlet:

Declarados en web.xml.
Accesibles a travs de ServletConfig

String urlBD = getServletConfig().getInitialParameter


(urlBD);
15

También podría gustarte