servlets. contenido estructura básica de un servlet estructura básica de un servlet manejar datos...

152
Servlets Servlets

Upload: patricio-posadas

Post on 18-Apr-2015

19 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

ServletsServlets

Page 2: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

ContenidoContenido

Estructura básica de un servletEstructura básica de un servlet Manejar datos de formulariosManejar datos de formularios Leer cabeceras de solicitud HTTPLeer cabeceras de solicitud HTTP Acceder a variables estándar CGIAcceder a variables estándar CGI Códigos de estado HTTPCódigos de estado HTTP Especificar cabeceras de respuesta Especificar cabeceras de respuesta

HTTPHTTP Manejar CookiesManejar Cookies Seguimiento de sesiónSeguimiento de sesión

Page 3: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

¿Qué son los servlets ¿Qué son los servlets Java?Java? Respuesta de Java a la programación Respuesta de Java a la programación

CGICGI Se ejecutan en un servidor de Se ejecutan en un servidor de

aplicacionesaplicaciones Construyen páginas webConstruyen páginas web

Actúan como capa intermedia entre:Actúan como capa intermedia entre: Petición proviniente de un Navegador Web u Petición proviniente de un Navegador Web u

otro cliente HTTPotro cliente HTTP Bases de Datos o Aplicaciones en el servidor Bases de Datos o Aplicaciones en el servidor

HTTPHTTP

Page 4: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

¿Qué son los servlets ¿Qué son los servlets Java?Java?

Servidor Web

Servlet

BDexterna

BD

Aplicación

Page 5: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Tareas encomendadas a un Tareas encomendadas a un ServletServlet Leer los datos enviados por un usuarioLeer los datos enviados por un usuario

Usualmente de formularios en páginas WebUsualmente de formularios en páginas Web Pueden venir de applets de Java o programas Pueden venir de applets de Java o programas

cliente HTTP.cliente HTTP. Buscar cualquier otra información sobre Buscar cualquier otra información sobre

la petición que venga incluida en estala petición que venga incluida en esta Detalles de las capacidades del navegador, Detalles de las capacidades del navegador,

cookies, nombre del host del cliente, etc.cookies, nombre del host del cliente, etc. Generar los resultadosGenerar los resultados

Puede requerir consults a Base de Datos, Puede requerir consults a Base de Datos, invocar a otras aplicaciones, computar invocar a otras aplicaciones, computar directamente la respuesta, etc.directamente la respuesta, etc.

Page 6: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Tareas encomendadas a un Tareas encomendadas a un ServletServlet Dar formato a los resultados en un Dar formato a los resultados en un

documentodocumento Incluir la información en una página HTMLIncluir la información en una página HTML

Establecer los parámetros de la Establecer los parámetros de la respuesta HTTPrespuesta HTTP Decirle al navegador el tipo de documento Decirle al navegador el tipo de documento

que se va a devolver, establecer las cookies, que se va a devolver, establecer las cookies, etc.etc.

Enviar el documento al clienteEnviar el documento al cliente

Page 7: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Cuándo y por qué usar Cuándo y por qué usar ServletsServlets

Muchas peticiones desde navegador se satisfacen Muchas peticiones desde navegador se satisfacen retornando retornando documentos HTML estáticosdocumentos HTML estáticos, es decir, , es decir, que están en ficherosque están en ficheros

En ciertos casos, es necesario generar las páginas En ciertos casos, es necesario generar las páginas HTML para cada petición:HTML para cada petición: Página Web basada en datos enviados por el Página Web basada en datos enviados por el

clientecliente Motores de búsqueda, confirmación de pedidosMotores de búsqueda, confirmación de pedidos

Página Web derivada de datos que cambian Página Web derivada de datos que cambian con frecuenciacon frecuencia

Informe del tiempo o noticias de última horaInforme del tiempo o noticias de última hora Página Web que usa información de bases de Página Web que usa información de bases de

datos corporativas u otras fuentes del la parte datos corporativas u otras fuentes del la parte del servidordel servidor

Comercio electrónico: precios y disponibilidadesComercio electrónico: precios y disponibilidades

Page 8: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Servlet vs. CGIServlet vs. CGI

Servidor Web

Petición al CGI-2Petición al CGI-1

Petición al CGI-1

Proceso Hijo del CGI-1Proceso Hijo del CGI-2Proceso Hijo del CGI-1

Servidor Web basado en CGI

Petición al Servlet-2

Petición al Servlet-1

Petición al Servlet-1

Servidor Web

JVM

Servlet-1

Servlet-2

Thread

Servidor Web basado en Java Servlet

Page 9: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Ventajas de los Servlets Ventajas de los Servlets frente a CGIfrente a CGI

EficienciaEficiencia CGI corto: el proceso de arranque de cada CGI corto: el proceso de arranque de cada

proceso puede dominar el tiempo de ejecuciónproceso puede dominar el tiempo de ejecución N peticiones simultáneas: el código del CGI se N peticiones simultáneas: el código del CGI se

carga en memoria N vecescarga en memoria N veces Al terminar el proceso, el CGI se cierra: difícil Al terminar el proceso, el CGI se cierra: difícil

persistencia de datos (conexiones a BD, caché...)persistencia de datos (conexiones a BD, caché...)

ConvenienciaConveniencia Los Servlets tienen una infraestructura muy Los Servlets tienen una infraestructura muy

amplia para la tratar automáticamente datos de amplia para la tratar automáticamente datos de formularios HTML, gestionar sesiones y otras formularios HTML, gestionar sesiones y otras utilidades de alto nivel.utilidades de alto nivel.

Page 10: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Ventajas de los Servlets Ventajas de los Servlets frente a CGIfrente a CGI PotenciaPotencia

Los Servlets pueden comunicar Los Servlets pueden comunicar directamente con el navegador Webdirectamente con el navegador Web

Pueden mantener datos entre peticiones, Pueden mantener datos entre peticiones, simplificando el seguimiento de sesiones y simplificando el seguimiento de sesiones y operaciones de cachéoperaciones de caché

Varios Servlets pueden compartir datosVarios Servlets pueden compartir datos

PortabilidadPortabilidad Los Servlets están escritos en Java y siguen Los Servlets están escritos en Java y siguen

una API estándar.una API estándar. Pueden funcionar sin ningún cambio en Pueden funcionar sin ningún cambio en

diferentes servidoresdiferentes servidores

Page 11: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Ventajas de los Servlets Ventajas de los Servlets frente a CGIfrente a CGI

SeguridadSeguridad CGI adolecen de vulnerabilidades porque:CGI adolecen de vulnerabilidades porque:

Se ejecutan en el shell del SOSe ejecutan en el shell del SO Pueden sufrir overflows por el lenguaje (C, Pueden sufrir overflows por el lenguaje (C,

C++, ...)C++, ...) Los Servlets no sufren estos problemasLos Servlets no sufren estos problemas

EconomíaEconomía Añadir soporte para Servlet a un servidor Web Añadir soporte para Servlet a un servidor Web

ya disponible tiene muy poco coste extraya disponible tiene muy poco coste extra Existen ciertos servidores web y servidores de Existen ciertos servidores web y servidores de

servlet gratuitos para tráficos pequeñosservlet gratuitos para tráficos pequeños

Page 12: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

ArquitecturaArquitectura

Servlet Container = servidor web Servlet Container = servidor web capaz de ejecutar servletscapaz de ejecutar servlets

En una aplicación JSP, el contenedor En una aplicación JSP, el contenedor se corresponde a un JSP container.se corresponde a un JSP container.

Browser HTTP ServerServlet Container

Contenido Estático

ServletHTTP Request

HTTP Response

Page 13: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

ArquitecturaArquitectura

Page 14: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Funcionamiento de un Funcionamiento de un ServletServlet

Recibir Petición

¿Está el Servidor

Cargado?

¿Es el servidor

reciente?

Procesar Petición

Enviar Respuesta

Cargar Servlet

NO

NO

Page 15: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Ventajas sobre el CGI Ventajas sobre el CGI tradicionaltradicional EficienciaEficiencia

CCada petición es procesada por un único proceso ada petición es procesada por un único proceso en el contenedor de servletsen el contenedor de servlets

PortabilidadPortabilidad Heredado de JavaHeredado de Java

Rápido desarrollo y PotenciaRápido desarrollo y Potencia Acceso a las riquísimas librerías de JavaAcceso a las riquísimas librerías de Java

RobustezRobustez gestionados por la máquina virtual de Java gestionados por la máquina virtual de Java

Amplio soporteAmplio soporte muchos desarrolladores y compañías utilizan muchos desarrolladores y compañías utilizan

esta tecnologíaesta tecnología

Page 16: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Servlets: JerarquíaServlets: Jerarquía

La jerarquía de clases en Java es...La jerarquía de clases en Java es...

Únicamente hay que hacer Únicamente hay que hacer polimorfismo de los métodos que se polimorfismo de los métodos que se quieran tratar.quieran tratar.

Dos paquetes permiten la Dos paquetes permiten la programación de servlets:programación de servlets: javax.servletjavax.servlet javax.servlet.httpjavax.servlet.http

Page 17: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Servlets: JerarquíaServlets: Jerarquía

Page 18: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Llamada a un ServletLlamada a un Servlet Invocación de un ServletInvocación de un Servlet

Desde la barra de direcciones del Desde la barra de direcciones del navegadornavegador::

Ejemplo:Ejemplo:

De esta forma se invoca el servlet mediante el De esta forma se invoca el servlet mediante el método GET siempremétodo GET siempre

Desde un formularioDesde un formulario:: La dirección del servlet debe ir en el La dirección del servlet debe ir en el actionaction

El servlet se invoca al hacer Submit y lo hace El servlet se invoca al hacer Submit y lo hace mediante el método definido en el formulario mediante el método definido en el formulario

Al servlet se le pasan los valores de los camposAl servlet se le pasan los valores de los campos

http://hostname:port/context/Nombre_Servlet

http://localhost:8080/servlet/SimpleHTML

<FORM action=“http://hostname:port/context/Nombre_Servlet” method=“POST”>...</FORM>

Page 19: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Llamada a un ServletLlamada a un Servlet

Page 20: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Servlets: Ciclo de vidaServlets: Ciclo de vida

Ciclo de vida de un servlet:Ciclo de vida de un servlet:

Page 21: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Servlets: Ciclo de vidaServlets: Ciclo de vida

Viene dado por tres métodos: Viene dado por tres métodos: initinit, , serviceservice y y destroydestroy

INICIALIZACIÓNINICIALIZACIÓN: Una única llamada al : Una única llamada al método “método “initinit” por parte del servidor. Incluso ” por parte del servidor. Incluso se pueden recoger unos parametros concretos se pueden recoger unos parametros concretos con “con “getInitParametergetInitParameter” de “” de “ServletConfigServletConfig”.”.

SERVICIOSERVICIO: una llamada a : una llamada a service()service() por cada por cada invocación al servletinvocación al servlet ¡Cuidado!¡Cuidado! El contenedor es multihilo El contenedor es multihilo

DESTRUCCIÓNDESTRUCCIÓN: Cuando todas las llamadas : Cuando todas las llamadas desde el cliente cesen o un temporizador del desde el cliente cesen o un temporizador del servidor así lo indique. Se usa el método servidor así lo indique. Se usa el método ““destroydestroy””

Revisar documentación de la clase Revisar documentación de la clase javax.servlet.Servletjavax.servlet.Servlet

Page 22: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Demostrando el Ciclo de Demostrando el Ciclo de VidaVida

// examples\servlets\ej2_ciclovida_servlet// examples\servlets\ej2_ciclovida_servletimport javax.servlet.*;import javax.servlet.*;import java.io.IOException;import java.io.IOException;public class public class CicloVidaServlet implements ServletCicloVidaServlet implements Servlet { { public void public void initinit(ServletConfig config) throws ServletException {(ServletConfig config) throws ServletException { System.out.println("init");System.out.println("init"); }} public void public void serviceservice(ServletRequest request, ServletResponse response)(ServletRequest request, ServletResponse response) throws ServletException, IOException {throws ServletException, IOException { System.out.println("service");System.out.println("service"); }} public void public void destroydestroy() {() { System.out.println("destroy");System.out.println("destroy"); }} public String public String getServletInfogetServletInfo() {() { return null;return null; }} public ServletConfig public ServletConfig getServletConfiggetServletConfig() {() { return null;return null; }}}}

Page 23: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Servlets: Operaciones Servlets: Operaciones duraderasduraderas Respuestas a peticiónes de clientes Respuestas a peticiónes de clientes

que requieran de un tiempo de que requieran de un tiempo de proceso muy largo.proceso muy largo.

Puede que el servlet deba destruirse Puede que el servlet deba destruirse y estas operaciones aun no hayan y estas operaciones aun no hayan concluido.concluido.

Es responsabilidad del programador Es responsabilidad del programador encargarse de su gestión.encargarse de su gestión.

Page 24: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Servlets: Operaciones Servlets: Operaciones duraderasduraderas Necesitaremos por tanto:Necesitaremos por tanto:

Mantener un seguimiento de las tareas Mantener un seguimiento de las tareas (threads) que se estén ejecutando en el (threads) que se estén ejecutando en el método “método “serviceservice””

Proporcionar una finalización correcta Proporcionar una finalización correcta haciendo que los procesos largos que aun no haciendo que los procesos largos que aun no hayan concluido puedan terminar hayan concluido puedan terminar correctamente en el método “correctamente en el método “destroydestroy” del ” del servlet.servlet.

En ciertos casos poder terminar los procesos En ciertos casos poder terminar los procesos que aun siguen en ejecución si es necesario.que aun siguen en ejecución si es necesario.

Page 25: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Servlets: Operaciones Servlets: Operaciones duraderasduraderas

