Springboot系列-静态资源配置

Springboot系列-静态资源配置

前言:之前我们采用SpringMVC框架开发时,经常会涉及到静态资源的拦截问题,同样在使用Springboot开发的时候也会涉及到静态资源的加载问题,那么到底应该如何配置呢?


1.SSM中配置

xml中配置

首先我们来说一下之前在做SSM开发的时候对静态资源进行配置,可以在springmvc.xml中配置如下:

<mvc:resources location="/html/" mapping="/html/**"></mvc:resources>
<mvc:resources location="/css/" mapping="/css/**"></mvc:resources>
<mvc:resources location="/js/" mapping="/js/**"></mvc:resources>
<mvc:resources location="/images/" mapping="/images/**"></mvc:resources>

“ /** ”表示可以匹配任意层级的路径,就是代表当前目录下所有文件的意思,如果不针对单个资源进行配置,可简写如下:

<mvc:resources mapping="/**" location="/"/>

Java代码配置

静态资源配置不仅可以在xml文件中进行配置,还可以在Java代码中进行配置,那么如何Java代码进行配置呢?其实很简单,只需要自定义一个类,然后继承WebMvcConfiguartionSupport即可,如下:

@Configuration
@ComponentScan(basePackages = "com.wxy")
public class SpringMVCConfig extends WebMvcConfigurationSupport {
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        super.addResourceHandlers(registry);
        registry.addResourceHandler("/**").addResourceLocations("/");
    }
}

重写 WebMvcConfigurationSupport 类中的 addResourceHandlers 方法,在该方法中配置静态资源位置,简单来说 和上述xml中配置原理一样


2.Springboot中配置

在之前的Springboot系列的文章中,我们提到过对于创建Springboot的几种方式,如果从 https://start.spring.io 网站上创建,或者用IDEA 中的 Spring Boot 初始化工具创建的项目,默认会在resources目录下有一个static 目录,只要静态资源只要放到这个目录下,就可以直接访问;那么为什么直接可以访问?有没有其他地方可以放置静态资源呢?

配置放置

在Springboot中,默认会有五个位置可以放置静态资源,如下(按照优先级):

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

前四个我们可能在开发的时候应该都知道,分别在resource目录下不同的目录,那么 / 是怎么配置的呢?其实创建Springboot项目后没有webapp目录,我们可以手动创建,所以 / 就表示 webapp 目录中的静态资源也不被拦截

所以我们在用的时候,如果在以上的目录下放置一个wxy.html文件,那么可以直接访问 http://localhost:8080/wxy.html即可 (端口默认8080),那么为什么不是http://localhost:8080/static/wxy.html呢?下面自定义配置会提到…

源码分析

在Springboot中静态资源是如何进行配置的呢?

在默认情况下,springboot是启用WebMvcAutoConfiguration,这点可以在spring-boot-autoconfigure.jar/META-INF/spring.factories中看到

在这里插入图片描述

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

在这里插入图片描述

通过上述圈红代码可以看出静态资源的定义和上面的SSM的Java配置方式相似,其中this.mvcProperties.getStaticPathPattern()方法对应的值就是 /**,而this.resourceProperties.getStaticLocations() 方法返回上面定义配置的几个路径

然后在 getResourceLocations 方法中,又添加了 / ,因此这里返回值一共有 5 个,其中 / 表示 webapp 目录,即 webapp 中的静态文件也可以直接访问

自定义配置

我们上述所说的都是系统默认配置,当然我们也可以通过application.properties或者Java代码自定义静态资源位置和映射,如下:

  1. application.properties
spring.resources.static-locations=classpath:/
spring.mvc.static-path-pattern=/**

第一行配置表示定义资源位置,第二行配置表示定义请求 URL 规则;上述配置表示可以将静态资源放在 resources 目录下的任意地方;此处需要注意的是由于是我们自定义配置,所以访问时需要完整路径,那么访问路径就是 http://localhost:8080/static/wxy.html ,所以此处 static 不能省略

  1. java代码配置

Java代码和之前说的SSM配置基本一样,如下:

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

总结:道理虽然是这样,但是比如用 Thymeleaf 之后,会将静态资源也放在 resources/templates 目录下,注意,templates 目录并不是静态资源目录,它是一个放页面模板的位置,虽然 Thymeleaf 模板虽然后缀为 .html,其实并不是静态资源…

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值