当前项目的类路径下只要有/static (or /public or /resources or /META-INF/resources)
这些目录,这些目录都能当作静态资源目录。
刚创建的项目以resources作为根目录,其下有一个子目录static:
接下来我们分别创建/public or /resources or /META-INF/resources
这些目录:
这4个目录都能被当作静态资源目录,接下来我们向4个目录中加入不同的图片,来测试一下看能不能访问到静态资源:
测试结果:
可以看到这四个目录下的资源都可以直接访问到。
访问的方式为 : 当前项目根路径/ + 静态资源名
它的原理是怎么样的呢?现在我们来创建一个Controller让来来处理一个与图片名称相同的rest请求,也就是说动态请求名与静态资源同名了,看看会发生什么事;Controller代码如下:
@RestController
public class HelloController {
@RequestMapping("/xiamu.jpg")
public String hello(){
return "访问请求!";
}
}
可以看到再次访问/xiamu.jpg
时,没有出现静态资源中的图片,而是被Controller处理了这次请求,返回了Controller中的字符串。
下面我们来看具体原理:
官方文档中提到说静态资源映射的是/**
,也就说是拦截所有的请求,而动态资源也是需要看所有请求的;
那么请求一进来,先去找Controller,看看其中有没有相关的请求,,如果我们的Controller能处理就处理了;
如果不能处理,因为我们的静态资源映射的是/**
,所以呢,不能处理的所有请求又都交给静态资源处理器;
然后呢,接下来看我们的静态资源能不能找到,静态资源会在上面提到的那4个目录中按照请求的名字来找;
如果静态资源能找到,那我们访问,如果静态资源也找不到,就会报错404。
如下:
上面我们提到了静态资源默认访问的是/**
,也就是说默认访问的是无前缀的。
如果我们想给它一个前缀,在官网文档中提到说:
By default, resources are mapped on /**
, but you can tune that with the spring.mvc.static-path-pattern
property. For instance, relocating all resources to /resources/**
can be achieved as follows:
也就是说我们只需要配置spring.mvc.static-path-pattern
,例如我们想让其前缀为resources,配置文件如下:
Properties:
spring.mvc.static-path-pattern=/resources/**
Yaml:
spring:
mvc:
static-path-pattern: "/resources/**"
配置前,我们访问静态资源是当前项目+静态资源名
配置后呢,我们以后访问静态资源就是当前项目+访问前缀+静态资源名
上面提到了当前的默认静态资源路径为:/static (or /public or /resources or /META-INF/resources)
,如果想改变这个静态资源路径,也是可以做到的,我们只需要用到spring.web.resources.static-locations
配置。
例如我们把静态资源的路径改为类路径下的ysw目录,那么我们的配置如下:
spring:
web:
resources:
static-locations: classpath:/ysw/
加上我们之间添加前缀的配置,总体的yaml配置文件内容为:
spring:
mvc:
static-path-pattern: /resource/**
web:
resources:
static-locations: classpath:/ysw/
配置后在之前的4个目录下的配置文件就都找不到了,比如public路径下的xiamu_1.jpeg:
当把public路径下的静态资源也就是图片移到ysw路径下,我们就能够访问了:
以jquery为例,展示访问WebJars的静态资源