静态资源映射处理以及静态资源路径的作用
一、静态资源映射配置
1. 静态资源映射在SpringBoot中的自动配置
WebMvcAutoConfiguration:
// 增加资源处理器---实际上就是增加资源路径的映射关系,比如访问地址/,将会映射到服务器的哪个文件夹下
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// 当spring.resources.add-mappings为false时(默认为true),直接日志输出以及结束函数,不会将下面的静态资源路径加入到注册器中
if (!this.resourceProperties.isAddMappings()) {
logger.debug("Default resource handling disabled");
return;
}
// 反之spring.resources.add-mappings为true
Duration cachePeriod = this.resourceProperties.getCache().getPeriod();
CacheControl cacheControl = this.resourceProperties.getCache().getCachecontrol().toHttpCacheControl();
// 如果注册器中不存在/webjars/**这个路径的映射,则将这个classpath:/META-INF/resources/webjars/资源路径映射到/webjars/**访问路径,webjars这个路径用于存放将静态资源打包成jar包后的资源,这里不做具体说明(不常用)
if (!registry.hasMappingForPattern("/webjars/**")) {
customizeResourceHandlerRegistration(registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/")
.setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl));
}
// 获取mvc配置类中的静态路径(默认为/**)
String staticPathPattern = this.mvcProperties.getStaticPathPattern();
// 如果这个路径在注册器中没有映射
if (!registry.hasMappingForPattern(staticPathPattern)) {
// 将resource配置类中的静态资源路径(默认为"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/")映射到mvc配置类中的静态路径(默认为/**),这里相当于当我们访问 / 路径下的文件时,会将其映射到前面的静态资源路径
customizeResourceHandlerRegistration(registry.addResourceHandler(staticPathPattern) .addResourceLocations(getResourceLocations(this.resourceProperties.getStaticLocations()))
.setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl));
}
}
// 经过上面配置类的加载(自动配置)后,我们可以将静态资源放在以下的路径下供于静态资源的访问。
// addResourceLocations(getResourceLocations(this.resourceProperties.getStaticLocations()))
"classpath:/META-INF/resources/",
"classpath:/resources/",
"classpath:/static/",
"classpath:/public/"
这些路径默认会被映射到/**(registry.addResourceHandler(staticPathPattern))
比如访问 http://localhost:8080/1.js 将会访问上面这些路径下的1.js文件
优先级以此递减(如果/META-INF/resources/中有对应文件,就不会去resources、static、public目录下找文件)
或者通过加入webjar的依赖包再访问如http://localhost:8080/webjars/jquery/3.4.1/jquery.js这个路径进行静态资源的访问(不常用)
2.使用自定义的映射
注意:使用自定义映射之后,自动配置的静态资源映射将失效(因为会进行覆盖)
spring:
mvc:
static-path-pattern: /**
resources:
static-locations: classpath:/hello/, classpath:/META-INF/resources/, classpath:/resources/, classpath:/static/, classpath:/public/
# 这里实际上就是修改了自动配置中的这部分参数customizeResourceHandlerRegistration(registry.addResourceHandler(staticPathPattern).addResourceLocations(getResourceLocations(this.resourceProperties.getStaticLocations()))
二、欢迎页映射—基于静态资源映射的欢迎页
WebMvcAutoConfiguration:
// 欢迎页处理映射
@Bean
public WelcomePageHandlerMapping welcomePageHandlerMapping(ApplicationContext applicationContext,
FormattingConversionService mvcConversionService, ResourceUrlProvider mvcResourceUrlProvider) {
// 实例化欢迎页处理映射,在这里指定了访问路径(this.mvcProperties.getStaticPathPattern()---前面配置好的mvc配置类中的静态路径/**)以及资源路径(getWelcomePage()---实际上就是前面配置好的静态资源路径下的index.html这个文件)
WelcomePageHandlerMapping welcomePageHandlerMapping = new WelcomePageHandlerMapping(
new TemplateAvailabilityProviders(applicationContext), applicationContext, getWelcomePage(),
this.mvcProperties.getStaticPathPattern());
welcomePageHandlerMapping.setInterceptors(getInterceptors(mvcConversionService, mvcResourceUrlProvider));
welcomePageHandlerMapping.setCorsConfigurations(getCorsConfigurations());
return welcomePageHandlerMapping;
}
// 欢迎页处理映射构造函数
WelcomePageHandlerMapping(TemplateAvailabilityProviders templateAvailabilityProviders,
ApplicationContext applicationContext, Optional<Resource> welcomePage, String staticPathPattern) {
// 注意这里只有当staticPathPattern=/**时才会加载欢迎页
if (welcomePage.isPresent() && "/**".equals(staticPathPattern)) {
logger.info("Adding welcome page: " + welcomePage.get());
setRootViewName("forward:index.html");
}
else if (welcomeTemplateExists(templateAvailabilityProviders, applicationContext)) {
logger.info("Adding welcome page template: index");
setRootViewName("index");
}
}
当我们访问静态资源路径时(http://localhost:8080/)时,将会在静态资源路径下面寻找index.html文件,并将其作为欢迎页(首页)返回,注意这里不能修改spring.mvc.static-path-pattern,否则将无法自动配置欢迎页