Posible solución: ContadorPosible solución: Contadorpublic ShutdownExample extends HttpServlet { public ShutdownExample extends HttpServlet {

private int serviceCounter = 0; private int serviceCounter = 0; private Object lock = new Object();  private Object lock = new Object();  protected void enteringServiceMethod() {protected void enteringServiceMethod() {

synchronized(lock) { serviceCounter++; }synchronized(lock) { serviceCounter++; }} } protected void leavingServiceMethod(){ protected void leavingServiceMethod(){

synchronized(lock) {synchronized(lock) {serviceCounter--;serviceCounter--;

if (serviceCounter == 0 && isShuttingDown()) notifyAll();if (serviceCounter == 0 && isShuttingDown()) notifyAll(); }}} } protected int numServices() {protected int numServices() {

synchronized(lock) { return serviceCounter; }synchronized(lock) { return serviceCounter; }}}protected void service(HttpServletRequest req, HttpServletResponse resp) protected void service(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {throws ServletException, IOException {enteringServiceMethod(); enteringServiceMethod(); try { super.service(req, resp); try { super.service(req, resp); }}

finally { leavingServiceMethod(); }finally { leavingServiceMethod(); }}}   

Page 26: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Servlets: Operaciones Servlets: Operaciones duraderasduraderas

Falta indicar la terminación.Falta indicar la terminación.public ShutdownExample extends HttpServlet { public ShutdownExample extends HttpServlet {

private boolean shuttingDown;private boolean shuttingDown;    protected void setShuttingDown(boolean flag) {protected void setShuttingDown(boolean flag) {

shuttingDown = flag; shuttingDown = flag; }}protected boolean isShuttingDown() {protected boolean isShuttingDown() {

return shuttingDown; return shuttingDown; }  }  public void destroy() {public void destroy() {

synchronized(lock) {synchronized(lock) { if (numServices() > 0) {if (numServices() > 0) {

setShuttingDown(true);setShuttingDown(true); }} while(numServices() > 0) {while(numServices() > 0) { try { wait(); }try { wait(); }

catch (InterruptedException e) { catch (InterruptedException e) { }} }}

}} }}} }   

Page 27: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Recuperando Recuperando ConfiguraciónConfiguración Recuperando información de configuración del fichero Recuperando información de configuración del fichero web.xmlweb.xml

<servlet><servlet> <servlet-name>ConfigDemoServletExample</servlet-name><servlet-name>ConfigDemoServletExample</servlet-name> <servlet-class>ConfigDemoServlet</servlet-class><servlet-class>ConfigDemoServlet</servlet-class> <init-param><init-param> <param-name>adminEmail</param-name><param-name>adminEmail</param-name> <param-value>[email protected]</param-value><param-value>[email protected]</param-value> </init-param></init-param> <init-param><init-param> <param-name>adminContactNumber</param-name><param-name>adminContactNumber</param-name> <param-value>6542214213</param-value><param-value>6542214213</param-value> </init-param></init-param> </servlet></servlet>

Page 28: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Recuperando Recuperando ConfiguraciónConfiguración Recuperando información de configuración del fichero Recuperando información de configuración del fichero web.xmlweb.xml, revisar , revisar

ejemplo ejemplo examples\servlets\examples\servlets\ej3_configinfo_servletej3_configinfo_servlet

public class ConfigDemoServlet implements Servlet {public class ConfigDemoServlet implements Servlet {ServletConfig cfg;ServletConfig cfg;public void init(ServletConfig config) throws ServletException {public void init(ServletConfig config) throws ServletException {

this.cfg = config;this.cfg = config;Enumeration parameters = Enumeration parameters = config.getInitParameterNamesconfig.getInitParameterNames();();while (parameters.hasMoreElements()) {while (parameters.hasMoreElements()) {

String parameter = (String) String parameter = (String) parameters.nextElement();parameters.nextElement();

System.out.println("Parameter name : " + System.out.println("Parameter name : " + parameter);parameter);

System.out.println("Parameter value : " + System.out.println("Parameter value : " + config.getInitParameter(parameter)config.getInitParameter(parameter)););

}}}}

// ...// ...}}

Page 29: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Contexto del ServidorContexto del Servidor

ServletContextServletContext representa el entorno donde se ejecuta el representa el entorno donde se ejecuta el servidor, es decir, el Servlet Containerservidor, es decir, el Servlet Container Se puede obtener una referencia a él mediante el método Se puede obtener una referencia a él mediante el método

ServletConfig.getServletContext()ServletConfig.getServletContext() Algunos métodos que se pueden utilizar son:Algunos métodos que se pueden utilizar son:

getMajorVersiongetMajorVersion de la Servlet API soportada por el contenedor de la Servlet API soportada por el contenedor getMinorVersiongetMinorVersion setAttributesetAttribute guarda un objeto en el guarda un objeto en el ServletContextServletContext getAttributeNamesgetAttributeNames getAttributegetAttribute removeAttributeremoveAttribute

A través del contexto de un servlet se puede compartir A través del contexto de un servlet se puede compartir estado entre varios servlets.estado entre varios servlets.

Page 30: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Contexto del ServidorContexto del Servidor

ServletConfig servletConfig;ServletConfig servletConfig;

public void init(ServletConfig config) throws ServletException {public void init(ServletConfig config) throws ServletException { servletConfig = config;servletConfig = config; }}

public void service(ServletRequest request, ServletResponse response) public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {throws ServletException, IOException { ServletContext servletContext = servletConfig.getServletContext();ServletContext servletContext = servletConfig.getServletContext(); Enumeration attributes = servletContext.getAttributeNames();Enumeration attributes = servletContext.getAttributeNames(); while (attributes.hasMoreElements()) {while (attributes.hasMoreElements()) { String attribute = (String) attributes.nextElement();String attribute = (String) attributes.nextElement(); System.out.println("Attribute name : " + attribute);System.out.println("Attribute name : " + attribute); System.out.println("Attribute value : " +System.out.println("Attribute value : " + servletContext.getAttribute(attribute));servletContext.getAttribute(attribute)); }}

System.out.println("Major version : " + servletContext.getMajorVersion());System.out.println("Major version : " + servletContext.getMajorVersion()); System.out.println("Minor version : " + servletContext.getMinorVersion());System.out.println("Minor version : " + servletContext.getMinorVersion()); System.out.println("Server info : " + servletContext.getServerInfo());System.out.println("Server info : " + servletContext.getServerInfo()); }}

Page 31: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Manejo de eventos del Manejo de eventos del contextocontexto Interface ServletContextListenerInterface ServletContextListener

Un objeto de esta interface recibe los eventos Un objeto de esta interface recibe los eventos de creación y destrucción de un contexto de de creación y destrucción de un contexto de Servlet. Decir, que el contenedor crea el Servlet. Decir, que el contenedor crea el contexto de Servlet como paso previo a servir contexto de Servlet como paso previo a servir cualquier contenido de la aplicación.cualquier contenido de la aplicación.

La clase que implemente este interface ha de La clase que implemente este interface ha de ser registrada en web.xml, mediante el ser registrada en web.xml, mediante el elemento <elemento <listenerlistener>>

public interface ServletContextListener extends java.util.eventListener Método Significado

contextInitialized(ServletContextEvent event ) Será invocado cuando se cree un nuevo contexto

contextDestroyedServletContextEvent event () Será invocado cuando se destruya un contexto ya existente.

Page 32: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Manejo de eventos del Manejo de eventos del contextocontexto Interface Interface

ServletContextAttributeListenerServletContextAttributeListener Notifica cuando existe un cambio en el Notifica cuando existe un cambio en el

estado de un contexto.estado de un contexto.public interface ServletContextAttributeListener extends java.util.eventListener

Método Significado

attributeAdded(ServletContextAttributeEvent event ) El contenedor invoca este método en el escuchante cuando un atributo es añadido al contexto.

attributeReplace(ServletContextAttributeEvent event ) Idem cuando es modificado attributeRemoved(ServletContextAttributeEvent event ) Idem cuando es eliminado

Page 33: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Manejo de eventos de Manejo de eventos de sesiónsesión Interface HttpSessionListenerInterface HttpSessionListener

Notifica cuando se crea o destruye una sesión.Notifica cuando se crea o destruye una sesión.

Cualquiera puede implementar esta interface, Cualquiera puede implementar esta interface, pero debemos indicarlo explícitamente en el pero debemos indicarlo explícitamente en el descriptor de despliegue (web.xml). Por descriptor de despliegue (web.xml). Por ejemplo:ejemplo:

<listener><listener>

<listener-class>MiEscuchador</listener-class><listener-class>MiEscuchador</listener-class>

</listener></listener>

public interface HttpSessionListener Método Significado

sessionCreated(HttpSessionEvent event) Este método seré invocado cuando se creé un sesión dentro de nuestra aplicación Web

sessionDestroyed(HttpSessionEvent event) Este método seré invocado cuando una sesión existente sea destruida

Page 34: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Manejo de eventos de Manejo de eventos de sesiónsesión Interface Interface

HttpSessionActivationListenerHttpSessionActivationListener Esta interface se utiliza para la notificación de Esta interface se utiliza para la notificación de

activación o pasivación.activación o pasivación.

Los atributos de sesión pueden implementar Los atributos de sesión pueden implementar esta interface. esta interface.

No es necesaria una entrada en web.xmlNo es necesaria una entrada en web.xml

public interface HttpSessionActivationListener Método Significado

sessionDidActivate(HttpSessionEvent event) Es invocado por el contenedor después de activar una sesión

sessionWillPassivate(HttpSessionEvent event)

El contenedor invoca este método antes de pasivizar la sesión.

Page 35: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Manejo de eventos de Manejo de eventos de sesiónsesión La clase HttpSessionEventLa clase HttpSessionEvent

Esta clase sólo tiene un métodoEsta clase sólo tiene un método public public HttpSession getSession()HttpSession getSession(), por medio del , por medio del cual podemos acceder a la sesión.cual podemos acceder a la sesión.

Page 36: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Manejo de eventos de Manejo de eventos de atributos de sesiónatributos de sesión

HttpSessionBindingListenerHttpSessionBindingListener La interface La interface HttpSessionBindingListenerHttpSessionBindingListener se se

utiliza para notificar a un objeto (el que utiliza para notificar a un objeto (el que implementa dicha interface) cuando está implementa dicha interface) cuando está siendo añadido o eliminado de la sesión siendo añadido o eliminado de la sesión (mediante los métodos setAttribute o (mediante los métodos setAttribute o removeAttribute)removeAttribute)public interface HttpSessionBindingListener extends java.util.EventListener

Método Significado

valueBound() El contenedor invoca este método en el objeto que está siendo vinculado a la sesión

valueUnBound()

El contenedor invoca este método en el objeto que está siendo desvinculado de la sesión, bien explícitamente o bien invalidando la sesión.

Page 37: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Manejo de eventos de Manejo de eventos de atributos de sesiónatributos de sesión

HttpSessionAttributeListenerHttpSessionAttributeListener La interface La interface HttpSessionAttributeListener, HttpSessionAttributeListener,

es semejante a la anterior, pero está destinada es semejante a la anterior, pero está destinada a notificar el cambio en el estado de una a notificar el cambio en el estado de una sesión.sesión.

public interface HttpSessionAttributeListener extends java.util.EventListener Método Significado

attributeAdded(HttpSessionBindingEvent event) El contenedor invoca este método cuando un atributo es añadido a una sesión

attributeRemove(HttpSessionBindingEvent event) El contenedor invoca este método cuando un atributo es eliminado de la sesión.

attributeReplace(HttpSessionBindingEvent event) Cuando se modifica un atributo

Page 38: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Manejo de eventos de Manejo de eventos de atributos de sesiónatributos de sesión

La clase HttpSessionBindingEventLa clase HttpSessionBindingEvent RepresentaRepresenta los eventos de vinculación y los eventos de vinculación y

desvinculación de sesión.desvinculación de sesión.

public interface HttpSessionBindingEvent extends HttpSessionEvent Método Significado

getName() Devuelve un String con el nombre del atributo vinculado o desvinculado de la session

getValue() Devuelve un Object con el valor del atributo vinculado, desvinculado o remplazado de la session

getSession() Devuelve un HttpSession que representa la sesión donde el atributo está siendo vinculado, desvinculado o remplazado.

Page 39: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Peticiónes y RespuestasPeticiónes y Respuestas

En el método En el método service()service() los parámetros: los parámetros: ServletRequestServletRequest representa la petición del cliente y representa la petición del cliente y ServletResponseServletResponse la respuesta del servidor la respuesta del servidor

ServletRequestServletRequest tiene los siguientes métodos: tiene los siguientes métodos: getParameterNamesgetParameterNames getParametergetParameter getRemoteAddressgetRemoteAddress getRemoteHostgetRemoteHost

ServletResponseServletResponse tiene entre otros el método: tiene entre otros el método: getWritergetWriter

Page 40: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Clase Clase GenericServletGenericServlet

El uso de la interfaz El uso de la interfaz ServletServlet tiene tiene dos inconvenientes:dos inconvenientes: Hay que proveer implementaciones de Hay que proveer implementaciones de

los cinco métodos de los cinco métodos de ServletServlet Hay que cachear la referencia a Hay que cachear la referencia a ServletConfigServletConfig pasada como parámetro pasada como parámetro

La clase La clase GenericServletGenericServlet provee una provee una implementación vacía de los 5 implementación vacía de los 5 métodos de Servlet y recuerda métodos de Servlet y recuerda ServletConfigServletConfig

Page 41: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Paquete Paquete javax.servlet.httpjavax.servlet.http

Normalmente siempre vamos a trabajar Normalmente siempre vamos a trabajar con él cuando programemos servlets.con él cuando programemos servlets.

Sus miembros y métodos son más Sus miembros y métodos son más convenientes y ofrecen más funcionalidadconvenientes y ofrecen más funcionalidad

Principalmente vamos a tratar con tres Principalmente vamos a tratar con tres clases:clases: HttpServletHttpServlet HttpServletRequestHttpServletRequest HttpServletResponseHttpServletResponse

Page 42: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

HttpServletHttpServlet

Hereda de Hereda de GenericServletGenericServlet Tiene 6 métodos Tiene 6 métodos doXXXdoXXX que son invocados que son invocados

cada vez que el correspondiente comando cada vez que el correspondiente comando HTTP es recibido:HTTP es recibido: doPostdoPost doPutdoPut doGetdoGet doDeletedoDelete doOptionsdoOptions doTracedoTrace

Page 43: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Servlets: Explicación de Servlets: Explicación de métodos HTTPmétodos HTTP

GETGET: Paso de parámetros en la propia URL de : Paso de parámetros en la propia URL de acceso al servicio o recurso del servidor. acceso al servicio o recurso del servidor. Método “Método “doGetdoGet””

POSTPOST: Lo mismo que GET pero los : Lo mismo que GET pero los parámetros van en línea aparte dentro del parámetros van en línea aparte dentro del cuerpo de la petición. El manejo es idéntico cuerpo de la petición. El manejo es idéntico pero a través del método “pero a través del método “doPostdoPost”.”.

Page 44: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Servlets: MétodosServlets: Métodos

Por defecto retornan Por defecto retornan BAD_REQUEST(400)BAD_REQUEST(400)

Son llamados desde el método Son llamados desde el método ““serviceservice”.”.

Reciben interfaces instanciadas:Reciben interfaces instanciadas: ““HttpServletRequestHttpServletRequest” para manejo de ” para manejo de

la informacion enviada por el usuario.la informacion enviada por el usuario. ““HttpServletResponseHttpServletResponse” para poder ” para poder

enviar una respuesta en forma de enviar una respuesta en forma de pagina web.pagina web.

Page 45: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Estructura básica de un Estructura básica de un servletservlet Ejemplo de un servlet básicoEjemplo de un servlet básico

import java.io.*;import java.io.*;

import javax.servlet.*;import javax.servlet.*;

import javax.servlet.http.*;import javax.servlet.http.*;

public class SomeServlet extends HttpServlet public class SomeServlet extends HttpServlet

{ { public void doGet(public void doGet( HttpServletRequest request, HttpServletRequest request,

HttpServletResponse HttpServletResponse response)response)

throws ServletException, throws ServletException, IOExceptionIOException

{{

Page 46: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Estructura básica de un Estructura básica de un servletservlet

// Use “request” para leer cabeceras HTTP// Use “request” para leer cabeceras HTTP// entrantes ( p.e. cookies) y datos de // entrantes ( p.e. cookies) y datos de // formularios HTTP ( p.e. datos introducidos y// formularios HTTP ( p.e. datos introducidos y// enviados por el usuario// enviados por el usuario// Use “response” para especificar las // Use “response” para especificar las

cabeceras ycabeceras y// texto de respuesta HTTP ( p.e. especificar el// texto de respuesta HTTP ( p.e. especificar el// tipo de contenido, declarar cookies).// tipo de contenido, declarar cookies).PrintWriter out = response.getWriter(); PrintWriter out = response.getWriter(); // Use "out" para enviar contenido al // Use "out" para enviar contenido al

navegadornavegador}}

} }

Page 47: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Estructura básica de un Estructura básica de un servletservlet Un servlet “extiende” a la clase HttpServletUn servlet “extiende” a la clase HttpServlet Sobreescribimos:Sobreescribimos:

doGet() para procesar peticiones hechas con GETdoGet() para procesar peticiones hechas con GET doPost() para procesar peticiones hechas con doPost() para procesar peticiones hechas con

POSTPOST Parámetros utilizados:Parámetros utilizados:

HttpServletRequestHttpServletRequest HttpServletResponseHttpServletResponse

La mayor parte del esfuerzo se gasta en La mayor parte del esfuerzo se gasta en senten-cias senten-cias printlnprintln que generan la página que generan la página deseadadeseada

Page 48: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

ContextosContextos

Aplicación: Aplicación: javax.servlet.ServletContextjavax.servlet.ServletContext

HttpServlet.getServletContext()HttpServlet.getServletContext() Sesión: Sesión: javax.servlet.http.HttpSessionjavax.servlet.http.HttpSession

HttpServletRequest.getSession()HttpServletRequest.getSession()

HttpServletRequest.getSession(t)HttpServletRequest.getSession(t) Petición: Petición: javax.servlet.ServletRequestjavax.servlet.ServletRequest

Page 49: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

ContextosContextos

Los contextos pueden guardar Los contextos pueden guardar información en atributos (un mapa de información en atributos (un mapa de asociación) mediante los métodosasociación) mediante los métodos

Object getAttribute(String)Object getAttribute(String)

void setAttribute(String, Object)void setAttribute(String, Object) El contexto de aplicación se pierde si el El contexto de aplicación se pierde si el

servidor se apaga. Hay mecanismos para servidor se apaga. Hay mecanismos para guardarlos y cargarlos automáticamente, guardarlos y cargarlos automáticamente, basados en eventos. Se pueden definir basados en eventos. Se pueden definir para eventos más generales.para eventos más generales.

Page 50: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

ServletsServlets

Servlet

Request Response

SessionPrintWriter

(atributos)

(parámetros)

EncodeURL

RequestURL

RemoteAddr

ServletContext

(atributos)

RequestDispatcher

include(…)forward(…)

(atributos)(parámetros)

Page 51: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Servlet que genera texto Servlet que genera texto normalnormalimport java.io.*;import java.io.*;import javax.servlet.*;import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.http.*;public class HelloWorld extends HttpServlet public class HelloWorld extends HttpServlet { {

public void doGet(public void doGet( HttpServletRequest HttpServletRequest request, request,

HttpServletResponse response)HttpServletResponse response)throws ServletException, throws ServletException,

IOException IOException {{

PrintWriter out = response.getWriter();PrintWriter out = response.getWriter();out.println("Hello World");out.println("Hello World");

}}} }

Page 52: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Servlet que genera Servlet que genera HTMLHTMLimport java.io.*;import java.io.*;import javax.servlet.*;import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.http.*;public class HelloWWW extends HttpServlet public class HelloWWW extends HttpServlet { {

public void doGet(public void doGet( HttpServletRequest HttpServletRequest request,request,

HttpServletResponse response)HttpServletResponse response)throws ServletException, throws ServletException,

IOExceptionIOException{{

response.setContentType("text/html"); response.setContentType("text/html"); PrintWriter out = response.getWriter(); PrintWriter out = response.getWriter();

Page 53: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Servlet que genera Servlet que genera HTMLHTML

out.println("<!DOCTYPE HTML out.println("<!DOCTYPE HTML PUBLIC \"-”+PUBLIC \"-”+

//W3C//DTD HTML 4.0 “ + //W3C//DTD HTML 4.0 “ + "Transitional//EN\">\n" +"Transitional//EN\">\n" +

"<HTML>\n" +"<HTML>\n" +"<HEAD>” +"<HEAD>” +““<TITLE>Hello WWW</TITLE>” +<TITLE>Hello WWW</TITLE>” +““</HEAD>\n" +</HEAD>\n" +"<BODY>\n" +"<BODY>\n" +"<H1>Hello WWW</H1>\n" +"<H1>Hello WWW</H1>\n" +"</BODY></HTML>"); "</BODY></HTML>");

}}} }

Page 54: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Invocación de otros Invocación de otros recursosrecursos ServletContext.getRequestDispatcher(StrinServletContext.getRequestDispatcher(Strin

g url)g url)

[Prepara un recurso preexistente para su [Prepara un recurso preexistente para su utilización subsiguiente en la sesión]utilización subsiguiente en la sesión]

RequestDispatcher.forward(request, RequestDispatcher.forward(request, response)response)

[Reenvía la solicitud. Antes de escribir en el [Reenvía la solicitud. Antes de escribir en el PrintWriter de la respuesta]PrintWriter de la respuesta]

RequestDispatcher.include(request, RequestDispatcher.include(request, response)response)

[Solicita la respuesta y la añade a la propia][Solicita la respuesta y la añade a la propia]

Page 55: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Eventos en el ciclo de vida de Eventos en el ciclo de vida de ServletsServlets

Cada vez que se crea o se destruye un Cada vez que se crea o se destruye un contexto (ServletContext, HttpSession o contexto (ServletContext, HttpSession o ServletRequest) o se modifica uno de sus ServletRequest) o se modifica uno de sus atributos, se emite un evento que reciben atributos, se emite un evento que reciben los objetos (listeners) registrados para los objetos (listeners) registrados para ello, ejecutando acciones especificadas en ello, ejecutando acciones especificadas en el programa.el programa.

Por ejemplo, un listener puede hacer que Por ejemplo, un listener puede hacer que al crearse una sesión se cree una al crearse una sesión se cree una conexión a una base de datos y que todo conexión a una base de datos y que todo cambio en un atributo se traslade a ella.cambio en un atributo se traslade a ella.

Page 56: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Eventos en el ciclo de vida de Eventos en el ciclo de vida de ServletsServlets

ServletContServletContextext

Iniciación, Iniciación, destruccióndestrucción

ServletContextListServletContextListener/Eventener/Event

Creación, borrado Creación, borrado o cambio de o cambio de atributoatributo

ServiceContextAttrServiceContextAttributeListener/ibuteListener/EventEvent

SessionSession

Creación, Creación, invalidación, invalidación, activación, activación, pasivaciónpasivación

HttpSessionListeneHttpSessionListener/Event/r/Event/ActivationListenerActivationListener

Creación, borrado Creación, borrado o cambio de o cambio de atributoatributo

HttpSessionAttribuHttpSessionAttributeListener/teListener/BindingEventBindingEvent

RequestRequest

Comienzo de Comienzo de procesamientoprocesamiento

ServletRequestListServletRequestListener/Eventener/Event

Creación, borrado Creación, borrado o cambio de o cambio de atributoatributo

ServletRequestAttrServletRequestAttributeListener/ibuteListener/EventEvent

Page 57: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

FiltrosFiltros

Permiten hacer acciones sobre la Permiten hacer acciones sobre la petición (Request) y la respuesta petición (Request) y la respuesta previas al tratamiento de la petición.previas al tratamiento de la petición.

Ejemplo: Mantenimiento de un Ejemplo: Mantenimiento de un contador de usuarios e inserción de contador de usuarios e inserción de su valor como atributo de la su valor como atributo de la respuesta.respuesta.

Pueden servir para varios servlets Pueden servir para varios servlets simultáneamente.simultáneamente.

Page 58: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

FiltrosFiltros

Un filtro es un objeto parecido a un Un filtro es un objeto parecido a un Servlet Servlet

Es controlado por el contenedor WebEs controlado por el contenedor Web Puede ser insertado de forma declarativa Puede ser insertado de forma declarativa

en el proceso de solicitud-respuesta en el proceso de solicitud-respuesta HTTP. HTTP.

Son útiles porque podemos introducir Son útiles porque podemos introducir código en el proceso de interceptación del código en el proceso de interceptación del contenedor Web.contenedor Web.

Page 59: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

FiltrosFiltros Su ciclo de vida se reduce a cuatro etapas, a la Su ciclo de vida se reduce a cuatro etapas, a la

sazón: sazón: Instanciación Instanciación

El contenedor instancia cada filtro en el arranque del El contenedor instancia cada filtro en el arranque del contenedor, para cada aplicación el contenedor mantiene contenedor, para cada aplicación el contenedor mantiene una instancia por filtrouna instancia por filtro

InicializaciónInicialización Después de instanciar un filtro, el contenedor invoca el Después de instanciar un filtro, el contenedor invoca el

método init(), durante esta llamada el contenedor pasa al método init(), durante esta llamada el contenedor pasa al filtro parámetros de inicialización.filtro parámetros de inicialización.

FiltradoFiltrado Aquellas solicitudes que requieran un filtro, el contenedor Aquellas solicitudes que requieran un filtro, el contenedor

invoca al método doFilter del filtro.invoca al método doFilter del filtro. DestrucciónDestrucción

El contenedor llama al método destroy() antes de retirar el El contenedor llama al método destroy() antes de retirar el filtro de servicio.filtro de servicio.

Page 60: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

FiltrosFiltros

Un filtro es una clase que:Un filtro es una clase que: Implementa la interface javax.servlet.FilterImplementa la interface javax.servlet.Filter Intercepta las peticiones a recursos del Intercepta las peticiones a recursos del

contenedor Web, previo al procesamiento de contenedor Web, previo al procesamiento de los mismos por parte del contenedor.los mismos por parte del contenedor.

Tiene al igual que un Servlet los métodos init() Tiene al igual que un Servlet los métodos init() y destroy(), con la misma finalidad. y destroy(), con la misma finalidad.

Posee el método doFilter() que es invocado Posee el método doFilter() que es invocado durante el proceso de interceptación, es decir, durante el proceso de interceptación, es decir, siempre que exista una solicitud de un recurso siempre que exista una solicitud de un recurso del servidor.del servidor.

Page 61: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

FiltrosFiltros

Dentro de web.xml tenemos:Dentro de web.xml tenemos:<filter><filter>

<filter-name>FiltroContador</filter-name><filter-name>FiltroContador</filter-name>

<display-name>FiltroContador</display-<display-name>FiltroContador</display-name>name>

<filter-class>jhc.FiltroContador</filter-<filter-class>jhc.FiltroContador</filter-class>class>

<init-param><init-param>

<param-name>parametro1</param-name><param-name>parametro1</param-name>

<param-value>valor1</param-value><param-value>valor1</param-value>

</init-param></init-param>

</filter></filter>

<filter-mapping><filter-mapping>

<filter-name>FiltroContador</filter-name><filter-name>FiltroContador</filter-name>

<url-pattern>*.html</url-pattern><url-pattern>*.html</url-pattern>

</filter-mapping></filter-mapping>

Page 62: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

FiltrosFiltros

La primera directiva es la que especifica La primera directiva es la que especifica el filtro dentro del descriptor.el filtro dentro del descriptor.

La segunda indica al contenedor que tipo La segunda indica al contenedor que tipo de solicitudes deben ser filtradas con el de solicitudes deben ser filtradas con el filtro en cuestión.filtro en cuestión.

Destacar que el orden en el que aparecen Destacar que el orden en el que aparecen los filtros en el descriptor de despliegue los filtros en el descriptor de despliegue (web.xml) representa el orden de la (web.xml) representa el orden de la cadena de filtro.cadena de filtro.

Page 63: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

La API de FiltrosLa API de Filtros

javax.servlet.Filtejavax.servlet.Filterr

Método Significado

Init(FilterConfig config) El contenedor invoca este método antes de poner el filtro en servicio. El contenedor envía la información de configuración mediante el objeto config

doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)

Este método es invocado por el contenedor mientras procesa un filtro. Mediante FilterChain, el filtro instruye al contenedor para que procese el filtro siguiente.

Destroy() Lo invoca el contenedor antes de sacar a un filtro de servicio.

Page 64: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

La API de FiltrosLa API de Filtros

javax.servlet.FilterConfigjavax.servlet.FilterConfig Similar a ServletConfig, permite o proporciona Similar a ServletConfig, permite o proporciona

acceso al entorno de filtros.acceso al entorno de filtros.

Método Significado

getFilterName() Devuelve el nombre del filtro, especificado en web.xml

getInitParameter(String name) Devuelve el valor del parámetro, null si no existe

getInitParameterNames() Devuelve un Enumeration con los nombres de los parámetros. Null si no tiene parámetros de iniciacización.

getServletContext() Devuelve una referencia al contexto de Servlet asociado a la aplicación.

Page 65: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

La API de FiltrosLa API de Filtros

javax.servlet.FilerChainjavax.servlet.FilerChain permite al filtro invocar el resto de la cadena permite al filtro invocar el resto de la cadena

de filtro (siguiente de la cadena), a través del de filtro (siguiente de la cadena), a través del método doFilter(). método doFilter().

Cuando un filtro invoca este método el Cuando un filtro invoca este método el contenedlo invoca al siguiente filtro, si existe, contenedlo invoca al siguiente filtro, si existe, en caso contrario el contenedor invoca al en caso contrario el contenedor invoca al recurso Web de la solicitud.recurso Web de la solicitud.Método Significado doFilter( ServletRequest req,

ServletResponse resp, FilterChain chain) throws ServletException, IOException

Hace que el contenedor invoque el siguiente filtro, tal y como esté definido en web.xml

Page 66: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Aspectos configurables en Aspectos configurables en aplicaciones web (web.xml)aplicaciones web (web.xml) Escuchas (Listeners)Escuchas (Listeners) Filtros (Filters)Filtros (Filters) Duración de la sesiónDuración de la sesión Parámetros de contextoParámetros de contexto Páginas de inicio y errorPáginas de inicio y error Páginas JSPPáginas JSP Lista de páginas JSP especialesLista de páginas JSP especiales Propiedades de grupos de páginas JSPPropiedades de grupos de páginas JSP Recursos (bases de datos, enlaces, …)Recursos (bases de datos, enlaces, …) SeguridadSeguridad

Page 67: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Servlets: Políticas de Servlets: Políticas de acceso concurrente acceso concurrente (threading)(threading) Los servlets están diseñados para Los servlets están diseñados para

soportar múltiples accesos simultáneos soportar múltiples accesos simultáneos por defecto.por defecto.

El problema puede surgir cuando se hace El problema puede surgir cuando se hace uso de un recurso compartido.uso de un recurso compartido.

Se exponen soluciones a poder Se exponen soluciones a poder considerar:considerar: Hacer que el servlet permita un único acceso Hacer que el servlet permita un único acceso

cada vez.cada vez. Hacer que el recurso sea el que posea la Hacer que el recurso sea el que posea la

política de acceso concurrente.política de acceso concurrente.

Page 68: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Servlets: Políticas de Servlets: Políticas de acceso concurrente acceso concurrente (threading)(threading) Para hacer que el servlet trate a un Para hacer que el servlet trate a un

cliente cada vez, únicamente hay cliente cada vez, únicamente hay que hacer que nuestra clase, además que hacer que nuestra clase, además de heredar de “de heredar de “HttpServletHttpServlet”, ”, implemente la interfaz implemente la interfaz ““SingleThreadModelSingleThreadModel” que es una ” que es una interfaz sin métodos.interfaz sin métodos.

Page 69: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Concurrencia: Concurrencia: PrecaucionesPrecauciones Si un servidor recibe varias peticiones Si un servidor recibe varias peticiones

dirigidas a la misma URL que dirigidas a la misma URL que corresponde a un servlet, el contenedor corresponde a un servlet, el contenedor de servlets ejecuta en hilos diferentes el de servlets ejecuta en hilos diferentes el método doGet o doPost sobre el mismo método doGet o doPost sobre el mismo objeto de la clase correspondiente en objeto de la clase correspondiente en vez de crear una instancia para cada vez de crear una instancia para cada petición.petición.

Como consecuencia de lo anterior, los Como consecuencia de lo anterior, los atributos de la clase del servlet son atributos de la clase del servlet son compartidos por todas las peticiones.compartidos por todas las peticiones.

Page 70: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Concurrencia: Concurrencia: PrecaucionesPrecauciones Cualquier variable o recurso cuyo Cualquier variable o recurso cuyo

estado tenga un ámbito más amplio estado tenga un ámbito más amplio para la aplicación que la ejecución del para la aplicación que la ejecución del método doGet o doPost tiene que ser método doGet o doPost tiene que ser sincronizada explícitamentesincronizada explícitamente

Ejemplo: Saldo de una cuenta corriente Ejemplo: Saldo de una cuenta corriente (independientemente de que se guarde (independientemente de que se guarde en el servlet o en una base de datos)en el servlet o en una base de datos)

No es recomendable usar atributos de No es recomendable usar atributos de servlets para información actualizableservlets para información actualizable

Page 71: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Manejar datos de Manejar datos de formulariosformularios Formato de los datos enviadosFormato de los datos enviados

http://host/path?user=Marty+Hall&origin=bwi&dehttp://host/path?user=Marty+Hall&origin=bwi&dest=laxst=lax

Los datos pueden enviarseLos datos pueden enviarse Al final de la URL de destino (formato GET)Al final de la URL de destino (formato GET) En una línea separada (formato POST)En una línea separada (formato POST)

Obtenerlos es una de las partes más tediosas Obtenerlos es una de las partes más tediosas con CGIcon CGI Hay que leerlos de forma diferente en GET y en Hay que leerlos de forma diferente en GET y en

POSTPOST Hay que separar las parejas de datos (&)Hay que separar las parejas de datos (&) Hay que separar nombre y valor del parámetro (=)Hay que separar nombre y valor del parámetro (=) Valores convertidos y/u omitidos (%7E,%20)Valores convertidos y/u omitidos (%7E,%20)

Page 72: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Manejar datos de Manejar datos de formulariosformularios Ventajas de los servlets JavaVentajas de los servlets Java

Análisis de los datos de formulario Análisis de los datos de formulario automatizadoautomatizado

Mismo tratamiento para GET y POSTMismo tratamiento para GET y POST Podemos obtener los nombres de los Podemos obtener los nombres de los

parámetrosparámetros Se tratan todos los valores como StringsSe tratan todos los valores como Strings

Page 73: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Manejar datos de Manejar datos de formulariosformularios Si el parametro tiene mas de un valor se Si el parametro tiene mas de un valor se

usa “usa “getParameterValuesgetParameterValues” de ” de ““HttpServletRequestHttpServletRequest” que devuelve un ” que devuelve un array de strings.array de strings.

Los nombres de los parametros son Los nombres de los parametros son accesibles mediante “accesibles mediante “getParameterNamesgetParameterNames” ” de “de “HttpServletRequestHttpServletRequest” que devuelve un ” que devuelve un Enumeration de strings.Enumeration de strings.

Se puede leer la línea directamente con Se puede leer la línea directamente con ““getReadergetReader” o “” o “getInputStreamgetInputStream” de ” de ““HttpServletRequestHttpServletRequest”.”.

Page 74: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Ejemplo 1: Leer tres Ejemplo 1: Leer tres parámetros parámetros import java.io.*;import java.io.*;import javax.servlet.*;import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.http.*;import java.util.*;import java.util.*;public class ThreeParams extends HttpServlet public class ThreeParams extends HttpServlet { {

public void doGet(public void doGet( HttpServletRequest request,HttpServletRequest request, HttpServletResponse response) HttpServletResponse response)

throws ServletException, throws ServletException, IOException IOException {{

response.setContentType("text/html"); response.setContentType("text/html"); PrintWriter out = response.getWriter(); PrintWriter out = response.getWriter(); String title = "Reading Three Request String title = "Reading Three Request

Parameters"; Parameters";

Page 75: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Ejemplo 1: Leer tres Ejemplo 1: Leer tres parámetrosparámetros

out.println(ServletUtilities.headWithTitle(title) out.println(ServletUtilities.headWithTitle(title) + "<BODY>\n" + "<BODY>\n" + "<H1 ALIGN=CENTER>"+title+ + "<H1 ALIGN=CENTER>"+title+

"</H1>\n" "</H1>\n" + "<UL>\n" + "<UL>\n" + " <LI>param1: " + " <LI>param1: " + request.getParameter("param1") + "\n" + request.getParameter("param1") + "\n" + " <LI>param2: " + " <LI>param2: " + request.getParameter("param2") + "\n" + request.getParameter("param2") + "\n" + " <LI>param3: " + " <LI>param3: " + request.getParameter("param3") + "\n" + request.getParameter("param3") + "\n" + "</UL>\n" + "</UL>\n" + "</BODY></HTML>"); + "</BODY></HTML>");

}}

Page 76: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Ejemplo 1: Leer tres Ejemplo 1: Leer tres parámetrosparámetros

public void doPost(public void doPost( HttpServletRequest HttpServletRequest request,request,

HttpServletResponse HttpServletResponse response) response)

throws ServletException, throws ServletException, IOException IOException { {

doGet(request, response); doGet(request, response); }}

}}

Page 77: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Ejemplo 2: Listar todos Ejemplo 2: Listar todos los Datoslos Datosimport java.io.*;import java.io.*;import javax.servlet.*;import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.http.*;import java.util.*;import java.util.*;

/** Shows all the parameters sent to the servlet via either/** Shows all the parameters sent to the servlet via either* GET or POST. Specially marks parameters that have no * GET or POST. Specially marks parameters that have no

values orvalues or* multiple values. * multiple values. * * * Part of tutorial on servlets and JSP that appears at * Part of tutorial on servlets and JSP that appears at * http://www.apl.jhu.edu/~hall/java/Servlet-Tutorial/ * http://www.apl.jhu.edu/~hall/java/Servlet-Tutorial/ * 1999 Marty Hall; may be freely used or adapted. * 1999 Marty Hall; may be freely used or adapted. */*/

Page 78: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Ejemplo 2: Listar todos Ejemplo 2: Listar todos los Datoslos Datospublic class ShowParameters extends HttpServlet public class ShowParameters extends HttpServlet { {

public void doGet(public void doGet( HttpServletRequest request,HttpServletRequest request, HttpServletResponse response) HttpServletResponse response)

throws ServletException, IOException throws ServletException, IOException { {

response.setContentType("text/html"); response.setContentType("text/html"); PrintWriter out = response.getWriter(); PrintWriter out = response.getWriter(); String title = "Reading All Request Parameters";String title = "Reading All Request Parameters";out.println(ServletUtilities.headWithTitle(title) out.println(ServletUtilities.headWithTitle(title) + "<BODY BGCOLOR=\"#FDF5E6\">\n" + "<BODY BGCOLOR=\"#FDF5E6\">\n" ++ "<H1 ALIGN=CENTER>"+title+"</H1>\n" "<H1 ALIGN=CENTER>"+title+"</H1>\n" + "<TABLE BORDER=1 ALIGN=CENTER>\n"+ "<TABLE BORDER=1 ALIGN=CENTER>\n"

Page 79: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Ejemplo 2: Listar todos Ejemplo 2: Listar todos los Datoslos Datos

+ "<TR BGCOLOR=\"#FFAD00\">\n" + "<TR BGCOLOR=\"#FFAD00\">\n" + "<TH>Parameter Name<TH>Parameter + "<TH>Parameter Name<TH>Parameter

Value(s)"); Enumeration paramNames = Value(s)"); Enumeration paramNames = request.getParameterNames(); request.getParameterNames(); while(paramNames.hasMoreElements()) while(paramNames.hasMoreElements()) { {

String paramName = String paramName = (String)paramNames.nextElement();(String)paramNames.nextElement(); out.println("<TR><TD>" + paramName + "\n<TD>"); out.println("<TR><TD>" + paramName + "\n<TD>"); String[] paramValues String[] paramValues

=request.getParameterValues(paramName);=request.getParameterValues(paramName); if (paramValues.length == 1) if (paramValues.length == 1) {{ String paramValue = paramValues[0];String paramValue = paramValues[0]; if (paramValue.length() == 0)if (paramValue.length() == 0) {{

Page 80: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Ejemplo 2: Listar todos Ejemplo 2: Listar todos los Datoslos Datos

out.print("<I>No Value</I>");out.print("<I>No Value</I>");}}elseelse{{

out.print(paramValue);out.print(paramValue); }} else else

{{ out.println("<UL>");out.println("<UL>"); for(int i=0; i<paramValues.length; i++) for(int i=0; i<paramValues.length; i++) {{ out.println("<LI>" + out.println("<LI>" +

paramValues[i]);paramValues[i]); } out.println("</UL>");} out.println("</UL>");

Page 81: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Ejemplo 2: Listar todos Ejemplo 2: Listar todos los Datoslos Datos

}} }} out.println("</TABLE>\n</BODY></HTML>");out.println("</TABLE>\n</BODY></HTML>");} }

public void doPost(public void doPost( HttpServletRequest request, HttpServletRequest request,

HttpServletResponse response) HttpServletResponse response) throws ServletException, throws ServletException,

IOException IOException {{

doGet(request, response); doGet(request, response); }}

}}

Page 82: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Ejemplo 2: Formulario de Ejemplo 2: Formulario de envíoenvío<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0

Transitional//EN">Transitional//EN"><HTML><HTML><HEAD> <HEAD> <TITLE>A Sample FORM using POST</TITLE><TITLE>A Sample FORM using POST</TITLE></HEAD></HEAD><BODY BGCOLOR="#FDF5E6"><BODY BGCOLOR="#FDF5E6"><H1 ALIGN="CENTER">A Sample FORM using POST</H1><H1 ALIGN="CENTER">A Sample FORM using POST</H1><FORM <FORM

ACTION="/servlet/hall.ShowParameters"METHOD="POST"> ACTION="/servlet/hall.ShowParameters"METHOD="POST"> Item Number: <INPUT TYPE="TEXT" Item Number: <INPUT TYPE="TEXT"

NAME="itemNum"><BR> NAME="itemNum"><BR> Quantity: <INPUT TYPE="TEXT" NAME="quantity"><BR> Quantity: <INPUT TYPE="TEXT" NAME="quantity"><BR> Price Each: <INPUT TYPE="TEXT" NAME="price" Price Each: <INPUT TYPE="TEXT" NAME="price"

VALUE="$"><BR>VALUE="$"><BR><HR> <HR> First Name: <INPUT TYPE="TEXT" NAME="firstName"><BR> First Name: <INPUT TYPE="TEXT" NAME="firstName"><BR>

Page 83: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Ejemplo 2: Formulario de Ejemplo 2: Formulario de envíoenvíoLast Name: <INPUT TYPE="TEXT" NAME="lastName"><BR> Last Name: <INPUT TYPE="TEXT" NAME="lastName"><BR> Middle Initial: <INPUT TYPE="TEXT" NAME="initial"><BR> Middle Initial: <INPUT TYPE="TEXT" NAME="initial"><BR> Shipping Address: <TEXTAREA NAME="address" ROWS=3 Shipping Address: <TEXTAREA NAME="address" ROWS=3

COLS=40></TEXTAREA><BR> COLS=40></TEXTAREA><BR> Credit Card:<BR> Credit Card:<BR>

<INPUT TYPE="RADIO" NAME="cardType" VALUE="Visa"><INPUT TYPE="RADIO" NAME="cardType" VALUE="Visa">Visa<BR>Visa<BR>

<INPUT TYPE="RADIO" NAME="cardType" VALUE="Master <INPUT TYPE="RADIO" NAME="cardType" VALUE="Master Card">Card">Master Card<BR> Master Card<BR> <INPUT TYPE="RADIO" NAME="cardType“ VALUE="Amex"><INPUT TYPE="RADIO" NAME="cardType“ VALUE="Amex">American Express<BR> American Express<BR> <INPUT TYPE="RADIO" NAME="cardType“ VALUE="Discover"><INPUT TYPE="RADIO" NAME="cardType“ VALUE="Discover">Discover<BR> Discover<BR> <INPUT TYPE="RADIO" NAME="cardType“ VALUE="Java <INPUT TYPE="RADIO" NAME="cardType“ VALUE="Java SmartCard">SmartCard">Java SmartCard<BR>Java SmartCard<BR>

Page 84: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Ejemplo 2: Formulario de Ejemplo 2: Formulario de envíoenvío

Credit Card Number: Credit Card Number: <INPUT TYPE="PASSWORD" NAME="cardNum"><BR> <INPUT TYPE="PASSWORD" NAME="cardNum"><BR> Repeat Credit Card Number: Repeat Credit Card Number: <INPUT TYPE="PASSWORD" NAME="cardNum"> <INPUT TYPE="PASSWORD" NAME="cardNum"> <BR><BR> <CENTER> <BR><BR> <CENTER> <INPUT TYPE="SUBMIT" VALUE="Submit Order"> <INPUT TYPE="SUBMIT" VALUE="Submit Order"> </CENTER></CENTER></FORM></FORM></BODY></BODY></HTML> </HTML>

Page 85: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Leer Cabeceras de Solicitud Leer Cabeceras de Solicitud HTTPHTTP

Introducción a las cabeceras de Introducción a las cabeceras de solicitudsolicitud Al enviar una petición, un cliente HTTP Al enviar una petición, un cliente HTTP

suministra una línea de petición (GET o suministra una línea de petición (GET o POST)POST)

Además, se pueden enviar cabecerasAdemás, se pueden enviar cabeceras Son opcionales salvo Content-Length Son opcionales salvo Content-Length

(POST)(POST)

Page 86: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Leer cabeceras de solicitud Leer cabeceras de solicitud HTTPHTTP

Cabeceras más comunesCabeceras más comunes AcceptAccept: : Tipos MIME preferidos por el navegadorTipos MIME preferidos por el navegador Accept-CharsetAccept-Charset: : Conjunto de caracteres Conjunto de caracteres

esperadoesperado Accept-EncodingAccept-Encoding: : Las codificaciónes de datos Las codificaciónes de datos

(por ejemplo gzip) que el navegador cliente soporta (por ejemplo gzip) que el navegador cliente soporta y conoce. Así el servlet puede consultar y conoce. Así el servlet puede consultar explícitamente información de codificación y así explícitamente información de codificación y así aprovechar las ventajas de HTML gzipeado aprovechar las ventajas de HTML gzipeado indicándolo en la cabecera de respuesta indicándolo en la cabecera de respuesta Content-Content-Encoding.Encoding.

Accept-LanguageAccept-Language: : Idioma esperado por el Idioma esperado por el navegadornavegador

Page 87: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Leer cabeceras de solicitud Leer cabeceras de solicitud HTTPHTTP

AuthorizationAuthorization: : Información de autentificación, que Información de autentificación, que generalmente se crea como respuesta a una cabecera generalmente se crea como respuesta a una cabecera WWW AuthenticateWWW Authenticate enviada desde el servidor. enviada desde el servidor.

ConnectionConnection: : Indica si se va a usar conexión Indica si se va a usar conexión persistente. Si un servlet recibe el valor persistente. Si un servlet recibe el valor Keep-AliveKeep-Alive o o una petición con una línea indicando HTTP 1.1 podrá una petición con una línea indicando HTTP 1.1 podrá hacer uso de las ventajas que estas ofrecen ahorrando hacer uso de las ventajas que estas ofrecen ahorrando tiempo en páginas con muchos elementos pequeños tiempo en páginas con muchos elementos pequeños como imágenes o applets. El servlet ha de indicar el como imágenes o applets. El servlet ha de indicar el tamaño del contenido a enviar como respuesta tamaño del contenido a enviar como respuesta mediante la cabecera mediante la cabecera Content-LengthContent-Length. Para ello se . Para ello se puede usar la clase puede usar la clase ByteArrayOutputStreamByteArrayOutputStream y al final y al final enviar todos los datos.enviar todos los datos.

Page 88: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Leer cabeceras de solicitud Leer cabeceras de solicitud HTTPHTTP

Content-LengthContent-Length: : Usada en los mensajes Usada en los mensajes POST para indicar el tamaño de los datos.POST para indicar el tamaño de los datos.

CookieCookie: : Para manejo de cookiesPara manejo de cookies FromFrom:: La dirección de email del cliente. La dirección de email del cliente. HostHost:: El host y el puerto sacados de la URL El host y el puerto sacados de la URL

original.original. If-Modified-SinceIf-Modified-Since:: Para indicar que solo han Para indicar que solo han

de enviarse documentos posteriores al actual. Si de enviarse documentos posteriores al actual. Si no es así, se envía una respuesta 304 "Not no es así, se envía una respuesta 304 "Not Modified". Modified".

PragmaPragma:: Si contiene el valor Si contiene el valor no-cacheno-cache indica indica que el servidor ha de enviar una nueva copia del que el servidor ha de enviar una nueva copia del documento.documento.

Page 89: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Leer cabeceras de solicitud Leer cabeceras de solicitud HTTPHTTP

RefererReferer:: La URL de la página que contenía La URL de la página que contenía el link que el cliente siguió para llegar a la el link que el cliente siguió para llegar a la pagina actual.pagina actual.

User-AgentUser-Agent:: El tipo de navegador que usa El tipo de navegador que usa el cliente. Es útil si se va enviar contenido el cliente. Es útil si se va enviar contenido especifico para un tipo de navegador.especifico para un tipo de navegador.

UA-PixelsUA-Pixels, , UA-ColorUA-Color, , UA-OSUA-OS, , UA-UA-CPUCPU:: Cabeceras no estándar enviadas desde Cabeceras no estándar enviadas desde IE indicando el tamaño de pantalla, la IE indicando el tamaño de pantalla, la profundidad de color, el SO y el tipo de cpu profundidad de color, el SO y el tipo de cpu usado en el cliente.usado en el cliente.

Page 90: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Leer cabeceras de Leer cabeceras de solicitudsolicitud Se obtienen mediante el método Se obtienen mediante el método getHeader()getHeader()

de HttpServletRequestde HttpServletRequest Hay métodos especiales para algunas Hay métodos especiales para algunas

cabecerascabeceras getCookies()getCookies(): Devuelve un arreglo con las cookies: Devuelve un arreglo con las cookies getAuthType(): getAuthType(): Devuelve el tipo de autorizaciónDevuelve el tipo de autorización getRemoteUser()getRemoteUser(): Devuelve la identidad del : Devuelve la identidad del

usuariousuario getDateHeader()getDateHeader() getIntHeader()getIntHeader()

getHeaderNames()getHeaderNames() devuelve todos los devuelve todos los nombresnombres

Page 91: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Leer cabeceras de Leer cabeceras de solicitudsolicitud También podemos obtener También podemos obtener

información sobre la línea de información sobre la línea de petición principalpetición principal getMethod()getMethod() devuelve el método de devuelve el método de

petición principalpetición principal getRequestURI()getRequestURI() devuelve la URI devuelve la URI getRequestProtocol()getRequestProtocol() devuelve la devuelve la

versión de HTTPversión de HTTP

Page 92: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

  Ejemplo 3: Imprimir todas las Ejemplo 3: Imprimir todas las CabecerasCabeceras

import java.io.*;import java.io.*;import javax.servlet.*;import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.http.*;import java.util.*;import java.util.*;

public class ShowRequestHeaders extends HttpServlet public class ShowRequestHeaders extends HttpServlet {{

public void doGet(public void doGet( HttpServletRequest request,HttpServletRequest request,HttpServletResponse response)HttpServletResponse response)throws ServletException, IOException throws ServletException, IOException {{response.setContentType("text/html");response.setContentType("text/html");PrintWriter out = response.getWriter();PrintWriter out = response.getWriter();

Page 93: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

  Ejemplo 3: Imprimir todas las Ejemplo 3: Imprimir todas las CabecerasCabeceras

String title = "Servlet Example: Showing Request String title = "Servlet Example: Showing Request Headers";Headers";out.println(out.println(ServletUtilities.headWithTitle(title) ServletUtilities.headWithTitle(title) +"<BODY BGCOLOR=\"#FDF5E6\">\n“+"<BODY BGCOLOR=\"#FDF5E6\">\n“+"<H1 ALIGN=CENTER>" +title +"</H1>\n“+"<H1 ALIGN=CENTER>" +title +"</H1>\n“+"<B>Request Method: </B>" +"<B>Request Method: </B>" +request.getMethod() + "<BR>\n" +request.getMethod() + "<BR>\n" +"<B>Request URI: </B>" +"<B>Request URI: </B>" +request.getRequestURI() + "<BR>\n" +request.getRequestURI() + "<BR>\n" +"<B>Request Protocol: </B>" +"<B>Request Protocol: </B>" +request.getProtocol() + "<BR><BR>\n" +request.getProtocol() + "<BR><BR>\n" +"<TABLE BORDER=1 ALIGN=CENTER>\n“+"<TABLE BORDER=1 ALIGN=CENTER>\n“+"<TR BGCOLOR=\"#FFAD00\">\n" +"<TR BGCOLOR=\"#FFAD00\">\n"

Page 94: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

  Ejemplo 3: Imprimir todas las Ejemplo 3: Imprimir todas las CabecerasCabeceras

+"<TH>Header Name<TH>Header Value");+"<TH>Header Name<TH>Header Value");Enumeration headerNames = Enumeration headerNames =

request.getHeaderNames();request.getHeaderNames();while(headerNames.hasMoreElements())while(headerNames.hasMoreElements()){{ String String

headerName=(String)headerNames.nextElement();headerName=(String)headerNames.nextElement();out.println("<TR><TD>" + headerName);out.println("<TR><TD>" + headerName);out.println("<TD>" out.println("<TD>"

+ + request.getHeader(headerName));request.getHeader(headerName));

}}out.println("</TABLE>\n</BODY></HTML>");out.println("</TABLE>\n</BODY></HTML>");

}}

public void doPost(public void doPost( HttpServletRequest request,HttpServletRequest request,

Page 95: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

  Ejemplo 3: Imprimir todas las Ejemplo 3: Imprimir todas las CabecerasCabeceras

HttpServletResponse response) HttpServletResponse response)

throws ServletException, throws ServletException, IOException IOException {{

doGet(request, response); doGet(request, response); }}

}}

Page 96: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Códigos de estado HTTPCódigos de estado HTTP

La respuesta típica a una petición La respuesta típica a una petición contienecontiene Línea de estadoLínea de estado Cabeceras de respuestaCabeceras de respuesta Una línea en blancoUna línea en blanco El documentoEl documento

Ejemplo mínimo:Ejemplo mínimo:HTTP/1.1 200 OKHTTP/1.1 200 OKContent-Type: text/plainContent-Type: text/plain

Hello WorldHello World

Page 97: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Códigos de estado HTTPCódigos de estado HTTP

La línea de estado consiste en:La línea de estado consiste en: Versión de HTTP utilizadaVersión de HTTP utilizada Un entero indicando un código de estadoUn entero indicando un código de estado Un texto corto correspondiente al código de Un texto corto correspondiente al código de

estadoestado Casi siempre, todas la cabeceras son Casi siempre, todas la cabeceras son

opcionales salvo Content-Typeopcionales salvo Content-Type No siempre se incluye un documentoNo siempre se incluye un documento

Peticiones HEADPeticiones HEAD Códigos de estado de falloCódigos de estado de fallo

Page 98: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Códigos de estado HTTPCódigos de estado HTTP

Los servlets pueden realizar tareas Los servlets pueden realizar tareas manipulando la línea de estado y las manipulando la línea de estado y las cabeceras de respuestacabeceras de respuesta Reenviar a otra páginaReenviar a otra página Indicar tipo del documento adjuntoIndicar tipo del documento adjunto Requerir password para acceder al Requerir password para acceder al

documentodocumento

Page 99: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Especificar códigos de Especificar códigos de estadoestado Seleccionamos un código de estado Seleccionamos un código de estado

mediante el método mediante el método setStatus()setStatus() de de HttpServletResponseHttpServletResponse

Los diferentes estados están definidos Los diferentes estados están definidos como constantes en como constantes en HttpServletResponseHttpServletResponse El nombre de la constante deriva del mensaje El nombre de la constante deriva del mensaje

estándar HTTP 1.1estándar HTTP 1.1 Se escribe en mayúsculas, sustituyendo los Se escribe en mayúsculas, sustituyendo los

espacios por subrayados y con el prefijo SC espacios por subrayados y con el prefijo SC (Status Code)(Status Code)

Ej: Ej: 404 => Not Found => SC_NOT_FOUND404 => Not Found => SC_NOT_FOUND

Page 100: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Especificar códigos de Especificar códigos de estadoestado ExcepcionesExcepciones

La constante para el código 302 deriva del La constante para el código 302 deriva del mensaje HTTP 1.0, no de HTTP 1.1mensaje HTTP 1.0, no de HTTP 1.1

La constante para el código 307 no existeLa constante para el código 307 no existe Seleccionar un código de estado no Seleccionar un código de estado no

significa que no necesitemos devolver un significa que no necesitemos devolver un documentodocumento Personalización de erroresPersonalización de errores Deberemos asegurarnos de llamar a Deberemos asegurarnos de llamar a

response.setStatus()response.setStatus() antes de enviar el antes de enviar el contenido mediante contenido mediante PrintWriterPrintWriter

Page 101: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Especificar códigos de Especificar códigos de estadoestado El modo general de seleccionar el El modo general de seleccionar el

código de estado es mediante código de estado es mediante response.setStatus()response.setStatus()

Excepciones/AtajosExcepciones/Atajos sendError()sendError() genera una respuesta 404 genera una respuesta 404

en HTMLen HTML sendRedirect()sendRedirect() genera una respuesta genera una respuesta

302 junto con una cabecera 302 junto con una cabecera LocationLocation indicando la URL de destinoindicando la URL de destino

Page 102: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Servlets: Respondiendo: Servlets: Respondiendo: Códigos de estadoCódigos de estado100 100

Continue Continue

Continuar con la petición parcial. Continuar con la petición parcial. (HTTP 1.1) (HTTP 1.1)

101 101

Switching Protocols Switching Protocols

El servidor debera responder con la cabecera El servidor debera responder con la cabecera UpgradeUpgrade y asi cambiar y asi cambiar de protocolo. de protocolo. (HTTP 1.1) (HTTP 1.1)

200 200

OK OK

Todo correcto. Por defecto en los servlets. Todo correcto. Por defecto en los servlets.

201 201

Created Created

El servidor ha creado un documento. En la cabecera El servidor ha creado un documento. En la cabecera LocationLocation se se incluye la URL.incluye la URL.

202 202

Accepted Accepted

La petición ha sido aceptada pero el procesamiento no ha terminado. La petición ha sido aceptada pero el procesamiento no ha terminado.

Page 103: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Servlets: Respondiendo: Servlets: Respondiendo: Códigos de estadoCódigos de estado203 203

Non-Authoritative Information Non-Authoritative Information El documento ha sido devuelto correctamente pero alguna cabecera es El documento ha sido devuelto correctamente pero alguna cabecera es incorrecta (HTTP 1.1) incorrecta (HTTP 1.1)

204 204 No Content No Content No hay nuevo documento. El cliente debe presentar el actual. No hay nuevo documento. El cliente debe presentar el actual.

205 205 Reset Content Reset Content No hay nuevo documento pero el cliente debe refrescar el actual. Para No hay nuevo documento pero el cliente debe refrescar el actual. Para resetear las variables CGI de los formularios (HTTP 1.1) resetear las variables CGI de los formularios (HTTP 1.1)

206 206 Partial Content Partial Content El cliente envio una petición parcial con una cabecera El cliente envio una petición parcial con una cabecera RangeRange y el servidor la y el servidor la ha rellenado. ha rellenado. (HTTP 1.1) (HTTP 1.1)

300 300 Multiple Choices Multiple Choices El documento que se ha solicitado se puede encontrar en múltiples sitios. La El documento que se ha solicitado se puede encontrar en múltiples sitios. La preferida o por defecto del servidor se ha de indicar en la cabecera preferida o por defecto del servidor se ha de indicar en la cabecera LocationLocation. .

Page 104: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Servlets: Respondiendo: Servlets: Respondiendo: Códigos de estadoCódigos de estado

301 301 Moved Permanently Moved Permanently El documento solicitado está en otro sitio. Se indica la URL en la cabecera El documento solicitado está en otro sitio. Se indica la URL en la cabecera LocationLocation. El . El navegador debería ir directamente.navegador debería ir directamente.

302 302 Found Found Similar a 301, pero la nueva URL debe entenderse como temporal. "Moved Temporarily" Similar a 301, pero la nueva URL debe entenderse como temporal. "Moved Temporarily" en HTTP 1.0, con la constante en HTTP 1.0, con la constante SC_MOVED_TEMPORARILY SC_MOVED_TEMPORARILY de de HttpServletResponseHttpServletResponse, (no , (no SC_FOUND)SC_FOUND). Tambien se puede usar el método directo . Tambien se puede usar el método directo response.sendRedirect(url)response.sendRedirect(url). .

303 303 See Other See Other Lo mismo que 301/302. Lo mismo que 301/302. (HTTP 1.1) (HTTP 1.1)

304 304 Not Modified Not Modified Cuando se determina que el cliente hace una petición condicional y se quiere indicar que Cuando se determina que el cliente hace una petición condicional y se quiere indicar que el documento que actualmente posee es el correcto (e.i. como respuesta a una cabecera el documento que actualmente posee es el correcto (e.i. como respuesta a una cabecera If-Modified-SinceIf-Modified-Since). ).

305 305 Use Proxy Use Proxy El documento solicitado debería ser accedido por el proxy indicado en la cabecera El documento solicitado debería ser accedido por el proxy indicado en la cabecera LocationLocation. . (HTTP 1.1) (HTTP 1.1)

Page 105: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Servlets: Respondiendo: Servlets: Respondiendo: Códigos de estadoCódigos de estado307 307

Temporary Redirect Temporary Redirect Identico a 302. No hay una variable en Identico a 302. No hay una variable en HttpServletResponseHttpServletResponse. . (HTTP 1.1) (HTTP 1.1)

400 400 Bad Request Bad Request petición con sintaxis errónea. petición con sintaxis errónea.

401 401 Unauthorized Unauthorized El cliente intento acceder a una pagina protegida con password sin la El cliente intento acceder a una pagina protegida con password sin la autorizacion necesaria. La respuesta incluye una cabecera autorizacion necesaria. La respuesta incluye una cabecera WWW-WWW-AuthenticateAuthenticate para que el cliente introduzca los datos en un dialogo que para que el cliente introduzca los datos en un dialogo que envia sus datos en la cabecera envia sus datos en la cabecera AuthorizationAuthorization. .

403 403 Forbidden Forbidden El recurso no esta disponible por un error en el servidor (permisos, acceso El recurso no esta disponible por un error en el servidor (permisos, acceso erroneo…). erroneo…).

404 404 Not Found Not Found El recurso no pudo ser accedido. Posee un método propio El recurso no pudo ser accedido. Posee un método propio HttpServletResponseHttpServletResponse: : sendError(message).sendError(message).

Page 106: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Servlets: Respondiendo: Servlets: Respondiendo: Códigos de estadoCódigos de estado405 405

Method Not Allowed Method Not Allowed El método de petición (El método de petición (GETGET, , POSTPOST, , HEADHEAD, , DELETEDELETE, , PUTPUT, , TRACETRACE, etc.) no es , etc.) no es permitido para el recurso solicitado. permitido para el recurso solicitado. (HTTP 1.1) (HTTP 1.1)

406 406 Not Acceptable Not Acceptable Incompatibilidad de tipo MIME. Incompatibilidad de tipo MIME. (HTTP 1.1) (HTTP 1.1)

407 407 Proxy Authentication Required Proxy Authentication Required Lo mismo que 401, pero se obliga a usar una cabecera Lo mismo que 401, pero se obliga a usar una cabecera Proxy-Proxy-AuthenticateAuthenticate por parte del servidor. por parte del servidor. (HTTP 1.1) (HTTP 1.1)

408 408 Request Timeout Request Timeout El cliente tardo demasiado en enviar una petición. El cliente tardo demasiado en enviar una petición. (HTTP 1.1) (HTTP 1.1)

409 409 Conflict Conflict Generalmente en método PUT. Suele enviarse si se ha solicitado una Generalmente en método PUT. Suele enviarse si se ha solicitado una versión incorrecta de un recurso. versión incorrecta de un recurso. (HTTP 1.1) (HTTP 1.1)

Page 107: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Servlets: Respondiendo: Servlets: Respondiendo: Códigos de estadoCódigos de estado410 410

Gone Gone El documento no esta disponible. La diferencia con 404 es que tiene El documento no esta disponible. La diferencia con 404 es que tiene carácter temporal. carácter temporal. (HTTP 1.1) (HTTP 1.1)

411 411 Length Required Length Required El servidor no puede procesar la petición si el usuario no envía una cabecera El servidor no puede procesar la petición si el usuario no envía una cabecera Content-LengthContent-Length. . (HTTP 1.1) (HTTP 1.1)

412 412 Precondition Failed Precondition Failed Alguna precondición especificada en las cabeceras de petición era falsa. Alguna precondición especificada en las cabeceras de petición era falsa. (HTTP 1.1) (HTTP 1.1)

413 413 Request Entity Too Large Request Entity Too Large El documento solicitado es mayor de lo que el servidor esta dispuesto a El documento solicitado es mayor de lo que el servidor esta dispuesto a gestionar. Si el servidor estará dispuesto de gestionarlo mas tarde deberá gestionar. Si el servidor estará dispuesto de gestionarlo mas tarde deberá incluir una cabecera de respuesta incluir una cabecera de respuesta Retry-AfterRetry-After. (. (HTTP 1.1) HTTP 1.1)

414 414 Request URI Too Long Request URI Too Long La URL es demasiado larga. La URL es demasiado larga. (HTTP 1.1) (HTTP 1.1)

Page 108: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Servlets: Respondiendo: Servlets: Respondiendo: Códigos de estadoCódigos de estado415 415

Unsupported Media Type Unsupported Media Type La petición esta en un formato desconocido. La petición esta en un formato desconocido. (HTTP 1.1) (HTTP 1.1)

416 416 Requested Range Not Satisfiable Requested Range Not Satisfiable El cliente introdujo una cabecera El cliente introdujo una cabecera RangeRange inadecuada en su petición. inadecuada en su petición. (HTTP 1.1) (HTTP 1.1)

417 417 Expectation Failed Expectation Failed El valor de la cabecera de petición El valor de la cabecera de petición ExpectExpect no se ha podido contrastar. no se ha podido contrastar. (HTTP 1.1) (HTTP 1.1)

500 500 Internal Server Error Internal Server Error Un mensaje genérico para indicar que el servidor está confuso. Un mensaje genérico para indicar que el servidor está confuso.

501 501 Not Implemented Not Implemented El servidor no posee la funcionalidad para completar la petición. El servidor no posee la funcionalidad para completar la petición. Por ejemplo si el Por ejemplo si el usuario ha hecho una petición PUT que el servlet no es capaz de procesar. usuario ha hecho una petición PUT que el servlet no es capaz de procesar.

502 502 Bad Gateway Bad Gateway Usado por servidores que funcionan como proxies o puertas de enlace para Usado por servidores que funcionan como proxies o puertas de enlace para indicar que recibió una respuesta incorrecta por el servidor remoto. indicar que recibió una respuesta incorrecta por el servidor remoto.

Page 109: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Servlets: Respondiendo: Servlets: Respondiendo: Códigos de estadoCódigos de estado503 503

Service Unavailable Service Unavailable

El servidor no puede responder por mantenimiento o colapso de El servidor no puede responder por mantenimiento o colapso de conexiones. Se puede enviar conjuntamente a una cabecera conexiones. Se puede enviar conjuntamente a una cabecera Retry-AfterRetry-After. .

504 504

Gateway Timeout Gateway Timeout

Usado por servidores que funcionan como proxies o puestas de enlace Usado por servidores que funcionan como proxies o puestas de enlace para indicar que no recibido respuesta del servidor remoto en un tiempo para indicar que no recibido respuesta del servidor remoto en un tiempo adecuado. adecuado. (HTTP 1.1) (HTTP 1.1)

505 505

HTTP Version Not Supported HTTP Version Not Supported

El servidor no es capaz de responder a la version del protocolo http El servidor no es capaz de responder a la version del protocolo http indicado en la petición. indicado en la petición. (HTTP 1.1) (HTTP 1.1)

Page 110: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Especificar cabeceras de respuesta Especificar cabeceras de respuesta HTTPHTTP

Ya hemos visto la respuesta normal de Ya hemos visto la respuesta normal de un servidor Web ante una peticiónun servidor Web ante una petición

Normalmente, las cabeceras de Normalmente, las cabeceras de respuesta van mano a mano con los respuesta van mano a mano con los códigos de estadocódigos de estado Document Moved => LocationDocument Moved => Location Unauthorized => WWW-AuthenticateUnauthorized => WWW-Authenticate

Especificar las cabeceras es realmente Especificar las cabeceras es realmente útil cuando se utilizan códigos de útil cuando se utilizan códigos de estado no comunesestado no comunes

Page 111: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Especificar cabeceras de respuesta Especificar cabeceras de respuesta HTTPHTTP

Ejemplos de usoEjemplos de uso Especificar cookiesEspecificar cookies Suministrar la fecha de modificación del Suministrar la fecha de modificación del

documentodocumento Recargar la página después de un Recargar la página después de un

intervalo de tiempointervalo de tiempo Tiempo de uso de conexiones Tiempo de uso de conexiones

persistentespersistentes ……

Page 112: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Especificar cabeceras de respuesta Especificar cabeceras de respuesta HTTPHTTP

Lo normal es utilizar el método Lo normal es utilizar el método setHeader()setHeader() de de HttpServletResponseHttpServletResponse

Hay dos métodos especializadosHay dos métodos especializados setDateHeader()setDateHeader() setIntHeader()setIntHeader()

Para dar múltiples valores a las Para dar múltiples valores a las cabecerascabeceras addHeader()addHeader() addDateHeader()addDateHeader() addIntHeader()addIntHeader()

Page 113: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Especificar cabeceras de respuesta Especificar cabeceras de respuesta HTTPHTTP

También podemos comprobar si ya También podemos comprobar si ya se ha utilizado alguna cabecera con se ha utilizado alguna cabecera con containsHeader()containsHeader()

Atajos para cabeceras comunes:Atajos para cabeceras comunes: setContentType()setContentType() setContentLength()setContentLength() addCookie()addCookie() sendRedirect()sendRedirect()

Page 114: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Especificar cabeceras de respuesta Especificar cabeceras de respuesta HTTPHTTP

AllowAllow Indica los métodos que soporta el servidor Indica los métodos que soporta el servidor

Content-EncodingContent-Encoding Indica el método usado para codificar el documento. El Indica el método usado para codificar el documento. El usar compresión puede reducir el tamaño de los usar compresión puede reducir el tamaño de los documentos pero antes es mejor asegurarse que la documentos pero antes es mejor asegurarse que la compresión esta soportada usando la cabecera compresión esta soportada usando la cabecera Accept-Accept-EncodingEncoding (e.i. (e.i. request.getHeader("Accept-Encoding")request.getHeader("Accept-Encoding")).).

Content-LengthContent-Length Indica el numero de bytes que se están enviando. Solo es Indica el numero de bytes que se están enviando. Solo es necesaria si se están usando conexiones http persistentes necesaria si se están usando conexiones http persistentes (sep-alive). Lo mas sencillo es escribir en un (sep-alive). Lo mas sencillo es escribir en un ByteArrayOutputStream, ByteArrayOutputStream, luego ver el tamaño e indicarlo luego ver el tamaño e indicarlo en en Content-LengthContent-Length y al final enviarlo con y al final enviarlo con byteArrayStream.writeTo(response.getOutputStream()byteArrayStream.writeTo(response.getOutputStream())). .

Page 115: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Especificar cabeceras de respuesta Especificar cabeceras de respuesta HTTPHTTP

Content-TypeContent-Type

Indica el tipo de codificación MIME del Indica el tipo de codificación MIME del documento. Por defecto es documento. Por defecto es text/plaintext/plain, por lo , por lo que se suele indicar que se suele indicar text/htmltext/html. Existe un . Existe un método para ello en método para ello en HttpServletResponseHttpServletResponse que que es es setContentTypesetContentType. .

DateDate

Indica la hora actual. Hay que usar el método Indica la hora actual. Hay que usar el método setDateHeadersetDateHeader..

ExpiresExpires

Indica el tiempo en el que el contenido debe considerarse Indica el tiempo en el que el contenido debe considerarse no valido y por lo tanto no introducirlo en la cache. no valido y por lo tanto no introducirlo en la cache.

Page 116: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Especificar cabeceras de respuesta Especificar cabeceras de respuesta HTTPHTTP

Last-ModifiedLast-Modified Indica cuándo cambio el documento por última vez. El cliente Indica cuándo cambio el documento por última vez. El cliente puede preguntar por ello usando la cabecera de petición puede preguntar por ello usando la cabecera de petición If-If-Modified-SinceModified-Since que se trata como una GET condicional y se que se trata como una GET condicional y se responde con responde con Last-ModifiedLast-Modified si la fecha es posterior. En otro si la fecha es posterior. En otro caso se envia 304 (Not Modified) como estado. caso se envia 304 (Not Modified) como estado. Usar Usar setDateHeadersetDateHeader. .

LocationLocation Indica la URL donde el cliente debe ir. Se suele usar con el Indica la URL donde el cliente debe ir. Se suele usar con el estado 302 y el método estado 302 y el método sendRedirectsendRedirect de de HttpServletResponseHttpServletResponse. .

ServerServer Indica el tipo de servidor. No lo suele indicar el servlet sino el Indica el tipo de servidor. No lo suele indicar el servlet sino el propio servidor web. propio servidor web.

Set-CookieSet-Cookie Indica la cookie asociada a la página. Es recomendable no usar Indica la cookie asociada a la página. Es recomendable no usar response.setHeader("Set-Cookie", ...)response.setHeader("Set-Cookie", ...), y en su defecto , y en su defecto addCookieaddCookie de de HttpServletResponseHttpServletResponse. .

Page 117: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Especificar cabeceras de respuesta Especificar cabeceras de respuesta HTTPHTTP

RefreshRefresh Indica cuándo debería pedir el navegador una página Indica cuándo debería pedir el navegador una página actualizada. En lugar de recargar la página actual, actualizada. En lugar de recargar la página actual, podemos especificar otra página a cargar mediante podemos especificar otra página a cargar mediante setHeader("Refresh", "5; URL=http://host/path")setHeader("Refresh", "5; URL=http://host/path"). Se . Se suele seleccionar mediante la cabecera HTML suele seleccionar mediante la cabecera HTML <META HTTP-<META HTTP-EQUIV="Refresh" CONTENT="5; URL=http://host/path">EQUIV="Refresh" CONTENT="5; URL=http://host/path"> en la sección HEAD, mejor que una cabecera explícita en la sección HEAD, mejor que una cabecera explícita desde el servidor. Esto es porque la recarga o el reenvio desde el servidor. Esto es porque la recarga o el reenvio automático es algo deseado por los autores de HTML que automático es algo deseado por los autores de HTML que no tienen accesos a CGI o servlets. Pero esta cabecera no tienen accesos a CGI o servlets. Pero esta cabecera significa "Recarga esta página o ve a URL especificada en n significa "Recarga esta página o ve a URL especificada en n segundos" y no significa "recarga esta página o ve la URL segundos" y no significa "recarga esta página o ve la URL especificada cada n segundos". Por eso tenemos que enviar especificada cada n segundos". Por eso tenemos que enviar una cabecera Refresh cada vez. De todas formas no es una una cabecera Refresh cada vez. De todas formas no es una cabecera oficial del HTTP 1.1, pero es una extensión cabecera oficial del HTTP 1.1, pero es una extensión soportada por Netspace e Internet Explorersoportada por Netspace e Internet Explorer

Page 118: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Especificar cabeceras de respuesta Especificar cabeceras de respuesta HTTPHTTP

WWW-AuthenticateWWW-Authenticate Indica el tipo de autorización y dominio que debería Indica el tipo de autorización y dominio que debería suministrar el cliente en su cabecera Authorization. Esta suministrar el cliente en su cabecera Authorization. Esta cabecera es necesaria en respuestas que tienen una línea cabecera es necesaria en respuestas que tienen una línea de estado 401 (Unauthorized). de estado 401 (Unauthorized). (e.i. (e.i. response.setHeader("WWW-Authenticate", "BASIC response.setHeader("WWW-Authenticate", "BASIC realm=\"executives\"")realm=\"executives\"")).).

Page 119: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Servlets: Acceso a Servlets: Acceso a recursosrecursos ACCEDER A RECURSOS DEL ACCEDER A RECURSOS DEL

SERVIDORSERVIDOR Posibilidades:Posibilidades:

1.1. Hacer que el servlet haga una petición HTTP.Hacer que el servlet haga una petición HTTP.

2.2. Pedir el recurso mediante el Pedir el recurso mediante el ""RequestDispatcherRequestDispatcher"".. Para acceder al Para acceder al RequestDispatcherRequestDispatcher hay que hay que

recoger el contexto del servlet mediante el recoger el contexto del servlet mediante el método “método “getServletContextgetServletContext”.”.

Page 120: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Servlets: Acceso a Servlets: Acceso a recursosrecursos

Seguidamente debemos acceder al recurso:Seguidamente debemos acceder al recurso:ServletContext sc = getServletContext();ServletContext sc = getServletContext();RequestDispatcher rd = sc.getRequestDispatcher(“/pagina.html");RequestDispatcher rd = sc.getRequestDispatcher(“/pagina.html");

Una vez tenemos el recurso accesible Una vez tenemos el recurso accesible podemos:podemos:

Hacer que el recurso sea el encargado de dar la Hacer que el recurso sea el encargado de dar la respuesta a la petición. Usamos el método respuesta a la petición. Usamos el método ““forwardforward” por lo que no podemos responder ” por lo que no podemos responder nosotros.nosotros.

Hacer una respuesta conjunta a la petición Hacer una respuesta conjunta a la petición entre el recurso y nuestro servlet usando el entre el recurso y nuestro servlet usando el método “método “includeinclude””

Page 121: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Servlets: Acceso a Servlets: Acceso a recursosrecursos En otra ocasiones puede que se En otra ocasiones puede que se

quiera compartir recursos entre quiera compartir recursos entre distintos servlets.distintos servlets.

Hacer uso de los atributos del Hacer uso de los atributos del ““ServletContextServletContext”.”.

Útil para servlets del mismo servidor Útil para servlets del mismo servidor y sobre todo para servlets de la y sobre todo para servlets de la misma aplicación.misma aplicación.

Page 122: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Servlets: Acceso a Servlets: Acceso a recursosrecursos CONVENCIÓN PARA NOMBRES DE CONVENCIÓN PARA NOMBRES DE

ATRIBUTOS: Se suele usar la misma ATRIBUTOS: Se suele usar la misma nomenclatura usada para los paquetes nomenclatura usada para los paquetes para evitar conflictos.para evitar conflictos. Añadir un atributo:Añadir un atributo: Se usa el método Se usa el método

““setAttributesetAttribute” de “” de “ServletContextServletContext”. Esto se ”. Esto se suele hacer en la inicialización del servlet. El suele hacer en la inicialización del servlet. El control de que varios servlets manejen un control de que varios servlets manejen un mismo atributo es responsabilidad del mismo atributo es responsabilidad del desarrollador.desarrollador.

Recoger un atributo:Recoger un atributo: Se usa el método Se usa el método ““getAttributegetAttribute” de “” de “ServletContextServletContext”. Hay ”. Hay que convertir el objeto que devuelve al tipo que convertir el objeto que devuelve al tipo requerido.requerido.

Page 123: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Servlets: Acceso a Servlets: Acceso a recursosrecursos

Eliminar un atributo:Eliminar un atributo: Se puede Se puede eliminar un atributo del contexto usando eliminar un atributo del contexto usando el método “el método “removeAttributeremoveAttribute” de ” de ““ServletContextServletContext”.”.

Page 124: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Seguimiento de sesiónSeguimiento de sesión

¿Qué es el seguimiento de sesión?¿Qué es el seguimiento de sesión? HTTP es un protocolo sin estadoHTTP es un protocolo sin estado Tenemos que buscar medios alternativos Tenemos que buscar medios alternativos

para reco-nocer a un usuario cada vez que para reco-nocer a un usuario cada vez que hace una peticiónhace una petición

¿Cómo podemos solucionar estos ¿Cómo podemos solucionar estos problemas?problemas? Utilizando cookiesUtilizando cookies Reescribir la URLReescribir la URL Campos de formulario ocultosCampos de formulario ocultos Utilizar servlets con la API HttpSessionUtilizar servlets con la API HttpSession

Page 125: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

¿Por qué seguir la trayectoria de ¿Por qué seguir la trayectoria de usuarios?usuarios? Cuando los clientes de una tienda Cuando los clientes de una tienda on-lineon-line

añaden artículos a su cesta de la compra, añaden artículos a su cesta de la compra, ¿cómo sabe el servidor lo que hay ya en sus ¿cómo sabe el servidor lo que hay ya en sus cestas de la compra?cestas de la compra?

Cuando los clientes deciden confirmar el Cuando los clientes deciden confirmar el pedido, ¿cómo sabe el pedido cuál de las pedido, ¿cómo sabe el pedido cuál de las cestas de la compra previamente creadas es cestas de la compra previamente creadas es la suya?la suya?

En un Sistema de Información Empresarial, En un Sistema de Información Empresarial, es importante saber qué usuario está es importante saber qué usuario está realizando operaciones para adjudicarle un realizando operaciones para adjudicarle un ““rolerole” y permitirle ciertas operaciones y ” y permitirle ciertas operaciones y otras nootras no

Page 126: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Formas de seguir la trayectoria Formas de seguir la trayectoria de usuariosde usuarios HTTP es un protocolo “HTTP es un protocolo “sin estadosin estado””

Cada vez que un cliente pide una página Web, abre Cada vez que un cliente pide una página Web, abre una conexión separada con el servidor Web y el una conexión separada con el servidor Web y el servidor no mantiene automáticamente servidor no mantiene automáticamente información información contextualcontextual acerca del cliente acerca del cliente

Servlets Servlets Permiten obtener y mantener una determinada Permiten obtener y mantener una determinada

información acerca de un clienteinformación acerca de un cliente Información accesible a diferentes servlets o entre Información accesible a diferentes servlets o entre

diferentes ejecuciones de un mismo servletdiferentes ejecuciones de un mismo servlet

Tres soluciones típicasTres soluciones típicas CookiesCookies Reescritura de URLsReescritura de URLs Campos ocultos de formulariosCampos ocultos de formularios

Page 127: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

CookiesCookies Objetos de la clase CookieObjetos de la clase Cookie

Permite guardar información relativa a un usuario a Permite guardar información relativa a un usuario a lo largo de sus distintos accesoslo largo de sus distintos accesos

Se almacenan en los equipos de los clientesSe almacenan en los equipos de los clientes El cliente debe soportar cookiesEl cliente debe soportar cookies Pueden ser desactivadas por el clientePueden ser desactivadas por el cliente El navegador es el encargado de almacenarlasEl navegador es el encargado de almacenarlas

Se transmiten en las cabeceras cuando se Se transmiten en las cabeceras cuando se realiza la comunicación HTTPrealiza la comunicación HTTP

Las cookies se implementan como una Las cookies se implementan como una colección y se usan mediante los objetos colección y se usan mediante los objetos integrados integrados HttpServletRequestHttpServletRequest y y HttpServletResponseHttpServletResponse

Page 128: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Reescritura de URLsReescritura de URLs IdeaIdea

El cliente añade ciertos datos extra que identifican la El cliente añade ciertos datos extra que identifican la sesión al final de cada URLsesión al final de cada URL

http://http://hosthost//pathpath/servlet//servlet/namename?jsessionid=1234?jsessionid=1234

El servidor asocia ese identificador con datos que ha El servidor asocia ese identificador con datos que ha guardado acerca de la sesiónguardado acerca de la sesión

Ejemplo: Ejemplo: SessionSnoop.javaSessionSnoop.java

VentajasVentajas Funciona incluso si las Cookies no son soportadas o están Funciona incluso si las Cookies no son soportadas o están

desactivadasdesactivadas

DesventajasDesventajas Se deben codificar todas las URLs referentes al sitio propioSe deben codificar todas las URLs referentes al sitio propio Todas las páginas deben generarse dinámicamenteTodas las páginas deben generarse dinámicamente Funciona mal para links desde otros sitiosFunciona mal para links desde otros sitios El servletrunner no soporta reescritura de URLsEl servletrunner no soporta reescritura de URLs

Page 129: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Campos ocultos de Campos ocultos de formulariosformularios

IdeaIdea Incluir campos ocultos con los datos a mantenerIncluir campos ocultos con los datos a mantener

<INPUT type=“hidden” name=“session” value=“1234”><INPUT type=“hidden” name=“session” value=“1234”>

VentajasVentajas Funciona incluso si las Cookies no son soportadas o Funciona incluso si las Cookies no son soportadas o

están desactivadasestán desactivadas

DesventajasDesventajas Cantidad de procesamiento tediosoCantidad de procesamiento tedioso Todas las páginas deben ser el resultado de envios Todas las páginas deben ser el resultado de envios

de formulariosde formularios

Page 130: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Introducción a las Introducción a las cookiescookies Son pequeños trozos de información Son pequeños trozos de información

textual que el servidor envía al textual que el servidor envía al navegador y que éste devuelve sin navegador y que éste devuelve sin modificar al visitar más tarde el modificar al visitar más tarde el mismo site.mismo site.

Leyendo esta información, el Leyendo esta información, el servidor puede proporcionar a los servidor puede proporcionar a los visitantes diversas conve-niencias.visitantes diversas conve-niencias.

Page 131: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Introducción a las Introducción a las cookiescookies ¿Qué podemos hacer utilizando cookies?¿Qué podemos hacer utilizando cookies?

Identificar a un usuario durante una sesiónIdentificar a un usuario durante una sesión Evitar pedir el nombre de usuario y la Evitar pedir el nombre de usuario y la

contraseñacontraseña Personalizar la presentación de la páginaPersonalizar la presentación de la página Publicidad dirigidaPublicidad dirigida

¿Qué problemas dan las cookies?¿Qué problemas dan las cookies? PrivacidadPrivacidad Usadas de un modo inadecuado, problemas Usadas de un modo inadecuado, problemas

de segu-ridad.de segu-ridad.

Page 132: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Introducción a las Introducción a las cookiescookies Algunos datos sobre el uso de cookiesAlgunos datos sobre el uso de cookies

Las cookies no son interpretadas ni Las cookies no son interpretadas ni ejecutadasejecutadas

No pueden usarse para insertar virus o No pueden usarse para insertar virus o atacar nuestro sistemaatacar nuestro sistema

Los navegadores sólo aceptan 20 cookies Los navegadores sólo aceptan 20 cookies por sitepor site

El límite máximo es de 300 cookies en El límite máximo es de 300 cookies en totaltotal

Cada cookie tiene un tamaño máximo de 4 Cada cookie tiene un tamaño máximo de 4 KBKB

Page 133: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Introducción a las Introducción a las cookiescookies Problemas normales al usar las cookiesProblemas normales al usar las cookies

Mantener la privacidad del usuarioMantener la privacidad del usuario No incluir información privada en las cookiesNo incluir información privada en las cookies

Muchos usuarios desactivan el uso de Muchos usuarios desactivan el uso de cookiescookies

No depender exclusivamente de las cookies No depender exclusivamente de las cookies para ofrecer servicios a nuestros usuariospara ofrecer servicios a nuestros usuarios

Si debemos tener mecanismos Si debemos tener mecanismos alternativos a las cookies, ¿para qué alternativos a las cookies, ¿para qué molestarnos en utilizarlas?molestarnos en utilizarlas?

Page 134: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Servlets: Respondiendo: Servlets: Respondiendo: CookiesCookies

Para utilizar cookies lo único que hay que Para utilizar cookies lo único que hay que hacer es:hacer es:

1)1) Crear una cookie: “Crear una cookie: “new Cookie(String new Cookie(String name, String value)name, String value)” ” El nombre no puede contener ni espacios El nombre no puede contener ni espacios ni:ni: [ ] ( ) = , " / ? @ : ;[ ] ( ) = , " / ? @ : ;   

2) Especificar algún atributo a la cookies 2) Especificar algún atributo a la cookies mediante alguno de sus métodos:mediante alguno de sus métodos: getComment/setCommentgetComment/setComment: : Comentarios Comentarios

asociados a la cookie. asociados a la cookie.

Page 135: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Servlets: Respondiendo: Servlets: Respondiendo: CookiesCookies

getDomain/setDomaingetDomain/setDomain: : Indicar el Indicar el dominio al que se aplica la cookie. Por dominio al que se aplica la cookie. Por defecto la cookie se devuelve a la misma defecto la cookie se devuelve a la misma dirección que dirección que la envió, pero así la envió, pero así podemos indicar que se reenvíe a otros podemos indicar que se reenvíe a otros servidores en el mismo dominio. El servidores en el mismo dominio. El dominio debe empezar por un ‘.’ dominio debe empezar por un ‘.’

getMaxAge/setMaxAgegetMaxAge/setMaxAge: : Indicar el tiempo Indicar el tiempo que debe pasar en segundos hasta que que debe pasar en segundos hasta que la cookie expire. Si no se indica la la cookie expire. Si no se indica la cookie dura una sesión. cookie dura una sesión.

Page 136: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Servlets: Respondiendo: Servlets: Respondiendo: CookiesCookies

getName/setNamegetName/setName: : Indicar el nombre de Indicar el nombre de la cookie. la cookie.

getPath/setPathgetPath/setPath:: Indica a que rutas Indica a que rutas responde la cookie. Si no se indica responde la cookie. Si no se indica nada, la cookie se envía para cualquier nada, la cookie se envía para cualquier página en el mismo path actual. Se página en el mismo path actual. Se podría usar para usos generales como podría usar para usos generales como someCookie.setPath("/")someCookie.setPath("/"). Hay que . Hay que incluir al menos el directorio actual.incluir al menos el directorio actual.

getSecure/setSecuregetSecure/setSecure: Só: Sólo vale para lo vale para sesiones seguras (e.i. SSL). sesiones seguras (e.i. SSL).

Page 137: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Servlet: Respondiendo: Servlet: Respondiendo: CookiesCookies

getValue/setValuegetValue/setValue: : Indicar el valor de Indicar el valor de la cookie.la cookie.

getVersion/setVersiongetVersion/setVersion: : Indicar con Indicar con que version del protocolo funciona esta que version del protocolo funciona esta cookie.cookie.

3) Añadir la cookie a la respuesta: 3) Añadir la cookie a la respuesta: ““response.addCookie(Cookie)response.addCookie(Cookie)””

