Servlet无法映射 访问提示目标资源不存在问题排查求助
问题说明
初学Servlet实现前端传两数、后端求和的功能时,项目运行抛出404错误:
The origin server did not find a current representation for the target resource or is not willing to disclose that one exists
初步判断为Servlet映射配置问题,提供的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" id="WebApp_ID" version="4.0"> <display-name>Addition</display-name> <servlet> <servlet-name>addNum</servlet-name> <servlet-class>addLogic.sum</servlet-class> </servlet> <servlet-mapping> <servlet-name>addNum</servlet-name> <url-pattern>/add</url-pattern> </servlet-mapping> </web-app>
对应项目结构:Java源码存放在src目录下的addLogic包,包内为sum业务类,web.xml位于WEB-INF目录下。
排查步骤
按优先级从高到低逐一核对即可定位问题:
- 核对Servlet全类名配置是否匹配
你在web.xml里配置的Servlet类路径是addLogic.sum,先确认两点:- 实际包名是否为
addLogic、类名是否为sum。Java类名默认规范是大驼峰命名,如果你实际类名写作Sum、包名大小写不对,服务器加载类时就会找不到,直接触发404。 - 确认项目编译后,
WEB-INF/classes/addLogic/路径下存在sum.class文件,没有的话先clean项目重新编译,类文件没输出的话配置写对也没用。
- 实际包名是否为
- 核对请求路径是否正确
你配置的访问路径是/add,这个路径是相对于项目上下文的,不是服务器根路径。正确的访问地址格式为http://localhost:端口号/项目部署名/add,比如Tomcat端口用默认8080、项目部署名是Addition的话,直接访问http://localhost:8080/add一定会404,必须带上项目名访问http://localhost:8080/Addition/add。
如果是前端表单提交,action属性不要写/add,开头带斜杠代表走服务器根路径,会跳过项目上下文,写相对路径add即可。 - 核对配置兼容性与文件位置
- web.xml必须放在
WEB-INF目录根下,放错位置服务器不会加载里面的映射规则。 - 你当前用的是web-app 4.0版本,对应Servlet 4.0规范,需要Tomcat9及以上版本才能支持,用Tomcat8及更低版本的话,配置不会被解析,映射自然不生效。
- web.xml必须放在
- 核对项目部署状态
启动服务器时看控制台日志:如果抛出ClassNotFoundException: addLogic.sum,就是类加载失败,回去核对类名、包名、编译输出;如果日志里没有加载Addition项目的记录,说明项目没关联部署到Tomcat上,重新在IDE里把项目添加到Tomcat的部署列表,重启服务即可。
快速验证技巧
在sum类的doGet/doPost方法第一行加打印语句System.out.println("请求已到达Servlet");,重启服务发请求:
- 如果控制台没有打印这句话,说明请求根本没进到Servlet,问题出在前面说的路径、配置、部署环节;
- 如果控制台打印了这句话还是报404,就检查业务逻辑末尾有没有正确输出响应内容、或者做请求转发,没有任何返回内容时也会触发这个提示。
内容的提问来源于stack exchange,提问作者Lavish 7
相关产品推荐
相关产品推荐

