CRUD – Servlets – JSP

Ingresar a Netbeans (Versión 11).

1.- Crear un proyecto de tipo Web Application

Project Name: Dashboard6

Project Location: c:\SC

Presionar la tecla Next > Finish

2. Modifica el navegador por default

3.- Verificar que el proyecto es ejecutable

  • Borrar el archivo index.html
  • Copia el contenido JSP del proyecto https://github.com/fararoni/Dashboard4.git (NO INCLUIR WEB-INF)
  • Copiar el contenido Java

Corregir la instalación del driver

  • Si no tienes el driver, se puede descargar de la siguiente url: https://cdn.nekdu.com/jdbc/mysql-connector-j-8.0.31.jar y copiarlos a c:\sc\jdbc. Agregar dependencias.
  • Revisar el funcionamiento de la funcionalidad productos, implementar la funcionalidd similar para clientes.

4. Seguir el siguiente ejercicio.

1.- Usar la tabla de clientes en MySql, con la siguiente estructura

CREATE TABLE `clientes` (
    `id` INT NOT NULL AUTO_INCREMENT ,
    `nombre` VARCHAR(20) NOT NULL ,
    `apellidos` VARCHAR(40) NOT NULL ,
    `telefono` INT NOT NULL ,
    `domicilio` VARCHAR(60) NOT NULL ,
    `codigo_postal` INT(5) NOT NULL ,
    `edad` INT(2) NOT NULL ,
    `sexo` VARCHAR(1) NOT NULL , 
    PRIMARY KEY (`id`)) ENGINE = InnoDB;

2. Crear la clase POJO (Bean) para la tabla clientes, agregar un constructor por default, constructor para todos los atributos, los métodos get/set y el método toString().

package tese.pojo;
public class Cliente {
    int id;
    String nombre;
    String apellidos;
    long telefono;
    String domicilio;
    int codigo;
    int edad;
    String sexo;
}

Con las teclas <alt><insertar> activar los generadores de contructores, métodos get/set y el metodo toString().

3.- Crear la clase DAO de acceso a la base de datos para la tabla clientes

Copiar el archivo ProductoDAO.java a ClienteDAO y hacer los siguientes cambios y corregir los errores que se presenten:

3.1 Actualizar el import del pojo.

import tese.pojo.Cliente;

3.2 Actualizar las consultas SQL, conforme a la estructura de la tabla MYSQL

    static String sqlCrearTabla = "CREATE TABLE clientes (\n" +
                "    id INT NOT NULL AUTO_INCREMENT ,\n" +
                "    nombre VARCHAR(20) NOT NULL ,\n" +
                "    apellidos VARCHAR(40) NOT NULL ,\n" +
                "    telefono BIGINT NOT NULL ,\n" +
                "    domicilio VARCHAR(60) NOT NULL ,\n" +
                "    codigo_postal INT(5) NOT NULL ,\n" +
                "    edad INT(2) NOT NULL ,\n" +
                "    sexo VARCHAR(1) NOT NULL , \n" +
                "    PRIMARY KEY (id)) ;";

    String sqlInsert = "INSERT INTO  clientes (nombre, apellidos, telefono, domicilio,codigo_postal, edad, sexo ) VALUES ( ?, ? ? , ?, ?, ?, ? )";
    String sqlUpdate = "UPDATE clientes set nombre= ?, apellidos = ?, telefono=?, domicilio =? , codigo_postal = ?, edad =?, sexo=? where id = ? ";
    String sqlDelete = "DELETE from clientes where id = ?";
    String sqlSelectById = "SELECT id, nombre, apellidos, telefono, domicilio,codigo_postal, edad, sexo from clientes where id =?";
    String sqlSelectByComodin = "SELECT nombre, apellidos, telefono, domicilio,codigo_postal, edad, sexo from clientes where (nombre like ? or apellidos like ?)";
    String sqlSelectAll = "select * from clientes";

3.3 Actualizar el método insert

    public int insert(Cliente p) throws SQLException {
        Connection conn = DatabaseDAO.openConnection();
        int cuantos;
        System.out.println("ClienteDAO.insert:" + p);
        PreparedStatement ps = conn.prepareStatement(sqlInsert);
        ps.setString(1, p.getNombre());
        ps.setString(2, p.getApellidos());
        ps.setLong(3, p.getTelefono());
        ps.setString(4, p.getDomicilio());
        ps.setInt(5, p.getCodigo());
        ps.setInt(6, p.getEdad());
        ps.setString(7, p.getSexo());
        cuantos = ps.executeUpdate();
        DatabaseDAO.closeConnection(conn);
        return cuantos;
    }
       

