5

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

表单中的按钮将我发送到:http://localhost:8080/IUBHQuiz/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();
    }

索引.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>
4

2 回答 2

19

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

  1. 为 Servlet 4.0 编写的软件不能针对来自 Tomcat 10 的 API jar 进行编译:参见。Servlet 5.0 JAR 在 javax.servlet.* 上引发编译错误,但 Servlet 4.0 JAR 不会
  2. 使用web.xml描述符的 Servlet 4.0 应用程序抛出很多ClassNotFoundExceptions 并且不启动:cf。Tomcat 10.x 在 javax/servlet/ServletRequestListener 上抛出 java.lang.NoClassDefFoundError
  3. 使用web.xml描述符的 Servlet 4.0 应用程序记录“X 不是 jakarta.servlet.Servlet”错误:cf。Servlet 类 org.restlet.ext.servlet.ServerServlet 不是 jakarta.servlet.Servlet
  4. 使用注释来声明 servlet 的 Servlet 4.0 应用程序停止工作,如您的情况
  5. 依赖于 a 的 Servlet 4.0 应用程序ServletContainerInitializer(如 Spring 和 Spring Boot 应用程序)不会启动:cf。在 Tomcat 10 上部署 Spring MVC 5 … 部署问题

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

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

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

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

于 2021-03-25T21:49:39.230 回答
3

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

由于 Piotr P. Karwasz 的回答中描述的原因,它不适用于 Tomcat 10 ,但它适用于 Tomcat 9.0.44 及更早版本。

于 2021-03-25T20:03:57.853 回答