Download JAVA: Servlets Servlets Cuándo se suelen utilizar Applets Servlets
Document related concepts
no text concepts found
Transcript
Copyright (c) 2001-2003 María de los Santos PÉREZ HERNÁNDEZ Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no BackCover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". JAVA: Servlets A copy of the GNU Free Documentation License can be found in: http://www.gnu.org/licenses/licenses.html#FDL Diseño de servicios web © 2001-2003 María de los Santos Pérez Hernández (mperez@fi.upm.es) 2 © 2001-2003 María PÉREZ (mperez@fi.upm.es) Servlets Cuándo se suelen utilizar Programas que se ejecutan en los servidores. – Añaden funcionalidad a un servidor web, del mismo modo que los applets añaden funcionalidad a los navegadores. La página web se basa en datos que proporciona el usuario. – Ejemplo: e-commerce sites. Similares a los scripts CGI, salvo que ofrecen una independencia de la plataforma. ⇒ A diferencia de mecanismos propietarios (tales como la API de Netscape Server o módulos de Apache), son independientes del servidor y de la plataforma. Los datos cambian frecuentemente. – Ejemplo: Partes meteorológicos. La página web utiliza información de BDs u otras fuentes. – Ejemplo: Aplicaciones comerciales. 3 © 2001-2003 María PÉREZ (mperez@fi.upm.es) Applets 4 © 2001-2003 María PÉREZ (mperez@fi.upm.es) Servlets Servidor servidor cliente Cliente El usuario pide un applet en java NAVEGADOR WEB Llega un applet en java Base de datos Arranca la máquina Virtual de java y Se ejecuta el applet MÁQUINA VIRTUAL JAVA © 2001-2003 María PÉREZ (mperez@fi.upm.es) 5 © 2001-2003 María PÉREZ (mperez@fi.upm.es) 6 1 Servlets. Requisitos Ejecución de un servlet El servidor debe tener una máquina virtual Java. El servidor debe soportar la API de los servlets Java. – Introducir la dirección URL del servlet en un navegador web. – Llamar al servlet desde una página web. – Ejecutar un servlet llamándolo desde otro servlet. – JavaServer Web Development Kit (JSWDK). http://java.sun.com/products/servlet/ Servidores capaces de ejecutar servlets: – – – – – – – Java Web Server Netscape Fast Track y Enterprise O’Reilly WebSite Professional Lotus Domino Go WebServer Novel IntraNetWare IBM Internet Connection Server Otros 7 © 2001-2003 María PÉREZ (mperez@fi.upm.es) Desde un navegador web – http://www.datsi.fi.upm.es/~mperez/servlet s/serv1?num1=3&num2=4 9 Un servlet también puede ser llamado desde el código de una página web, al igual que se llamaría a cualquier CGI. Ejemplo: © 2001-2003 María PÉREZ (mperez@fi.upm.es) 10 Desde otro servlet Se puede lanzar la ejecución de un servlet desde otro. Pasos: – Conocer el nombre del servlet que queremos llamar. – Proporcionar acceso al objeto “Servlet” del servlet llamado. – Llamar al método público del servlet. © 2001-2003 María PÉREZ (mperez@fi.upm.es) 8 – <form action = “http://www.datsi.fi.upm.es/~mperez/servlet s/serv2” method=“post”> Desde otro servlet © 2001-2003 María PÉREZ (mperez@fi.upm.es) Desde una página web http://nombre_maquina:puerto/ruta_serv let/nombre_servlet Las llamadas a servlets pueden contener parámetros: © 2001-2003 María PÉREZ (mperez@fi.upm.es) Formas de iniciar la ejecución: 11 public class servletCalling extends HttpServlet { public void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ... Servlet servlet_get = (Servlet) getServletConfig().getServletContext().getServlet(“ser vletCalled”); String data_get = servlet_get.method1(data); ... } } © 2001-2003 María PÉREZ (mperez@fi.upm.es) 12 2 Arquitectura de los servlets Interacción con los clientes Biblioteca ‘javax.servlet’ Objeto ‘ServletRequest’: – Comunicación que fluye del cliente al servidor. Servlets Objeto ‘ServletResponse’: – Encapsula la información enviada desde el servidor al cliente. HttpServlet MiServlet © 2001-2003 María PÉREZ (mperez@fi.upm.es) 13 14 Ejemplo Servlets: Hola Mundo Estructura de un Servlet import java.io.*; // Utiliza response para import javax.servlet.*; // especificar la respuesta import javax.servlet.http.*; // (tipo de contenido, establecer public class SomeServlet extends // cookies, ...) HttpServlet { // El servidor envía una página PrintWriter out = // web al cliente response.getWriter(); public void doGet (HttpServletRequest request, // Utilizar out para enviar el HttpServletResponse response) // contenido al navegador throws ServletException, IOException } { // Utilizar request para leer // Análogamente, sobreescribir // doPost(). // datos procedentes del // cliente (ej: cookies, } // otros datos) © 2001-2003 María PÉREZ (mperez@fi.upm.es) © 2001-2003 María PÉREZ (mperez@fi.upm.es) import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HolaMundoSrvlt extends HttpServlet { // El servidor envía una página web al cliente public void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out; } String titulo=“Hola Mundo”; response.setContentType (“text/html”); out = response.getWriter(); out.println(“<HTML><HEAD><TITLE>”); out.println(titulo); out.println(“</TITLE></HEAD><BODY>”); out.println(“<H1>”+titulo+</H1>”); out.println(“</BODY></HTML>”); out.close(); } 15 Ejemplo Servlets: Hola Mundo // Utiliza response para // especificar la respuesta © 2001-2003 María PÉREZ (mperez@fi.upm.es) 16 Obtención y envío de información Obtención de datos del cliente: – getParameter() • getParameterValues() • getParameterNames() Envío de datos al cliente: – getWriter – getOutputStream – getReader – getInputStream() © 2001-2003 María PÉREZ (mperez@fi.upm.es) 17 © 2001-2003 María PÉREZ (mperez@fi.upm.es) 18 3 Ejemplo: Lectura de parámetros import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class ThreeParam extends HttpServlet { public void doGet( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out; String title="Leyendo 3 parámetros"; Ejemplo: Lectura de parámetros out.println("</TITLE></HEAD><BODY>"); out.println("<H1 ALIGN=CENTER>"+ title +"</H1>"); out.println("<UL>"); out.println("<LI>param1: "+ request.getParameter("param1")); out.println("<LI>param2: "+ request.getParameter("param2")); out.println("<LI>param3: "+ request.getParameter("param3")); out.println("</UL>"); out.println("</BODY></HTML>"); out.close(); } public void doPost(HttpServletRequest response.setContentType request,HttpServletResponse ("text/html"); response) out = response.getWriter(); throws ServletException,IOException { out.println("<HTML><HEAD><TITLE>"); doGet(request,response); out.println(title); } } © 2001-2003 María PÉREZ (mperez@fi.upm.es) 19 out.println("<H1 ALIGN=CENTER>"+ title else +"</H1>"); out.print(valorParam); out.println("<TABLE BORDER=1 } else { ALIGN=CENTER>"); out.println("<UL>"); out.println("<TR><TH>Nombre de for (int i=0; parámetro<TH>Valores de parámetro"); i<valoresDeParam.length; i++) { Enumeration nombresDeParam = out.println("<LI>" + request.getParameterNames(); valoresDeParam[i]); while (nombresDeParam.hasMoreElements()){ } String nombreParam = (String) out.println("</UL>"); nombresDeParam.nextElement(); } out.println("<TR><TD>" + nombreParam); } out.println("<TD>"); out.println("</TABLE>"); String[] valoresDeParam= out.println("</BODY></HTML>"); request.getParameterValues(nombreParam); out.close(); if (valoresDeParam.length == 1) { } String valorParam = public void doPost(HttpServletRequest valoresDeParam[0]; request,HttpServletResponse if (valorParam.length()== 0) response) out.print("<I>No existe valor</I>"); throws ServletException,IOException { doGet(request,response); } } java.io.*; javax.servlet.*; javax.servlet.http.*; java.util.*; public class ShowParameters extends HttpServlet { public void doGet( HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException { PrintWriter out; String title="Leyendo todos los parámetros"; response.setContentType ("text/html"); out = response.getWriter(); out.println("<HTML><HEAD><TITLE>"); out.println(title); out.println("</TITLE></HEAD><BODY>"); © 2001-2003 María PÉREZ (mperez@fi.upm.es) 20 Ejemplo: Lectura de parámetros II Ejemplo: Lectura de parámetros II import import import import © 2001-2003 María PÉREZ (mperez@fi.upm.es) 21 © 2001-2003 María PÉREZ (mperez@fi.upm.es) 22 Ejemplo: Uso de formulario Ejemplo: Lectura de parámetros II <HTML> <HEAD> <TITLE> Un ejemplo de formulario que utiliza POST </TITLE> </HEAD> <H1 ALIGN=CENTER> Un ejemplo de formulario que utiliza POST </H1> <FORM ACTION="../servlet/ShowParameters" METHOD="POST"> Número Artículo: <INPUT TYPE="TEXT" NAME="numItem"> <BR> Cantidad: <INPUT TYPE="TEXT" NAME="cantidad"> <BR> Precio Unidad: <INPUT TYPE="TEXT" NAME="precio" VALUE="$"> <BR> <HR> Nombre: <INPUT TYPE="TEXT" NAME="nombre"> <BR> Apellidos: <INPUT TYPE="TEXT" NAME="apellidos"> <BR> © 2001-2003 María PÉREZ (mperez@fi.upm.es) 23 © 2001-2003 María PÉREZ (mperez@fi.upm.es) 24 4 Ejemplo: Uso de formulario Ejemplo: Uso de formulario Dirección: <TEXTAREA NAME="direccion" ROWS=3 COLS=40> </TEXTAREA><BR> Tarjeta de crédito: <BR> <INPUT TYPE="RADIO" NAME="tipoTarjeta" VALUE="Visa">Visa<BR> <INPUT TYPE="RADIO" NAME="tipoTarjeta" VALUE="Master Card">Master Card<BR> <INPUT TYPE="RADIO" NAME="tipoTarjeta" VALUE="Amex">American Express<BR> <INPUT TYPE="RADIO" NAME="tipoTarjeta" VALUE="Discover">Discover<BR> Número de tarjeta de crédito: <INPUT TYPE="PASSWORD" NAME="numTarjeta"> <BR> Repetición del número de tarjeta de crédito: <INPUT TYPE="PASSWORD" NAME="numTarjeta"> <BR><BR> <CENTER> <INPUT TYPE="SUBMIT" VALUE="Enviar solicitud"> </CENTER> </FORM> </BODY> </HTML> © 2001-2003 María PÉREZ 25 (mperez@fi.upm.es) Ejemplo: Uso de formulario 26 © 2001-2003 María PÉREZ (mperez@fi.upm.es) Ciclo de vida de un servlet Servidor Servlet Carga init() Cliente Servlet Servidor Servidor © 2001-2003 María PÉREZ (mperez@fi.upm.es) 27 Almacenamiento del estado de un cliente Mecanismos: © 2001-2003 María PÉREZ (mperez@fi.upm.es) 29 Servlet 28 Eficiencia – CGI inicia un nuevo proceso para cada petición HTTP. (Solución: FastCGI) – El servlet se ejecuta solamente la primera vez que es llamado. Permanece en memoria una vez cargado y puede compartir información entre varias llamadas de clientes. Uso de threads para las distintas peticiones. Estado del cliente: – Almacenamiento de sesiones en el servidor – “Cookies” Cliente Descarga destroy() Servlets vs CGI – Situación en la que se encuentra un cliente en sucesivas peticiones al servidor. doGet() doPost() © 2001-2003 María PÉREZ (mperez@fi.upm.es) Manejo de peticiones service() Portabilidad Modularidad El uso de parámetros es más sencillo en el caso de los servlets © 2001-2003 María PÉREZ (mperez@fi.upm.es) 30 5