Page 138: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Servlets: Respondiendo: Servlets: Respondiendo: CookiesCookies Para acceder a las cookies que el Para acceder a las cookies que el

cliente reenvía cada vez que accede cliente reenvía cada vez que accede al recurso se usa el método al recurso se usa el método ““getCookiesgetCookies” de ” de ““HttpServletRequestHttpServletRequest” que devuelve ” que devuelve un array de cookies.un array de cookies.

Con los métodos “Con los métodos “getNamegetName” y ” y ““getValuegetValue” de “” de “CookieCookie” se accede a ” se accede a la información de la cookie.la información de la cookie.

Page 139: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Sesiones en Java (Session Sesiones en Java (Session Tracking)Tracking) Los objetos de la sesión se guardan en el Los objetos de la sesión se guardan en el

servidorservidor Se pueden guardar objetos arbitrarios dentro Se pueden guardar objetos arbitrarios dentro

de una sesiónde una sesión Las sesiones se asocian automáticamente al Las sesiones se asocian automáticamente al

cliente vía Cookies o Reescritura de URLscliente vía Cookies o Reescritura de URLs Como una caja negra para el cliente, el sistema se Como una caja negra para el cliente, el sistema se

encarga de utilizar el método apropiado para encarga de utilizar el método apropiado para mantener la sesión, bien mediante cookies o mantener la sesión, bien mediante cookies o mediante reescritura de URLsmediante reescritura de URLs

