You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tomcat下Java Servlet报HTTP Status 404 - Not Found问题求助

解决Tomcat Servlet 404 Not Found问题

我来帮你排查下这个404问题,看下来你的代码和配置里有几个关键错误,直接导致了资源找不到:

1. Servlet类结构完全错误

你把MyServlet定义成了WorkshopForm的非静态内部类,还把@WebServlet注解标在了外部类上——这完全不符合Servlet规范:

  • Tomcat无法实例化非静态内部类(它依赖外部类实例才能创建)
  • @WebServlet注解必须标注在直接继承HttpServlet的类上,否则注解不会生效

修正后的代码(推荐改成独立Servlet类)

package workshop;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(description = "This registration form", urlPatterns = { "/WorkshopForm" })
public class MyServlet extends HttpServlet {
    private static final long serialVersionUID = 13425L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String participantName = request.getParameter("participantName");
        String participantSurname = request.getParameter("participantSurname");
        String participantEmail = request.getParameter("participantEmail");
        
        PrintWriter writer = response.getWriter();
        writer.println("Welcome " + participantName + " " + participantSurname + "! Your email is: " + participantEmail);
    }
}

如果一定要保留内部类结构,必须把MyServlet设为static,并把注解移到它上面:

package workshop;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class WorkshopForm {
    @WebServlet(description = "This registration form", urlPatterns = { "/WorkshopForm" })
    public static class MyServlet extends HttpServlet {
        private static final long serialVersionUID = 13425L;

        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            String participantName = request.getParameter("participantName");
            String participantSurname = request.getParameter("participantSurname");
            String participantEmail = request.getParameter("participantEmail");
            
            PrintWriter writer = response.getWriter();
            writer.println("Welcome " + participantName + " " + participantSurname + "! Your email is: " + participantEmail);
        }
    }
}

2. Web.xml配置冲突且错误

从你的截图来看:

  • web.xml里配置的servlet-class是workshop.WorkshopForm,但这个类并不是Servlet(它没有继承HttpServlet),真正的Servlet是内部类MyServlet,正确的类路径应该是workshop.WorkshopForm$MyServlet(仅限静态内部类)
  • 你同时用了@WebServlet注解和web.xml配置,这会导致映射冲突,Tomcat不知道该优先用哪个

解决方案:

  • 优先推荐用注解:直接删掉web.xml里的<servlet>和<servlet-mapping>节点,避免冲突
  • 如果一定要用web.xml配置,确保servlet-class指向正确的Servlet类,并且<servlet>和<servlet-mapping>里的servlet-name完全一致

3. 访问路径错误

你的错误日志显示请求路径是/WorkshopForm/MainWorkshopForm,但不管是注解的urlPatterns还是web.xml的映射,都没有这个路径。正确的访问路径应该是:

http://localhost:8080/你的项目名称/WorkshopForm

(从你的目录结构截图看,项目名应该是WorkshopForm,所以完整路径是http://localhost:8080/WorkshopForm/WorkshopForm,带参数的话可以加?participantName=xxx&participantSurname=xxx&participantEmail=xxx)

最后验证步骤

  1. 重新编译项目,确保WEB-INF/classes/workshop下生成了正确的class文件
  2. 重启Tomcat并清除缓存,避免旧配置残留
  3. 用正确的路径发起请求测试

内容的提问来源于stack exchange,提问作者Anyta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:02:46