Post on 18-Apr-2015
ServletsServlets
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
¿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
¿Qué son los servlets ¿Qué son los servlets Java?Java?
Servidor Web
Servlet
BDexterna
BD
Aplicación
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.
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
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
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
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.
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
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
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
ArquitecturaArquitectura
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
SÍ
SÍ
NO
NO
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
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
Servlets: JerarquíaServlets: Jerarquía
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>
Llamada a un ServletLlamada a un Servlet
Servlets: Ciclo de vidaServlets: Ciclo de vida
Ciclo de vida de un servlet:Ciclo de vida de un servlet:
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
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; }}}}
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.
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.
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(); }}}
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) { }} }}
}} }}} }
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>dipina@ilargi.org</param-value><param-value>dipina@ilargi.org</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>
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)););
}}}}
// ...// ...}}
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.
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()); }}
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.
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
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
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.
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.
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.
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
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.
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
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
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
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
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”.”.
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.
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
{{
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}}
} }
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
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
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.
ServletsServlets
Servlet
Request Response
SessionPrintWriter
(atributos)
(parámetros)
EncodeURL
RequestURL
RemoteAddr
ServletContext
(atributos)
RequestDispatcher
include(…)forward(…)
(atributos)(parámetros)
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");
}}} }
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();
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>");
}}} }
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]
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.
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
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.
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.
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.
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.
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>
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.
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.
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.
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
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
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.
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.
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.
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
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)
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
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”.”.
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";
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>");
}}
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); }}
}}
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. */*/
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"
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) {{
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>");
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); }}
}}
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>
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>
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>
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)
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
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.
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.
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.
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
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
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();
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"
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,
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); }}
}}
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
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
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
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
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
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
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.
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. .
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)
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).
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)
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)
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.
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)
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
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 ……
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()
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()
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())). .
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.
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. .
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
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\"")).).
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”.”.
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””
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.
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.
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”.”.
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
¿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
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
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
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
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
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.
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.
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
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?
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.
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.
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).
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)””
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.
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
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
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();
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..
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);} }
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()..
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.
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
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
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));
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);
Servlets con acceso a Base Servlets con acceso a Base de Datosde Datos
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
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