静态资源处理:
默认的静态资源路径为
calsspath:/META-INF/resources/
classpath:/resources/
classpath:/static/
classpath:/public/
如果我们将静态资源放置上述四种路径处,那么可以通过项目根路径/静态资源名称
的方式访问到,否则会访问不到
举例:
如下所示,我在resources目录下创建了4个不同的目录,它们均可以作为默认的资源路径,并在每个路径下存放了静态资源
在客户端,如果我们想访问上述的静态资源,那么只需要通过项目根路径/静态资源名称的形式,如下所示:
那么springboot为什么会知道我们是想找静态资源而不是请求呢?
为了解决这个疑惑,我们可通过创建一个控制器方法,其访问路径与静态资源的访问路径相同,如下所示:
package com.example.demo.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class helloController {
@RequestMapping("/微信图片_20230716223013.jpg")
public String showMessage(){
return "aaa";
}
}
浏览器访问显示如下所示:
我们可以看出,当静态资源名称和控制器方法相同的情况下,springboot会访问对应的控制器方法而不是静态资源,这其实是与springboot静态映射的原理有关,当客户端发送一个请求,springboot会先去找Controller看是否能进行处理,只有当Controller不能处理的请求才会交给静态资源处理器,如果静态资源处理器也无法处理,则会产生404错误
为了避免发生上述这种当静态资源名称和控制器访问路径名冲突导致静态资源无法正常加载,我们通常需要给静态资源加前缀,例如将静态资源访问路径设置为"/static/**"
,这样Spring Boot就会将该路径下的请求映射到静态资源上,而不会与其他请求冲突。
举例:
当我们在application.yaml中将静态资源的访问路径设置为如下所示,则表明我们在访问静态资源时,都要在静态资源名称的前面加上/res
spring:
mvc:
static-path-pattern: /res/**
举例:
未加前缀前的访问路径如下所示:
加前缀之后的访问路径如下所示:
如果我们不想将静态资源放置上述路径下,那么我们可以在application.yaml文件中进行配置,如下所示
spring:
resources:
static-locations: classpath:/abc/
有了上述配置之后,则会导致我们在默认路径下的所有资源都不会被访问到
只有abc目录下的静态资源会被访问到,如下所示:
由此说明,一旦我们配置了外部静态资源文件夹,那么默认的静态资源文件夹就无法被访问了