第一部分:Spring Boot概述
1.1 什么是Spring Boot
⭐ 老师强调 :Spring Boot可视为Spring MVC和Spring的结合体 ,核心优势在于简化了原有SSM框架的复杂配置,大幅减少需要手动编写和维护的配置文件数量。
SSM vs Spring Boot:
| 对比 | SSM框架 | Spring Boot |
|---|---|---|
| 配置文件 | 大量XML配置 | 极少配置即可跑 |
| 依赖管理 | 手动管理版本冲突 | 官方父工程统一管理 |
| 服务器 | 需手动部署Tomcat | 内置Tomcat |
| 启动方式 | 部署到容器 | main方法直接启动 |
⭐ 老师强调 :Spring Boot虽简化配置,但注解和请求语法规则与Spring MVC完全一致,该用的注解正常用,别误以为写法变了。
1.2 JDK版本注意
⭐ 老师强调 :Spring Boot 3要求JDK至少17 ,而咱们现在用的是1.8。软件工程并非工具越新越好------新版本未经充分测试,藏有未暴露问题;企业交付时若出新故障,常无前人方案可查。
| Spring Boot版本 | JDK要求 |
|---|---|
| Spring Boot 2.x | JDK 8+ |
| Spring Boot 3.x | JDK 17+ |
第二部分:创建Spring Boot项目
2.1 手动创建(推荐)
⭐ 老师强调 :手动建项目更干净------只需建个纯净的Maven项目,不起特殊模板,关键标识是有pom.xml文件。
步骤:
- 新建纯Maven项目(不带模板)
- JDK选1.8
- 在pom.xml中加
<parent>继承Spring Boot官方父工程 - 引入核心启动器依赖
2.2 pom.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.qcby</groupId>
<artifactId>SpringBootProject</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 父项目:继承Spring Boot官方父工程 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.18</version>
</parent>
<dependencies>
<!-- Spring Boot核心基础启动器(必加) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- 加载web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- thymeleaf模板 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
⭐ 老师强调 :
<parent>标签的作用像"认亲",让项目成为Spring Boot的子辈,从而获得其依赖与配置管理。必须加spring-boot-starter核心启动器,否则项目起不来。
2.3 主启动类
package com.qcby;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringBootProjectApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootProjectApplication.class, args);
}
}
⭐ 老师强调:
- 主启动类放在com.qcby包下(所有Java程序也放这里,后续按controller、service、dao分层)
- 类名随意,习惯叫
项目名+Application- 必须加**@SpringBootApplication**注解
run()方法参数用当前类的类对象
2.4 项目结构
src/
├── main/
│ ├── java/
│ │ └── com.qcby/
│ │ ├── SpringBootProjectApplication.java ← 主启动类
│ │ ├── controller/ ← 控制层
│ │ ├── service/ ← 业务层
│ │ └── dao/ ← 持久层
│ └── resources/
│ ├── application.yml ← 配置文件
│ ├── static/ ← 静态资源
│ │ ├── index.html
│ │ ├── css/
│ │ └── js/
│ ├── templates/ ← 模板页面
│ │ └── suc.html
│ └── banner.txt ← 自定义启动图标(可选)
⭐ 老师强调:
- static放可直接访问的静态页
- templates放需经处理的模板页
- 两者不能混放,否则访问不到
第三部分:注解体系
3.1 分层注解
⭐ 老师强调:项目分控制层、业务层、持久层,请求从浏览器到controller,经service再到dao操作数据库,再逐层返回,每层各有注解。
| 注解 | 对应层 | 说明 |
|---|---|---|
@Controller |
控制层 | 接收请求 |
@Service |
业务层 | 处理业务逻辑 |
@Repository |
持久层 | 数据访问 |
@Component |
通用 | 任意组件 |
⭐ 老师强调 :这些注解本质无区别 ,都是把类交给框架创建对象;约定俗成才让controller用
@Controller、service用@Service。注解只管对象托管,不分层的逻辑约束。
3.2 控制反转(IOC)
⭐ 老师强调 :Java里没加static的方法属于对象级别,得先创建对象才能调用。正常得自己new对象再调,但没地方写创建代码时,就把创建对象交给Spring框架------这就是控制反转。
@Controller // 加在类上,Spring自动帮你创建对象
public class HelloController {
// 不用自己new,Spring接管
}
⭐ 老师强调:原本对象创建和调用全靠自己写代码,现在靠注解"甩手"给框架,它内部悄悄完成了new的操作。
3.3 请求映射注解
@Controller
@RequestMapping("/hello") // 类级路径(1级目录)
public class HelloController {
@RequestMapping(path = "world", method = {RequestMethod.GET},
produces = "application/json;charset=UTF-8")
@ResponseBody
public String hello() {
System.out.println("hello");
return "{\"message\":\"hello\"}";
}
}
@RequestMapping属性:
| 属性 | 作用 | 说明 |
|---|---|---|
path / value |
请求的url | 二者等价 |
method |
请求方式 | GET/POST等 |
produces |
响应头 | 返回数据的类型和编码 |
⭐ 老师强调:
@RequestMapping相当于之前Servlet里的@WebServlet,用来指定方法对应的访问路径- 类上写1级目录,方法上写2级目录,访问需一层层来
- 项目小、方法少时全写在方法上不冲突就行;但文件多、controller多时易冲突,务必在类上挂1级目录做区分
pass和value等价,用哪个都行- 类上路径建议挂斜杠,方法上通常不挂,挂不挂都能匹配
3.4 @ResponseBody
⭐ 老师强调 :Spring MVC默认机制------若不加
@ResponseBody,框架会认为要返回具体页面资源。
| 是否加注解 | 返回内容 |
|---|---|
| 不加 | 走视图解析,找页面 |
加@ResponseBody |
直接返回数据 |
// 返回数据(JSON字符串)
@RequestMapping("hello")
@ResponseBody
public String hello() {
return "{\"message\":\"hello\"}";
}
// 返回页面(走视图解析)
@RequestMapping("test")
public String test(Model model) {
model.addAttribute("message", "hello");
return "suc"; // 找templatessuc.html
}
⭐ 老师强调 :直接返回的内容即便看起来像json,浏览器也只当作普通字符串,不会按json格式解析。必须设置响应格式为json (用
produces),浏览器才按json处理。
第四部分:配置文件
4.1 application.yml
#server:
# port: 8081
# servlet:
# context-path: /sp2
#spring:
# mvc:
# static-path-pattern: /as/**
spring:
thymeleaf:
cache: false #关闭页面缓存
encoding: utf-8 #编码
prefix: classpath:/templates/ #页面映射路径
suffix: .html #视图的后缀
mode: HTML5 #模板模式
4.2 常用配置项
| 配置项 | 说明 |
|---|---|
server.port |
端口号(默认8080) |
server.servlet.context-path |
项目根路径 |
spring.thymeleaf.cache |
页面缓存(false关闭) |
spring.thymeleaf.prefix |
页面映射路径 |
spring.thymeleaf.suffix |
视图后缀 |
⭐ 老师强调:
- 配置文件一般命名
application,有两种类型:.properties(点号分隔)和.yml(缩进)- yaml中冒号后必须加空格,否则识别不了
#表示注释,注释掉的配置不生效- 两种格式只是书写差异,底层配置逻辑一致
第五部分:静态资源与模板
5.1 静态资源(static)
⭐ 老师强调 :static目录就相当于项目的根目录,默认访问路径就在它下面。
访问规则:
| 资源 | 访问路径 |
|---|---|
| staticindex.html | http://localhost:8080/ 或 index.html |
| staticsuc.html | http:suc.html |
| static/css/index.css | /css/index.css |
⭐ 老师强调:
- 浏览器直接访问时无法写 /static,因为static就是根目录
- 引入资源路径从根目录出发,不要带
/static前缀- 默认首页都叫index.html
5.2 模板页面(templates)
⭐ 老师强调 :templates文件夹下的页面无法直接通过url访问。因为静态资源只去static里找,templates里的内容那样找根本找不到。
| 目录 | 访问方式 |
|---|---|
| static | 可直接url访问 |
| templates | 必须经controller返回 |
@RequestMapping("test")
public String test(Model model) {
model.addAttribute("message", "hello");
model.addAttribute("name", "lisa");
return "suc"; // 找templatessuc.html,拼成suc.html
}
5.3 Thymeleaf模板引擎
suc.html:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
success!!!
<p th:text="${message}"></p>
<p th:text="${name}"></p>
</body>
</html>
⭐ 老师强调:
- 用模板引擎的好处是:边跳页边带数据
th:text="${message}"直接取controller传的message- 直接读这些数据必须引入命名空间 (
xmlns:th),否则取不到- 用模板引擎就别手写JS赋值,多此一举
第六部分:请求参数接收
6.1 基本参数接收
@RequestMapping("test1")
@ResponseBody
public void test1(String name, int age,
@RequestParam(value = "sex", required = true) String sex) {
System.out.println(name); // 张三
System.out.println(age); // 20
System.out.println(sex); // 女
}
前端ajax:
$(".btn").click(function() {
$.ajax({
url: "/test1",
type: "get",
data: {
name: "张三",
age: 20,
sex: "女"
},
success: function(value) {
console.log(value);
}
});
});
⭐ 老师强调 :用字段名直接接收参数时,系统会按名字自动一一匹配 。
@RequestParam的required=false表示传不传都行,true则强制校验,不传会报错。
6.2 复杂参数(嵌套对象)
⭐ 老师强调 :JS里不能直接传对象格式,必须拆开用带引号的点语法传。
data: {
name: "张三",
age: 20,
sex: "女",
"friends.name": "李华", // 嵌套对象拆开
"friends.age": 22,
play: ['足球','篮球','羽毛球'] // 数组
}
后端接收:
@RequestMapping("test1")
@ResponseBody
public void test1(String name, int age,
@RequestParam("friends.name") String fName,
@RequestParam("friends.age") String fAge,
@RequestParam("play[]") String[] play) {
System.out.println(fName); // 李华
System.out.println(fAge); // 22
System.out.println(Arrays.toString(play)); // [足球, 篮球, 羽毛球]
}
⭐ 老师强调:
- Java里不能写成"对象.属性"形式,因为Java没有这种变量
- 必须重命名参数 (如fName、fAge),再用
@RequestParam建立映射- 想识别数组,需给Play套两层中括号 (
play[])- 实际开发中直接传值更常用,这种加中括号的用法较少见
6.3 实体类接收
User实体类:
package com.qcby.entity;
import java.util.List;
public class User {
private String name;
private Integer age;
private String sex;
private Friends friends;
private List<String> play;
// getter/setter、toString省略
}
Friends实体类:
package com.qcby.entity;
public class Friends {
private String name;
private Integer age;
// getter/setter、toString省略
}
后端接收:
@RequestMapping("test1")
@ResponseBody
public void test1(User user) {
System.out.println(user.getName());
System.out.println(user.getAge());
System.out.println(user.getSex());
System.out.println(user.getFriends().getName());
System.out.println(user.getFriends().getAge());
List<String> playList = user.getPlay();
for (String play : playList) {
System.out.println(play);
}
}
⭐ 老师强调:
- 简单字段可包进User实体
- Friends属于嵌套结构,需再嵌套别的实体
- 集合需循环打印,直接打印看不到内容
6.4 JSON格式传参
⭐ 老师强调 :get请求只能传简单数据,无法传json格式 这类复杂数据包。想传json对象这种复杂数据,必须换成post请求。
前端(JSON格式):
$(".btn").click(function() {
var obj = {
name: "张三",
age: 20,
sex: "女",
friends: {
name: "李华",
age: 22
},
play: ['足球','篮球','羽毛球']
};
$.ajax({
url: "/test1",
type: "post",
contentType: "application/json",
data: JSON.stringify(obj),
success: function(value) {
console.log(value);
}
});
});
后端接收:
@RequestMapping("test1")
@ResponseBody
public void test1(@RequestBody User user) {
System.out.println(user.getName());
// ...
}
⭐ 老师强调:
- 要用JSON模块的
JSON.stringify()把obj转成json格式- 加
contentType: "application/json"声明传递的是json数据- 后端用
@RequestBody专门解析JSON格式- 不加
@RequestBody就读不到,参数会是空- 必须换成post请求
6.5 参数接收方式对比
| 方式 | 适用 | 前端写法 | 后端接收 |
|---|---|---|---|
| 表单键值 | 简单数据 | data: {name, age} |
直接参数名 |
| 嵌套拆开 | 嵌套对象 | "friends.name": "李华" |
@RequestParam("friends.name") |
| 实体类 | 整体封装 | 同上 | User user |
| JSON | 复杂数据 | JSON.stringify(obj) |
@RequestBody User user |
| Servlet | 传统方式 | - | HttpServletRequest |
第七部分:Spring MVC页面跳转与数据传递
7.1 Model传数据
@RequestMapping("test")
public String test(Model model) {
model.addAttribute("message", "hello");
model.addAttribute("name", "lisa");
return "suc"; // 返回templatessuc.html
}
suc.html:
<p th:text="${message}"></p> <!-- 输出 hello -->
<p th:text="${name}"></p> <!-- 输出 lisa -->
⭐ 老师强调 :
model.addAttribute把数据带到页面,模板引擎用th:text="${变量名}"直接取。
第八部分:自定义启动图标(Banner)
8.1 自定义banner
⭐ 老师强调:Tomcat启动时的banner图标默认是官方样式,但可以自定义。
步骤:
-
在resource目录下建
banner.txt -
把自定义图案粘贴进去
-
启动时自动读取该文件
// 方式1:默认自动读取banner.txt
SpringApplication.run(SpringBootProjectApplication.class, args);// 方式2:手动设置关闭banner
SpringApplication springApplication = new SpringApplication(SpringBootProjectApplication.class);
springApplication.setBannerMode(Banner.Mode.OFF); // OFF=关闭
springApplication.run(args);
| 设置 | 效果 |
|---|---|
| 无banner.txt | 走官方图标 |
| 有banner.txt | 用自己的 |
Banner.Mode.OFF |
关闭图标 |
⭐ 老师强调:有个网站能生成各类图标------上方修改时下方自动实时更新,改了设置立刻生效。
附录一:核心注解速查表
| 注解 | 作用 |
|---|---|
@SpringBootApplication |
主启动类标识 |
@Controller |
控制层 |
@Service |
业务层 |
@Repository |
持久层 |
@Component |
通用组件 |
@RequestMapping |
建立url请求映射 |
@ResponseBody |
返回数据(非页面) |
@RequestParam |
接收请求参数 |
@RequestBody |
接收JSON数据 |
@RequestMapping属性
| 属性 | 说明 |
|---|---|
path / value |
请求url(等价) |
method |
请求方式 |
produces |
响应头 |
@RequestParam属性
| 属性 | 说明 |
|---|---|
value |
参数名 |
required |
是否必传(true/false) |