SERVLETS Aplicaciones Distribuidas
Contenido Definición. Framework Servlet. Ciclo de vida. Ejemplo. Procesamiento Petición. Generación de la Respuesta. Sesiones. Cookies. Colaboración entre servlets. Otros aspectos de interés. 2
Definición 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. Tecnología Java que sustituye a la programación CGI. Situada en el nivel módulos ejecutables. Hasta JSP, único modo de generar páginas web dinámicas. Ahora: Controlador en la arquitectura Modelo/Vista/Control Preprocesamiento de peticiones.... 3
Framwork Servlets <<Interface>> javax.servlet.servlet init(config : ServletConfig) destroy() service(peticion : ServletRequest, respuesta : ServletResponse) Especificación Servlet define un framework de programación Petición/Respuesta. javax.servlet.genericservlet init() destroy() getinitparameter()...() service() Especialización protocolo HTTP. Paquetes: javax.servlet. javax.servlet.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)...() 4
Ciclo de Vida Se instancia el objeto Primera petición init Ejecución en un Thread Siguientes peticiones service service doget dopost El contenedor libera recursos destroy 5
Modelo de Ejecución Un solo objeto instanciado por Servlet. Cada petición se ejecuta en un thread diferente. Programación thread-safe: Uso de variables locales y parámetros. Acceso a atributos en modo consulta. Bloques de sincronización para las actualizaciones. Interface marca SingleThreadModel private int codigo;... public void dopost (...) {... synchronize (this) { codigo ++;... } 6
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 Petición Información petición: HttpServletRequest. Recoger parámetros de la petición: Organizados en un diccionario multivaluado de cadenas. Ejemplos: String nombre = request.getparameter( nombre ). Enumeration preferencias = request.getparametervalues( preferencias ); Parámetros petición: getparameternames(): Enumeration Recoger cabeceras HTTP: String referer = request.getheader( referer ); A tener en cuenta: Los parámetros siempre son String. Cuando un parámetro no ha sido definido, devuelve null. Ejemplo: checkbox no marcado. 8
Generación de la Respuesta Información Respuesta: HttpServletResponse. La salida siempre se genera siguiendo la estructura de una respuesta HTTP: Código 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: Respuestas directas: senderror(int sc, String msg) sendredirect(string url) PrintWriter out = response.getwriter() out.println( Hola Mundo ); 9
Sesiones El contenedor de servlets implementa un mecanismo de seguimiento de sesiones. Información sesión: HttpSession. El contenedor ofrece al servlet la sesión asociada a la petición: HttpSession sesion = request.getsession(); Manejar información de la sesión: 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 aplicación web. <session-config> <session-timeout>20</session-timeout> </session-config> 10
Sesiones Reescritura URL Problema: El seguimiento de la sesión basado en cookies puede ser deshabilitado. Solución: reescritura de URLs Añadir a todas las URLs a módulos ejecutables de la aplicación (servlets, JSP) un parámetro que identifique a la sesión. Consecuencia: Generación dinámica de URLs. Reescritura: String nuevaurl = response.encondeurl(url); El método realiza la reescritura si es necesario. 11
Cookies Problema: El mecanismo de seguimiento está limitado a la sesión del navegador. Solución: Enviar una cookie y mantener la información de sesión persistente. Útil para personalizar sitios web. Las cookies se añaden a la respuesta. Cookie c = new Cookie( id, identificador); response.addcookie(c); Las cookies se recuperan de la petición: Cookie[] cookies = request.getcookies(); if (cookies[0].getname().equals( id )) { out.println(cookies[0].getvalue(); 12
Colaboración entre Servlets Tipos: Un servlet invoca a otro servlet. Un servlet guarda información para otros servlets. Invocación de un servlet: RequestDispatcher ResquestDispatcher rd = request.getresquestdispatcher ( servlet/hola ); Tipos de invocación: forward: reenvío de la llamada rd.forward(request, response); include: para incluir el contenido de una página (SSI) rd.include(request, response); A tener en cuenta: Los dos servlets comparten la petición (ServletRequest). La invocación no está restringida a servlets: HTML, JSP,... 13
Colaboración entre Servlets RequestDispatcher (continuación): Intercambio de información a través de la petición: request.setattribute( usuarios, lista); List usuarios = (List) request.getattribute( usuarios ); Comunicación a través del Contexto. Los servlets comparten un objeto ServletContext. Compartir información: contexto.setattribute( factoriadao, factoriadao); FactoriaDAO f = (FactoriaDAO) contexto.getattribute ( factoriadao ); Contexto accesible a través de ServletConfig: ServletContext contexto = getservletconfig ().getservletcontext(); 14
Otros aspectos de interés Tipos de URL: Absoluta: http://localhost/isi/servlet/hola Relativa:../index.jsp, servlet/hola Relativa al contexto: Añade el nombre de la aplicación. /ad/servlet/hola En la práctica: Utilizar URL relativas. Parámetros inicio de un servlet: Declarados en web.xml. Accesibles a través de ServletConfig String urlbd = getservletconfig().getinitialparameter ( urlbd ); 15