在以前spring mvc时代,我们是将静态资源放在WebContent文件夹下。只要在前端控制器中没有被拦截,那么我们就可以通过(例如:http://localhost:8080/springmvc-mybatis/js/index.js)这样的访问路径,访问我们的静态资源。

springboot xml映射文件所在的路径 springboot资源映射_ico

那么在spring boot时代,是怎么去访问静态资源的呢?像以前在spring mvc时代,我们要用这个框架,就得把它给整合进来(导包+配置前端控制器+处理器映射器+处理器适配器+视图解析器等等),拦截规则也是我们在前端控制器做了配置。但是现在spring boot通通帮我们配置好了,所以想要了解静态资源的映射规则,就必须去看spring boot的自动配置文件即WebMvcAutoConfiguration

 

  • 所有的/webjars/**,都会去classpath:/META-INF/resources/webjars/   找资源
public void addResourceHandlers(ResourceHandlerRegistry registry) {
            if (!this.resourceProperties.isAddMappings()) {
                logger.debug("Default resource handling disabled");
            } else {
                Integer cachePeriod = this.resourceProperties.getCachePeriod();
                if (!registry.hasMappingForPattern("/webjars/**")) {
                    this.customizeResourceHandlerRegistration(registry.addResourceHandler(new String[]{"/webjars/**"}).addResourceLocations(new String[]{"classpath:/META-INF/resources/webjars/"}).setCachePeriod(cachePeriod));
                }

                String staticPathPattern = this.mvcProperties.getStaticPathPattern();
                if (!registry.hasMappingForPattern(staticPathPattern)) {
                    this.customizeResourceHandlerRegistration(registry.addResourceHandler(new String[]{staticPathPattern}).addResourceLocations(this.resourceProperties.getStaticLocations()).setCachePeriod(cachePeriod));
                }

            }
        }

webjars:以jar包引入的静态资源,比如jquery,bootstrap等

我们以引入jquery为例,首先需要在pom.xml中引入依赖

<!-- 引入jquery -->
        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>jquery</artifactId>
            <version>3.4.1</version>
        </dependency>

接着我们可以在External Libraries,看到我们引入的jar包

springboot xml映射文件所在的路径 springboot资源映射_静态资源_02

我们可以通过访问http://localhost:8080/webjars/jquery/3.4.1/jquery.js,访问到/META-INF/resources/webjars/jquery/3.4.1/jquery.js

 

  • 访问当前任何静态资源,会去默认静态文件夹找资源
————————也就是addResourceHandlers(上面那段代码)if下面那一部分———————— 
String staticPathPattern = this.mvcProperties.getStaticPathPattern();
                if (!registry.hasMappingForPattern(staticPathPattern)) {
                    this.customizeResourceHandlerRegistration(registry.addResourceHandler(new String[]{staticPathPattern}).addResourceLocations(this.resourceProperties.getStaticLocations()).setCachePeriod(cachePeriod));
                }

点开new String[]{staticPathPattern}的staticPathPattern,可以看到它要处理的是/**请求

springboot xml映射文件所在的路径 springboot资源映射_静态资源_03

再点开this.resourceProperties.getStaticLocations()).setCachePeriod(cachePeriod)的getStaticLocations()

springboot xml映射文件所在的路径 springboot资源映射_ico_04

 

可以看到,它映射到的路径是CLASSPATH_RESOURCE_LOCATIONS

private static final String[] CLASSPATH_RESOURCE_LOCATIONS = new String[]{"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"};

 可以看到CLASSPATH_RESOURCE_LOCATIONS对应的是

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

"classpath:/resources/",

"classpath:/static/",

"classpath:/public/"

这个四条路径

springboot xml映射文件所在的路径 springboot资源映射_jar_05

也就是说当我们访问http://localhost:8080/templates/success.html,它就会去这四个目录下找到有没有templates/success.html这个资源,而不是去http://localhost:8080/templates/这个目录下找success,html这个资源

由于这是静态资源文件夹,所以我们一般是拿来存放静态资源的(比如css,js),这些资源一般是写死的,不需要做改变的。比较少拿来放html文件,因为在thymeleaf这个模板引擎下,html是可以动态填充数据的,一般放在template这个文件夹下。至于thymeleaf的用法我会在下一篇博客讲解。

 

  • 自定义静态资源映射文件夹

  上面那个四个是默认的静态文件夹,默认情况下访问静态资源都会去这四个静态文件夹找资源,但是我们也可以不用这几个文件夹,可以自定义静态资源文件夹,只要在application.properties下做如下配置,那么它就不再去默认的静态文件夹找资源,而是去classpath:/hello/下找

spring.resources.static-locations=classpath:/hello/

 

  • 欢迎页的映射
@Bean
        public WebMvcAutoConfiguration.WelcomePageHandlerMapping welcomePageHandlerMapping(ResourceProperties resourceProperties) {
            return new WebMvcAutoConfiguration.WelcomePageHandlerMapping(resourceProperties.getWelcomePage(), this.mvcProperties.getStaticPathPattern());
        }

点开getWelcomePage()

springboot xml映射文件所在的路径 springboot资源映射_静态资源_06

再点开getStaticWelcomePageLocations

springboot xml映射文件所在的路径 springboot资源映射_spring boot_07

可以看到当我们直接访问https://localhost:8080/时,会自动映射到https://localhost:8080/index.html

 

  • 图标映射
@Configuration
        @ConditionalOnProperty(
            value = {"spring.mvc.favicon.enabled"},
            matchIfMissing = true
        )
        public static class FaviconConfiguration {
            private final ResourceProperties resourceProperties;

            public FaviconConfiguration(ResourceProperties resourceProperties) {
                this.resourceProperties = resourceProperties;
            }

                ——————————————————映射到faviconRequestHandler———————————————
            @Bean
            public SimpleUrlHandlerMapping faviconHandlerMapping() {
                SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping();
                mapping.setOrder(-2147483647);
                mapping.setUrlMap(Collections.singletonMap("**/favicon.ico", this.faviconRequestHandler()));
                return mapping;
            }

            @Bean
            public ResourceHttpRequestHandler faviconRequestHandler() {
                ResourceHttpRequestHandler requestHandler = new ResourceHttpRequestHandler();
                requestHandler.setLocations(this.resourceProperties.getFaviconLocations());
                return requestHandler;
            }
        }

点开faviconRequestHandler

springboot xml映射文件所在的路径 springboot资源映射_静态资源_08

再点开 getFaviconLocations,可以看到映射静态文件夹下

springboot xml映射文件所在的路径 springboot资源映射_jar_09

所有我们只要在静态文件夹下放入favicon.ico这个资源

springboot xml映射文件所在的路径 springboot资源映射_jar_10

再到html文件中,加入如下配置

springboot xml映射文件所在的路径 springboot资源映射_静态资源_11

那么访问路径时,便能加载到该图标

springboot xml映射文件所在的路径 springboot资源映射_ico_12