相对路径 绝对路径
相对路径
1. href="/login.html"
(根目录)
- 以
/
开头,表示从网站根目录开始查找。 - 无论当前页面在哪个路径下,都会直接访问
https://example.com/login.html
。 - 适用场景:适用于全局导航链接(如网站顶部的登录入口)。
2. href="./login.html"
(当前目录)
- 以
./
开头,表示从当前页面所在的目录开始查找。 - 例如:当前页面是
https://example.com/user/profile.html
,则链接指向https://example.com/user/login.html
。 - 适用场景:适用于同一目录下的文件跳转(如用户个人中心内的页面切换)。
login.html
→ 同目录下的login.html
(./
可省略)
3. href="../login.html"
(上级目录)
- 以
../
开头,表示从当前页面的上一级目录开始查找。 - 例如:当前页面是
https://example.com/user/account/profile.html
,则链接指向https://example.com/user/login.html
。 - 适用场景:适用于返回上一级目录的链接(如从子目录返回父级目录)。
总结对比:
写法 | 解析方式 | 示例(当前页面 /user/profile.html ) | 最终路径 |
---|---|---|---|
/login.html | 根目录 | https://example.com/login.html | ✅ 固定 |
./login.html | 当前目录 | https://example.com/user/login.html | 取决于当前路径 |
../login.html | 上级目录 | https://example.com/login.html | 向上跳一级 |
绝对路径
绝对路径在 Web 资源引入中的应用及相关解决方案
一、绝对路径的核心特点与应用场景
- 基准路径固定:绝对路径的基准路径始终是服务器的根路径(如
http://localhost:8080
),资源查找方式为 “基准路径 + src 属性值”。 - 适用场景:
- 无论引入资源的页面位于 Web 项目的哪个目录(如
web/index.html
、web/a/b/c/test.html
),甚至是通过 Servlet 转发访问的WEB-INF
下的页面(如web/WEB-INF/views/view1.html
),绝对路径的写法保持一致。 - 示例:引入
web/static/img/logo.png
时,绝对路径统一写为<img src="/web03_war_exploded/static/img/logo.png"/>
(其中web03_war_exploded
为项目上下文路径)。
- 无论引入资源的页面位于 Web 项目的哪个目录(如
二、base 标签的作用与限制
- 核心功能:定义页面中相对路径的公共前缀,将相对路径转换为绝对路径,简化路径写法。
- 使用方式:在
<head>
标签中定义,例如:<base href="/web03_war_exploded/">
此时页面中相对路径static/img/logo.png
会被解析为/web03_war_exploded/static/img/logo.png
。 - 限制条件:
- 仅对相对路径有效,对绝对路径无效。
- 若相对路径以
./
或../
开头,base 标签不生效。
三、项目上下文路径的问题与解决方案
- 问题:项目上下文路径(如
web03_war_exploded
)可能会发生变化,若在绝对路径或 base 标签中硬编码该路径,修改时需逐个调整,维护成本高。 - 解决方案:将项目上下文路径设置为缺省值
/
,此时绝对路径可直接以/
开头,无需包含上下文路径。例如:- 原路径
/web03_war_exploded/static/img/logo.png
可简化为/static/img/logo.png
。
- 原路径
总结
- 绝对路径适用于各种目录结构的页面,路径写法固定,但需包含项目上下文路径。
- base 标签可简化相对路径写法,但依赖上下文路径,且有使用限制。
- 缺省项目上下文路径(设为
/
)是解决路径维护问题的最优方案,可避免硬编码上下文路径带来的麻烦。
获取类路径下资源文件路径的方式
String path = Thread.currentThread().getContextClassLoader().getResource("文件名").getPath();
借助Thread.currentThread()
能够得到当前正在执行的线程实例,再调用getContextClassLoader()
就能获取该线程的上下文类加载器。