SpringBoot web静态资源映射
- 1、创建SpringBoot项目,在创建的时候选择web
- 2、我们现在来讨论一下SpringBoot的默认映射
- ①静态资源映射
- 我们来看看wenjars是个什么玩意
- 我们在来说一下什么是类路径
- ①欢迎页
1、创建SpringBoot项目,在创建的时候选择web
2、我们现在来讨论一下SpringBoot的默认映射
我们在导入的依赖中找到spring-boot-autoconfigure,在这个下边找到
我们的web文件夹,我们可以发现在他的里边有个
WebMvcAutoConfiguration这个类,好,那打开这个类我们来看一下。
①静态资源映射
我们在项目中常常会用到js,css,图片等静态资源文件。
那么SpringBoot的默认加载位置是在哪里?
我们先看一下下边的源码:
分析一下:
a、首先他是在WebMvcAutoConfiguration这个类下
b、在他的里边有个这方法addResourceHandlers,我们在这里边分析一下
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
super.addResourceHandlers(registry);
if (!this.resourceProperties.isAddMappings()) {
logger.debug("Default resource handling disabled");
} else {
ServletContext servletContext = this.getServletContext();
//第一种加载资源方式为webjars方式
this.addResourceHandler(registry, "/webjars/**", "classpath:/META-INF/resources/webjars/");
//这是第二种,首先我们在他的下边找到了第一种方式,也就是类路径"/"
this.addResourceHandler(registry, this.mvcProperties.getStaticPathPattern(), (registration) -> {
//我们来看这个代码,顺着他点击进去 registration.addResourceLocations(this.resourceProperties.getStaticLocations());
if (servletContext != null) {
registration.addResourceLocations(new Resource[]{new ServletContextResource(servletContext, "/")});
}
});
}
}
//在他的里边有一个这方法
public static class Resources {
//在这里我们找到CLASSPATH_RESOURCE_LOCATIONS 这个常量,他是一个String数组,在这里边我们看到了很多路径
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = new String[]{"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"};
private String[] staticLocations;
private boolean addMappings;
private boolean customized;
private final WebProperties.Resources.Chain chain;
private final WebProperties.Resources.Cache cache;
public Resources() {
//变量staticLocations在这里给赋值了一个CLASSPATH_RESOURCE_LOCATIONS
this.staticLocations = CLASSPATH_RESOURCE_LOCATIONS;
this.addMappings = true;
this.customized = false;
this.chain = new WebProperties.Resources.Chain();
this.cache = new WebProperties.Resources.Cache();
}
//当我们点击this.resourceProperties.getStaticLocations()里边的这个方法时到了这里,我们看到他给了一个变量staticLocations
public String[] getStaticLocations() {
return this.staticLocations;
}
通过上边两段代码分析:
静态资源加载路径如下:
①classpath:/META-INF/resources/
②classpath:/resources/
③classpath:/static/
④classpath:/public/
⑤/
我们可以看到,有五种方式可以使我们的静态资源被访问到。哦!我们还有一个叫wenjars方式
我们来看看wenjars是个什么玩意
WebJars是一个很神奇的东西,可以让大家以jar包的形式来使用前端的各种框架、组件。
我们进他的官网看到很多东西,如果我们是要已jar包的方式进行访问,我们在哪里找到对应的选择对应的
版本,导入他的Maven依赖即可,我们在外部时刻已访问到的他的访问路径就可上边说的一样,就是这个
classpath:/META-INF/resources/webjars/地址
我们在来说一下什么是类路径
这个就是类路径java和resources为类路径,我们在她下边建相应的SpringBoot可以访问的路径,我们就可以快速的访问到我们的静态资源了
①欢迎页
我们还是在这个类下找到welcomePageHandlerMapping这个方法在这里,我们可以看到在当前类下有个this.getWelcomePage()方法
@Bean
public WelcomePageHandlerMapping welcomePageHandlerMapping(ApplicationContext applicationContext, FormattingConversionService mvcConversionService, ResourceUrlProvider mvcResourceUrlProvider) {
WelcomePageHandlerMapping welcomePageHandlerMapping = new WelcomePageHandlerMapping(new TemplateAvailabilityProviders(applicationContext), applicationContext, this.getWelcomePage(), this.mvcProperties.getStaticPathPattern());
welcomePageHandlerMapping.setInterceptors(this.getInterceptors(mvcConversionService, mvcResourceUrlProvider));
welcomePageHandlerMapping.setCorsConfigurations(this.getCorsConfigurations());
return welcomePageHandlerMapping;
}
//在整个类中我们可以看到他调用了getIndexHtml方法
private Resource getWelcomePage() {
String[] var1 = this.resourceProperties.getStaticLocations();
int var2 = var1.length;
for(int var3 = 0; var3 < var2; ++var3) {
String location = var1[var3];
Resource indexHtml = this.getIndexHtml(location);
if (indexHtml != null) {
return indexHtml;
}
}
ServletContext servletContext = this.getServletContext();
if (servletContext != null) {
//我们在这里可以看到加载位置为类路径下
return this.getIndexHtml((Resource)(new ServletContextResource(servletContext, "/")));
} else {
return null;
}
}
//在这个方法中我们可以看到他去取静态资源路径,这个location是getWelcomePage方法通过this.resourceProperties.getStaticLocations()组装起来的,最终还是去取private static final String[] CLASSPATH_RESOURCE_LOCATIONS = new String[]{"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"};这个值
private Resource getIndexHtml(String location) {
return this.getIndexHtml(this.resourceLoader.getResource(location));
}
//这种就是在类路径下找他的index.html,我们可以在getWelcomePage方法里找到
private Resource getIndexHtml(Resource location) {
try {
Resource resource = location.createRelative("index.html");
if (resource.exists() && resource.getURL() != null) {
return resource;
}
} catch (Exception var3) {
}
return null;
}
在这两个方法中我们可以看到他还是去到了去取staticLocations这个值
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = new String[]{"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"};
还是上边加载静态资源的位置
自定义静态资源文件夹的处理 spring.resources.static-locations=classpath:/hello/,classpath:/wqp/
这种方式会使springboot的默认访问失效