Clase Clase HttpSessionHttpSession de la Servlet API 2.0 de la Servlet API 2.0 Existen APIs más actuales para trabajar con Existen APIs más actuales para trabajar con

servlets que vienen con la distribución de J2EEservlets que vienen con la distribución de J2EE

Page 140: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

El API de seguimiento de El API de seguimiento de sesiónsesión El uso de sesiones en servlets es El uso de sesiones en servlets es

sencillo y nos permite:sencillo y nos permite: Búsqueda del objeto sesión asociado a la Búsqueda del objeto sesión asociado a la

petición actualpetición actual Crear un nuevo objeto sesión si es Crear un nuevo objeto sesión si es

necesarionecesario Buscar la información asociada a una Buscar la información asociada a una

sesiónsesión Almacenar la información de una sesiónAlmacenar la información de una sesión Descartar sesiones completas o Descartar sesiones completas o

abandonadasabandonadas

Page 141: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Buscar el objeto Buscar el objeto HttpSessionHttpSession Para obtener el objeto sesión utilizamos Para obtener el objeto sesión utilizamos

el método el método getSession()getSession() de la clase de la clase HttpServletRequestHttpServletRequest.. Si devuelve un valor Si devuelve un valor nullnull, podemos crear , podemos crear

una nueva sesiónuna nueva sesión Podemos automatizar el crear una nueva Podemos automatizar el crear una nueva

