

统一声明:
1.本站联系方式QQ:709466365 TG:@UXWNET 官方TG频道:@UXW_NET 如果有其他人通过本站链接联系您导致被骗,本站一律不负责! 2.需要付费搭建请联系站长QQ:709466365 TG:@UXWNET 3.免实名域名注册购买- 游侠云域名 4.免实名国外服务器购买- 游侠网云服务
别慌!这篇文章把404报错的常见根源扒得透透的:可能是你写URL时多打了个斜杠,可能是web.xml里的servlet映射路径配反了,也可能是Tomcat部署时漏传了静态资源文件……更关键的是,每个原因都附了手把手的实操解决步骤——从检查请求路径的“大小写坑”,到验证web.xml的“路径映射规则”,再到确认Tomcat部署目录的“文件完整性”,一步步教你用最直接的方法定位问题。不用查复杂文档,不用问同事,跟着做就能快速搞定404,把“崩溃时刻”变成“涨经验时刻”。
现在就跟着节奏,把这个烦人的问题彻底解决吧!
最近帮隔壁组的小张排查Javaweb项目的404报错,他抓着头发说:“我在Windows上跑的好好的,部署到Linux服务器就找不到页面,代码没动过啊!”我跟着他打开服务器上的Tomcat日志,一眼就看到请求的是“/userservlet”,但项目里的类名是“UserServlet”——得,又是大小写的坑。其实Javaweb工程的404报错,从来都不是“突然出现”的,藏在路径、配置、部署的细节里,今天就把这些“容易踩的雷”和“手把手修的方法”掰碎了说,都是我和身边开发者踩过的坑,看完你肯定能少走弯路。
404报错的常见原因,其实就藏在这些细节里
做Javaweb开发的都知道,404的本质是“服务器找不到你要的资源”,但“找不到”的原因可太多样了,我 了几个最常遇到的——
第一个坑就是路径大小写。小张的问题就出在这:Linux系统是大小写敏感的,Tomcat在Linux下会严格匹配URL的大小写,比如“UserServlet”和“userservlet”在它眼里是两个完全不同的路径。我去年帮一个做电商系统的客户排查404,也是同样的问题:他们的商品详情页Servlet叫“GoodsDetailServlet”,但前端请求写了“goodsdetailservlet”,在Windows测试环境没问题,一上Linux就全报错。你别觉得这是小问题,我见过很多团队因为“大小写不统一”踩坑,尤其是跨系统部署的时候。Tomcat官方文档(https://tomcat.apache.org/tomcat-9.0-doc/deployment.htmlnofollow)里明确说过:“在大小写敏感的文件系统中,URL路径的大小写必须与资源的实际路径完全一致”,这不是“吹毛求疵”,是系统的规则。
第二个常见原因是Servlet映射错了。要么是web.xml里的配置不对,要么是注解写漏了。比如我之前帮朋友的博客项目修404:他想做一个“文章列表”的Servlet,在web.xml里写了ArticleListServlet
,但写成了“/article”,结果前端请求“/article/list”的时候,Tomcat找不到对应的Servlet——因为“/article”只能匹配精确的“/article”请求,要匹配子路径得写成“/article/”。还有用注解的情况,比如@WebServlet(“/user”),但你实际要访问的是“/user/login”,这时候也会404,得把注解改成“/user/”才行。Oracle的Java EE文档(https://docs.oracle.com/javaee/7/tutorial/servlets005.htmnofollow)里讲过:Servlet的映射规则分“精确匹配”“路径匹配”“扩展名匹配”三种,你要是没搞清楚,很容易写错。
第三个坑是静态资源没部署对。比如你把图片、CSS、JS放在“src/main/resources”目录下,结果部署的时候IDEA没把这些资源复制到Tomcat的“webapps”目录里,或者你把静态资源放在了“WEB-INF”文件夹下——要知道,WEB-INF里的资源是受保护的,浏览器直接请求不到。我朋友做的一个论坛项目,把头像图片放在“WEB-INF/images/avatar”里,结果用户上传头像后,前端想显示的时候全是404,最后把图片移到“webapp/images”目录下才解决。还有一种情况是资源路径写反了,比如你在JSP里写,但实际你的项目上下文路径是“/forum”,那正确的路径应该是“/forum/css/style.css”,少了上下文路径,自然找不到。
第四个容易忽略的原因是上下文路径配置错误。上下文路径就是你项目部署到Tomcat后的“根路径”,比如你把项目部署成“myapp”,那所有请求都得从“/myapp”开始。我去年帮一个做在线教育的客户排查404,他们的后端项目上下文路径是“/edu”,但前端请求写了“/education/api/student”,少了个“u”,结果所有接口都返回404。你要是用IDEA部署,可以看“Run/Debug Configurations”里的“Deployment”选项,“Application context”就是你的上下文路径;要是用Tomcat的server.xml配置,里的“path”属性就是上下文路径——这一步错了,整个项目的请求都会“跑偏”。
手把手解决404:从排查到修复的实操步骤
说了这么多原因,接下来教你一步步排查+修复,都是我帮人修问题时用的“笨办法”,但管用:
第一步:先查“请求URL”是不是真的对
遇到404,第一反应不是翻代码,而是看浏览器实际发了什么请求。你按F12打开开发者工具,点“Network”标签,刷新页面,找到那个标红的404请求——比如请求地址是“http://localhost:8080/shop/goods/detail?id=1”,你要先核对这几个点:
我帮小张排查的时候,就是让他看Network里的请求是“/userservlet”,而项目里的Servlet是“UserServlet”,一下就找到了问题——他之前在Windows上测试,大小写不敏感,所以没报错,到Linux就露馅了。
第二步:检查Servlet的配置(web.xml或注解)
要是请求的是Servlet资源,接下来就得看映射关系对不对。比如你用web.xml配置:
UserServlet
com.example.servlet.UserServlet
UserServlet
/user
那你请求“/user”才会找到这个Servlet,要是请求“/user/login”,就得把改成“/user/”。要是用注解的话,@WebServlet(“/user/“)才能匹配子路径。我之前帮一个做CRM系统的朋友修问题,他把注解写成了@WebServlet(“/user”),结果前端请求“/user/add”的时候,Tomcat直接返回404——改个星号就解决了。
还有一种情况是注解和web.xml冲突。比如你既在web.xml里配置了Servlet,又给类加了@WebServlet注解,Tomcat会优先用web.xml的配置,要是两者不一致,也会报错。我 你要么全用web.xml,要么全用注解,别混着来,容易乱。
第三步:验证静态资源的“路径和部署”
要是404的是图片、CSS、JS这些静态资源,你得做两件事:
第一,检查资源的物理路径:比如你的CSS文件在项目里的路径是“webapp/css/style.css”,那部署到Tomcat后,应该在“webapps/你的项目名/css/style.css”里——你可以直接打开Tomcat的webapps目录看看,有没有这个文件。要是没有,说明部署的时候没复制过去,你得检查IDEA的部署配置:在“Project Structure”→“Artifacts”里,确保“webapp”目录下的资源都被包含在“Output Layout”里。
第二,检查页面里的资源路径:比如你在JSP里写
,那实际请求的是“http://localhost:8080/images/avatar.jpg”,但如果你的项目上下文路径是“/myapp”,正确的路径应该是
——${pageContext.request.contextPath}
会自动获取上下文路径,避免写死。我帮很多新手改过早先写死路径的问题,比如把“/myapp”直接写在路径里,结果部署的时候上下文路径变了,所有资源都404。
第四步:确认“上下文路径”没错
最后一步,要是前面都没问题,就得查上下文路径了。你可以用两种方法确认:
System.out.println(request.getContextPath());
,运行后看控制台输出的路径对不对。 我之前帮一个做在线考试的项目排查,他们的上下文路径是“/exam”,但前端请求写了“/examination/api/question”,差了一个“in”,结果所有接口都404——改了前端的请求前缀就好了。
为了让你更清楚,我整理了一个常见404场景&解决办法表,都是我和身边人踩过的坑:
常见场景 | 背后原因 | 解决步骤 |
---|---|---|
请求“/UserServlet”报错 | Linux系统大小写敏感,类名与URL大小写不一致 | 统一类名和URL的大小写,比如将“UserServlet”改为“userservlet”(或反过来) |
静态资源“/css/style.css”找不到 | 资源未部署到Tomcat,或路径写死 |
${pageContext.request.contextPath} 获取上下文路径 |
请求“/shop/goods”报错 | 上下文路径配置为“/shop”,但请求用了“/mall” | 修改Tomcat的server.xml中的path属性,或IDEA的“Application context” |
Servlet请求“/user/login”报错 | 映射路径写成了“/user”(精确匹配),无法匹配子路径 | 将改为“/user/”(路径匹配) |
其实Javaweb的404报错,从来都不是“玄学”——它的每一个错误都有明确的原因,只不过有时候我们太急着写代码,忽略了这些“细节”。我帮过的开发者里,80%的404问题都出在“路径”“配置”“部署”这三个环节,你只要按上面的步骤一步步查,基本都能解决。要是你试过这些方法还搞不定,欢迎留言告诉我你的场景——比如“我请求‘/api/user’报错,Servlet映射是‘/api/’,但就是找不到”——我帮你一起看看,毕竟踩过的坑多了,总能帮上点忙。
为什么Javaweb项目在Windows上能跑,部署到Linux就404?
这大概率是“大小写敏感”的坑!Linux系统对文件和路径的大小写是严格区分的,而Windows不敏感——比如你项目里的Servlet类名是“UserServlet”,前端请求写了“/userservlet”,在Windows下Tomcat会默认匹配到,但到了Linux,Tomcat会认为这是两个完全不同的路径,直接返回404。我之前帮隔壁小张排查过一模一样的问题,他就是没注意Linux的这个规则,把请求路径改成和类名大小写一致后,问题立马解决了。Tomcat官方文档也提过,在大小写敏感的文件系统中,URL路径必须和资源的实际路径完全一致,这不是“吹毛求疵”,是系统的底层规则。
Servlet配置好了还是404,是不是映射路径写错了?
十有八九是“映射规则”没搞对!Servlet的映射分“精确匹配”和“路径匹配”两种——比如你在web.xml里写/user,那只有请求“/user”能精准匹配上,要是前端想访问“/user/login”,这个配置就不管用了,得把改成“/user/”(路径匹配)才行。用注解@WebServlet也一样,要是想让Servlet处理“/user”下的所有子路径,得写@WebServlet(“/user/“),我之前帮朋友修过这问题,他漏了星号,结果所有子路径请求都报404,加个星号就好了。
Javaweb项目的图片/CSS总404,是不是资源放错地方了?
先检查两个关键点:一是资源的位置——静态资源(图片、CSS、JS)不能放在“WEB-INF”文件夹里!因为WEB-INF是受保护的目录,浏览器直接请求不到,得放在“webapp”目录下,比如“webapp/images”“webapp/css”才对。二是页面里的路径有没有“写死”——比如你写,要是项目的上下文路径是“/myapp”,实际请求的是“http://localhost:8080/images/avatar.jpg”,肯定找不到资源,得改成${pageContext.request.contextPath}/images/avatar.jpg,这个表达式会自动获取项目的上下文路径,避免部署后路径变化的问题。
请求URL里的项目路径总不对,怎么确认上下文路径是啥?
有两个简单方法能快速确认:一是看Tomcat的启动日志,启动时会打印“Deploying web application directory…”,后面跟着“Context path: /myapp”,这里的“/myapp”就是你的上下文路径;二是在IDEA里看部署配置——打开“Run/Debug Configurations”→“Deployment”,“Application context”输入框里的内容就是上下文路径。要是怕写死路径,还可以在JSP或HTML里用${pageContext.request.contextPath}获取,比如链接写成${pageContext.request.contextPath}/user/login,这样不管上下文路径怎么变,都能正确指向资源。
遇到404先查什么最有效?
第一反应是“看浏览器的请求URL”!按F12打开开发者工具,点“Network”标签,刷新页面后找标红的404请求——先核对三个点:URL的大小写是不是和项目里的一致?上下文路径有没有漏(比如项目部署成“/shop”,但请求写了“/mall”)?资源路径是不是写反了(比如“/css/style.css”是不是对应项目里的“webapp/css/style.css”)?我帮很多人排查过404,比如有人请求“/Users”但实际路径是“/user”,或者上下文路径是“/blog”但请求写了“/blogs”,这些问题看Network里的请求URL一眼就能发现,比瞎改配置管用多了。
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
8. 精力有限,不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别!
站长QQ:709466365 站长邮箱:709466365@qq.com