Tomcat 10.0.4 不加载 servlet (@WebServlet 类) 并出现 404 错误

Tomcat 10.0.4 doesn't load servlets (@WebServlet classes) with 404 error

我的第一个 Web 应用程序有问题。我使用 IntelliJ 作为 IDE 和 Tomcat 作为网络服务器。 我尝试访问的每个 servlet 都会抛出 404 错误。即使我复制了一些 youtube 教程,这似乎很有效。

表单中的按钮将我发送到:http://localhost:8080/IUBHQuiz/login

你能告诉我有什么问题吗?我要疯了。

login.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();
    }

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

我在复制 the problem reported at IntelliJ IDEA forums 时遇到了同样的问题。

由于 的原因,它不适用于 Tomcat 10,但它适用于 Tomcat 9.0.44 和更早版本。

出于版权原因,Servlet 5.0 API(由 Tomcat 10 实现)和 Servlet 4.0 API(由 Tomcat 9 实现)不兼容:API 命名空间从 javax.* 更改为 jakarta.*。这可以通过多种方式体现:

  1. 为 Servlet 4.0 编写的软件无法针对来自 Tomcat 10 的 API jar 进行编译:cf. ,
  2. 使用 web.xml 描述符的 Servlet 4.0 应用程序会抛出大量 ClassNotFoundException 并且不会启动:cf. Tomcat 10.x throws java.lang.NoClassDefFoundError on javax/servlet/ServletRequestListener.
  3. 使用 web.xml 描述符的 Servlet 4.0 应用程序记录 "X is not a jakarta.servlet.Servlet" 错误:cf. .
  4. 使用注解声明 servlet 的 Servlet 4.0 应用程序停止工作,在您的情况下
  5. 依赖 ServletContainerInitializer 的 Servlet 4.0 应用程序(如 Spring 和 Spring 引导应用程序)无法启动:cf.

最后一个最难诊断:没有错误写入日志文件,但应用程序无法运行。此行为背后的原因是 @javax.servlet.WebServlet 注释被忽略:服务器正在扫描 @jakarta.servlet.WebServlet.

由于三个问题的原因相同,所以上述问题的解决方案均有效。在这种特定情况下,我建议使用 Tomcat Migration Tool for Jakarta EE.

备注Tomcat download site有一个警告,不幸的是很多人没有注意到:

Users of Tomcat 10 onwards should be aware that, as a result of the move from Java EE to Jakarta EE as part of the transfer of Java EE to the Eclipse Foundation, the primary package for all implemented APIs has changed from javax.* to jakarta.*. This will almost certainly require code changes to enable applications to migrate from Tomcat 9 and earlier to Tomcat 10 and later.