SpringBoot配置静态资源映射

​ SpringBoot打包成jar项目时,HTML页面和CSS等静态资源得放置目录是由规定的。开发中一些需要上传的资源如图片,通常我们会配置资源映射,将其存放在服务器的某个文件夹下。


​ 在SpringBoot中打包成jar项目时,静态页面和css放置的目录有规定。在SpringBoot中相关配置在WebMvcAutoConfiguration接口中。通过这个分析所有/webjars/**都去classpath:/META-INF/resources/webjars/找资源。所谓的webjars是指以jar包的方式引入资源。

​ 一般通过实现这个接口实现addResourceHandlers方法来设置资源映射,如图所示,springboot常用的static包下的静态文件映射就是这么做的。ResourceHandlerRegistry类负责储存资源文件的注册,将需要添加的请求路径注册进去并为其添加映射路径。(static/**代表所有static下的所有请求)

1
2
3
4
5
6
7
@Configuration
public class OisWebMvcConfigurerAdapter implements WebMvcConfigurer{

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {}

}

​ 开发时经常会为上传图片做静态资源映射到服务器指定的地方,我们简单的映射到F:/upload/下,如图所示。

1
2
3
4
5
6
7
8
9
10
11
12
@Configuration
public class OisWebMvcConfigurerAdapter implements WebMvcConfigurer{

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
//图片上传路径
registry.addResourceHandler("/upload/**").addResourceLocations("file:F:/upload/");
WebMvcConfigurer.super.addResourceHandlers(registry);
}

}

​ 这样我们就能通过upload的请求找到对应的资源了。

​ 然而不可能就这样将资源映射写死,每一次使用的时候都拼接完整的请求路径,所以我们会在配置文件中设定好路径映射,需要时通过@value将属性赋值使用,如图所示。也能使用@ConfigurationProperties在类上标识直接指定多个属性,就不多演示了。

1
2
3
#上传的映射
uploads:
user_img_path: F:/upload/
1
2
3
4
5
6
7
8
9
10
11
12
13
@Configuration
public class OisWebMvcConfigurerAdapter implements WebMvcConfigurer{

@Value("${uploads.user_img_path}")
private String user_img_path;

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
//图片上传路径
registry.addResourceHandler("/upload/**").addResourceLocations("file:"+user_img_path);
WebMvcConfigurer.super.addResourceHandlers(registry);
}

以上只是第一种方式,常用的还有一种在配置文件中通过spring.resources.static-locations直接进行配置,如图。

1
2
3
4
mvc:
static-path-pattern: /upload/**
resources:
static-locations: classpath:/META- INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:/home/upload/

不能在staic-locations下只配置upload请求的映射,至少也要添加classpath:/static/ 不然存放再这个包下的如css,js的文件会获取不到。

博主水平有限,仍然在学习中,如有不足之处,请帮忙指正,感激不尽。

0%