Tomcat 10.0.4 no carga servlets (@clases WebServlet) con error 404 [duplicado]
Tengo un problema con mi primera aplicación web. Utilizo IntelliJ como IDE y Tomcat como servidor web. Cada servlet al que he intentado acceder arroja un error 404. Incluso si copio algunos tutoriales de YouTube, parece que funciona de maravilla.
El botón en el formulario me envía a: http://localhost:8080/IUBHQuiz/login
¿Puedes decirme qué pasa? Me estoy volviendo loco.
iniciar sesión.java
package com.example.IUBHQuiz;
import java.io.*;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.sql.*;
@WebServlet("/login")
public class login extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
String email = request.getParameter("fmail");
String pass = request.getParameter("fpw");
if(email.equals("j") && pass.equals("j"))
{
RequestDispatcher rs = request.getRequestDispatcher("/main.jsp");
rs.forward(request, response);
}
else
{
out.println("Username or Password incorrect");
RequestDispatcher rs = request.getRequestDispatcher("/index.jsp");
rs.include(request, response);
}
out.close();
}
índice.jsp
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>IUBH Quiz</title>
<link href="./resources/css/style.css" rel="stylesheet">
</head>
<body>
<div class="main">
<div class="image-container">
<img src="./resources/images/logo.png" alt="Logo">
</div>
<div class="Login">
<h1>Willkommen beim IUBH-Quiz!</h1>
<form action="login" method="post">
E-Mail:<input type="text" id="fmail" name="fmail"><br><br>
Passwort: <input type="password" id="fpw" name="fpw"><br><br>
<input type="submit" value="Log In" class="button">
</form>
</div>
<div class="Links">
<a href="#">Passwort vergessen</a>
<a href="#">Registrieren</a>
</div>
</div>
</body>
</html>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
</web-app>
Por motivos de derechos de autor, la API de Servlet 5.0 (implementada por Tomcat 10) y la API de Servlet 4.0 (implementada por Tomcat 9) son incompatibles: el espacio de nombres de la API cambió de javax.*
a jakarta.*
. Esto puede manifestarse de muchas maneras:
- El software escrito para Servlet 4.0 no se compila con los archivos API de Tomcat 10: cf. Servlet 5.0 JAR arroja un error de compilación en javax.servlet.* pero Servlet 4.0 JAR no .
- Las aplicaciones Servlet 4.0 que utilizan un
web.xml
descriptor lanzan muchosClassNotFoundException
mensajes de correo electrónico y no se inician: cf. Tomcat 10.x arroja java.lang.NoClassDefFoundError en javax/servlet/ServletRequestListener . - Las aplicaciones Servlet 4.0 que utilizan un
web.xml
descriptor registran el error "X no es un jakarta.servlet.Servlet" : cf. La clase de servlet org.restlet.ext.servlet.ServerServlet no es un jakarta.servlet.Servlet . - Las aplicaciones Servlet 4.0 que usan anotaciones para declarar servlets dejan de funcionar, como en su caso ,
- Las aplicaciones Servlet 4.0 que dependen de
ServletContainerInitializer
(como las aplicaciones Spring y Spring Boot) no se inician: cf. Implementación de Spring MVC 5 en Tomcat 10… problemas de implementación
El último es el más difícil de diagnosticar: no se escriben errores en los archivos de registro, pero la aplicación no funciona. La razón detrás de este comportamiento es que @javax.servlet.WebServlet
las anotaciones se ignoran: el servidor está buscando archivos @jakarta.servlet.WebServlet
.
Dado que los tres problemas tienen la misma causa, todas las soluciones proporcionadas a las preguntas antes mencionadas funcionan. En este caso específico, recomendaría utilizar la herramienta de migración Tomcat para Jakarta EE .
Observación : El sitio de descarga de Tomcat presenta una advertencia que, lamentablemente, muchas personas no notan:
Los usuarios de Tomcat 10 en adelante deben tener en cuenta que, como resultado del cambio de Java EE a Jakarta EE como parte de la transferencia de Java EE a la Fundación Eclipse, el paquete principal para todas las API implementadas ha cambiado de javax.* a jakarta. .*. Es casi seguro que esto requerirá cambios de código para permitir que las aplicaciones migren de Tomcat 9 y versiones anteriores a Tomcat 10 y versiones posteriores.
Tuve el mismo problema al reproducir el problema informado en los foros de IntelliJ IDEA .
No funcionó con Tomcat 10 por los motivos descritos en la respuesta de Piotr P. Karwasz , pero funciona bien con Tomcat 9.0.44 y versiones anteriores.