Tomcat 10.0.4 不加载 servlet(@WebServlet 类)并显示 404 错误



我的第一个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" 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>

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

  1. 为Servlet 4.0编写的软件不针对Tomcat10中的API JAR进行编译:参见Servlet 5.0 JAR在javax.Servlet.*上抛出编译错误,但Servlet 4.0 JAR没有
  2. 使用web.xml描述符的Servlet 4.0应用程序会抛出大量ClassNotFoundException而不启动:参见Tomcat 10.x在javax/Servlet/ServerRequestListener上抛出java.lang.NoClassDefFoundError
  3. 使用CCD_ 5描述符的Servlet 4.0应用程序记录一个";X不是jakarta.servlet.servlet">错误:参见Servlet类org.restlet.ext.Servlet.ServerServlet不是jakarta.Servlet.Servlet
  4. Servlet 4.0应用程序使用注释来声明Servlet停止工作,在您的案例中是
  5. 依赖ServletContainerInitializer的Servlet 4.0应用程序(如Spring和Spring Boot应用程序(无法启动:参见在Tomcat 10上部署Spring MVC 5…部署问题

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

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

备注:Tomcat下载站点有一个警告,不幸的是,许多人没有注意到:

Tomcat10以后的用户应该注意,由于将Java EE转移到Eclipse Foundation,从Java EE迁移到Jakarta EE,所有实现的API的主包都已从javax.*更改为Jakarta.*。这几乎肯定需要更改代码才能使应用程序从Tomcat9及更早版本迁移到Tomcat10及更高版本。

我在重现IntelliJ IDEA论坛上报告的问题时遇到了同样的问题。

由于Piotr p.Karwasz的回答中描述的原因,它不能与Tomcat10一起使用,但它与Tomcat9.0.44及更早的版本配合使用。

相关内容

最新更新