Indice


Volver al Indice Autores


Esta práctica ha sido realizada por el grupo 4 de prácticas.
La programación y documentación han sido realizadas por Guillem Rull Fort y Jose María Rodríguez Valls.

Volver al Indice Introducción


En esta sesión será necesario aprender a desarrollar aplicaciones Web mediante servlets.

El trabajo a realizar consiste en hacer una pequeña gestión de pedidos donde los usuarios podrán realizar sus demandas y visualizar un listado.

En esta ocasión no deberá guardarse el estado mediante el uso de ficheros. Será necesario desarrollar algún tipo de solución para este problema.

Podemos aprovechar los formularios de la sesión 1.

Volver al Indice Entorno


Inicialmente dispondremos de una máquina con sistema operativo linux con un servidor Apache Tomcat.
La idea es realizar la práctica para trabajo local.

Existen algunos ejemplos de Servlets para poder facilitar la faceta autodidacta de los estudiantes.


Volver al Indice Implementación

Comanda.java


El Servlet comanda será el encargado de atender a las peticiones de los formularios de gestión de pedidos.
Cada uno de los pedidos será almacenado en una instancia de la clase dadescomanda. Por lo que hemos añadido un Vector de pedidos para poder hacer el listado.

    //Vector con los pedidos realizados...
    private Vector comandes = new Vector();

    //Definimos el usuario y el password...
    static final String USERID = "pxc";
    static final String PASSWORD = "abc";

    //Datos de un pedido...
    class dadescomanda {
        int n_taules;
        String model_taula;
        int preu_taula;
        int n_cadires;
        String model_cadira;
        int preu_cadira;
        int n_llums;
        String model_llum;
        int preu_llum;
    }

    //Función encargada de separar los datos recibidos y
    //retornarlos por separado...
    private String[] model_preu(String str_model_preu) {
        int i = str_model_preu.indexOf('-');
        /*i != -1*/
        String[] result = new String[2];
        result[0] = str_model_preu.substring(0, i);
        result[1] = str_model_preu.substring(i+1);
        return result;
    }


doPost


A continuación se muestra el código encargado de realizar el listado de pedidos. El Servlet recibe los datos mediante el método POST desde el formulario llistarcomandes.html

Primeramente comprobamos que el usuario se haya autentificado, posteriormente se genera el listado de pedidos almacenados en el Vector.

