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.jspcon 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?
- Lee el código desde la URL
- Pide al DAO la persona correspondiente
- Si la encuentra, la inyecta como atributo
personay hace forward al JSP de edición - 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:
- Recibe código (normalmente readonly en el formulario de edición) y nombre actualizado
- Llama a
dao.actualizar(...) - 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:
- Recibe el código a eliminar (desde un formulario con
method="post"en la tabla) - 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:
- GET: Se agregó
cargarEditarpara mostrar formulario con datos precargados - POST: Se agregaron
editaryeliminarpara procesar las operaciones - Métodos auxiliares: Nuevos métodos
editar(),eliminar()ycargarEditar() - 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 →