escuela técnica superior de ingeniería informática Tema 2: Diseño de la capa lógica Departamento de Lenguajes y Sistemas Informáticos Ingeniería del Software de Gestión III
Índice Modelo conceptual Mapeo del modelo conceptual a código Aplicación web y sus problemas Servlets Front Controller
Índice Modelo conceptual Mapeo del modelo conceptual a código Aplicación web y sus problemas Servlets Front Controller
Modelo conceptual CreditCard -firm : string -holder : string -month : int -number : string -year : int 1 Informacion de pago Customer -customerid : string -name : string -surname : string 1 Address -city : string -email : string -fax : string -phone : string -name : string -state : string -street : string -zipcode : int Tiene 1 ItemProcessor POSProcessor 1..* Order 1..* Entrega +listitems() +getitem(entrada pid : string) : Item +placeorder(entrada o : Order) +retrieveorder() : Order +listorders() : <sin especificar> +cancelorder(entrada OrderID : string) -orderid : string -timeplaced +hasproduct() : bool +adddetail() * 1 Item 1..* 1 -productid : string -description : string -price : int «interfaz» IPOSProcessor +placeorder(entrada o : Order) +retrieveorder() : Order +cancelorder(entrada oid : string) +listorders() : <sin especificar> Detail -itemid : string -quantity : int -note : string 1..* «interfaz» IItemProcessor +listitems() : <sin especificar> +getitem(entrada pid : string) : Item
Índice Modelo conceptual Mapeo del modelo conceptual a código Aplicación web y sus problemas Servlets Front Controller
Recordatorios Cómo mapear un MC a código La interfaz Map y HashMap Uso de variables de tipo interfaz Algunos problemas: Parámetros en Java: Literales: por valor Objetos: por referencia arrays: por referencia Qué pasa con la devolución de getdetails():map?
Índice Modelo conceptual Mapeo del modelo conceptual a código Aplicación web y sus problemas Servlets Front Controller
Aplicación web y sus problemas El problema de la concurrencia El problema del intercambio de datos Envío de datos con valor único Envío de datos multievaluados El problema de la presentación de datos (HTML/XML) El problema del mantenimiento del estado
Índice Modelo conceptual Mapeo del modelo conceptual a código Aplicación web y sus problemas Servlets Front Controller
Índice Modelo conceptual Mapeo del modelo conceptual a código Aplicación web y sus problemas Servlets Introducción a HTTP Aplicación web Características básicas Ciclo de vida, concurrencia Petición y respuesta Ejemplo El problema del estado Parámetros de entrada Extraer información del servidor Extraer información del cliente
Servlets, Introducción a HTTP HTTP (HyperText Transport Protocol) Protocolo sin estado, es decir, se abra una conexión por cada petición URL (Universal Resource Location): http://www.lsi.us.es:8080 Puertos utilizados: 80 por defecto, 8080 Métodos GET, POST Otras alternativas: CGI-PHP-ASP
Servlets, Aplicación web Definición: Un conjunto de servlets, JSPs, ficheros, HTML, imágenes, etc.. dispuestos de tal manera que sean fácilmente desplegables (deployed) en un contenedor web. Tomado de [Brittain03]
Servlets, características básicas Definición Servlet: Es un componente software escrito en JAVA que dinámicamente extiende la funcionalidad de un servidor genérico Son una especificación (usaremos 2.3 / tomcat 4.1.30). Características: Capaz de funcionar en el mismo proceso del servidor Contienen código compilado (hasta el nivel del servidor, puesto que después hay un.class) Es multiplataforma, multiservidor Paquetes necesarios: javax.servlet.*; javax.servlet.http.*
Servlets, características básicas <<interface>> Servlet init() destroy() <<abstract>> GenericServlet <<abstract>> HttpServlet doget() dopost() MiServlet
Servlets, ciclo de vida init() DarServicio destroy() service() A petición del cliente el contenedor carga el servlet y llama a init() El servidor espera peticiones y las trata A petición del administrador, el servidor descarga el servlet y llama a destroy() NOTA: Dependiendo de la implementación del servidor cada petición puede: i) crear su propia instancia del servlet, es decir, se llama a init() cada vez que hay una petición ii) crear una sola instancia del servlet
Servlets, petición y respuesta <<abstract>> HttpServlet doget(httpservletrequest request, HttpServletResponse response) dopost(httpservletrequest request, HttpServletResponse response) <<interface>> ServletRequest <<interface>> ServletResponse
Servlets, tratar la petición <<interface>> ServletRequest getparameter(name:string):string getparametervalues(name:string):string[] getparameternames():ennumeration <<interface>> HttpServletRequest
Servlets, tratar la respuesta <<interface>> ServletResponse getwriter():printwriter setcontenttype(type:string) PrintWriter println(out:string) close() <<interface>> HttpServletResponse
Servlet, ejemplo package isg3.servlets; import java.io.ioexception; import java.io.printwriter; import javax.servlet.*; import javax.servlet.http.*; public class MiServlet extends HttpServlet { private String user; public void init() {user = hola ;} public void doget(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { } } public void dopost(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { }
Servlet, ejemplo public void doget(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { dopost(request,response); } public void dopost(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { } response.setcontenttype("text/html"); PrintWriter out = response.getwriter(); out.println("<html>"); out.println("<head>"); out.println("<title>password Checker"); out.println("</title>"); out.println("</head>"); out.println("<body bgcolor=\"#6699cc\">"); out.println("<p> Hola Mundo </p>"); out.println("<body\">"); out.close();
Servlets, el problema del estado Problema: HTTP es un protocolo sin estado pero muchas aplicaciones web necesitan mantener el estado (chat, tienda virtual, ). Posibles soluciones: Formularios ocultos Cookies: son ficheros de texto que los almacena el cliente (navegador) Sesiones: hacen uso de cookies pero lo hacen de manera transparente.
Servlets, el problema del estado Session Tracking API <<interface>> ServletRequest <<interface>> HttpServletRequest getsession(c:boolean):httpsession getsession():httpsession <<interface>> HttpSession setattribute(name:string,value:object) getattribute(name:string):object getattributenames(name:string):ennumeration removeattribute(name:string) setmaxinactiveinterval(sec:int); invalidate()
Servlets, el problema del estado Session Atributo Valor Sesion1 name David Sesion2 email name benavides@us.es José Luis Sesion3 email name email actas arjona@tdg.lsi.us.es Antonio aruiz@tdg.lsi.us.es ok
Servlets, el problema del estado Sesion1 name David Sesion2 name José Luis email benavides@us.es email arjona@tdg.lsi.us.es Sesion3 name email actas Antonio aruiz@tdg.lsi.us.es ok
Servlets, ejemplo public class ContadorEstado extends HttpServlet { public void dopost(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { response.setcontenttype("text/html"); PrintWriter out = response.getwriter(); HttpSession session = request.getsession(); Integer cont = (Integer)session.getAttribute( contador ); int aux = 1; if(cont!= null){ aux = cont.intvalue() + 1; s.setattribute( contador,new Integer(aux)); } else{ s.setattribute( contador,new Integer(aux)); } } } out.println( Ha accedido + aux + veces en esta sesión );
Servlets, ejemplo
Servlets, parámetros de entrada web.xml <web-app> <!-- ========================= Aplicación ===================== --> <display-name>tomcat Primeros Pasos</display-name> <description> Primeros pasos con Tomcat.</description> <!-- ========================= Definición de Servlets ============= --> <servlet> <servlet-name>holamundo</servlet-name> <servlet-class>es.us.isg3.servlets.holamundo</servlet-class> </servlet> <!-- ========================= Mapeo de Servlets Definidas ========= --> <servlet-mapping> <servlet-name>holamundo</servlet-name> <url-pattern>/hola.html</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>default.html</welcome-file> <welcome-file>index.html</welcome-file> </welcome-file-list> </web-app>
Servlets, parámetros de entrada <web-app> <!--======= Parámetros de entrada de la app web ========== --> <context-param> <param-name>jdbc-url</param-name> <param-value>jdbc:mysql://127.0.0.1:3306/isg3</param-value> </context-param> <servlet> <servlet-name>holamundo</servlet-name> <servlet-class>es.us.isg3.servlets.holamundo</servlet-class> <!--======= Parámetros de entrada del Servlet ========== --> <init-param> <param-name>user</param-name> <param-value>practica</param-value> </init-param> <init-param> <param-name>passwd</param-name> <param-value>practica</param-value> </init-param> </servlet> </web-app>
Servlets, parámetros de entrada <<interface>> Servlet init() destroy() <<abstract>> GenericServlet <<abstract>> HttpServlet doget() dopost() <<interface>> ServletConfig MiServlet getinitparameter(name: String): String getinitparameternames():enumeration getservletcontext():servletcontext
Servlets, información del servidor <<interface>> ServletContext getinitparameter(string name): String getinitparameternames(): Enumeration getserverinfo(): String <<interface>> ServletRequest getservername():string getserverport(): int
Servlets, información del cliente <<interface>> ServletRequest getremoteaddr():string getremotehost():string <<interface>> HttpServletRequest getheader(name:string):string getheadernames():enumeration getheaders(name:string)
Índice Modelo conceptual Mapeo del modelo conceptual a código Aplicación web y sus problemas Servlets Front Controller
Front Controller Problema: existen varios recursos con partes en común en una aplicación web. R1 R2 R3 Solución: Poner un controlador frontal que haga la parte en común y despache las peticiones R1 FC R2 R3
Front Controller, ejemplo Identificarse Consultar Productos Seguir Compra Añadir Añadir Productos Visualizar Carrito Cliente Eliminar Productos Eliminar Confirmar Compra Acabar Compra
Front Controller, ejemplo Identificarse Consultar Productos Seguir Compra Añadir FC Añadir Productos Visualizar Carrito Cliente Eliminar Productos Eliminar Confirmar Compra Acabar Compra
Front Controller, ejemplo El problema del logado
!Gracias! Podemos mejorar esta lección? Mándanos un email a benavides@us.es Visite la web de la asignatura www.lsi.us.es