Comparativa JSP puro vs MVC Persona - eliizquierdo/material_programacion_avanzada2026 GitHub Wiki

Comparativa: JSP puro (sin Servlet) vs MVC (con Servlet) — usando Persona

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.

Tabla Comparativa

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.

Ejemplo: alta de persona, sin Servlet

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.

persona-form.jsp

<%@ 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>

resultado.jsp

<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.

La versión real, con Servlet (la que ya está en el repo)

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.

🔍 Resumen de la Evolución

1. Separación de Responsabilidades

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

2. La pregunta que separa a los dos ejemplos anteriores de este

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.


📋 Palabras clave

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 →

⚠️ **GitHub.com Fallback** ⚠️