Вопрос-ответ

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

Tomcat 10.0.4 не загружает сервлеты (классы @WebServlet) с ошибкой 404 [дубликат]

У меня проблема с моим первым веб-приложением. Я использую IntelliJ в качестве IDE и Tomcat в качестве веб-сервера. Каждый сервлет, к которому я пытался получить доступ, выдает ошибку 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">
<h3>Willkommen beim IUBH-Quiz!</h3>
<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>
Переведено автоматически
Ответ 1

По причинам авторского права API Servlet 5.0 (реализованный Tomcat 10) и API Servlet 4.0 (реализованный Tomcat 9) несовместимы: пространство имен API изменено с javax.* на jakarta.*. Это может проявляться по-разному:


  1. Программное обеспечение, написанное для Servlet 4.0, не компилируется с использованием API jars из Tomcat 10: ср. Servlet 5.0 JAR выдает ошибку компиляции в javax.servlet.* но Servlet 4.0 JAR этого не делает,

  2. Приложения Servlet 4.0, использующие web.xml дескриптор, выдают много ClassNotFoundExceptionфайлов и не запускаются: ср. Tomcat 10.x выдает java.lang.Ошибка NoClassDefFoundError в javax / servlet / ServletRequestListener.

  3. Приложения Servlet 4.0, использующие web.xml дескриптор log a "X не является jakarta.servlet.Servlet" ошибка: ср. Класс сервлета org.restlet.ext.servlet.ServerServlet не является jakarta.servlet.Сервлет.

  4. Приложения Servlet 4.0, которые используют аннотации для объявления сервлетов, перестают работать, как в вашем случае,

  5. Приложения Servlet 4.0, которые полагаются на ServletContainerInitializer (например, приложения Spring и Spring Boot), не запускаются: ср. Развертывание Spring MVC 5 на Tomcat 10 ... проблемы с развертыванием

Последнее сложнее всего диагностировать: в файлы журнала не записывается никаких ошибок, но приложение не работает. Причина такого поведения заключается в том, что @javax.servlet.WebServlet аннотации игнорируются: сервер выполняет сканирование @jakarta.servlet.WebServlet.

Поскольку все три проблемы имеют одну и ту же причину, все решения, предоставленные для вышеупомянутых вопросов, работают. В этом конкретном случае я бы посоветовал использовать инструмент миграции Tomcat для Jakarta EE.

Замечание: На сайте загрузки Tomcat отображается предупреждение, которое, к сожалению, многие люди не замечают:


Пользователи Tomcat 10 и более поздних версий должны знать, что в результате перехода с Java EE на Jakarta EE в рамках передачи Java EE Eclipse Foundation основной пакет для всех реализованных API изменился с javax.* на jakarta.*. Для этого почти наверняка потребуются изменения кода, позволяющие приложениям мигрировать с Tomcat 9 и более ранних версий на Tomcat 10 и более поздних.


Ответ 2

У меня была такая же проблема при воспроизведении проблемы, о которой сообщалось на форумах IntelliJ IDEA.

Это не сработало с Tomcat 10 по причинам, описанным в ответе Петра П. Карваша, но это отлично работает с Tomcat 9.0.44 и более ранними версиями.

java tomcat intellij-idea servlets