sesiónsesión La orden será igual o muy similar a:La orden será igual o muy similar a:

HttpSession sesion = HttpSession sesion = request.getSession(false);request.getSession(false);

HttpSession sesion = request.getSession();HttpSession sesion = request.getSession();

Page 142: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Información asociada a Información asociada a la sesiónla sesión Los objetos Los objetos HttpSessionHttpSession viven en el viven en el

servidorservidor Tienen una estructura interna donde Tienen una estructura interna donde

podemos almacenar informaciónpodemos almacenar información Para obtener dicha información Para obtener dicha información

utilizamosutilizamos Hasta la versión 2.1, Hasta la versión 2.1, getValues(“clave”);getValues(“clave”); Desde la versión 2.2, Desde la versión 2.2, getAttribute(“clave”);getAttribute(“clave”);

Podemos monitorizar los valores mediante un Podemos monitorizar los valores mediante un HttpSessionBindingListenerHttpSessionBindingListener..

Page 143: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Información asociada a Información asociada a la sesiónla sesión Ejemplo de uso:Ejemplo de uso:

HttpSession session = request.getSession(true);HttpSession session = request.getSession(true);ShoppingCart previousItems = ShoppingCart previousItems =

(ShoppingCart)session.getValue("previousItems"(ShoppingCart)session.getValue("previousItems"););

