41
Servlets Roberto Moriyón

Serv Lets

  • Upload
    anitaaa

  • View
    213

  • Download
    0

Embed Size (px)

DESCRIPTION

Servlets

Citation preview

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.