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