3.4 Actualizar el método update

  public int update(Cliente p) throws SQLException {
       Connection conn = DatabaseDAO.openConnection();
        int cuantos;
        conn = DatabaseDAO.openConnection();
        PreparedStatement ps = conn.prepareStatement(sqlUpdate);
        ps.setString(1, p.getNombre());
        ps.setString(2, p.getApellidos());
        ps.setLong(3, p.getTelefono());
        ps.setString(4, p.getDomicilio());
        ps.setInt(5, p.getCodigo());
        ps.setInt(6, p.getEdad());
        ps.setString(7, p.getSexo());
        ps.setInt(8, p.getId());
        cuantos = ps.executeUpdate();
        System.out.println("update" + cuantos + " > " +  p);
        DatabaseDAO.closeConnection(conn);
        return cuantos;
    }

3.5 Actualizar el método delete

    public int delete(int id) throws SQLException {
        Connection conn = DatabaseDAO.openConnection();
        int cuantos;
        PreparedStatement ps = conn.prepareStatement(sqlDelete);
        ps.setInt(1, id);
        cuantos = ps.executeUpdate();
        DatabaseDAO.closeConnection(conn);
        return cuantos;
    }

3.5 Actualizar el método select por id

    public Cliente select(int id) throws SQLException {
        Connection conn = DatabaseDAO.openConnection();
        Cliente cliente = null;
        PreparedStatement preparedStatement = conn.prepareStatement(sqlSelectById);
        preparedStatement.setInt(1, id);
        System.out.println(preparedStatement);
        ResultSet rs = preparedStatement.executeQuery();
        while (rs.next()) {
            cliente = new Cliente();
            cliente.setId(rs.getInt("id"));
            cliente.setNombre(rs.getString("nombre"));
            cliente.setApellidos(rs.getString("apellidos"));
            cliente.setTelefono(rs.getLong("telefono"));
            cliente.setDomicilio(rs.getString("domicilio"));
            cliente.setCodigo(rs.getInt("codigo_postal"));
            cliente.setEdad(rs.getInt("edad"));
            cliente.setSexo(rs.getString("sexo"));
        }
        DatabaseDAO.closeConnection(conn);
        return cliente;
    }

3.6 Actualizar el método select por comodín

    public Cliente select(String comodin) throws SQLException {
        Connection conn = DatabaseDAO.openConnection();
        Cliente cliente = null;
        PreparedStatement preparedStatement = conn.prepareStatement(sqlSelectByComodin);
        preparedStatement.setString(1, comodin);
        preparedStatement.setString(2, comodin);
        System.out.println(preparedStatement);
        ResultSet rs = preparedStatement.executeQuery();
        while (rs.next()) {
            cliente = new Cliente();
            cliente.setId(rs.getInt("id"));
            cliente.setNombre(rs.getString("nombre"));
            cliente.setApellidos(rs.getString("apellidos"));
            cliente.setTelefono(rs.getLong("telefono"));
            cliente.setDomicilio(rs.getString("domicilio"));
            cliente.setCodigo(rs.getInt("codigo_postal"));
            cliente.setEdad(rs.getInt("edad"));
            cliente.setSexo(rs.getString("sexo"));
        }
        DatabaseDAO.closeConnection(conn);
        return cliente;
    }

3.7 Actualizar el método select todo

    public List selectAll() throws SQLException {
        Connection conn = DatabaseDAO.openConnection();
        List clientes = new ArrayList();
        PreparedStatement ps = conn.prepareStatement(sqlSelectAll);
        System.out.println(ps);
        ResultSet rs = ps.executeQuery();
        while (rs.next()) {
            Cliente cliente = new Cliente();
            cliente.setId(rs.getInt("id"));
            cliente.setNombre(rs.getString("nombre"));
            cliente.setApellidos(rs.getString("apellidos"));
            cliente.setTelefono(rs.getLong("telefono"));
            cliente.setDomicilio(rs.getString("domicilio"));
            cliente.setCodigo(rs.getInt("codigo_postal"));
            cliente.setEdad(rs.getInt("edad"));
            cliente.setSexo(rs.getString("sexo"));
            clientes.add(cliente);
        }
        DatabaseDAO.closeConnection(conn);
        return clientes;
    }

3.8 Verificar que funciona la clase ClienteDAO

