第八节 SpringBoot项目的静态文件

亮子 2021-05-11 13:38:48 21733 0 0 0

静态资源路径是指系统可以直接访问的路径,且路径下的所有文件均可被用户直接读取。

1、默认配置

Spring Boot 对静态资源映射提供了默认配置。
Spring Boot 默认将 /** 所有访问映射到以下目录:

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

其中,SpringBoot最常用的静态文件目录为:classpath:/static

静态文件目录主要用来存放图片、JS脚本、CSS文件等等,不需要web服务器进行特殊处理。

2、自定义静态资源访问

1)、通过配置类实现

@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //将所有D:/test/ 访问都映射到/test/** 路径下
        registry.addResourceHandler("/test/**").addResourceLocations("file:D:/test/");
    }
}

2)、通过配置文件实现

## 配置文件
spring.application.name=server-first
server.port=8000

web.upload-path=D:/test
spring.mvc.static-path-pattern=/**
spring.resources.static-locations=classpath:/static/,file:${web.upload-path}

web.upload-path:这个属于自定义的属性,指定了一个路径,注意要以/结尾;

spring.mvc.static-path-pattern=/**:表示所有的访问都经过静态资源路径;

spring.resources.static-locations:在这里配置静态资源路径,前面说了这里的配置是覆盖默认配置,所以需要将默认的也加上否则static、public等这些路径将不能被当作静态资源路径,在这个最末尾的file:${web.upload-path}之所有要加file:是因为指定的是一个具体的硬盘路径,其他的使用classpath指的是系统环境变量。

3、文件的搜索顺序

很多人可能有一个疑问,那就是在多个静态目录中,都有一个相同名字的文件,那么SpringBoot应该先显示哪个呢?
那我们先做一个如下实验,先使用默认路径:
- classpath:/static
- classpath:/public
- classpath:/resources
在以上三个目录都创建一个test.html文件,里面的内容不一样,那么我们访问test.html,这时候可以看看页面显示的是那个目录下的文件内容,经过测试结果如下:
优先级最高:classpath:/static
优先级其次:classpath:/public
当上面两个目录的文件都删除后,再访问,则失败,说明放在/resources目录下的文件是无法访问,因此classpath:/resources已经不是默认目录了。
至于和自定义目录相比的优先级,我们再来测试一下:
增加如下配置类:

package com.shenmazong.demonew.config;

import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

public class WebMvcConfig extends WebMvcConfigurerAdapter {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //将所有D:/test/ 访问都映射到/test/** 路径下
        registry.addResourceHandler("/**").addResourceLocations("file:E:/test/");
    }
}

通过测试发现,自定义的目录优先级要比static默认的路径优先级别要高。