一、SpringBoot起步依赖
1.1 起步依赖
概念:引入了web依赖和test依赖,这两个依赖都是SpringBoot中的starter依赖,starter依赖也被称为起步依赖,起步依赖可以引入某个功能的相关依赖和一些初始化的配置
Spring官方提供的starter名称为:spring-boot-starter-xxx,例如Spring官方提供的spring-boot-starter-web/test
第三方提供的starter名称为:xxx-spring-boot-starter,例如由mybatis提供的mybatis-spring-boot-starter
1.2 SpringBoot项目版本管理
概念:在入门案例中,我们通过maven引入了web和test依赖,但是并没有指定具体的依赖版本号的?这是因为SpringBoot使用了Maven的继承,每一个SpringBoot工程都有一个父工程,依赖的版本号,在父工程中统一管理
1.3. Maven管理标签
parent:继承标签,Mavan父子项目中用于继承父项目
dependencyManagement:依赖管理标签,用于在父项目声明依赖,但并不是引入依赖到项目中。在子工程中用到声明的依赖时,可以不加依赖的版本号,这样可以做到统一管理工程中用到的依赖版本
pluginManagement:插件管理标签,作用与dependencyManagement一样,也是声明插件但不引入。在子工程中用到声明的插件时,可以不加插件的版本号,这样可以做到统一管理工程中用到的插件版本
properties:属性标签,在标签内可以把版本号作为变量进行声明,后面dependency中用到版本号时可以用${变量名}的形式代替,这样做的好处在于当版本号发生改变时,只要更新properties标签中的变量就行了,不用更新所有依赖的版本号
dependencies:依赖标签,项目中要引入的依赖需要通过此标签进行引入
build:描述了如何编译及打包项目,具体的编译和打包工作是通过其中的plugin配置来实现的,Maven的所有操作其根本都是通过插件进行实现的
1.4 SpringBoot启动类
概念:当一个类使用**@SpringBootApplication**这个注解他就是SpringBoot启动类,SpringBoot就是运行这个类的main方法来启动Spring程序的
启动类位置:启动类需要放在业务类同包或父包中,也就是保证启动类是所有Java代码的平级或父级,需要注解需要被启动类扫描到才会起作用
启动类命名规则:
1.5 SpringBoot配置文件
概念:SpringBoot的配置文件有三种,优先级最高的是properties,如果内容发生冲突以properties为主,如果内容不冲突这三个配置文件的所有配置都会生效
- application.properties
- application.yaml
- application.yml
1. key和value之间除了有冒号在冒号后面还必须有空格:key: value
2. 配置前缀层级关系只能以一个Tab的空格,不能多也不能少
3. value如果是字符串不需要加双引号
注意:yml中编写错误右上角会有提示-显示黄色警告(正确时显示绿色√),但有的时候是误报要注意区分
1.6 多环境配置
概念:编写多套环境配置在不同环境中我们可以进行快速切换,而不需要再去修改原有配置
- dev:开发环境,端口号为8081
- pro:生产环境,端口号为8082
- test:测试环境,端口号为8083
方式一:配置写在一个文件中
# 最上面的就是默认配置,默认配置不需要指定profile
server:
# 设置端口号
port: 8081
spring:
profiles:
# 要启动的环境标识,如果环境标识在下面找不到那么就启动默认配置
active: dev
# 每套环境中间需要有此分隔符,分隔每套环境
---
server:
# 设置端口号
port: 8082
spring:
config:
activate:
on-profile: pro
---
server:
# 设置端口号
port: 8083
spring:
config:
activate:
on-profile: test
方式二:多文件配置
1.7 SpringBoot单元测试
1.8 前后端不分离
概念:在JavaWeb项目中,有一种项目架构是将页面资源交由后端进行解析,然后响应页面资源给前端,这种项目架构称为前后端不分离项目
前后端分离
概念:目前主流的开发模式就是前后端分离模式,前端项目和后端项目分开构建,分开开发和部署。前端使用Mockjs或fastMock模拟假数据和接口进行测试,后端使用PostMan、ApiFox等工具进行测试
1.9 Controller控制器
概念:Controller是一个代码方案,可以通过具体的技术实现:Servlet,SpringMvc。Servlet是处理请求的底层代码,而SpringMvc是Spring提供的一个处理请求的框架,底层还是通过Servlet实现的,可以看成是对Servlet的封装,让代码写起来更加简单,更加灵活
1.10 SpringMvc
概念:SpringMvc是基于Spring框架的一个用于处理web请求的框架,底层就是Servlet
- SpringBoot中已经封装好了SpringMvc框架,我们只需要导入起步依赖spring-boot-starter-web即可使用
- SpringMvc中有一个非常重要的Servlet类,叫做DispatcherServlet,这也是SpringMvc的核心功能
- Spring(ioc,aop - 管理对象,抽取公共业务)、SpringMvc(处理请求的)、SpringBoot(简化配置,简化启动部署)关系如下
1.11 DispatcherServlet
概念:SpringMVC提供了一个DispatcherServlet类,称之为核心控制器,DispatcherServlet负责接收请求,然后根匹配规则将请求再转发给后面的请求处理器Controller,请求处理器处理完请求之后,最终再由DispatcherServlet给浏览器响应数据
1.12 请求和响应对象
概念:浏览器发送请求,会将请求包装成请求数据包发送给tomcat服务器,Tomcat会解析这些请求数据,然后将解析后的请求数据传递给HttpServletRequest对象,那也就意味着 HttpServletRequest对象就可以获取到请求数据,例如:请求参数、请求IP、请求头信息等等
Tomcat还给Servlet程序传递了一个参数 HttpServletResponse,通过这个对象,我们就可以给浏览器设置响应数据
1.13 后端接口
概念:Controller方法就是一个接口,那个Controller类就是接口。
安装步骤见文档Spring高级
3.1 数据交换格式
概念:数据交换/数据交互指的是不同语言或不同项目之间数据的共享,数据要以统一的格式(所有语言,所有项目都能识别)进行保存。而目前基本所有项目或所有语言都能识别的数据格式:xml和json
- xml目前一般只用于做配置文件
- json以轻量和解析方便的优势作为数据交换格式
- 数据库用来存储文件
3.2 Json数据格式(JavaScript Object Notation - JS对象表示法)
概念:一种轻量级的数据交换格式。易于人阅读和编写,可以在多种语言之间进行数据交换,同时也易于机器解析和生成
Json数据格式
- 一个对象:{“key1”:“value1”,“key2”:“value2”…}
- 多个对象:[{“key1”:“value1”,“key2”:“value2”…},{“key1”:“value1”,“key2”:“value2”…},{“key1”:“value1”,“key2”:“value2”…}]
注意::JSON数据格式就是以key-value形式的数据格式,KEY必须 以 “” 包裹起来,并且如果value是字符串也必须以 “” 包裹起来,如果不是字符串那么正常写就可以
四、SpringBoot中Controller应用
4.1 公共资源路径
概念:在企业开发中,不会把所有模块的接口写在一个控制器类中,通常会按照模块划分控制器类
- 用户模块控制器类:UserController
- 员工模块控制器类:EmployeeController
- 部门模块控制器类:DepartmentController
那么将模块划分到了不同的控制器类中之后,通常会为每个模块的控制器类定义一个唯一公共资源标识
- 请求用户模块:/user
- 请求员工模块:/employee
- 请求部门模块:/department
抽取公共资源路径:将公共资源路径抽取到控制器类上使用@RequestMapping(“公共资源路径”)注解标识
4.2 参数接收
1.请求对象接受
2.参数接收-通过参数名(参数类型不要用基本类型)
- 参数名不一致时在形参前面加上@RequestParam(value=“传递参数名称”)指定前端传递的那个参数映射到形参中
@RequestParam属性
- value:指定前端传递的参数名称
- required:此参数是否必填,默认为true,如果使用默认为true的属性值前端没有传递此参数时会响应400
参数接收-实体对象
参数接收-数组集合
参数接收-日期参数
概念:日期类型与其他类型不同,日期类型在接收时需要指定@DateTimeFormat(pattren=“日期格式”)注解,然后通过Date或LocalDateTime对象进行接收。
参数接收-JSON数据
参数接收-路径参数
RESTfulAPI:RESTFul风格的接口。用URL定位资源,用HTTP动词(GET、POST、PUT、DELETE)描述操作
要求:
- 请求方式区别资源
- 资源路径只能有名词不能有动词
操作 | 请求方式 | 说明 |
---|---|---|
C:新增 | POST | 新增操作使用POST请求方式 |
R:读取 | GET | 获取等操作使用GET请求方式 |
U:修改 | PUT | 修改等操作使用PUT请求方式 |
D:删除 | DELETE | 删除等操作使用DELETE请求方式 |
注意:同一个Controller类/接口类中不能有相同请求(请求方式 + 请求地址 ),否则启动就报错
使用:@RequestMapping注解可以指定所有请求方式,企业开发中不再使用@RequestMapping指定接口请求方式,只使用@RequestMapping注解指定唯一公共资源路径
@RestController注解,这是一个复合注解,其底层包含了如下两个注解
- **@Controller:标识当前类是一个控制器类 **
- @ResponseBody:加在类上代表整个控制器类的接口方法都响应JSON格式数据返回给前端
接口响应单个JSON对象
接口响应集合JSON对象
统一响应结果
为什么要统一:
- 前端每次都要根据不同的结果做不同的处理,非常麻烦
- 不知道后端接口请求是否成功,无法做进一步的处理
定义统一响应结果类工具类:
package cn.itsource.utils;
/**
* @Date: 2023-08-04
* @Description: 响应信息结果类
* @Version:1.0
*/
public class R<T> {
// 响应状态码
private Integer code;
// 操作结果
private Boolean success;
// 响应数据 - 描述信息
private String message;
// 响应数据 - 其他数据
private T data;
public static <T> R<T> ok() {
return new R<T>(200, true, "操作成功", null);
}
public static <T> R<T> ok(T data) {
return new R<T>(200, true, "操作成功", data);
}
public static <T> R<T> ok(String message) {
return new R<T>(200, true, message, null);
}
public static <T> R<T> ok(String message, T data) {
return new R<T>(200, true, message, data);
}
public static <T> R<T> fail() {
return new R<T>(500, false, "操作失败", null);
}
public static <T> R<T> fail(T data) {
return new R<T>(500, false, "操作失败", data);
}
public static <T> R<T> fail(String message) {
return new R<T>(500, false, message, null);
}
public static <T> R<T> fail(Integer code) {
return new R<T>(code, false, "操作失败", null);
}
public static <T> R<T> fail(String message, T data) {
return new R<T>(500, false, message, data);
}
public static <T> R<T> fail(Integer code, T data) {
return new R<T>(code, false, "操作失败", data);
}
public static <T> R<T> fail(Integer code, String message) {
return new R<T>(code, false, message, null);
}
public static <T> R<T> fail(Integer code, String message, T data) {
return new R<T>(code, false, message, data);
}
public R(Integer code, Boolean success, String message, T data) {
this.code = code;
this.message = message;
this.success = success;
this.data = data;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Boolean getSuccess() {
return success;
}
public void setSuccess(Boolean success) {
this.success = success;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
课程总结
- 什么是起步依赖有,有什么好处 减少配置
- 为什么SpringBoot项目导入依赖不需要导入版本 被父项目管理了
- SpringBoot中配置文件有哪几种,优先级最高的是哪种 3种 properties最高 yaml yml
- 项目开发模式分哪两种,什么是前后端分离项目?
- 注解@RestController和注解@RequestMapping有什么作用
1.@RestController它结合了
@Controller
和@ResponseBody(方法的返回值序列化为特定格式(如 JSON、XML 等))
,其中每个方法的返回值会直接序列化为 JSON 或 XML 数据并发送给客户端,也就是处理请求2.@RequestMapping用于将任意HTTP 请求映射到控制器方法上,也就是请求映射。
- Apifox是什么有什么用 模拟前端发送数据
- xml和json的区别 xml一般做配置文件 json交换数据格式
- 什么是Restful 用URL定位资源,用HTTP动词(GET、POST、PUT、DELETE)描述操作
- 接口中参数接收有哪些方式 对象,数组集合,json,日期,路径
- 接口中如何响应数据 通过requestMapping接收请求,然后通过return响应数据给调用方,前提是必须声明注解requestcontroller(处理请求的)
er和
@ResponseBody(方法的返回值序列化为特定格式(如 JSON、XML 等))`** ,其中每个方法的返回值会直接序列化为 JSON 或 XML 数据并发送给客户端,也就是处理请求
2.@RequestMapping用于将任意HTTP 请求映射到控制器方法上,也就是请求映射。
- Apifox是什么有什么用 模拟前端发送数据
- xml和json的区别 xml一般做配置文件 json交换数据格式
- 什么是Restful 用URL定位资源,用HTTP动词(GET、POST、PUT、DELETE)描述操作
- 接口中参数接收有哪些方式 对象,数组集合,json,日期,路径
- 接口中如何响应数据 通过requestMapping接收请求,然后通过return响应数据给调用方,前提是必须声明注解requestcontroller(处理请求的)