二八佳人体似酥,腰间仗剑斩愚夫。虽然不见人头落,暗里教君骨髓枯。
上一章简单介绍了SpringBoot整合Druid(八),如果没有看过,请观看上一章
我们在编写WEB项目的时候,除了处理后端逻辑,包括业务逻辑和第三方插件等信息之外,还常常需要编写静态的资源信息。
静态信息,用于展示页面内容。
现在,公司基本都采用前后端分离,进行处理大中型项目。 但是小型的项目,或者我们的练习项目,通常采用的都是前后端不分离进行处理。
在SSM阶段的时候,我们会将静态的资源放置在 webapps/WEB-INFO 目录下, 放置在这个目录下的静态资源文件,
如 .html, .css,. js 可以直接访问。
SpringBoot 项目,只有一个 resources 目录放置相关的配置文件和静态资源,没有 WEB-INFO 目录,
那么应该放置在哪儿呢?
一. SpringBoot 提供的四种静态资源位置
按照以前的方式,创建一个 Static 的项目。
SpringBoot 默认提供了四种静态资源目录:
- classpath:/public/
- classpath:/static/
- classpath:/resources/
- classpath:/META-INF/resources/
优先级依次升高。 即,如果在四个目录下都放置相同的文件名称的静态文件,访问时,会优先展示 /META-INF/resources下的文件内容。
一.一 public 目录文件
在public 目录下,创建两个静态资源,一个是 b.html, 一个是 bc.css 文件
b.html 文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>B</title>
</head>
<body>
我是 /public 目录下的文件,我叫岳泽霖,一个快乐的程序员
</body>
</html>
bc.css 文件:
p{
height:100px;
color:blue;
}
进行查询展示:
一.二 static 目录文件
在 static 目录下, 创建一个 a.html 文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>C</title>
</head>
<body>
我是 /static 目录下的文件,我岳泽霖,热爱生活,追求快乐
</body>
</html>
进行访问:
也可以放置图片信息,在 static目录下创建 img 目录,下面放置一个 self.png 的图片
进行访问:
如果写成 self.png, 没有这个图片的话:
记住这个展示的页面信息,这是SpringBoot 默认的 404 页面。
一.三 resources 目录文件
在 resources 目录下创建两个文件, c.html 和 cj.js 文件
c.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>C</title>
</head>
<body>
我叫周小欢,一个可爱的小姑娘
</body>
</html>
cj.js:
alert("Two Butterfly");
进行访问:
一.四 META-INF.resources 目录下文件
META-INF.resources 目录下创建一个 d.html 的文件
d.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>D</title>
</head>
<body>
我是 META-INF.resources 目录下的文件,我叫周小欢,一个新加入的成员。
</body>
</html>
一.五 当各个资源目录下存在相同的文件名称时,访问优先级
静态资源的默认访问优先级:/META-INF/resources/
>/resources/
>/static/
>/public/
在 public 目录下创建一个静态资源, huan.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Public目录</title>
</head>
<body>
我是Public目录下的资源信息
</body>
</html>
在 static 目录下,也创建 huan.html 的静态文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Static目录</title>
</head>
<body>
我是Static目录下的资源信息
</body>
</html>
进行访问时:
static 目录的文件优先级高于 Public 的目录文件
在 resources 目录下,创建 huan.html 的静态文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>resources目录</title>
</head>
<body>
我是resources目录下的资源信息
</body>
</html>
resources目录的文件优先级高于 static 的目录文件
在 META-INF.resources 目录下创建文件 huan.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>META-INF/resources目录</title>
</head>
<body>
我是META-INF/resources目录下的资源信息
</body>
</html>
可以发现, META-INF.resources 目录下的文件优先级最高。
二. 自定义资源目录处理
我们在实际项目中,常常看到 使用 templates 目录文件。
在 templates 目录下 放置 index.html 和一个图片 timg/self.jpg
index.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>主页</title>
</head>
<body>
<p>不管什么时候,总会还有人记得,周小欢和岳泽霖的故事</p>
</body>
</html>
无论是: http://localhost:8081/Static/index.html
还是 http://localhost:8081/Static/tempaltes/index.html
都无法进行访问到相关的资源,会报 404 资源找不到。
这是因为 /templates 目录并不是SpringBoot提供的默认的静态资源, 需要进行相关的配置。
有两种常见的方式,进行处理
二.一 继承 WebMvcConfigurerAdapter 接口进行配置
在 controller 同级目录下 创建 config 包,config 包下创建 MvcConfig 类
二.一.一 全局配置
package top.yueshushu.learn.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
/**
* @ClassName:MvcConfig
* @Description TODO
* @Author zk_yjl
* @Date 2021/6/29 16:31
* @Version 1.0
* @Since 1.0
**/
@Configuration
public class MvcConfig extends WebMvcConfigurerAdapter {
/**
* 配置静态的资源信息
* @param registry
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler(
"/**" //路径是 /**
).addResourceLocations(
"classpath:/templates/" //对应的目录是 templates目录
);
}
}
resourceHandler 表示的是请求的路径, resourceLocations 表示的是该请求路径对应的资源目录信息, 是一一对应的,
可以同时注册多个。
重新启动项目:
输入路径: http://localhost:8081/Static/index.html
发现,可以访问到 templates/index.html 文件内容了。
此时,注意,以前的 SpringBoot提供的默认的四种目录无法访问到
二.一.二 指定路径配置
访问 index.html 时,没有使用任何路径前缀,这是因为 addResourceHandler 使用的是 /**
也可以进行指定
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
/* registry.addResourceHandler(
"/**"
).addResourceLocations(
"classpath:/templates/"
);*/
registry.addResourceHandler(
"/yjl/**" //对应路径的路径是 yjl/
).addResourceLocations(
"classpath:/templates/" //目录是 templates
);
}
前面添加了 /yjl/ 目录
直接输入
会发现,报 404
需要添加 /yjl 路径前缀才可以
注意此时:
访问原先的SpringBoot提供的那四种默认目录下的文件,是可以访问的。
addResourceHandler 的值 已经不是 /** 了,就不会替换默认的了,当配置了 /**时,就会将SpringBoot默认提供的替换。
二.一.三 配置多个路径
再新创建两个目录 s1, s2
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
/* registry.addResourceHandler(
"/**"
).addResourceLocations(
"classpath:/templates/"
);*/
registry.addResourceHandler(
"/yjl/**" //对应路径的路径是 yjl/
).addResourceLocations(
"classpath:/templates/" //目录是 templates
);
registry.addResourceHandler(
"s1/**" //目录s1
).addResourceLocations(
"classpath:/s1/"
);
registry.addResourceHandler("s2/**") //目录s2
.addResourceLocations("classpath:/s2/");
}
进行访问:
通常采用的是这一种方式
二.二 配置文件进行配置资源信息
先在 MvcConfig 类中,去掉 @Configuration 注解。
在 application.yml 配置文件的 spring目录下,添加配置信息(只放置spring目录相关的配置信息)
# 引入 数据库的相关配置
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/springboot?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8&useSSL=false&allowMultiQueries=true
username: root
password: abc123
type: com.alibaba.druid.pool.DruidDataSource
#配置资源信息
mvc:
static-path-pattern: /yjl/** #配置信息,不要忘记 /**表示,任意多层目录
resources:
static-locations: [classpath:/templates] # 写一个的话,会将以前的全部覆盖掉。
重启项目,发现
s1.html 无法访问到
SpringBoot提供的默认目录文件无法访问到
直接 index.html 无法访问到
最前面添加 yjl 之后,才可以访问到。
static-locations 可以配置多个
# 引入 数据库的相关配置
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/springboot?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8&useSSL=false&allowMultiQueries=true
username: root
password: abc123
type: com.alibaba.druid.pool.DruidDataSource
#配置资源信息
mvc:
static-path-pattern: /** # 原先的会清除掉
resources:
static-locations: [classpath:/templates,classpath:/s1,classpath:/s2,classpath:/public,classpath:/static] # 配置多个
这个时候, s1目录,s2目录,templates目录, public目录,static目录均可以进行访问。
但是 resources目录并没有配置,所以无法访问到(不知道为什么,d.html竟然可以访问到)。
b可以访问到:
c无法访问到:
通常采用第一种方式进行配置资源信息。
本章节的代码放置在 github 上: