Comparativa JSP puro vs MVC Persona - eliizquierdo/material_programacion_avanzada2026 GitHub Wiki
Esta página muestra, con el propio ejemplo de Persona que ya se usa en el curso (persona-form.jsp, PersonaControladorServlet, PersonaDAO), qué cambia entre resolver el alta de una persona solo con JSP (sin ningún Servlet de por medio) y resolverla con la arquitectura MVC que ya está documentada en Controlador-PersonaControladorServlet y Validación-de-unicidad-de-código.
La idea es usarla como puente: antes de llegar a MVC, se puede mostrar la versión "ingenua" (JSP puro) de este mismo formulario, y después, al llegar a la unidad de MVC, contrastarla con la versión real que ya tienen en el repo.
| Aspecto | Versión JSP puro (sin Servlet) | Versión MVC real (la que ya está en el repo) |
|---|---|---|
| ¿Quién lee el formulario? | El propio JSP, con ${param.codigo} / ${param.nombre}
|
El Servlet, con request.getParameter("codigo") / request.getParameter("nombre")
|
| ¿Dónde "vive" la lista de personas? | En ningún lado — cada envío del formulario es independiente, no hay memoria entre pedidos | En el PersonaDAO, que mantiene una ArrayList<PersonaVO> mientras el servidor está corriendo |
| Verificación de código duplicado | No es posible. Sin un lugar donde guardar los códigos ya usados, no hay con qué comparar |
dao.obtenerXCodigo(codigo) — el Controlador le pregunta al Modelo si ese código ya existe |
| ¿Qué pasa si el código está repetido? | No se puede saber | El Servlet arma el mensaje de error y hace forward de vuelta al mismo formulario, con los datos ya ingresados precargados |
| Patrón de navegación tras guardar | Ninguno — la misma página muestra el eco de lo que se envió | PRG (Post → Redirect → Get): response.sendRedirect(...) al listado |
Esta tabla es la clave de por qué Persona sí necesita Servlet y Área del triángulo o Promedio de notas no: acá hay algo que debe persistir entre un pedido y el siguiente (la lista de personas ya cargadas), y esa persistencia solo puede vivir en un objeto del lado del servidor (el DAO) — no en el request de una sola pasada que usa JSP puro.
Esta sería la versión "ingenua" — sirve para mostrar el límite de lo que se puede hacer solo con JSP, antes de introducir MVC.
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="c" uri="jakarta.tags.core" %>
<form action="resultado.jsp" method="post">
<label>Código: <input type="number" name="codigo" required /></label>
<label>Nombre: <input type="text" name="nombre" required /></label>
<button type="submit">Guardar</button>
</form><c:if test="${not empty param.codigo}">
<p>Persona registrada:</p>
<p>Código: ${param.codigo}</p>
<p>Nombre: ${param.nombre}</p>
</c:if>Con esto se puede mostrar que el formulario "funciona" — pero cada envío es una isla. Si dos estudiantes cargan el código 5 dos veces seguidas, no hay forma de que la página se dé cuenta ni de avisar. Ese es exactamente el problema que dispara la necesidad de un Modelo (DAO) y, con él, un Controlador (Servlet) que lo consulte.
Este código no es un ejemplo nuevo — es literalmente el que ya está en proyectos-teoricos/mini-crud2/src/main/java/controlador/PersonaControladorServlet.java, documentado en la página Validación-de-unicidad-de-código:
private void agregar(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
PersonaVO personaParaFormulario = null;
int codigo = 0;
String nombre = request.getParameter("nombre");
// 1. Obtener y validar el código
codigo = Integer.parseInt(request.getParameter("codigo"));
personaParaFormulario = new PersonaVO(codigo, nombre.trim());
// 2. 🛑 VERIFICACIÓN DE UNICIDAD USANDO EL DAO 🛑
PersonaVO personaExistente = dao.obtenerXCodigo(codigo);
if (personaExistente != null) {
// Error: Código duplicado
request.setAttribute("error",
"Error: El código " + codigo + " ya está registrado. Ingrese uno diferente.");
request.setAttribute("persona", personaParaFormulario); // Mantener datos
// Usar FORWARD para volver al formulario y mostrar el error/datos
request.getRequestDispatcher("/WEB-INF/vista/persona-form.jsp").forward(request, response);
return; // Detener la ejecución
}
// 3. Si es único (personaExistente == null), agregar
dao.agregar(personaParaFormulario);
// 4. PRG (Redirección al listado)
response.sendRedirect(request.getContextPath() + "/persona");
}La vista correspondiente (persona-form.jsp) ya está documentada tal cual en Uso-de-JSTL / Validación-de-unicidad-de-código, usando ${requestScope.error} y ${requestScope.persona.codigo} en vez de ${param.codigo} — porque ahora el dato no viene directo del formulario, sino de lo que el Servlet decidió guardar en el request después de consultar al DAO.
| Capa | Versión sin Servlet | Versión con Servlet (real) |
|---|---|---|
| Vista (JSP) | Lee el formulario y lo muestra tal cual, sin poder validar nada que dependa de datos anteriores | Solo muestra lo que el Controlador ya decidió: el error, o la persona precargada |
| Controlador (Servlet) | No existe | Consulta al DAO, decide si hay error, y elige a qué vista hacer forward o redirect |
| Modelo (DAO) | No existe — no hay dónde guardar nada |
PersonaDAO mantiene la lista de personas mientras el servidor corre |
Con Área del triángulo o Promedio de notas, cada cálculo depende únicamente de lo que llegó en ese mismo formulario — no hace falta recordar nada de pedidos anteriores. Con Persona, en cambio, la pregunta "¿este código ya existe?" no se puede responder sin memoria entre pedidos. Ahí es donde JSP puro se queda corto y aparece la necesidad real de MVC: un Modelo que persista datos, y un Controlador que lo consulte antes de decidir qué mostrar.
MVC · Servlet · Controlador · PersonaDAO · PersonaVO · doPost · forward · PRG · requestScope · param · unicidad de código · persistencia en memoria
Ver también: Uso-de-JSTL, Validación-de-unicidad-de-código, Comparativa-persona-form (esa página compara scriptlets vs EL/JSTL dentro de la vista; esta página compara con/sin Servlet en la arquitectura completa — son ejes distintos).
← Comparativa persona-form.jsp · 🏠 Inicio · Introducción: BD + Web →
