Version: Next

Web开发探究

静态资源处理

静态资源映射规则一

SpringBoot项目的打包方式时jar包,SpringBoot对于静态资源放置的位置,是有约定的

静态资源映射规则:

SpringBoot中,SpringMVC的web配置都定义在WebMvcAutoConfiguration这个配置类里面

WebMvcAutoConfigurationAdapter中有很多配置方法,其中包含addResourceHandlers添加资源处理

public void addResourceHandlers(ResourceHandlerRegistry registry) {
if (!this.resourceProperties.isAddMappings()) {
//禁用默认资源处理
logger.debug("Default resource handling disabled");
} else {
//webjars配置
if (!registry.hasMappingForPattern("/webjars/**")) {
ResourceHandlerRegistration registration = registry.addResourceHandler(new String[]{"/webjars/**"}).addResourceLocations(new String[]{"classpath:/META-INF/resources/webjars/"});
//缓存控制
this.configureResourceCaching(registration);
this.customizeResourceHandlerRegistration(registration);
}
//静态资源配置
String staticPathPattern = this.webFluxProperties.getStaticPathPattern();
if (!registry.hasMappingForPattern(staticPathPattern)) {
ResourceHandlerRegistration registration = registry.addResourceHandler(new String[]{staticPathPattern}).addResourceLocations(this.resourceProperties.getStaticLocations());
this.configureResourceCaching(registration);
this.customizeResourceHandlerRegistration(registration);
}
}
}

这段代码显示,所有的/webjars/**都被映射到了classpath:/META-INF/resources/webjars/找对应资源

什么是webjars

webjars的本质,就是以jar包的方式引入静态资源,以前要导入一个静态资源文件,直接导入即可

在SpringBoot中则需要使用webjars

webjars网站:https://www.webjars.org

比如想要使用JQuery,首先导入JQuery maven坐标

<dependency>
<groupId>org.webjars</groupId>
<artifactId>jquery</artifactId>
<version>3.4.1</version>
</dependency>

之后,在maven下载好的JQuery jar包中,可以找到classpath:/META-INF/resources/webjars/目录,其中就包含了jquery.js静态js资源文件


要访问静态资源,就访问对应的/webjars路由。

访问http://localhost:8080/webjars/jquery/3.4.1/jquery.js,即可访问到静态资源


静态资源映射配置二

对于项目中自己的静态资源:在staticPathPattern中可以发现第二种映射规则:/**,访问当前项目任意资源,都会找到resourceProperties类:

// 进入方法
public String[] getStaticLocations() {
return this.staticLocations;
}
// 找到对应的值
private String[] staticLocations = CLASSPATH_RESOURCE_LOCATIONS;
// 找到路径
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = {
"classpath:/META-INF/resources/",
"classpath:/resources/",
"classpath:/static/",
"classpath:/public/"
};

由此可以得出结论,以下四个目录存放的静态资源可以被SpringBoot识别到:

"classpath:/META-INF/resources/",
"classpath:/resources/",
"classpath:/static/",
"classpath:/public/"

直接访问http://localhost:8080/静态资源文件名,SpringBoot就会去这四个文件夹寻找静态资源文件

优先级:

  • resources > static > public

自定义静态资源路径

可以在配置文件中配置静态资源文件路径

application.yaml
spring:
resources:
static-locations: classpath:/css, classpath:/js
warning

一旦定义了静态文件夹的路径,原来的自动配置就会失效