if (previousItems != null) if (previousItems != null) { { doSomethingWith(previousItems);doSomethingWith(previousItems);}}elseelse{{ previousItems = new ShoppingCart(...);previousItems = new ShoppingCart(...); doSomethingElseWith(previousItems);doSomethingElseWith(previousItems);} }

Page 144: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Información asociada a Información asociada a la sesiónla sesión Normalmente conocemos todos los Normalmente conocemos todos los

identifica-dores de atributos identifica-dores de atributos relacionados con la sesiónrelacionados con la sesión

También podemos obtener dichos También podemos obtener dichos identificado-res mediante:identificado-res mediante: Hasta la versión 2.1, Hasta la versión 2.1, getValueNames(), getValueNames(), que que

devuelve un array de Stringsdevuelve un array de Strings Desde la versión 2.2, Desde la versión 2.2, getAttributeNames(), getAttributeNames(),

que devuelve un objeto de tipo que devuelve un objeto de tipo Enumeration, al igual que los métodos Enumeration, al igual que los métodos getHeaders() getHeaders() y y getParameterNames()getParameterNames()..

Page 145: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Información asociada a Información asociada a la sesiónla sesión Otros métodos:Otros métodos:

getId()getId():: Este método devuelve un identificador único generado para cada Este método devuelve un identificador único generado para cada

