![Spring Boot实战:从0开始动手搭建企业级项目](https://wfqqreader-1252317822.image.myqcloud.com/cover/850/40107850/b_40107850.jpg)
7.6 Spring Boot对静态资源的映射规则
与普通Spring Web项目相比,Spring Boot项目的目录结构中仅有java和resources两个目录。用于存放资源文件的webapp目录在Spring Boot项目的目录结构中根本不存在。那么Spring Boot是如何处理静态资源的呢? WebMVC在自动配置时针对资源文件的访问又做了哪些配置呢?
由源码可知,这部分配置依然是通过WebMvcAutoConfigurationAdapter内部类完成的,源码如下所示:
![](https://epubservercos.yuewen.com/3069E4/20862583308964806/epubprivate/OEBPS/Images/138-2.jpg?sign=1739391083-x84FZFYy3PslO5J9zYOH8eJdJ46gnp2Z-0-0bb25867e89ab84e9dd92fc40b1535a1)
如以上源码所示,静态资源的映射是在addResourceHandlers()方法中进行映射配置的,它类似于在Spring MVC配置文件中的如下配置代码:
![](https://epubservercos.yuewen.com/3069E4/20862583308964806/epubprivate/OEBPS/Images/139-2.jpg?sign=1739391083-GsreS8aOJUyruLBlVjUCwURDcPO0yE8F-0-2c4a430825a4391d23b0d05868684170)
回到addResourceHandlers()源码中来,staticPathPattern的变量值为"/**",其默认值在WebMvcProperties类中。实际的静态资源存放目录通过getResourceLocations()方法获取,该方法源码如下所示:
![](https://epubservercos.yuewen.com/3069E4/20862583308964806/epubprivate/OEBPS/Images/139-3.jpg?sign=1739391083-via8mgynl8Y2zC4wK1OMWs7Q44CMqJ3a-0-ebee4143bfbdd95d7e1b0dbcfce1afe7)
![](https://epubservercos.yuewen.com/3069E4/20862583308964806/epubprivate/OEBPS/Images/140-1.jpg?sign=1739391083-HTAMjx31qzC2qQoZpheXRfYeHwwn2Pqm-0-0b283174e2499e719dec4d01d7a44c50)
由此可知,Spring Boot默认的静态资源处理目录为:"classpath:/META-INF/ resources/"、"classpath:/resources/"、"classpath:/static/"、"classpath:/public/"。
由于访问当前项目的任何资源都能在静态资源的文件夹中查找,而不存在的资源则会显示相应的错误页面,因此在开发Web项目时只需要包含这几个目录中的任意一个或者多个,并将静态资源文件放入其中即可。
为了验证该配置,可以在类路径下分别创建public目录(PNG格式文件)、resources目录(CSS格式文件)、stati目录(HTML格式文件和JS格式文件),并分别在三个文件夹中放入静态文件,如图7-4所示。
![](https://epubservercos.yuewen.com/3069E4/20862583308964806/epubprivate/OEBPS/Images/140-2.jpg?sign=1739391083-JRbdEIL1FxDSl0IVEuNIBEErvrBgVDe9-0-5e039cc7c0d666e836b653ac95e3c3e7)
图7-4 静态资源文件
重启Spring Boot,在启动成功后打开浏览器并输入以下请求地址分别进行请求:
![](https://epubservercos.yuewen.com/3069E4/20862583308964806/epubprivate/OEBPS/Images/140-3.jpg?sign=1739391083-MWZd4CxxUUCldXQge10jS2dYGO3l1RIN-0-677bb9198195eabdec8b99f36b5e63fb)
访问结果如图7-5~7-8所示。
![](https://epubservercos.yuewen.com/3069E4/20862583308964806/epubprivate/OEBPS/Images/141-1.jpg?sign=1739391083-XbgEDsupMThFJ6kmCdNpJKkOD5ACCX9F-0-e0ee19b260703639fe28d6b045036cfe)
图7-5 logo.png请求结果
![](https://epubservercos.yuewen.com/3069E4/20862583308964806/epubprivate/OEBPS/Images/141-2.jpg?sign=1739391083-9u73MHv36lLLETAqoIoWJUfUJ6KVz2LP-0-96ced8f96f5aa70b48905aa6d343557c)
图7-6 main.css请求结果
![](https://epubservercos.yuewen.com/3069E4/20862583308964806/epubprivate/OEBPS/Images/141-3.jpg?sign=1739391083-T8rzksPkNqWwUrakMZZDUTaJ9ITCpPTB-0-cdb7ca2c34f0dd0b2e507c0a619a7355)
图7-7 test.html请求结果
![](https://epubservercos.yuewen.com/3069E4/20862583308964806/epubprivate/OEBPS/Images/141-4.jpg?sign=1739391083-EhmsH5nRjn0312fGog8RIn8TyHugAJYk-0-c0582d6867418b429c4f6269b87c41d3)
图7-8 test.js请求结果
通过以上请求结果可以发现,静态资源虽然在不同的目录中,但都能被正确返回。这就是Spring Boot对静态资源的拦截处理。
当然,开发时也可以在Spring Boot项目配置文件中修改这些属性。比如将拦截路径改为“/static/”,并将静态资源目录修改为“/file-test”,那么默认配置就会失效并使用开发人员自定义的配置。修改application.properties文件,添加如下配置:
![](https://epubservercos.yuewen.com/3069E4/20862583308964806/epubprivate/OEBPS/Images/142-1.jpg?sign=1739391083-PYWgjg5wO1SysuWcmXincRk8PdYZsRCP-0-a9c61fcf7d106e319b259a3f15354c24)
在修改后重启Spring Boot项目,再次使用原来的URL访问以上三个资源文件将会报404的错误,如图7-9所示。
![](https://epubservercos.yuewen.com/3069E4/20862583308964806/epubprivate/OEBPS/Images/142-2.jpg?sign=1739391083-gLWgeSy7xxwVxDJqcEkGtALEOeysWQjF-0-c9aeae12bc1c8cac4151b39fce3275b2)
图7-9 404错误
如果想要正常访问文件,则需要新建static-test目录并将静态资源文件移至file-test目录下,且修改访问路径为:
![](https://epubservercos.yuewen.com/3069E4/20862583308964806/epubprivate/OEBPS/Images/142-3.jpg?sign=1739391083-5ATEYiamO9UFg17tsuWsddUn7meKoacy-0-669aff89871d7b3a0601f1305476b5a2)
此时页面就不会出现404错误。