Modificar el Servlet TestServlet, con el siguiente método processRequest

 protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            ClienteDAO dao = new ClienteDAO();
            Cliente cliente = new Cliente(0, 
                    "Guadalupe", 
                    "Reyes", 
                    5512345678L, 
                    "Conocido",
                    12345, 
                    21,
                    "M" );
            List la = dao.selectAll();
            out.print("Select all..");
            out.println(la);
            
            dao.insert(cliente);
            List lb = dao.selectAll();
            out.print("Select all 2..");
            out.println(lb);
            //--
            out.print("Update..");
            cliente.setNombre("Lupita");
            cliente.setId(1);
            dao.update(cliente);
            
            out.print("Delete..");
            dao.delete(1);
            out.print("Ok");
            
        } catch (SQLException ex) {
            Logger.getLogger(TestServlet.class.getName()).log(Level.SEVERE, null, ex);
            out.print(ex);
        } finally {
            out.close();
        }
    }

4. Crear las vistas en JSP para las operaciones CRUD de la tabla Clientes

4.1 Crear el directorio clientes en Web Pages

Copiar los archivos producto-list.jsp y producto-form.jsp a este directorio, renombrarlos para clientes

4.2 Editar clientes-list.jsp

Modificar las siguientes lineas

<c:forEach var="cliente" items="${listClientes}">
   <tr>
      <td>
         <c:out value="${cliente.id}" />
      </td>
      <td>
         <c:out value="${cliente.nombre}" />
      </td>
      <td>
         <c:out value="${cliente.apellidos}" />
      </td>
      <td>
         <c:out value="${cliente.telefono}" />                                 
      </td>
      <td>
         <c:out value="${cliente.domicilio}" />
      </td>
      <td>
         <c:out value="${cliente.codigo}" />
      </td>
      <td>
         <c:out value="${cliente.edad}" />
      </td>
      <td>
         <c:out value="${cliente.sexo}" />
      </td>
      <td>
         <a href="<%=request.getContextPath()%>/ClientesUpdate?id=<c:out value='${cliente.id}' />">Actualizar</a> 
         <a href="<%=request.getContextPath()%>/ClientesDelete?id=<c:out value='${cliente.id}' />">Borrar</a>
   </tr>
</c:forEach>

4.3 Editar cliente-form.jsp

Línea 57 a 71

<div class="form-group row">
                                    <label for="nombre" class="col-sm-2 col-form-label">Nombre</label>
                                    <div class="col-sm-10">
                                        <input type="text" id="nombre" name="nombre" value="<c:out value='${cliente.nombre}' />" 
                                               class="form-control" placeholder="Nombre del cliente...">
                                    </div>
                                </div>
                                <div class="form-group row">
                                    <label for="apellidos" class="col-sm-2 col-form-label">Apellidos</label>
                                    <div class="col-sm-10">
                                        <input type="text" id="apellidos" name="apellidos" value="<c:out value='${cliente.apellidos}' />" 
                                               class="form-control" placeholder="Apellidos del cliente...">
                                    </div>
                                </div>

5.- Crear el Servlet para controllar los clientes

Copiar el archivo ProductosServlet.java con el nombre ClientesServlet.java

5.1 Editar ClientesServlet.java y actualizar el método para listar los clientes

import tese.dao.ClienteDAO;
import tese.pojo.Cliente;

Se encuentra una sección comentada para explicar la organización de los métodos del servlet

/*
            SQL                      Form            Action      
                                     GET             POST
    Create  Insert  /ClientesNew    showNewForm     actionInsert 
    Read    Select  /ClientesGrid   showAllGrid     N/A
    Update  Update  /ClientesUpdate showUpdateForm  actionUdate
    Delete  Delete  /ClientesDelete showDeleteForm  actionDelete
    ------  ------  ---------------- --------------  ------------

    1.- Los formularios y grid, se mostraran por el Método GET y 
        las acciones a B.D. por el método POST.
 */
