Diseño Y Aplicaciones de Sistemas Distribuidos Servlets Joan Vila DISCA / UPV Departament d Informàtica de Sistemes i Computadors Universitat Politècnica de València
Qué es un servlet? Son una forma de realizar CGI s en Java (server side programming) Tiene capacidades para manipular peticiones y respuesta a formularios HTML No tienen una interfaz gráfica (a diferencia de los Applets) 108
Arquitectura del paquete javax.servlet Las interfaces Servlet y HttpServlet proporcionan métodos para gestionar el Servlet y manejar las comunicaciones con los clientes. Cuando un servlet acepta una petición de un cliente recibe dos objetos ServletRequest: encapsula la comunicación del cliente al servlet ServletResponse: encapsula la comunicación del servlet al cliente 109
Arquitectura del paquete javax.servlet La clase ServletRequest proporciona: Acceso a las variables CGI y a los parámetros definidos por la petición del cliente. Acceso al input stream ServletInputStream, a través del cual el servlet obtiene datos de clientes que utilizan protocolos de aplicación tales como los métodos POST y PUT de HTTP u otros más específicos. La clase ServletResponse proporciona métodos para: Contestar al cliente con un PrintWriter, estableciendo las variables CONTENT_LENGTH y CONTENT_TYPE. Contestar al client a través de un ServletOutputStream. 110
Un ejemplo de servlet public BookServlet extends HttpServlet { doget(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException {... // set content-type header before accessing the Writer response.setcontenttype("text/html"); PrintWriter out = response.getwriter(); // then write the response out.println("<html>" + "<head><title>book Description</title></head>" +...); //Get the identifier of the book to display String bookid = request.getparameter("bookid"); if (bookid!= null) { // and the information about the book and print it... out.println("</body></html>"); out.close(); 111
Manejo de métodos GET y POST Sobrecargar los métodos doget y dopost de HttpServlet Aspectos de multithreading Los servlets atienden clientes concurrentemente. Para atenderlos secuencialmente: public class BookServlet extends HttpServlet implements SingleThreadModel Ciclo de vida de un servlet Algunos métodos de la clase HttpServlet son invocados automáticamente a lo largo de su ciclo de vida: init: cuando un servlet es cargado por el servidor. Se puede sobrecargar. destroy: cuando un servlet es descargado por el servidor. Se puede sobrecargar. service: cada vez que se procesa una petición de un cliente. Sólo se suele sobrecargar para poner un contador de clientes. 112
Ejemplo de cómo sobrecargar el método service public ShutdownExample extends HttpServlet { private int servicecounter = 0; //Access methods for servicecounter protected synchronized void enteringservicemethod() { servicecounter++; protected synchronized void leavingservicemethod() { servicecounter--; protected synchronized int numservices() { return servicecounter; protected void service(httpservletrequest req, HttpServletResponse resp) throws ServletException, IOException { enteringservicemethod(); try { super.service(req, resp); finally { leavingservicemethod(); 113
Información de estado Existen dos opciones básicas Sessions: mantenida por el servidor Cookies: mantenida por el cliente Sessions Sirven para establecer sesiones con un cliente web. Permiten; Cookies Crear una sesión. Almacenar/Obtener datos Invalidar una sesión. Permiten a un servidor enviar información codificada a un cliente para recuperarla más tarde sin alterar. 114
Sessions public public class class CatalogServlet extends HttpServlet { public public void void doget doget (HttpServletRequest request, HttpServletResponse response) throws throws ServletException, IOException { // // Get Get the the user's user's session session and and shopping cart cart HttpSession session session = request.getsession(true); ShoppingCart cart cart = (ShoppingCart) session.getvalue(session.getid()); Obtener el id de una sesión Obtener estado de una sesión // // If If the the user user has has no no cart, cart, create create a new new one one if if (cart (cart == == null) null) { cart cart = new new ShoppingCart(); Asociar un nuevo estado session.putvalue(session.getid(), cart); cart); a una sesión...... 115
Sessions public public void void doget doget (HttpServletRequest request, HttpServletResponse response) throws throws ServletException, IOException { HttpSession session session = request.getsession(true); ShoppingCart cart cart = (ShoppingCart)session.getValue(session.getId());...... // // Check Check for for pending adds adds to to the the shopping cart cart String String bookid bookid = request.getparameter("buy"); //If //If the the user user wants wants to to add add a book, book, add add it it and and print print the the result result String String booktoadd = request.getparameter("buy"); if if (booktoadd!=!= null) null) { BookDetails book book = database.getbookdetails(booktoadd); Añadir Información cart.add(booktoadd, book); book); estado out.println("<p><h3>" +...);...); 116
Sessions public class ReceiptServlet extends HttpServlet { public void dopost(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { Invalidar sesión... scart = (ShoppingCart)session.getValue(session.getId());... // Clear out shopping cart by invalidating the session session.invalidate(); // set content type header before accessing the Writer response.setcontenttype("text/html"); out = response.getwriter();... 117
Cookies Crear un cookie (un cookie asociado a cada libro): Cookie getbook = new Cookie( Buy, bookid) Enviar un cookie: response.addcookie(getbook); Establecer atributos de un cookie: Comentarios: getbook.setcomment( El cliente... ) Tiempo validez: getbook.setmaxage(0) // 0 Lo borra Recuperar cookies: Cookie[] cookies = request.getcookies(); Consultar valor de un cookie: getbook.getvalue().equals(bookid) 118