Tomcat 10.0.4 不加载带有 404 错误的 servlet(@WebServlet 类)[重复]

Posted

技术标签:

【中文标题】Tomcat 10.0.4 不加载带有 404 错误的 servlet(@WebServlet 类)[重复]【英文标题】:Tomcat 10.0.4 doesn't load servlets (@WebServlet classes) with 404 error [duplicate] 【发布时间】:2021-06-22 16:06:16 【问题描述】:

我的第一个 Web 应用程序出现问题。我使用 IntelliJ 作为 IDE,使用 Tomcat 作为 Web 服务器。 我尝试访问的每个 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" >
        </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>

【问题讨论】:

你使用什么版本的Tomcat? Tomcat 10 存在一些问题,请查看它是否适用于 Tomcat 9。 你在开玩笑吧。我花了一整天的时间寻找解决方案,几乎疯了。非常感谢。 【参考方案1】:

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

    为 Servlet 4.0 编写的软件无法针对来自 Tomcat 10 的 API jar 进行编译:参见。 Servlet 5.0 JAR throws compile error on javax.servlet.* but Servlet 4.0 JAR does not, 使用web.xml 描述符的Servlet 4.0 应用程序抛出大量ClassNotFoundExceptions 并且不启动:参见。 Tomcat 10.x throws java.lang.NoClassDefFoundError on javax/servlet/ServletRequestListener。 使用 web.xml 描述符的 Servlet 4.0 应用程序记录 “X 不是 jakarta.servlet.Servlet” 错误:参见。 Servlet class org.restlet.ext.servlet.ServerServlet is not a jakarta.servlet.Servlet. 使用注释来声明 servlet 的 Servlet 4.0 应用程序停止工作,如在您的情况, 依赖 ServletContainerInitializer 的 Servlet 4.0 应用程序(如 Spring 和 Spring Boot 应用程序)无法启动:参见。 Deploying Spring MVC 5 on Tomcat 10 … deployment problems

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

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

备注:Tomcat download site 有一个警告,很遗憾很多人没有注意到:

Tomcat 10 及更高版本的用户应该注意,由于作为 Java EE 转移到 Eclipse Foundation 的一部分而从 Java EE 转移到 Jakarta EE,所有已实现 API 的主要包已从 javax. * 到雅加达。*。这几乎肯定需要更改代码以使应用程序能够从 Tomcat 9 及更早版本迁移到 Tomcat 10 及更高版本。

【讨论】:

很好的答案,感谢您的详细解释。我已将您的答案与我的答案联系起来,以便更容易找到。我想几乎没有人会在下载服务器试用之前阅读迁移指南或警告,所以这个问题会变得非常受欢迎。 感谢您的出色回答。【参考方案2】:

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

由于described in the answer by Piotr P. Karwasz 的原因,它不适用于 Tomcat 10,但它适用于 Tomcat 9.0.44 及更早版本。

【讨论】:

以上是关于Tomcat 10.0.4 不加载带有 404 错误的 servlet(@WebServlet 类)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

更改myeclipse默认tomcat6以及Myeclipse运行tomcat时报错404源服务器无法找到资源

LINUX随笔二 tomcat404报错去掉敏感版本号

大家来找茬-SpringMVC中Tomcat正常启动,始终访问不了Controller,出404错

带有Angular应用程序的tomcat 9服务器上的Spring Boot 404和CORS

启动Tomcat成功后到work里面可以看到工程名但工程名下没有子目录,到前端访问 时报404错,这是怎么回事?

我在<iframe></iframe>添加 jsp页面的地址,但是报404错