Servlets
Roberto Moriyón
Servlets, I
• Objetos java, componentes web contenidas en un servidor (contenedor de servlets) que los reutiliza, que reciben peticiones mediante una URL y generan respuestas
• Mantienen información mediante cookies HTTP, objetos de sesión y de aplicación y reescritura de la URL
• Normalmente generan código HTML
Servlets, II
• Los servlets no son aplicaciones, sino partes de aplicaciones que gestionan información que puede tener un contexto más amplio que el del código escrito por el desarrollador (contexto de sesión o de aplicación).
• Los servlets proporcionan medios para almacenar información válida en los contextos de sesión y de aplicación y para acceder a ella.
Contenedores: Optimizaciones
• Los contenedores no crean y destruyen objetos constantemente, sino que los reaprovechan mediante pools o caches.– Los contenedores se pueden configurar
especificando el número de items en caches y pools de objetos almacenados para su reutilización
• Tecnologías previas, como CGI, crean un proceso por cada solicitud
Procesamiento de una petición http
• URL de la petición:http://serverId/applId/servletPath?params
• Servidor: (crea objetos si hace falta)– Asocia applId/servletPath a objeto Servlet– Prepara objetos request y response– Llama al método doGet(req, resp) o
doPost(req, resp) del Servlet• resp escribe en su Writer
• Envía el texto acumulado en el Writer
Procesamiento de la información en una petición http
• Las cuestiones marcadas en rojo tienen que ser programadas (en Java o mediante fichero de configuración)
• Los parámetros de la petición están disponibles en el objeto HttpServletRequest.
• Otros datos como la dirección del cliente (remoteAddr) y la URL de la petición (requestURL) también.
Servlets, III
• Corresponden a una subclase de HttpServlet
• Su fichero compilado se guarda en un subdirectorio WEB-INF/class
• Métodos esenciales:– doGet(request, response)– doPost(request, response)– PrintWriter response.getWriter()– String request.getParameter(String)
Servlets, IV
• Los atributos no estáticos de una subclase de HttpServlet no tienen utilidad en general.
• Puede ser útil definir métodos específicos de la subclase, llamados por doGet o doPost.
Servlets, IV
HttpServlet
request response
writerrequestURL
remoteAddr(parámetros)
Ejemplo: SimpleServlet.zip, I
public class SimpleServlet extends HttpServlet { protected void doGet (HttpServletRequest request,
HttpServletResponse response) throws Exception {response.setContentType("text/html;charset=UTF-8");PrintWriter out = response.getWriter();out.println("<html> <head><title>Simple</title></head>");out.println("<body><h1>Hello, “ +
request.getRemoteAddr () +“.</h1> </body> </html>”);
out.close(); }}
Ejemplo: SimpleServlet, II
• Ejecución: http://localhost:8080/Simple/– Hello, 127.0.0.1.
• Ficheros relevantes:
web.xml + SimpleServlet.java
• Configuración (web.xml):– Entrada: SimpleServlet
Desarrollo y despliegue de aplicaciones web
• Complejidad: árbol de directorios
• Fases:– Compilación .class– Construcción .war, .ear, …– Despliegue aplicación/módulo en servidor
Despliegue y pliegue de aplicaciones web
• Despliegue: alternativas– Copiar fichero .war en
<JEE_HOME>/domains/domain1/autodeploy– Ejecución de un objetivo Ant (script, build.xml)– Ejecutar deploy (o run)desde NetBeans
• Pliegue– asadmin undeploy <nombre_contexto>– http://localhost:4848/asadmin ->
Aplicaciones Web -> Anular implementación
ANT
• Script: build.xml
• Objetivos (Compilar, desplegar, …)– Pueden estar satisfechos– Pueden depender de otros objetivos– Pueden utilizar variables
• ant deploy
NetBeans
• Proyecto (módulo)– Categoría: Java Web, Web Application– Nombre (context path)– Servidor (GlassFish 3)– Versión Java EE: 6
• Acciones: Build (compila y genera *.war), Deploy (despliega), Run, Generate JavaDoc, … (usan fichero Ant generado automáticamente)
• Crea fichero build.xml y directorio de configuración nbproject
Configuración de módulos web
• Los Servlets se crean y destruyen por iniciativa del contenedor web, que también activa sus métodos.
• Un fichero de configuración permite especificar estos procesos.
• El fichero web.xml contiene información utilizada por el servidor de aplicaciones y el contenedor web en su funcionamiento.
Información de configuración de módulos web
• Inicialización de parámetros de la aplicación
• Lista de servlets y otras componentes
• Inicialización de parámetros de las componentes
• Asociación de URLs a componentes
Estructura básica de fichero de configuración Web.xml
• Título• Servlets:
– Nombre– Clase– URLs (plantillas)
// <web-app …>
// <display-name>
// <servlet>
// <servlet-name>
// <servlet-class>
// <servlet-mapping>
// <servlet-name>
// <url-pattern>
Ejemplo de fichero de configuración web.xml
<?xml version=… ?><web-app version=…>
<servlet><servlet-name>Simple</servlet-name><servlet-class>servlets.Simple</servlet-class>
</servlet><servlet-mapping>
<servlet-name>Simple</servlet-name><url-pattern>/</url-pattern>
</servlet-mapping></web-app>
Ejercicios
• [NombreYClub] Desarrollar una aplicación web que incluya la página HTML del ejercicio STATIC así como un servlet que conteste a la URL
UUU:8080/NombreYClub?nombre=XXX&club=YYY
con una página que diga
“Hola XXX, Viva el YYY!”
Ejercicios, II
• [SERV1] Escribir una aplicación web que complete el ejemplo visto como sigue:– El servlet SimpleServlet saluda al usuario
utilizando su IP y utiliza un formulario para pedirle el nombre
– El servlet adicional NameServlet saluda al usuario utilizando su nombre
• [SERV2] Aplicación web con un servlet que evalúa operaciones numéricas (sumas, restas, productos y divisiones)
Ejercicios, III
• [SERV3] Aplicación web con un servlet que pide un número y se llama a sí mismo de nuevo. Además, el servlet muestra la suma de las cantidades introducidas hasta el momento por todos los usuarios.
Recordatorio
• Los servlets no son aplicaciones, sino partes de aplicaciones con información que puede tener un contexto más amplio que el del código escrito por el desarrollador (contexto de sesión o de aplicación).
• Los servlets proporcionan medios para almacenar información válida en los contextos de sesión y de aplicación y para acceder a ella.
Contextos
• Aplicación: javax.servlet.ServletContext
HttpServlet.getServletContext()
• Sesión: javax.servlet.http.HttpSession
HttpServletRequest.getSession()
HttpServletRequest.getSession(t)
• Petición: javax.servlet.HttpServletRequest
Contextos, II
• Los contextos son objetos que pueden guardar información en atributos (un mapa de asociación) mediante los métodosObject getAttribute(String)void setAttribute(String, Object)
• El contexto de aplicación se pierde si el servidor se apaga. Hay mecanismos para guardarlos y cargarlos automáticamente, basados en eventos. Se pueden definir para eventos más generales.
Ejercicios
• [SERVCONT1] Aplicación web que pide una lista de números y muestra la suma de ellos pidiendo a la vez otra lista, así como la suma de todos los que se han introducido en la misma sesión y de los que se han introducido desde que se arrancó la aplicación.
• [SERVCONT2] (Voluntario) Aplicación web que permite guardar dos listas de objetos: una que se mantiene y se puede modificar durante una sesión y otra común que se mantiene y se puede modificar en cualquier momento y por cualquier usuario.
Ejercicios, II
• [SERVEMAILS] (Voluntario) Aplicación web con tres funcionalidades accesibles a través de URLs diferentes: añadir personas y direcciones de correo electrónico a una lista común, ver la lista de personas y correos electrónicos y pedir la dirección de correo electrónico correspondiente a un nombre.
Servlets, III
Servlet
Request Response
SessionPrintWriter
(atributos)
(parámetros)
EncodeURL
RequestURL
RemoteAddr
ServletContext
(atributos)
RequestDispatcher
include(…)forward(…)
(atributos)(parámetros)
Invocación de otros recursos
• ServletContext.getRequestDispatcher(String url)[Prepara un recurso de la aplicación para su utilización subsiguiente en la sesión]
• RequestDispatcher.forward(request, response)[Reenvía la solicitud. Antes de escribir en el PrintWriter de la respuesta]
• RequestDispatcher.include(request, response)[Solicita la respuesta y la añade a la propia]
• HttpServletResponse.sendRedirect(“String url”)[Reenvia la solicitud a un recurso externo]
Ejercicios
• [SERVRED] Aplicación web que pide una URL y si es de la UAM la muestra y si no, no.
• [SERVFILTER] (Voluntario) Aplicación web que permite gestionar un filtro de acceso a dominios de Internet.
Eventos en el ciclo de vida de Servlets
• Cada vez que se crea o se destruye un contexto (ServletContext, HttpSession o ServletRequest) o se modifica uno de sus atributos, se emite un evento que reciben los objetos (listeners) registrados para ello, ejecutando acciones especificadas en el programa.
• Por ejemplo, un listener puede hacer que al crearse una sesión se cree una conexión a una base de datos y que todo cambio en un atributo se traslade a ella.
• Los mecanismos anteriores se configuran mediante el fichero web.xml.
Eventos en el ciclo de vida de Servlets, II
ServletContext Session Request
Iniciación, destrucción:ServletContextListenerServletContextEvent
Creación, invalidación, activación, pasivación:HttpSessionListenerHttpSessionEventHttpSessionActivationListener
Comienzo de procesamiento:ServletRequestListenerServletRequestEvent
Creación, borrado o cambio de atributo:ServiceContextAttributeListenerServiceContextAttributeEvent
Creación, borrado o cambio de atributo:HttpSessionAttributeListenerHttpSessionAttributeBindingEvent
Creación, borrado o cambio de atributo:ServletRequestAttributeListenerServletRequestAttributeEvent
Eventos en el ciclo de vida de Servlets, III
<listener>
<description>MyKewlListener</description>
<display-name>MyKewlListener</display-name>
<listener-class>
com.examscam.web.listener.MyKewlListener
</listener-class>
</listener>.
Filtros
• Permiten hacer acciones sobre la petición (Request) y la respuesta previas al tratamiento de la petición.
• Ejemplo: Mantenimiento de un contador de usuarios e inserción de su valor como atributo de la respuesta.
• Pueden servir para varios servlets simultáneamente.
• Los ficheros se configuran mediante el fichero web.xml.
Configuración de filtros
<filter>
<filter-name>Timer</filter-name>
<filter-class>kief.FD.TimerF</filter-class>
<description> Servlet timing. </description>
</filter>
<filter-mapping>
<filter-name>Timer</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Otros aspectos configurables en aplicaciones web (web.xml)
• Escuchas (Listeners)• Filtros (Filters)• Duración de la sesión• Parámetros de contexto• Páginas de inicio y error• Páginas JSP• Lista de páginas JSP especiales• Propiedades de grupos de páginas JSP• Recursos (bases de datos, enlaces, …)• Seguridad
Ejercicios opcionales
• [BLINDAEMAIL] Blindar la aplicación de gestión de contactos comunes por correo electrónico contra fallos en el servidor.
• [ SERVUTILS] Extraer clases útiles para otros programas.
Concurrencia: Precauciones
• Si un servidor recibe varias peticiones dirigidas a la misma URL que corresponde a un servlet, el contenedor de servlets ejecuta en hilos diferentes el método doGet o doPost sobre el mismo objeto de la clase correspondiente en vez de crear una instancia para cada petición.
• Como consecuencia de lo anterior, los atributos de la clase del servlet son compartidos por todas las peticiones.
Concurrencia: Precauciones, II
• Cualquier variable o recurso cuyo estado tenga un ámbito más amplio para la aplicación que la ejecución del método doGet o doPost tiene que ser sincronizada explícitamente
• Ejemplo: Saldo de una cuenta corriente (independientemente de que se guarde en el servlet o en una base de datos)
• No es recomendable usar atributos de servlets para información actualizable
Control de la sincronización en Java
• Todo objeto tiene un candado. Si un bloque de código se declara como sincronizado con x, se ejecuta cuando x deja de estar bloqueado y lo bloquea durante su ejecución.
• Ejemplo:f();synchronized(x) {
g();}h();
Ejercicios
• [SERVCONC1] Reescribir la aplicación web del ejercicio [SERVCONT1] para evitar problemas de concurrencia.
• [SERVCONC2] (Voluntario) Reescribir la aplicación web del ejercicio [SERVCONT2] para evitar problemas de concurrencia.
• [SERVCONC3] (Voluntario) Reescribir la aplicación web del ejercicio [SERVEMAILS] para evitar problemas de concurrencia.
Top Related