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)
最后验证步骤
- 重新编译项目,确保
WEB-INF/classes/workshop下生成了正确的class文件 - 重启Tomcat并清除缓存,避免旧配置残留
- 用正确的路径发起请求测试
内容的提问来源于stack exchange,提问作者Anyta
相关产品推荐
相关产品推荐

