直接写 /css/style.css 会404,因浏览器解析为网站根目录而非项目上下文路径;应使用 ${pagecontext.request.contextpath}/css/style.css 确保正确拼接上下文路径。

为什么直接写 /css/style.css 在 JSP 里会 404?
因为浏览器请求的是绝对路径,而 /css/style.css 被解析成网站根目录(比如 https://example.com/css/style.css),不是你项目的上下文路径(如 /myapp/css/style.css)。Tomcat 部署时项目名(ContextPath)通常不是 /,硬编码会导致静态资源加载失败。
${pageContext.request.contextPath} 是最稳妥的 ContextPath 获取方式
它在 JSP 中直接可用,无需额外配置或 Java 代码,且能正确处理 ROOT 应用(ContextPath 为空字符串)和带名应用(如 /shop)两种情况。别用 request.getContextPath() 这种 EL 表达式外写法,JSP 里不识别。
常见错误写法:
-
<link href="%24%7Brequest.contextPath%7D/css/style.css" rel="stylesheet">→request对象没有contextPath属性,EL 解析失败,结果是空字符串 -
<link href="<%=%20request.getContextPath()%20%>/css/style.css" rel="stylesheet">→ 混用 scriptlet 和 EL,可读性差、易出错,且在禁用 scriptlet 的容器中报错
推荐写法:
<link href="%24%7BpageContext.request.contextPath%7D/css/style.css" rel="stylesheet">
CSS 路径拼接要注意尾部斜杠和相对位置
ContextPath 本身**不带尾部斜杠**(ROOT 应用返回空字符串,/myapp 应用返回 /myapp),所以必须手动加 / 再拼接子路径,否则会变成 /myappcss/style.css 这类错误路径。
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
几个关键点:
- 始终用
${pageContext.request.contextPath}/css/xxx.css,开头加/ - 如果 CSS 文件放在
WEB-INF/css/下——别这么干,WEB-INF下资源无法被浏览器直连,会 404 - 路径区分大小写:Linux 服务器上
/Css/≠/css/ - 开发时用 Chrome DevTools 的 Network 标签确认最终请求 URL 是否正确
用 JSTL <url></url> 更安全(尤其含参数时)
当 CSS 路径需要动态参数(比如版本号防缓存),<url></url> 能自动处理 URL 编码和 ContextPath,比手拼更可靠。
示例(带版本参数):
<url value="/css/style.css" var="cssUrl"><param name="v" value="1.2.3"></url><link href="%24%7BcssUrl%7D" rel="stylesheet">
生成的 HTML 类似:<link href="/myapp/css/style.css?v=1.2.3" rel="stylesheet">。注意:JSTL 需提前引入 ,且依赖 jstl.jar 和 standard.jar(或 Jakarta EE 版本)。
ContextPath 不是魔法,它只是字符串;真正容易忽略的是:不同部署环境(本地 Tomcat、Docker、云平台)可能通过反向代理修改了请求路径,此时 pageContext.request.contextPath 仍反映容器内路径,但前端入口 URL 可能被重写——这种场景得配合 Nginx 的 proxy_pass 或 Spring 的 server.forward-headers-strategy 来对齐。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