sesión. Algunas veces es usado como el nombre clave cuando hay un sesión. Algunas veces es usado como el nombre clave cuando hay un sólo valor asociado con una sesión, o cuando se uso la información sólo valor asociado con una sesión, o cuando se uso la información de logging en sesiones anteriores. de logging en sesiones anteriores.

isNew()isNew():: Esto devuelve true si el cliente (navegador) nunca ha visto la sesión, Esto devuelve true si el cliente (navegador) nunca ha visto la sesión,

normalmente porque acaba de ser creada en vez de empezar una normalmente porque acaba de ser creada en vez de empezar una referencia a una petición de cliente entrante. Devuelve false para referencia a una petición de cliente entrante. Devuelve false para

sesión preexistentes.sesión preexistentes.

getCreationTime()getCreationTime():: Devuelve la hora, en milisegundos desde 1970, en la que se creo la Devuelve la hora, en milisegundos desde 1970, en la que se creo la

sesión. Para obtener un valor útil para impresión, pasamos el valor sesión. Para obtener un valor útil para impresión, pasamos el valor al constructor de Date o al método setTimeInMillis de al constructor de Date o al método setTimeInMillis de GregorianCalendar.GregorianCalendar.

Page 146: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Información asociada a Información asociada a la sesiónla sesión