@WebServlet(name = "ClientesServlet", urlPatterns = {
    "/ClientesNew",
    "/ClientesGrid",
    "/ClientesUpdate",
    "/ClientesDelete"
})
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String action = request.getServletPath();
        try {
            if ("/ClientesNew".equals(action)) {
                showNewForm(request, response);
            }
            if ("/ClientesGrid".equals(action)) {
                showAllGrid(request, response);

            }
            if ("/ClientesUpdate".equals(action)) {
                showUpdateForm(request, response);
            }
            if ("/ClientesDelete".equals(action)) {
                showDeleteForm(request, response);
            }
        } catch (SQLException ex) {
            Logger.getLogger(ClientesServlet.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String action = request.getServletPath();
        try {
            if ("/ClientesNew".equals(action)) {
                actionInsert(request, response);
            }
            if ("/ClientesGrid".equals(action)) {
                showAllGrid(request, response);
            }
            if ("/ClientesUpdate".equals(action)) {
                actionUpdate(request, response);
            }
            if ("/ClientesDelete".equals(action)) {
                actionDelete(request, response);
            }
        } catch (SQLException ex) {
            Logger.getLogger(ClientesServlet.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

5.2 Métodos para crear los clientes

    //-- Create  Insert  /ProductosNew    showNewForm     actionInsert 
    private void showNewForm(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        System.out.println("showNewForm");
        RequestDispatcher dispatcher = request.getRequestDispatcher("/clientes/cliente-form.jsp");
        dispatcher.forward(request, response);
    }
    private void actionInsert(HttpServletRequest request, HttpServletResponse response)
            throws SQLException, IOException {
        int id = 0;
        try {
            id = Integer.parseInt(request.getParameter("id"));
        } catch (Exception e) {
               System.out.println("Id tiene valor nulo");
        }
            
        String nombre    = request.getParameter("nombre");
        String apellidos = request.getParameter("apellidos");
        long telefono    = Long.parseLong(request.getParameter("telefono"));
        String domicilio = request.getParameter("domicilio");
        int codigo       = Integer.parseInt(request.getParameter("edad"));
        int edad         = Integer.parseInt(request.getParameter("edad"));
        String sexo      = request.getParameter("sexo");

        Cliente newProd = new Cliente(id, nombre, apellidos, telefono, domicilio, codigo, edad, sexo);
        clienteDAO.insert(newProd);
        response.sendRedirect(request.getContextPath() + "/ClientesGrid");
    }

5.3 Métodos para crear consultar los clientes

    //--Read    Select  /ProductosGrid   showAllGrid     N/A
    private void showAllGrid(HttpServletRequest request, HttpServletResponse response)
            throws SQLException, IOException, ServletException {
        List< Cliente> listUser = clienteDAO.selectAll();
        
        request.setAttribute("listClientes", listUser);
        RequestDispatcher dispatcher = request.getRequestDispatcher("/clientes/clientes-list.jsp");
        dispatcher.forward(request, response);
    }

5.4 Métodos para actualizar los clientes

    //-- Update  Update  /ProductosUpdate showUpdateForm  actionUdate
    private void showUpdateForm(HttpServletRequest request, HttpServletResponse response)
            throws SQLException, ServletException, IOException {
        int id = Integer.parseInt(request.getParameter("id"));
        Cliente cliente = clienteDAO.select(id);
        
        request.setAttribute("cliente", cliente);
        RequestDispatcher dispatcher = request.getRequestDispatcher("/clientes/cliente-form.jsp");
        dispatcher.forward(request, response);
    }
     private void actionUpdate(HttpServletRequest request, HttpServletResponse response)
            throws SQLException, IOException {
        int id = -1;
        try {
            id = Integer.parseInt(request.getParameter("id"));
        } catch (Exception e) {
               System.out.println("Id tiene valor nulo");
        }
        String nombre    = request.getParameter("nombre");
        String apellidos = request.getParameter("apellidos");
        long telefono    = Long.parseLong(request.getParameter("telefono"));
        String domicilio = request.getParameter("domicilio");
        int codigo       = Integer.parseInt(request.getParameter("edad"));
        int edad         = Integer.parseInt(request.getParameter("edad"));
        String sexo      = request.getParameter("sexo");

        Cliente updateCliente = new Cliente(id, nombre, apellidos, telefono, domicilio, codigo, edad, sexo);
        System.out.println(" actionUpdate:" + updateCliente );
        clienteDAO.update(updateCliente);
        response.sendRedirect(request.getContextPath() + "/ClientesGrid");
    }

5.5 Métodos para borrar los clientes

    //-- Delete  Delete  /ProductosDelete showDeleteForm  actionDelete
    private void showDeleteForm(HttpServletRequest request, HttpServletResponse response)
            throws SQLException, ServletException, IOException {
        int id = Integer.parseInt(request.getParameter("id"));
        Cliente cliente = clienteDAO.select(id);
        
        request.setAttribute("producto", cliente);
        request.setAttribute("accion", "borrar");
        RequestDispatcher dispatcher = request.getRequestDispatcher("/clientes/cliente-form.jsp");
        dispatcher.forward(request, response);
    }

    private void actionDelete(HttpServletRequest request, HttpServletResponse response)
            throws SQLException, IOException {
        int id = -1;
        try {
            id = Integer.parseInt(request.getParameter("id"));
        } catch (Exception e) {
               System.out.println("Id tiene valor nulo");
        }
        System.out.println(" actionDelete:" + id );
        clienteDAO.delete("id");
        response.sendRedirect(request.getContextPath() + "/ClientesGrid");
    }

Felicidades!!!!