Anexo Errores frecuentes - eliizquierdo/material_programacion_avanzada2026 GitHub Wiki

Esta página reúne los errores más comunes al trabajar con Servlets, JSP y Tomcat, con su causa y solución.


🔴 HTTP 404 — Página no encontrada

Síntoma

El navegador muestra: "HTTP Status 404 – Not Found"

Causas más comunes

a) La URL no coincide con el @WebServlet

// El Servlet está registrado en:
@WebServlet("/personas")

// Pero la URL que estás visitando es:
http://localhost:8080/mi-app/persona   // ← falta la "s"

✅ Verificar que la URL en el navegador coincida exactamente con el @WebServlet.

b) El .war no está desplegado

# Asegurarse de que el archivo .war esté en la carpeta webapps de Tomcat
deploy   # ejecutar este comando en el Codespace

c) El JSP está dentro de WEB-INF y se intenta acceder directo

❌ http://localhost:8080/mi-app/WEB-INF/vistas/lista.jsp   # no funciona
✅ Los JSP dentro de WEB-INF solo son accesibles via forward desde un Servlet

🔴 HTTP 500 — Error interno del servidor

Síntoma

El navegador muestra: "HTTP Status 500 – Internal Server Error"

Es siempre un error en el código Java. Ver el log:

tomcat-log   # muestra el stack trace completo

Causas más comunes

a) NullPointerException al leer parámetros

// ❌ El campo "nombre" no existe en el formulario o viene vacío
p.setNombre(req.getParameter("nombre").trim());
//                                    ↑ .trim() sobre null lanza NullPointerException
// ✅ Verificar antes de usar
String nombre = req.getParameter("nombre");
if (nombre != null) {
    p.setNombre(nombre.trim());
}

b) NumberFormatException al convertir edad

// ❌ El campo edad está vacío o tiene letras
p.setEdad(Integer.parseInt(req.getParameter("edad")));
// ✅ Parsear con cuidado
String edadStr = req.getParameter("edad");
if (edadStr != null && !edadStr.isEmpty()) {
    p.setEdad(Integer.parseInt(edadStr));
}

c) Error de conexión a la base de datos

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
# MySQL no está corriendo
sudo service mysql start
# o en el Codespace:
mysql-escuela   # si responde, MySQL está activo

🔴 HTTP 400 — Bad Request

Síntoma

El formulario no se envía o la respuesta llega vacía.

Causa

El encoding del formulario no está configurado antes de leer los parámetros.

// ✅ Siempre la primera línea del doPost():
req.setCharacterEncoding("UTF-8");

🟡 La página se recarga y vuelve a guardar el dato

Síntoma

Al presionar F5 después de guardar, el navegador pregunta si reenviar el formulario.

Causa

Falta el patrón PRG. Ver: Patrón PRG

// ❌ Responde con forward después de insertar → el POST queda en el historial
req.getRequestDispatcher("/lista.jsp").forward(req, resp);

// ✅ Redirigir después de modificar datos
resp.sendRedirect(req.getContextPath() + "/personas");

🟡 Los caracteres especiales se ven mal (tildes, ñ)

Síntoma

María aparece como María o similar.

Solución

Tres lugares donde hay que configurar UTF-8:

// 1. En el doPost() del Servlet:
req.setCharacterEncoding("UTF-8");

// 2. En el JSP (primera línea):
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

// 3. En la URL de conexión a MySQL (ConexionDB.java):
"jdbc:mysql://localhost:3306/escuela?characterEncoding=UTF-8"

🟡 El Servlet no se encuentra aunque @WebServlet está bien

Síntoma

404 aunque la URL parece correcta.

Causas

a) No se recompiló el proyecto después del cambio

deploy   # volver a compilar y desplegar

b) Hay un error de compilación que impide que el Servlet se registre

tomcat-log   # buscar errores de compilación en el log

c) web.xml tiene el Servlet duplicado o con URL diferente Revisar que no haya un <servlet-mapping> en el web.xml que contradiga el @WebServlet.


🟡 El puerto 8080 ya está en uso

Síntoma

Address already in use: bind

Solución

tomcat-stop     # detener Tomcat si estaba corriendo
tomcat-start    # volver a iniciar

🔵 El log de Tomcat (cómo leerlo)

El log es la herramienta más importante para diagnosticar errores. Cada vez que hay un 500, el stack trace aparece ahí.

tomcat-log   # muestra el log en tiempo real

Cosas a buscar en el log:

Lo que ves Qué significa
SEVERE: Servlet.service() for servlet threw exception Error en el código Java del Servlet
java.lang.NullPointerException Se usó un objeto que es null
java.sql.SQLException Error con la base de datos
java.lang.NumberFormatException Se intentó convertir texto a número y falló
ClassNotFoundException: com.mysql.cj.jdbc.Driver El driver de MySQL no está en el pom.xml

📋 Palabras clave

errores frecuentes · HTTP 404 · HTTP 500 · HTTP 400 · NullPointerException · NumberFormatException · SQLException · @WebServlet · WEB-INF · UTF-8 · encoding · PRG · log de Tomcat · puerto 8080


🧠 Autoevaluación — Patrón DAO y JDBC


← Transacciones · 🏠 Inicio