jsp 中应使用 ${pagecontext.request.contextpath} 或 ${c:url()} 动态获取上下文路径,避免硬编码导致 404; 标签会破坏 css 内部 url() 解析且无法适配多环境,故不可用。

直接写 /css/style.css 在 JSP 里大概率会 404,因为漏掉了应用上下文路径(如 /myapp);真正能稳定工作的,是用 ${pageContext.request.contextPath} 或 ${c:url()} 动态拼路径。
为什么 <base> 标签在 JSP 中基本不能用
<base> 看似能“一劳永逸”统一路径基准,但实际会破坏 CSS 文件内部的 url() 解析逻辑——CSS 里的 background: url(../images/icon.png) 仍以 CSS 文件自身位置为起点解析,和 <base> 完全无关,导致图片、字体等二级资源全部失效。
-
<base href="/myapp/">是非法写法:浏览器会补全为http://localhost/myapp/,协议+域名缺失时可能跨域或跳错协议 - 所有相对路径(
<img src="logo.png">、<script src="a.js"></script>)都会被强制重写,不可控 - 开发环境
http://localhost:8080/myapp/和生产环境https://prod.example.com/app-v2/的 base 值无法自动适配 - 被
<include></include>嵌入时,<base>可能污染父页面,作用域不可靠
${pageContext.request.contextPath} 是最轻量可靠的方案
它不依赖额外 taglib,JSP 2.0+ 默认支持,且天然兼容根路径部署(应用部署在 / 时返回空字符串,${pageContext.request.contextPath}/css/style.css → /css/style.css)。
使用 JSON Schema 验证 JSON 数据,从示例 JSON 生成 schema,并将其转换为 TypeScript 接口、Python 数据类或 Markdown 文档。
- 路径必须以
/开头,否则变成相对于当前 URL,极不稳定 - 可嵌套变量:
href="${pageContext.request.contextPath}/css/${theme}.css",适合后端传参切换主题 - 不处理 URL 编码,如果路径含中文或空格,需自行
URLEncoder.encode() - 不要和
<url></url>混用,否则可能重复拼接 context path,出现/myapp/myapp/css/xxx.css
${c:url()} 适合需要 URL 编码或动态参数的场景
它本质是调用 response.encodeURL(),会自动对特殊字符转义,并支持 <param> 追加查询参数,比纯 EL 更健壮。
- 必须提前声明 taglib:
- 路径必须以
/开头,${c:url('css/style.css')}(无斜杠)会相对当前请求路径,99% 出错 -
${c:url('/api/data')}?v=1合法,但${c:url('/api/data?v=1')}不推荐——参数应走<param> - 调试时若看到 404,先看 Network 面板里请求地址:如果是
http://host/css/xxx.css,说明没走 context path;如果是/myapp/myapp/...,说明 EL 和<url></url>叠加了
真正容易被忽略的点,不是怎么写 <link>,而是 CSS 文件内部的 url() ——它们永远以 CSS 文件物理位置为基准,和 JSP 页面里的任何路径机制都无关。所以 CSS 里的资源路径也要按 WAR 包结构来组织,比如 css/style.css 引用 images/bg.jpg,那 images/ 就得和 css/ 同级,不能指望 JSP 的 EL 去“修正”它。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










