在SpringBoot中,如果我们是从https://start.spring.io这个网站上创建的项目,或者使用IntelliJIDEA中的SpringBoot初始化工具创建的项目,默认的静态资源都会存在resources/static目录下,很多小伙伴也知道静态资源只要放到这个目录下,就可以直接访问。那么,除了这里还有没有其他可以放静态资源的位置呢?为什么放在这里就能直接访问了呢?本篇文章就带领大家了解一下SpringBoot框架中的静态资源配置。
一、静态资源可存放位置
首先,在SpringBoot中,默认情况下,一共有5个位置可以放静态资源,五个路径分别是如下5个:
classpath:/META-INF/resources/
classpath:/resources/
classpath:/static/
classpath:/public/
/
前四个目录好理解,分别对应了resources目录下不同的目录,第5个/是啥意思呢?
我们知道,在SpringBoot项目中,默认是没有webapp这个目录的,当然我们也可以自己添加(例如在需要使用JSP的时候),这里第5个/其实就是表示webapp目录中的静态资源也不被拦截。如果同一个文件分别出现在五个目录下,那么优先级也是按照上面列出的顺序。
不过,虽然有5个存储目录,除了第5个用的比较少之外,其他四个,系统均默认创建了classpath:/static/。
正常情况下,我们只需要将我们的静态资源放到这个目录下即可,也不需要额外去创建其他静态资源目录。
举例说明:
例如在classpath:/static/目录下放了一张名为1.png的图片,那么我的访问路径是:http://localhost:8080/1.png。
这里大家注意,请求地址中并不需要static这层路径,如果加上了static反而多此一举,报404错误。
很多人会觉得奇怪,为什么不需要添加static呢?资源明明放在static目录下。其实这个效果很好实现,例如在SSM框架整合配置中,我们的静态资源拦截配置如果是下面这样:
<mvc:resources mapping="/**" location="/static/"/>
如果我们是这样配置的话,请求地址如果是 http://localhost:8080/1.png。
实际上系统会去 /static/1.png 目录下查找相关的文件。所以我们理所当然的猜测,在SpringBoot中可能也是类似的配置。接下来我们通过解读SpringBoot源码,来看下它是如何实现的。
我们知道SpringBoot项目启动类是入口,在项目的pom.xml中引入需要的场景启动器后,根据自动配置原理,SpringBoot框架会尽可能为我们匹配并加载对应所需的所有的类到Spring容器中,以便于开发时我们可以随时从容器中获取到对应的组件对象。
在spring.factories文件中,在Auto Configure自动配置这一栏有一个配置类,叫做WebMvcAutoConfiguration。
在这个类中我们可以看到有关SpringMVC自动化配置的相关内容。
在WebMvcAutoConfiguration类中,我们查看addResourceHandlers()方法,断点如下:
其中,this.mvcProperties.getStaticPathPattern()方法对应的值是/**, this.resourceProperties.getStaticLocations()方法返回了四个位置,分别是:
classpath:/META-INF/resources/
classpath:/resources/
classpath:/static/
classpath:/public/
然后在getResourceLocations方法中,又添加了/,因此这里返回值一共有5个。其中,/ 表示webapp目录,即webapp中的静态文件也可以直接访问。
静态资源的匹配路径按照定义路径优先级依次降低。
因此这里的配置和我们前面提到的如出一辙。这样大伙就知道了为什么Spring Boot中支持5个静态资源位置,同时也明白了为什么静态资源请求路径中不需要/static,因为在路径映射中已经自动的添加上了/static了。
二、自定义配置
上述我们说的是系统默认配置,如果我们并不想将资源放在系统默认的这五个位置上,也可以自定义静态资源位置和映射,自定义的方式也有两种,可以通过application.properties来定义,也可以在Java代码中来定义,下面我们分别来看。
1.1通过application.properties配置
这种方式比较简单,我们可以直接配置指定:
spring.resources.static-locations=classpath:/
spring.mvc.static-path-pattern=/**
第一行配置表示定义资源位置,第二行配置表示定义请求URL规则。
以上文的配置为例,如果我们这样定义了,表示可以将静态资源放在resources目录下的任意地方,我们访问的时候当然也需要写完整的路径,例如在resources/static目录下有一张名为1.png的图片,那么访问路径就是http://localhost:8080/static/1.png。注意此时的static不能省略。
1.2通过Java代码完成
使用Java代码完成自定义静态资源配置。
@Configuration // 该注解表示当前类是一个配置类
public class WebMVCConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
}
}
总结
通过上面的讲解,相信大家对SpringBoot中静态资源的位置有一定了解了。在这里需要强调的是,有很多朋友用了Thymeleaf之后,会将静态资源也放在resources/templates目录下,注意,这里templates目录并不是静态资源目录,它只是一个放页面模板的位置,模板虽然后缀也为 .html,其实它并不是静态资源。