Spring Boot2 系列教程(十一)Spring Boot 中的静态资源配置

当咱们使用 SpringMVC 框架时,静态资源会被拦截,须要添加额外配置,以前老有小伙伴在微信上问松哥 Spring Boot 中的静态资源加载问题:“松哥,个人 HTML 页面好像没有样式?”,今天我就经过一篇文章,来和大伙仔细聊一聊这个问题。css

1. SSM 中的配置

要讲 Spring Boot 中的问题,咱们得先回到 SSM 环境搭建中,通常来讲,咱们能够经过 <mvc:resources /> 节点来配置不拦截静态资源,以下:html

<mvc:resources mapping="/js/**" location="/js/"/>
<mvc:resources mapping="/css/**" location="/css/"/>
<mvc:resources mapping="/html/**" location="/html/"/>
复制代码

因为这是一种Ant风格的路径匹配符,/** 表示能够匹配任意层级的路径,所以上面的代码也能够像下面这样简写:java

<mvc:resources mapping="/**" location="/"/>
复制代码

这种配置是在 XML 中的配置,你们知道,SpringMVC 的配置除了在XML中配置,也能够在 Java 代码中配置,若是在 Java 代码中配置的话,咱们只须要自定义一个类,继承自 WebMvcConfigurationSupport 便可:web

@Configuration
@ComponentScan(basePackages = "org.javaboy.javassm")
public class SpringMVCConfig extends WebMvcConfigurationSupport {
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**").addResourceLocations("/");
    }
}
复制代码

重写 WebMvcConfigurationSupport 类中的 addResourceHandlers 方法,在该方法中配置静态资源位置便可,这里的含义和上面 xml 配置的含义一致,所以无需多说。spring

这是咱们传统的解决方案,在 Spring Boot 中,其实配置方式和这个一脉相承,只是有一些自动化的配置了。后端

2. Spring Boot 中的配置

在 Spring Boot 中,若是咱们是从 https://start.spring.io 这个网站上建立的项目,或者使用 IntelliJ IDEA 中的 Spring Boot 初始化工具建立的项目,默认都会存在 resources/static 目录,不少小伙伴也知道静态资源只要放到这个目录下,就能够直接访问,除了这里还有没有其余能够放静态资源的位置呢?为何放在这里就能直接访问了呢?这就是本文要讨论的问题了。bash

2.1 总体规划

首先,在 Spring Boot 中,默认状况下,一共有 5 个位置能够放静态资源,五个路径分别是以下 5 个:微信

  1. classpath:/META-INF/resources/
  2. classpath:/resources/
  3. classpath:/static/
  4. classpath:/public/
  5. /

前四个目录好理解,分别对应了 resources 目录下不一样的目录,第 5 个 / 是啥意思呢?咱们知道,在 Spring Boot 项目中,默认是没有 webapp 这个目录的,固然咱们也能够本身添加(例如在须要使用JSP的时候),这里第 5 个 / 其实就是表示 webapp 目录中的静态资源也不被拦截。若是同一个文件分别出如今五个目录下,那么优先级也是按照上面列出的顺序。mvc

不过,虽然有 5 个存储目录,除了第 5 个用的比较少以外,其余四个,系统默认建立了 classpath:/static/ , 正常状况下,咱们只须要将咱们的静态资源放到这个目录下便可,也不须要额外去建立其余静态资源目录,例如我在 classpath:/static/ 目录下放了一张名为 1.png 的图片,那么个人访问路径是:app

http://localhost:8080/1.png
复制代码

这里你们注意,请求地址中并不须要 static,若是加上了 static 反而画蛇添足会报 404 错误。不少人会以为奇怪,为何不须要添加 static 呢?资源明明放在 static 目录下。其实这个效果很好实现,例如在 SSM 配置中,咱们的静态资源拦截配置若是是下面这样:

<mvc:resources mapping="/**" location="/static/"/>
复制代码

若是咱们是这样配置的话,请求地址若是是 http://localhost:8080/1.png 实际上系统会去 /static/1.png 目录下查找相关的文件。

因此咱们理所固然的猜想,在 Spring Boot 中可能也是相似的配置。

2.2 源码解读

胡适之先生说:“大胆猜测,当心求证”,咱们这里就经过源码解读来看看 Spring Boot 中的静态资源究竟是怎么配置的。

首先咱们在 WebMvcAutoConfiguration 类中看到了 SpringMVC 自动化配置的相关的内容,找到了静态资源拦截的配置,以下:

能够看到这里静态资源的定义和咱们前面提到的 Java 配置 SSM 中的配置很是类似,其中,this.mvcProperties.getStaticPathPattern() 方法对应的值是 /**,this.resourceProperties.getStaticLocations() 方法返回了四个位置,分别是:

  • classpath:/META-INF/resources/
  • classpath:/resources/
  • classpath:/static/
  • classpath:/public/

而后在 getResourceLocations 方法中,又添加了 / ,所以这里返回值一共有 5 个。其中, / 表示 webapp 目录,即 webapp 中的静态文件也能够直接访问。静态资源的匹配路径按照定义路径优先级依次下降。所以这里的配置和咱们前面提到的一模一样。这样大伙就知道了为何 Spring Boot 中支持 5 个静态资源位置,同时也明白了为何静态资源请求路径中不须要 /static ,由于在路径映射中已经自动的添加上了 /static 了。

2.3 自定义配置

固然,这个是系统默认配置,若是咱们并不想将资源放在系统默认的这五个位置上,也能够自定义静态资源位置和映射,自定义的方式也有两种,能够经过 application.properties 来定义,也能够在 Java 代码中来定义,下面分别来看。

2.3.1 application.properties

在配置文件中定义的方式比较简单,以下:

spring.resources.static-locations=classpath:/
spring.mvc.static-path-pattern=/**
复制代码

第一行配置表示定义资源位置,第二行配置表示定义请求 URL 规则。以上文的配置为例,若是咱们这样定义了,表示能够将静态资源放在 resources 目录下的任意地方,咱们访问的时候固然也须要写完整的路径,例如在 resources/static 目录下有一张名为 1.png 的图片,那么访问路径就是 http://localhost:8080/static/1.png ,注意此时的 static 不能省略。

2.3.2 Java 代码定义

固然,在 Spring Boot 中咱们也能够经过 Java 代码来自定义,方式和 Java 配置的 SSM 比较相似,以下:

@Configuration
public class WebMVCConfig implements WebMvcConfigurer {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**").addResourceLocations("classpath:/aaa/");
    }
}
复制代码

这里代码基本和前面一致,比较简单,再也不赘述。

3. 总结

这里须要提醒你们的是,松哥见到有不少人用了 Thymeleaf 以后,会将静态资源也放在 resources/templates 目录下,注意,templates 目录并非静态资源目录,它是一个放页面模板的位置(你看到的 Thymeleaf 模板虽而后缀为 .html,其实并非静态资源)。好了,经过上面的讲解,相信你们对 Spring Boot 中静态资源的位置有一个深入了解了,应该不会再在项目中出错了吧!

关注公众号【江南一点雨】,专一于 Spring Boot+微服务以及先后端分离等全栈技术,按期视频教程分享,关注后回复 Java ,领取松哥为你精心准备的 Java 干货!

相关文章
相关标签/搜索