静态资源访问
类路径的根路径 /
拓展知识:类路径的根路径 / 是什么?
答:简单来说,可以认为 文件夹所代表的路径就是类路径的根路径。
.
静态资源目录(路径)
基本介绍
By default, Spring Boot serves static content from a directory called
/static
(or/public
or/resources
or/META-INF/resources
) in the classpath or from the root of theServletContext
.
默认情况,只要静态资源放在类路径下的 /static
、/public
、/resources
、/META-INF/resources
文件夹。就可以通过:当前项目根路径/ + 静态资源名 的方式来访问。
eg. http://localhost:8080/beans.xml
原理分析
原理:默认静态映射
/**
。解释:请求进来后,先去找对应的
Controller
处理,如果有对应的Controller
则直接处理(不会再将请求交给静态资源处理器处理);如果没有对应的
Controller
处理请求,则由静态资源处理器处理请求,静态资源处理器处理请求的操作很简单,就是去找有没有相对应的静态资源,如果有,返回静态资源。没有就响应 404 页面。
案例:假如有一个处理 /bean.xml
请求的 Controller
以及有一个 bean.xml
的静态资源,则 http://localhost:8080/beans.xml 返回的结果是什么?
@GetMapping("/beans.xml")
public String getBeansXml() {
return "getBeansXml()";
}
答:返回 getBeansXml()
字符串,而不是 bean.xml
文件的内容。
解析:按照通配符规则,越详细的优先级越高,所有优先匹配 /bean.xml
的 Controller
,而不是匹配 /**
的静态资源处理器。
修改静态资源存放路径
改变默认的静态资源存放目录(路径)
默认是
/static
、/public
、/resources
、/META-INF/resources
文件夹。
spring:
resources:
static-locations: [classpath:/rnny/]
注意:
static-locations
的值需要用数组写法。- 注意数组的每个元素的书写格式。
classpath:/{dir1}/{dir2}/.../
classpath:
必须要写,且:/
之间没有空格。- 最后要以
/
结尾。
- 修改之后的路径依旧包括
/META-INF/resources
文件夹(具体原因不详!)。
为什么?底层源码就是这么写的。
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = { "classpath:/META-INF/resources/","classpath:/resources/", "classpath:/static/", "classpath:/public/" };
静态资源访问前缀
默认无访问前缀。
默认静态资源访问路径为:当前项目 + 静态资源名。eg. http://localhost:8080/静态资源名
spring:
mvc:
static-path-pattern: /res/**
修改之后的静态资源访问路径:当前项目 +
static-path-pattern
+ 静态资源名。
webjar
webjar实际用处不是很大,但是对于路径的理解还是有点帮助的。
默认自动映射 /webjars/**
<dependency>
<groupId>org.webjars</groupId>
<artifactId>jquery</artifactId>
<version>3.5.1</version>
</dependency>
访问地址:http://localhost:8080/webjars/jquery/3.5.1/jquery.js 后面地址要按照依赖里面的包路径
.
欢迎页支持
静态资源路径下,
index.html
- 可以配置静态资源路径
- 但是不可以配置静态资源的访问前缀。否则导致
index.html
不能被默认访问。
spring:
# mvc:
# static-path-pattern: /res/** 这个会导致 welcome page 功能失效
resources:
static-locations: [classpath:/hehe/]
提示:Controller
能处理 /index
自定义 Favicon
favicon.ico
放在静态资源目录下即可。
spring:
# mvc:
# static-path-pattern: /res/** 这个会导致 Favicon 功能失效
通配符
通配符匹配规则如下:
- 符号 “
*
” 匹配任意字符,符号 “**
” 匹配任意路径,符号 “?
” 匹配单个字符。 - 没有通配符的优先级高于有通配符的,比如
/user/add.json
比/user/*.json
优先匹配。 - 有 “
*
” 通配符的优先级高于有 “**
” 的。