运行JSP/Servlet时遇ClassNotFoundException或HTTP 404错误求助
问题描述
点击JSP页面提交按钮后想输出“Hi There!”,但操作时出现两种错误:
- HTTP Status 404 – 未找到
原始服务器未找到目标资源的当前表示,或者不愿透露存在该资源。
Apache Tomcat/10.0.27 - HTTP Status 500 – 内部服务器错误
消息:实例化servlet类[com.bootcamp.IndexServlet]失败
描述:服务器遇到意外情况,无法完成请求。
异常链:
jakarta.servlet.ServletException: Error instantiating servlet class [com.bootcamp.IndexServlet]
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:356)
org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399)
org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:870)
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1762)
org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
java.base/java.lang.Thread.run(Thread.java:833)
根本原因:java.lang.ClassNotFoundException: com.bootcamp.IndexServlet
相关代码
index.jsp 文件
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html> <html> <head> <meta charset="ISO-8859-1"> <title>Insert title here</title> </head> <body> <form action="IndexServlet" > <input type="text" name="username"> <input type="submit"> </form> </body> </html>
Servlet 文件
import java.io.IOException; import java.io.PrintWriter; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; public class Index extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter out = resp.getWriter(); out.println("Hi There!"); } }
问题原因与解决步骤
这些错误的核心是Servlet的配置、类名、部署路径不匹配,以及类加载失败,逐一解决:
1. 修正Servlet映射与类名的匹配
你的Servlet类名叫Index,但错误提示里Tomcat尝试加载的是com.bootcamp.IndexServlet,表单的action也是IndexServlet,这里完全不对应:
- 如果你用注解配置(Tomcat 8及以上支持),直接在Servlet类上加
@WebServlet注解,指定映射路径:import jakarta.servlet.annotation.WebServlet; @WebServlet("/IndexServlet") // 和表单的action值对应 public class Index extends HttpServlet{ // 原有代码不变 } - 如果你用web.xml配置,确保配置和类一致:
<servlet> <servlet-name>IndexServlet</servlet-name> <servlet-class>Index</servlet-class> <!-- 没有包就直接写类名 --> </servlet> <servlet-mapping> <servlet-name>IndexServlet</servlet-name> <url-pattern>/IndexServlet</url-pattern> <!-- 和表单action对应 --> </servlet-mapping>
2. 确保Servlet类被正确编译部署
ClassNotFoundException说明Tomcat找不到你的Servlet类,要做这些检查:
- 确认
.java文件已经编译成.class文件,普通Web项目里要放到WEB-INF/classes目录;Maven/Gradle项目要确保编译后的class在target/classes或build/classes,打包WAR时被包含进去。 - 如果想把Servlet放到
com.bootcamp包下,要在类顶部加package com.bootcamp;,同时class文件要放在WEB-INF/classes/com/bootcamp/Index.class路径,配置里的类名要写成com.bootcamp.Index。
3. 修正表单action路径(避免404)
表单的action="IndexServlet"是相对路径,容易出问题,改成带项目上下文的绝对路径更稳妥:
<form action="${pageContext.request.contextPath}/IndexServlet" >
这样不管JSP在哪个路径,都能正确映射到Servlet。
4. 确认Tomcat依赖匹配
你用的是Tomcat 10,它用的是Jakarta EE API(jakarta.servlet.*),你的代码已经正确导入了这些包,别混用旧的javax.servlet依赖,否则会导致类加载异常。
内容的提问来源于stack exchange,提问作者Danica Mora

