SpringBoot对静态资源的映射规则
先做 2 个核心铺垫(消除源码和专业术语的困惑)
- 核心配置类的作用 :
WebMvcAutoConfiguration是 SpringBoot 的web 场景自动配置类 ,静态资源的映射规则就是这个类里的addResourceHandlers方法定的,我们不用改这个类,只需要按它定的规则来就行;ResourceProperties是管静态资源的小配置(比如缓存、自定义路径),后续想改默认规则时会用到。 - classpath 是什么? 不用纠结专业定义,对 SpringBoot(Maven/Gradle)项目来说,
classpath:/就等价于项目里的src/main/resources/文件夹 ,后续所有说classpath:的路径,你直接往这个文件夹里放文件就行。
映射规则的本质就是 「你在浏览器输什么 URL」→「SpringBoot 去项目的哪个位置找文件」,总共 4 条,按「使用频率」排序。
所有规则都有一个前提:创建 SpringBoot 项目时,必须选中「Spring Web」模块(静态资源映射属于 web 场景,没选的话规则全部失效)。
规则 1:Webjars 规则 ------「以 jar 包方式引入的静态资源」专属访问规则
适用场景 :想引入 jQuery、Vue、Bootstrap 这类前端框架,不想自己下载 js/css 文件,直接用 Maven/Gradle 依赖引入(版本统一管理,适合团队开发)。核心对应关系 :浏览器输入 localhost:8080/webjars/xxx/版本号/资源名 → SpringBoot 去 所有 jar 包的classpath:/META-INF/resources/webjars/ 里找资源。关键 :webjars是一个专门的网站,把所有前端框架打成了 Mavenjar 包,地址:webjars.org,你只需要复制对应依赖到项目里,不用自己放文件。
规则 2:通用静态资源规则 ------「自己写的 / 下载的静态资源」核心规则(最常用)
适用场景 :自己写的 css、js,下载的图片、视频,自定义的静态页面等,都用这个规则。核心对应关系 :浏览器输入 localhost:8080/任意路径/资源名(即/**) → SpringBoot 按顺序去4 个默认静态文件夹 里找资源,找到就返回,找不到才报 404。4 个默认静态文件夹 (都在src/main/resources/下,随便建一个就行,也可以都建):
src/main/resources/META-INF/resources/
src/main/resources/resources/
src/main/resources/static/ 【最推荐用这个,SpringBoot官方默认】
src/main/resources/public/
避坑重点 :访问时不用加文件夹名 !比如把abc.jpg放在static里,直接输localhost:8080/abc.jpg,而不是localhost:8080/static/abc.jpg,SpringBoot 会自动去 4 个文件夹里找。
规则 3:欢迎页规则 ------「项目根路径访问的首页」专属规则
适用场景 :访问项目根路径localhost:8080/时,想自动显示首页(比如官网的首页)。核心对应关系 :浏览器输入 localhost:8080/ → SpringBoot 去4 个默认静态文件夹 里找index.html,找到就显示,找不到报 404。关键 :这个规则是规则 2 的延伸 ,因为/属于/**的范围,SpringBoot 对index.html做了特殊处理,优先匹配。
规则 4:网站小图标(favicon.ico)规则 ------「浏览器标签页的小图标」专属规则
适用场景 :想给项目加一个浏览器标签页的小图标(比如百度的小爪子)。核心对应关系 :浏览器会自动请求 **/favicon.ico(不管你输什么 URL,都会自动找) → SpringBoot 去4 个默认静态文件夹 里找favicon.ico文件,找到就显示,找不到用浏览器默认图标。关键 :文件名必须是favicon.ico,格式也必须是 ico(jpg/png 不行),放在 4 个静态文件夹里即可。
实用扩展:不想用默认规则?自定义静态资源路径(常用需求)
如果觉得 4 个默认文件夹不好用,想把静态资源放在自己命名的文件夹里(比如src/main/resources/my-static/),只需要在配置文件里加一行配置,不用改源码,这就是 SpringBoot 的灵活之处。
-
打开
src/main/resources/application.properties(默认是空的); -
加一行配置,指定自定义的静态资源文件夹:
自定义静态资源路径,classpath:/my-static/ 就是src/main/resources/my-static/
spring.web.resources.static-locations=classpath:/my-static/
-
建
src/main/resources/my-static/文件夹,放一个custom.jpg图片; -
重启项目,访问
http://localhost:8080/custom.jpg,能看到图片就成功。
注意 :自定义路径后,默认的 4 个文件夹会失效(比如 static 里的文件访问不到了),如果想保留默认文件夹 + 加自定义文件夹,用逗号分隔:
# 保留默认4个文件夹 + 加自定义my-static
spring.web.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/