Servlet运行报错:服务器未找到目标资源当前表示问题排查
问题描述
开发基础Servlet演示项目时,运行项目或访问index.html均触发「服务器未找到目标资源的当前表示」错误。已按规范完成web.xml中Servlet的注册与映射配置,也将Servlet相关依赖jar包添加至项目构建路径,尝试过网上公开的多种解决方案均无效,无法定位报错根因。
附:项目核心代码
Login Servlet 代码(包名:Main)
package Main; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.*; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Login extends HttpServlet { /** * */ private static final long serialVersionUID = 1L; Login(){ super(); } public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { System.out.println("servlet called"); } }
web.xml 配置
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <display-name>FirstServlet</display-name> <servlet> <servlet-name>Login</servlet-name> <servlet-class>Main.Login</servlet-class> </servlet> <servlet-mapping> <servlet-name>Login</servlet-name> <url-pattern>/Login</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> </web-app>
index.html 首页代码
<!DOCTYPE html> <html> <body> <form action="Login" method="get"> <input type="text" name="username"/><br> <input type="text" name="password"/> <input type="submit" value="Login"/> </form> </body> </html>
排查方向与修复方案
按优先级逐一排查以下常见问题即可定位根因:
- 检查项目部署的目录结构是否符合Servlet规范
- Java源码编译后的class文件必须放在
WEB-INF/classes/目录下,且包层级和包名完全对应:即Main.Login类编译后的Login.class必须位于WEB-INF/classes/Main/路径下。多数IDE默认的Java项目编译输出路径不会自动指向Web项目的classes目录,仅配置build path不会自动完成class文件的部署,这是该类404问题最高发的原因。 index.html必须放在Web应用根目录(和WEB-INF文件夹同级),不能放在WEB-INF目录内,也不能放在src源码目录下,否则欢迎页规则无法匹配到目标文件。- Servlet-api相关jar包仅需在编译阶段引入,不要随项目放在
WEB-INF/lib目录下部署,否则会和Servlet容器自身提供的API产生版本冲突,导致类加载失败。
- Java源码编译后的class文件必须放在
- 检查访问路径是否正确
- 访问首页时必须带上项目部署的上下文路径,例如项目部署上下文名为
FirstServlet时,正确访问地址为http://localhost:8080/FirstServlet/,直接访问根地址http://localhost:8080无法匹配到对应项目的资源。 - 表单配置的相对路径
action="Login"本身没有问题,只要首页访问路径正确,提交时会自动拼接为符合映射规则的地址,无需额外修改。
- 访问首页时必须带上项目部署的上下文路径,例如项目部署上下文名为
- 检查Servlet类的访问权限
- 当前代码中Login类的无参构造方法使用默认包访问权限,部分Tomcat等Servlet容器通过反射实例化Servlet时,要求类和无参构造方法必须为
public修饰,将构造方法修改为如下即可:public Login(){ super(); }
- 当前代码中Login类的无参构造方法使用默认包访问权限,部分Tomcat等Servlet容器通过反射实例化Servlet时,要求类和无参构造方法必须为
- 补充说明:当前
doGet方法仅在控制台打印日志,没有向响应对象写入任何返回内容,请求处理完成后会显示空白页,属于正常逻辑,不属于404资源找不到的错误范畴,若需要返回可见页面内容,补充响应输出逻辑即可。
内容的提问来源于stack exchange,提问作者amstudent
相关产品推荐
相关产品推荐