getLastAccessedTime()getLastAccessedTime():: Esto devuelve la hora, en milisegundos desde 1970, en que la Esto devuelve la hora, en milisegundos desde 1970, en que la

sesión fue enviada por última vez al cliente.sesión fue enviada por última vez al cliente.

getMaxInactiveInterval()getMaxInactiveInterval():: Devuelve la cantidad de tiempo, en segundos, que la sesión Devuelve la cantidad de tiempo, en segundos, que la sesión

debería seguir sin accesos antes de ser invalidada debería seguir sin accesos antes de ser invalidada automáticamente. Un valor negativo indica que la sesión automáticamente. Un valor negativo indica que la sesión nunca se debe desactivar.nunca se debe desactivar.

invalidate():invalidate():AutomáticamenteAutomáticamente el servidor web invalida tras un periodo de tiempo el servidor web invalida tras un periodo de tiempo

(30’) sin peticiones o manualmente usando el método “(30’) sin peticiones o manualmente usando el método “invalidate()invalidate()”.”.

getSessionContext():getSessionContext():Devuelve el contexto al que está asociada la sesiónDevuelve el contexto al que está asociada la sesión

removeValue(String):removeValue(String):Elimina el objeto asociado a la sesión con el nombre dadoElimina el objeto asociado a la sesión con el nombre dado

Page 147: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Asociar información a la Asociar información a la sesiónsesión Para asociar información a la sesión Para asociar información a la sesión

utilizamos:utilizamos: Hasta la versión 2.1, Hasta la versión 2.1, putValue(“nombre”, putValue(“nombre”,

valor);valor); Desde la versión 2.2, Desde la versión 2.2,

setAttribute(“nombre”, valor);setAttribute(“nombre”, valor); Esto reemplaza cualquier valor anteriorEsto reemplaza cualquier valor anterior A veces podemos querer recuperar un A veces podemos querer recuperar un

valor anterior y aumentarlo o valor anterior y aumentarlo o modificarlomodificarlo

Page 148: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Asociar información a la Asociar información a la sesiónsesión Ejemplo:Ejemplo:

HttpSession session = request.getSession(true);HttpSession session = request.getSession(true);session.putValue("referringPage",request.getHeadesession.putValue("referringPage",request.getHeade

r("Referer"));r("Referer"));ShoppingCart previousItems = ShoppingCart previousItems =

(ShoppingCart)session.getValue("previousItems"); (ShoppingCart)session.getValue("previousItems"); if (previousItems == null) if (previousItems == null) {{ previousItems = new ShoppingCart(...);previousItems = new ShoppingCart(...);}}String itemID = request.getParameter("itemID");String itemID = request.getParameter("itemID");previousItems.addEntry(Catalog.getEntry(itemID));previousItems.addEntry(Catalog.getEntry(itemID));

Page 149: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Asociar información a la Asociar información a la sesiónsesión

// Sigues teniendo que hacer // Sigues teniendo que hacer putValue putValue o o setAttributesetAttribute, no, no

// simplemente modificar el carro, dado que éste // simplemente modificar el carro, dado que éste puede serpuede ser

// nuevo y, por tanto, no estar ya almacenado en // nuevo y, por tanto, no estar ya almacenado en la sesión.la sesión.

session.putValue("previousItems", session.putValue("previousItems", previousItems); previousItems);

Page 150: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Servlets con acceso a Base Servlets con acceso a Base de Datosde Datos

Page 151: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Servlets con acceso a Base Servlets con acceso a Base de Datosde Datos Conexión a Bases de DatosConexión a Bases de Datos

Tarea importante y frecuente de los ServletsTarea importante y frecuente de los Servlets ServletsServlets

Funciones de capa intermedia en sistemas Funciones de capa intermedia en sistemas con arquitectura de tres capascon arquitectura de tres capas

Ventajas: Nivel intermedio: control de operaciones

contra la Base de Datos Drivers JDBC no tienen que estar en el

cliente Se puede tener constancia de lo que ha

hecho el usuario en peticiones anteriores Sincronización de peticiones

Page 152: Servlets. Contenido Estructura básica de un servlet Estructura básica de un servlet Manejar datos de formularios Manejar datos de formularios Leer cabeceras

Estructura de un Servlet con Estructura de un Servlet con acceso a DBacceso a DB

HttpServlet

Método init()

•Establecer conexión con la Base de Datos

Método destroy()

•Cerrar la conexión con la Base de Datos

Métodos doGet() o doPost()

•Interacción con la Base de Datos

Bien en el propio cuerpo de estos métodos

Bien mediante llamadas a otros métodos de usuario

Otros métodos de usuario: actualizarBaseDeDatos()...

Objeto Connection