Sesión 3: Ejemplo de uso de servlets y JSP

EJEMPLO DE USO DE SERVLETS Y JSP.

Modelo
A continuación, se detalla un caso de ejemplo donde se solicita realizar un inicio de sesión y un registro de usuarios dentro de una aplicación X.
En el caso del registro del nuevo perfil se debe solicitar el nombre del usuario, un nickname o ID, y el registro de la contraseña, la cual se debe solicitar dos veces y ambos ingresos deben coincidir en su contenido. De pronto no se hace necesario incorporar las reglas de escritura de la misma, por lo que puede ser cualquier combinación de caracteres, de cualquier longitud. La página debe verificar si ambas contraseñas coinciden y los espacios de captura son obligatorios para poder realizar el registro del perfil del nuevo usuario.
En el caso del inicio de sesión, el usuaro debe suministrar el nombre de usuario o ID y la contraseña y pasará a mostrarse como usuario conectado si y solo si sus credenciales se encuentran registradas previamente y han sido ingresadas de manera correcta.
    Solución propuesta
    • IniciarSesion.jsp
    <%@page contentType="text/html" pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
            <title>Iniciar Sesión</title>
        </head>
        <body>
            <h1>Iniciar Sesión</h1>
        </body>
        
            <%HttpSession miSesion = request.getSession();%> 
        
            <form name="form_IniciarSesion" action="IniciarSesionServlet" method="POST">
                <br/>
                Usuario: <input type="text" name="input_usuario" value="" />
                <br/>
                Contraseña: <input type="password" name="input_contrasenia" value="" />
                <br/>
                <%=miSesion.getAttribute("mensaje")== null ? "" : miSesion.getAttribute("mensaje") %>
                <br/>
                <input type="submit" value="Ingresar" name="btnIngresar" /> 
                <input type="submit" value="Registrarse" name="btnRegistrar" /> 
                <br/>
            </form>
    </html>
    
    • RegistrarUsuario.jsp
    <%@page contentType="text/html" pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
            <title>Registrar Usuario</title>
        </head>
        <body>
            <h1>Registrarse</h1>
        </body>
        
            <%HttpSession miSesion = request.getSession();%> 
        
            <form name="form_RegistrarUsuario" action="RegistrarUsuarioServlet" method="POST">
                <br/>
                Nombre: <input type="text" name="input_nombre" value="" />
                <br/>
                Usuario: <input type="text" name="input_usuario" value="" />
                <br/>
                Contraseña: <input type="password" name="input_contrasenia" value="" />
                <br/>
                Vuelva a ingresar la contraseña: <input type="password" name="input_contrasenia_de_nuevo" value="" />
                <br/>
                <%=miSesion.getAttribute("mensaje")== null ? "" : miSesion.getAttribute("mensaje") %>
                <br/>
                <input type="submit" value="Registrar" name="btnRegistrar" /> 
                <br/>
            </form>
    </html>
    
    Como se puede observar, se utilizan páginas con extención .jsp como elementos alternativos para lograr que la página sea dinámica y pueda mostrar cambios en los elementos a través del uso de scriplets. Además, se utiliza el objeto HttpSession junto al métedo getSession() mediante el debido scriplet, todo esto con el fin de mostrar mensajes respectivos al usuario y lograr ese efecto de dinamismo en las pantallas. Estos mensajes son utilizados por ejemplo, en las validaciones, si el usuario al momento del registro el nickname ingresado es válido, entre otros casos. Entonces, gracias a getAttribute(atributo) obtendremos esos mensajes enviados por el debido servlet (más adelante se detalla). Al utilizar servlets es necesario crear un form que contendrá los componentes de la pantalla, a su vez, se especifica un nombre, la acción que corresponde con el nombre de la clase servlet como tal (se detalla a continuación), y el tipo de método para el paso de atributos entre pantallas .jsp.
    Importante notar que cada componente, es decir, los inputs, se les debe asignar su respectivo identificador en el campo name para que posteriormente, el debido servlet pueda recibir los datos que se ingresan.
    Pasemos ahora a los respectivos servlets de los dos .jsp anteriores. La codificación mostrada a continuación se incluye en el método processRequest, el cuál es generado al momento de crear este tipo de archivo dentro del proyecto, o bien al momento de implementar el objeto HttpServer en la clase que queremos que tome la responsabilidad de servlet.
    • IniciarSesionServlet.java
    //---------------------- Simular la persistencia ----------------------
    BaseDeDatos miBase = BaseDeDatos.getInstance();
    miBase.LlenarBaseDeDatos();
    //----------------------------------------------------------------------
    HttpSession miSesion = request.getSession();
    
    // Presionó "Iniciar Sesión"
    if (request.getParameter("btnIngresar") != null)
    {
        String usuario = (String) request.getParameter("input_usuario");
        String contrasenia = (String) request.getParameter("input_contrasenia");
    
        if (!usuario.equals("") && !contrasenia.equals(""))
        {
            boolean esValido = miBase.ValidarUsuario(usuario, contrasenia);
    
            if (esValido)
            {
                miSesion.setAttribute("mensaje", "Felicidades, has iniciado sesión :)");
                response.sendRedirect("IniciarSesion.jsp");
            }
            else
            {
                miSesion.setAttribute("mensaje", "El nombre de usuario o contraseña es incorrecto!");
                response.sendRedirect("IniciarSesion.jsp");
            }
        }
        else
        {
           miSesion.setAttribute("mensaje", "Por favor, complete todos los campos!");
           response.sendRedirect("IniciarSesion.jsp"); 
        }
    }
    else
    {
        // Presionó "Registrarse"
        miSesion.setAttribute("mensaje", "");
        response.sendRedirect("RegistrarUsuario.jsp"); 
    }
    
      • RegistrarUsuarioServlet.java
        //---------------------- Simular la persistencia ----------------------
        BaseDeDatos miBase = BaseDeDatos.getInstance();
        //----------------------------------------------------------------------
        HttpSession miSesion = request.getSession();
        
        String nombre = (String) request.getParameter("input_nombre");
        String usuario = (String) request.getParameter("input_usuario");
        String contrasenia = (String) (String) request.getParameter("input_contrasenia");
        String contrasenia_rep = (String) (String) request.getParameter("input_contrasenia_de_nuevo");
        
        if (request.getParameter("btnRegistrar") != null)
        {
            if (!nombre.equals("") || !usuario.equals("") || !contrasenia.equals("") || !contrasenia_rep.equals(""))
            {
                if (!miBase.ValidarUsuario(nombre))
                {
                    if (contrasenia.equals(contrasenia_rep))
                    {
                        miBase.RegistrarUsuario(nombre, usuario, contrasenia);
                        miSesion.setAttribute("mensaje", "Se ha creado la cuenta con éxito!");
                        response.sendRedirect("IniciarSesion.jsp"); 
                    }
                    else
                    {
                        miSesion.setAttribute("mensaje", "Las contraseñas ingresadas no concuerdan!");
                        response.sendRedirect("RegistrarUsuario.jsp"); 
                    }
                }
                else
                {
                    miSesion.setAttribute("mensaje", "El nombre de usuario ya esta en uso!");
                    response.sendRedirect("RegistrarUsuario.jsp"); 
                }
            }
            else
            {
               miSesion.setAttribute("mensaje", "Por favor, complete todos los campos!");
               response.sendRedirect("RegistrarUsuario.jsp"); 
            }
        }
        

        • Nota: request y responsive son parámetros de entrada que recibe el método processRequest.
        Para simular que estamos tratando con datos reales, simplemente se creó una clase Java BaseDeDatos únicamente a modo de ejemplo de almacenamiento.
        Ahora bien, debido a que queremos mostrar mensajes al usuario en la misma pantalla, debemos hacer getSession() para manipular y pasar dichos mensajes entre la pantalla .jsp y el respectivo servlet. Por tanto, al momento de querer enviar mensajes a la pantalla se debe invocar setAttribute(atributo, mensaje) insertando un atributo identificador seguido del mensaje que se desea mostrar. Con respecto al atributo identificador, es utlizado para poder efectuar getAttribute(atributo) desde la pantalla y con ello lograr recibir el mensaje que se envió desde la clase servlet.

        Antes de proseguir, se incluye a continuación la clase BaseDeDatos y Usuario a manera de completitud del ejemplo.
        • BaseDeDatos.java
        public class BaseDeDatos {
            
            public static List usuarios = new ArrayList<>();
            public static BaseDeDatos miBase;
            
            public BaseDeDatos() {  }
            
            public static BaseDeDatos getInstance()
            {
                if (miBase == null) {
                    miBase = new BaseDeDatos();
                }
                return miBase;
            }
            
            public void LlenarBaseDeDatos()
            {
                usuarios.add(new Usuario("José", "JoseNA", "123"));
                usuarios.add(new Usuario("Usuario 1", "usuario1", "123"));
                usuarios.add(new Usuario("Usuario 2", "usuario2", "123"));
            }
            
            // Inicio de sesión
            public boolean ValidarUsuario(String pUsuario, String pContrasenia)
            {
                for(Usuario usuario : usuarios) 
                {
                    if(usuario.getUsuario().equals(pUsuario) && usuario.getContraseña().equals(pContrasenia)) 
                    {
                        return true;
                    }
                }
                return false; // usuario no encontrado
            }
            
            public boolean ValidarUsuario(String pUsuario)
            {
                for(Usuario usuario : usuarios) 
                {
                    if(usuario.getUsuario().equals(pUsuario)) 
                    {
                        return true;
                    }
                }
                return false;
            }
            
            public boolean RegistrarUsuario(String pNombre, String pUsuario, String pContrasenia)
            {
                usuarios.add(new Usuario(pNombre, pUsuario, pContrasenia));
                return true;
            }
        }
        
        • Usuario.java
        public class Usuario {
            
            private String nombre;
            private String usuario;
            private String contraseña;
        
            public Usuario(String nombre, String usuario, String contraseña) {
                this.nombre = nombre;
                this.usuario = usuario;
                this.contraseña = contraseña;
            }
        
            public String getNombre() {
                return nombre;
            }
        
            public void setNombre(String nombre) {
                this.nombre = nombre;
            }
        
            public String getUsuario() {
                return usuario;
            }
        
            public void setUsuario(String usuario) {
                this.usuario = usuario;
            }
            
            public String getContraseña() {
                return contraseña;
            }
        
            public void setContraseña(String contraseña) {
                this.contraseña = contraseña;
            }
        }
        

        Para concluir, veamos las salidas que produce.
        • Faltan datos al momento de iniciar sesión.
        Caso 1
        • Usuario inválido (usuario y/o contraseña).
        Caso 2
          • Login exitoso.
            Caso 3
                • Faltan datos al momento del registro.
                  Caso 4
                    • El nombre de usuario ya esta en uso.
                      Caso 5
                      • Las contraseñas no concuerdan.
                      Caso 6
                        • Registro de usuario exitoso.
                          Caso 7

                          Referencias bibliográficas:

                          Programming model for JSP files and servlets. IBM® Knowledge Center 

                          Comentarios