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/地址

spring boot 国内镜像源 springboot本地资源映射_jar

我们在来说一下什么是类路径

spring boot 国内镜像源 springboot本地资源映射_静态资源_02


这个就是类路径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的默认访问失效