Controlador PersonaControladorServlet2 - eliizquierdo/material_programacion_avanzada2026 GitHub Wiki

📦 Proyecto: mini-crud1 (Fase 2) — ⬇️ Descargar ZIP · ☁️ Abrir en Codespace

Controlador CRUD Completo - Funciones Editar y Eliminar

Vamos a analizar ahora qué cambios debemos hacer para agregar las funciones de editar y eliminar a nuestro CRUD.

¿Qué hace este código actualizado?

  • GET action=agregar → abre /WEB-INF/vista/persona-form.jsp
  • GET action=cargarEditar&codigo=... → abre /WEB-INF/vista/persona-editar.jsp con datos
  • POST action=agregar|editar|eliminar → procesa y aplica PRG

Código completo del Servlet actualizado:

package controlador;

import java.io.IOException;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.*;

import modelo.dao.PersonaDAO;
import modelo.vo.PersonaVO;

@WebServlet("/persona")
public class PersonaControladorServlet extends HttpServlet {
    private final PersonaDAO dao = new PersonaDAO();

    // ======================== GET ========================
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String action = request.getParameter("action");
        if (action == null)
            action = ""; // evita NPE en switch

        switch (action) {
            case "agregar": // mostrar formulario de alta (GET)
                request.getRequestDispatcher("/WEB-INF/vista/persona-form.jsp")
                        .forward(request, response);
                break;

            case "cargarEditar": // mostrar formulario de edición (GET)
                cargarEditar(request, response);
                break;

            case "listar": // listar explícito
                listar(request, response);
                break;

            default: // sin action o desconocida → listar
                listar(request, response);
                break;
        }
    }

    // ======================== POST ========================
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        request.setCharacterEncoding("UTF-8");
        String action = request.getParameter("action");
        if (action == null) {
            response.sendRedirect(request.getContextPath() + "/persona");
            return;
        }

        switch (action) {
            case "agregar":
                agregar(request, response);
                break;
            case "editar":
                editar(request, response);
                break;
            case "eliminar":
                eliminar(request, response);
                break; // eliminar por POST
            default:
                response.sendRedirect(request.getContextPath() + "/persona");
        }
    }

    // ===================== Acciones privadas =====================

    private void agregar(HttpServletRequest request, HttpServletResponse response)
            throws IOException {
        int codigo = Integer.parseInt(request.getParameter("codigo"));
        String nombre = request.getParameter("nombre");
        dao.agregar(new PersonaVO(codigo, nombre.trim()));
        // PRG → volver a listar
        response.sendRedirect(request.getContextPath() + "/persona");
    }

    private void editar(HttpServletRequest request, HttpServletResponse response)
            throws IOException {
        int codigo = Integer.parseInt(request.getParameter("codigo"));
        String nombre = request.getParameter("nombre");
        dao.actualizar(new PersonaVO(codigo, nombre.trim()));
        // PRG → volver a listar
        response.sendRedirect(request.getContextPath() + "/persona");
    }

    private void eliminar(HttpServletRequest request, HttpServletResponse response)
            throws IOException {
        int codigo = Integer.parseInt(request.getParameter("codigo"));
        dao.eliminar(codigo);
        // PRG → volver a listar
        response.sendRedirect(request.getContextPath() + "/persona");
    }

    private void cargarEditar(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        int codigo = Integer.parseInt(request.getParameter("codigo"));
        PersonaVO persona = dao.obtenerXCodigo(codigo);

        if (persona != null) {
            request.setAttribute("persona", persona);
            request.getRequestDispatcher("/WEB-INF/vista/persona-editar.jsp")
                    .forward(request, response);
        } else {
            response.sendRedirect(request.getContextPath() + "/persona");
        }
    }

    private void listar(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setAttribute("personas", dao.getLista());
        request.getRequestDispatcher("/WEB-INF/vista/persona-lista.jsp")
                .forward(request, response);
    }
}

Nuevas funcionalidades agregadas:

1) Nueva acción GET: cargarEditar

En el método doGet() aparece el nuevo caso:

case "cargarEditar": // mostrar formulario de edición
    cargarEditar(request, response);
    break;

¿Qué hace?

  • action=cargarEditar&codigo=... → formulario de edición
  • Llama al método privado cargarEditar(...), que busca por código y, si existe, precarga los datos en /WEB-INF/vista/persona-editar.jsp

Método auxiliar: cargar datos para editar

private void cargarEditar(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    int codigo = Integer.parseInt(request.getParameter("codigo"));
    PersonaVO persona = dao.obtenerXCodigo(codigo);

    if (persona != null) {
        request.setAttribute("persona", persona);
        request.getRequestDispatcher("/WEB-INF/vista/persona-editar.jsp")
                .forward(request, response);
    } else {
        response.sendRedirect(request.getContextPath() + "/persona");
    }
}

¿Qué hace?

  1. Lee el código desde la URL
  2. Pide al DAO la persona correspondiente
  3. Si la encuentra, la inyecta como atributo persona y hace forward al JSP de edición
  4. Si no existe, redirige al listado

2) Nuevas acciones POST: editar y eliminar

En el método doPost() se agregaron los nuevos casos:

switch (action) {
    case "agregar":
        agregar(request, response);
        break;
    case "editar":
        editar(request, response);
        break;
    case "eliminar":
        eliminar(request, response);
        break; // eliminar por POST
    default:
        response.sendRedirect(request.getContextPath() + "/persona");
}

2.1) Editar (actualización)

private void editar(HttpServletRequest request, HttpServletResponse response)
        throws IOException {
    int codigo = Integer.parseInt(request.getParameter("codigo"));
    String nombre = request.getParameter("nombre");
    dao.actualizar(new PersonaVO(codigo, nombre.trim()));
    response.sendRedirect(request.getContextPath() + "/persona"); // PRG → listar
}

Flujo:

  1. Recibe código (normalmente readonly en el formulario de edición) y nombre actualizado
  2. Llama a dao.actualizar(...)
  3. Vuelve al listado con PRG

2.2) Eliminar (bajas)

private void eliminar(HttpServletRequest request, HttpServletResponse response)
        throws IOException {
    int codigo = Integer.parseInt(request.getParameter("codigo"));
    dao.eliminar(codigo);
    response.sendRedirect(request.getContextPath() + "/persona"); // PRG → listar
}

Flujo:

  1. Recibe el código a eliminar (desde un formulario con method="post" en la tabla)
  2. Llama a dao.eliminar(codigo) y redirige al listado

Patrón PRG aplicado en todas las operaciones

Luego de cada operación POST (agregar, editar, eliminar) se mantiene el mismo patrón:

response.sendRedirect(request.getContextPath() + "/persona"); // PRG → listar

¿Por qué?

  • Evita el reenvío del formulario si el usuario actualiza la página
  • Fuerza a que el navegador haga un GET al listado, lo que deja la UI en un estado consistente

Resumen de cambios principales:

  1. GET: Se agregó cargarEditar para mostrar formulario con datos precargados
  2. POST: Se agregaron editar y eliminar para procesar las operaciones
  3. Métodos auxiliares: Nuevos métodos editar(), eliminar() y cargarEditar()
  4. PRG: Se mantiene el patrón en todas las operaciones POST

Continuemos con VISTA- Editar Persona


📋 Palabras clave

PersonaControladorServlet · editar · eliminar · cargarEditar · doGet · doPost · obtenerXCodigo · PRG · sendRedirect · actualizar · CRUD completo · switch


🧠 Autoevaluación — Mini-CRUD con MVC


← PersonaDAO y PersonaVO · 🏠 Inicio · VISTA: Editar Persona →