在 Spring MVC 中,<mvc:resources>
的 location
路径前缀决定了资源的查找位置,二者的核心区别如下:
1. location="/static/"
- 含义:
表示资源位于 Web 应用的根目录(即 WAR 包的根路径,对应开发时的src/main/webapp/static
目录)。 - 适用场景:
静态资源直接存放在webapp/static
目录下,且希望直接通过 WAR 根路径访问。 - 目录结构:
src/ main/ webapp/ static/ ← 资源存放位置 css/ js/
- 访问路径:
http://localhost:8080/your-project/static/css/style.css
2. location="classpath:/static/"
- 含义:
表示资源位于 类路径(classpath) 下(对应开发时的src/main/resources/static
目录,构建后会被复制到WEB-INF/classes/static
)。 - 适用场景:
静态资源存放在resources/static
目录下,通常与 Spring Boot 的默认静态资源路径一致。 - 目录结构:
src/ main/ resources/ static/ ← 资源存放位置 css/ js/
- 访问路径:
http://localhost:8080/your-project/static/css/style.css
关键对比表
配置方式 | 资源物理位置 | 适用项目类型 | 构建后的 WAR 路径 |
---|---|---|---|
location="/static/" |
src/main/webapp/static |
传统 Servlet 项目 | /static/ (根目录) |
location="classpath:/static/" |
src/main/resources/static |
Spring Boot 或需要类路径访问的项目 | WEB-INF/classes/static/ |
常见问题排查
1. 404 错误
- 现象:配置了
location="classpath:/static/"
,但资源在webapp/static
下。
原因:资源未被打包到类路径。
解决:将资源移动到src/main/resources/static
。
2. 资源重复加载
- 现象:同时配置两种路径。
解决:合并配置,指定多个资源位置:<mvc:resources mapping="/static/**" location="/static/, classpath:/static/"/>
3. 与 Spring Boot 冲突
- 现象:Spring Boot 默认使用
classpath:/static/
,但项目中配置了location="/static/"
。
解决:统一使用 Spring Boot 默认配置,或显式覆盖:# application.properties spring.web.resources.static-locations=classpath:/static/, file:./webapp/
总结
- 使用
location="/static/"
:
适合资源直接暴露在 WAR 根目录的场景(如传统 Servlet 项目)。 - 使用
location="classpath:/static/"
:
适合资源需要从类路径加载的场景(如 Spring Boot 或需要打包到WEB-INF/classes
的项目)。 - 验证资源位置:解压 WAR 文件,检查
static
文件夹是否在预期路径下。