Validación de unicidad de código - eliizquierdo/material_programacion_avanzada2026 GitHub Wiki

📦 Proyecto: mini-crud2 — ⬇️ Descargar ZIP · ☁️ Abrir en Codespace


Control de Unicidad del Código (Clave Primaria en Memoria)

Antes de integrar una Base de Datos (BD) real, donde el motor impondrá la restricción de Clave Primaria (PK), debemos implementar la validación de unicidad en la capa de Modelo (DAO). El DAO expone el método obtenerXCodigo() que el Servlet consulta: si el código ya existe, el Servlet reenvía al formulario con un mensaje de error; si es único, procede con la inserción y aplica el patrón PRG. Esto respeta la separación de responsabilidades MVC y evita que los errores de la BD se muestren directamente al usuario.

Luego de los cambios que haremos, cuando se inserte un codigo que ya existe el error se mostrará de la siguiente manera:

Control de unicidad de codigo

Usaremos el método dao.obtenerXCodigo(codigo) de nuestro DAO en memoria para verificar si el código ya existe.

1. 👨‍💻 Cambios en el Controlador (PersonaControladorServlet.java)

El cambio principal se realiza en el método agregar(). Necesitamos modificar su firma para que pueda manejar el forward (throws ServletException) y aplicar la lógica de validación y respuesta de error.

Lógica Aplicada en agregar()

Validar Existencia: Se llama al DAO para buscar si el código ya está en uso.

Manejo de Error (Duplicado):

  • Si personaExistente != null, el código está duplicado.
  • Usamos request.setAttribute("error", ...) para almacenar el mensaje.
  • Usamos request.setAttribute("persona", ...) para guardar los datos ya ingresados (código y nombre) y que no se pierdan al recargar la página.
  • Usamos request.getRequestDispatcher(...).forward() para devolver el flujo de control al formulario sin cambiar la URL.

Inserción/PRG: Solo si el código es único, procedemos a la inserción y aplicamos el patrón PRG.

// Modificamos la firma para incluir ServletException
private void agregar(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException { // Se necesita ServletException para usar forward

        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");

    }

2. 🎨 Cambios en la Vista (persona-form.jsp)

Ya venimos usando JSTL y EL desde el principio de este tema (ver Archivos JSP), así que el taglib y la dependencia en el pom.xml ya están en el proyecto. Lo que agregamos ahora es nuevo: mostrar el mensaje de error del Servlet, condicionalmente, con <c:if>.

El JSP debe hacer dos cosas nuevas:

  1. Usar <c:if> y EL para mostrar el error solo si existe.
  2. Usar EL para precargar los valores que el usuario ya había ingresado (para que no se pierdan si hay un error).

2.1. Código persona-form.jsp Modificado

<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="c" uri="jakarta.tags.core" %>

<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8" />
    <title>Agregar Persona</title>

    <link rel="stylesheet" href="${pageContext.request.contextPath}/css/styles.css" />
</head>
<body>
    <div class="form-container">
        <h1>Agregar Persona</h1>

        <c:if test="${requestScope.error != null}">
            <div
                style="
                    color: red;
                    border: 1px solid red;
                    padding: 10px;
                    margin-bottom: 15px;
                    background-color: #ffe8e8;
                "
            >
                <strong>Error:</strong> ${requestScope.error}
            </div>
        </c:if>

        <form action="${pageContext.request.contextPath}/persona" method="post">
            <input type="hidden" name="action" value="agregar" />

            <label>Código</label>
            <input
              type="number"
              name="codigo"
              required
              value="${requestScope.persona.codigo}"
            />

            <label>Nombre</label>
            <input
              type="text"
              name="nombre"
              required
              value="${requestScope.persona.nombre}"
            />

            <button class="btn" type="submit">Guardar</button>
            <a
              class="btn btn-secondary"
              href="${pageContext.request.contextPath}/persona"
              >Volver</a
            >
        </form>
    </div>
</body>
</html>

Con estos cambios, tu aplicación está lista para manejar la unicidad del código de manera robusta y con una separación clara de responsabilidades (MVC).

Veamos una comparativa aquí:


📋 Palabras clave

unicidad de código · c:if · Expression Language · EL · persona-form.jsp · MVC · vista robusta · mensaje de error · PRG


🧠 Autoevaluación — Mini-CRUD con MVC


← VISTA: Listar Personas (Fase 2) · 🏠 Inicio · Validación de campos obligatorios →

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