//Método llamado al realizar un listado de pedidos...
public void doPost(HttpServletRequest req, HttpServletResponse res)
                           throws ServletException, IOException {
   //Enviamos el header...
   res.setContentType("text/html");
   PrintWriter out = res.getWriter();

   //Obtenemos el usuario y password...
   String userid = req.getParameter("userid");
   String password = req.getParameter("password");

   //Comprobamos que el usuario y passord sean correctos...
   if(userid.equals(USERID) && password.equals(PASSWORD)) {
        out.println("<H1>Llistat de comandes</H1>");
        out.println("<br>");

        //Recorremos el Vector de pedidos...
        for(int i = 0; i < comandes.size(); i++) {
           out.println("<hr>");
           out.println("<ul>");
           dadescomanda c;

           //Obtenemos el pedido del Vector...
           synchronized(this) {
                c = (dadescomanda)comandes.get(i);
           }

           //Visualizamos los datos...
           if(c.n_taules > 0) {
               out.println("<li> <code>"+c.n_taules+" taules model ");
               out.println("c.model_taula+" amb preu "+c.preu_taula);
               out.println(". Total: "+c.n_taules*c.preu_taula+"</code>");
           }
           if(c.n_cadires > 0) {
               out.println("<li> <code>"+c.n_cadires+" taules model ");
               out.println(c.model_cadira+" amb preu "+c.preu_cadira);
               out.println(". Total:"+c.n_cadires*c.preu_cadira+"</code>");
           }
           if(c.n_llums > 0) {
               out.println("<li> <code>"+c.n_llums+" llums model ");
               out.println(c.model_llum+" amb preu "+c.preu_llum);
               out.println(". Total: "+c.n_llums*c.preu_llum+"</code>");
           }
           out.println("</ul>");
           out.println("Preu total: "+(c.n_taules*c.preu_taula +
                                     +c.n_cadires*c.preu_cadira +
                                     +c.n_llums*c.preu_llum));
        }
        out.println("<hr>");
   } else {
        //El usuario o password son incorrectos...
        out.println("<H1>Error de login!</H1>");
        out.println("El username i/o el password son incorrectes");
   }
   out.println("<br>");
   out.println("<br>");
}

doGet


En el caso del formulario comanda.html los datos se enviarán por GET hacia el Servlet comanda.

En primer lugar será necesario decodificar los datos enviados por el cliente. Seguidamente se almacena el pedido dentro del Vector.
Para terminar se le muestra al cliente los datos recibidos.

public void doGet(HttpServletRequest req, HttpServletResponse res)
                          throws ServletException, IOException {
  //Enviamos el header...
  res.setContentType("text/html");
  PrintWriter out = res.getWriter();

//Obtenemos los datos las mesas...
int n_taules = Integer.parseInt(req.getParameter("n_taules"));
String model_preu_taula[]=model_preu(req.getParameter("model_preu_taula"));
String model_taula = model_preu_taula[0];
int preu_taula = Integer.parseInt(model_preu_taula[1]);

//Obtenemos los datos de las sillas...
int n_cadires = Integer.parseInt(req.getParameter("n_cadires"));
String model_preu_cadira[]=model_preu(req.getParameter("model_preu_cadira"));
String model_cadira = model_preu_cadira[0];
int preu_cadira = Integer.parseInt(model_preu_cadira[1]);

//Obtenemos los datos de las luces...
int n_llums = Integer.parseInt(req.getParameter("n_llums"));
String model_preu_llum[]=model_preu(req.getParameter("model_preu_llum"));
String model_llum = model_preu_llum[0];
int preu_llum = Integer.parseInt(model_preu_llum[1]);

   if (n_taules == 0 && n_cadires == 0 && n_llums == 0) {
       //El pedido esta vacio...
       out.println("<H1>Comanda buida!</H1>");
       out.println("No s'ha donat cap quantitat més gran de 0");
   } else {
       //Creamos el pedido y lo almacenamos en el Vector...
       dadescomanda dc = new dadescomanda();
       dc.n_taules = n_taules;
       dc.model_taula = model_taula;
       dc.preu_taula = preu_taula;
       dc.n_cadires = n_cadires;
       dc.model_cadira = model_cadira;
       dc.preu_cadira = preu_cadira;
       dc.n_llums = n_llums;
       dc.model_llum = model_llum;
       dc.preu_llum = preu_llum;
       synchronized(this) {
           comandes.add(dc);
       }


       //Visualizamos los datos enviados...
       out.println("<H1>Dades de la comanda</H1>");
       out.println("<ul>");
       if(n_taules > 0) {
         out.println("<li> <code>"+n_taules+" taules model ");
         out.println(model_taula+" amb preu "+preu_taula+"</code>");
       }
       if(n_cadires > 0) {
         out.println("<li> <code>"+n_cadires+" cadires model ");
         out.println(model_cadira+" amb preu "+preu_cadira+"</code>");
       }
       if(n_llums > 0) {
         out.println("<li> <code>"+n_llums+" llums model ");
         out.println(model_llum+" amb preu "+preu_llum+"</code>");
       }
       out.println("</ul>");
       out.println("<br>");
       int preu_total = n_taules*preu_taula+
                        +n_cadires*preu_cadira+
                        +n_llums*preu_llum;
       out.println("Preu total: " + preu_total);
    }
    out.println("<br>");
    out.println("<br>");
}


Volver al Indice Resultados


Hemos conseguido que toda la práctica funcione con completa normalidad.

Servlets


Esta práctica sirve de gran utilidad para aprender los principios básicos de la tecnología CGI.

Ventajas de usar Servlets

Ha diferencia de lo CGI los Servlets son más seguros puesto que no se ejecuta una instancia por cada solicitud del cliente. Sino que se habre un nuevo hilo de ejecución.
Esto evita situaciones como la caída de servidores por falta de recursos de memoria.

Los Servlets funcionan mediante una máquina virtual que sirve las necesidades requeridas por el servidor Web. Al ser código no interpretado es de una velocidad similar a la de los CGI.

Inconvenientes de usar Servlets

Los Servlets por si solos son difíciles de manipular puesto que incorporar grandes cantidades de html en un servlet puede ser engorroso. Con el fin de evitar ese problema consideramos que es más interesante usar JSP, que sin dejar de ser servlets son archivos mucho más manejables.
Existen pocos servidores que soporten Servlets y es difícil encontrar servicios de hosting con este tipo de tecnología.

Volver al Indice Conclusiones


Primeramente hemos leído la documentación sobre programación Servlet.

Puesto que los Servlets permiten tratar el método Get y el Post de manera independiente, hemos considerado oportuno juntarlo todo en un único archivo.
Hemos aprovechado los formularios de la práctica de CGI, modificando el action de los formularios para que llamaran al Servlet comanda.

En principio el Servlet comanda no guarda la información en ningún fichero plano. Por este motivo ha sido necesario crearnos nuestra propia estructura para que los pedidos puedan ser almacenados en memoria.

Hemos tenido en cuenta el problema de la concurrencia para que si existen diferentes clientes simultáneos no pueda existir inconsistencia en los datos.
Posteriormente hemos documentado la práctica.