Итак, я новичок в сервлетах и jsp и следовал примеру пост-процесса Hello World из https://stackoverflow.com/tags/servlets/info. Когда я попытался запустить его с использованием Tomcat v9.0 в Eclipse, я получил

После некоторых дополнительных исследований и осмотра, я не нашел рабочего решения или объяснения того, что происходит.Я в основном скопировал код из примера, так что я не совсем понимаю, почему он не работает.У меня также пока нет опыта, чтобы точно выяснить, в чем дело, поэтому любая помощь будет отличной.Моя единственная догадка - это то, что я, вероятно, испортил каталоги или что-то в этом роде.Вот изображение:

Единственное несоответствие, которое я смог найти, было в том месте, где находился мой HelloServlet.class, который находился в
apache-tomcat-9.0.19/webapps/hello/build/classes/com/example/controller/HelloServlet.class
вместо
/WEB-INF/classes/com/example/controller/HelloServlet.class
, как указано в примере.Я предположил, что это произошло потому, что Eclipse по умолчанию скомпилировал файл класса там, где он сейчас, но просто чтобы быть уверенным, я скопировал папку класса в WEB-INF, чтобы она соответствовала примеру, но все равно не работала.Так вот где я застрял.Если бы кто-нибудь мог указать на мою ошибку или хотя бы помочь, это было бы очень признательно.Я включил мои файлы hello.jsp, web.xml и HelloServlet.java ниже на случай, если с ними возникнут какие-либо проблемы.
hello.jsp
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<!DOCTYPE html>
<html lang="en">
<head>
<title>Servlet Hello World</title>
<style>.error { color: red; } .success { color: green; }</style>
</head>
<body>
<form action="hello" method="post">
<h1>Hello</h1>
<p>
<label for="name">What's your name?</label>
<input id="name" name="name" value="${fn:escapeXml(param.name)}">
<span class="error">${messages.name}</span>
</p>
<p>
<label for="age">What's your age?</label>
<input id="age" name="age" value="${fn:escapeXml(param.age)}">
<span class="error">${messages.age}</span>
</p>
<p>
<input type="submit">
<span class="success">${messages.success}</span>
</p>
</form>
</body>
</html>
web.xml
<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"
metadata-complete="true">
</web-app>
HelloServlet.java
package com.example.controller;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@SuppressWarnings("serial")
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Preprocess request: we actually don't need to do any business stuff, so just display JSP.
request.getRequestDispatcher("/WEB-INF/hello.jsp").forward(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Postprocess request: gather and validate submitted data and display the result in the same JSP.
// Prepare messages.
Map<String, String> messages = new HashMap<String, String>();
request.setAttribute("messages", messages);
// Get and validate name.
String name = request.getParameter("name");
if (name == null || name.trim().isEmpty()) {
messages.put("name", "Please enter name");
} else if (!name.matches("\\p{Alnum}+")) {
messages.put("name", "Please enter alphanumeric characters only");
}
// Get and validate age.
String age = request.getParameter("age");
if (age == null || age.trim().isEmpty()) {
messages.put("age", "Please enter age");
} else if (!age.matches("\\d+")) {
messages.put("age", "Please enter digits only");
}
// No validation errors? Do the business job!
if (messages.isEmpty()) {
messages.put("success", String.format("Hello, your name is %s and your age is %s!", name, age));
}
request.getRequestDispatcher("/WEB-INF/hello.jsp").forward(request, response);
}
}