SpringBoot入门
修改历史:
- 增加了Web入门的基础知识,完善了结构
SpringBoot入门
0.概述
本篇只是对springboot的基本使用的总结,学习视频->Day05-01. 请求响应-概述_哔哩哔哩_bilibili,使用postman进行调试。
1.Web入门
HTTP协议
概述
HTTP协议(HyperTextTransferProtocol),超文本传输协议,规定了浏览器和服务器之间数据传输的规则。
特点:
- TCP协议:面向连接,安全
- 基于请求-响应模型:一次请求对应一次响应
- HTTP是无状态的协议:对于事务处理没有记忆能力。每次请求-响应都是独立的
- 缺点:多次请求无法共享数据
- 优点:速度快
请求协议
请求数据包括三个部分:
请求行:请求数据第一行(请求方式,资源路径、协议)
请求头:第二行开始,格式key: value
请求体:POST请求,存放请求参数
两种请求方式对比:
-
请求方式-get:请求参数在请求行中,没有请求体。get请求大小是有限制的。
-
请求方式-post:请求参数在请求体中,post请求大小是没有限制的。
响应协议
响应数据包括三部分:
-
响应行:相应数据第一行(协议、状态码、描述)
-
响应头:key: value
-
响应体:存放响应数据
常见状态码:
状态码 | 描述 |
---|---|
1xx | 响应中 |
2xx | 成功 |
3xx | 重定向-重定向到其他地方;让客户端再发起一次请求以完成整个处理 |
4xx | 客户端错误-处理发生错误,责任在客户端。如请求了不存在的资源、客户端未被授权、禁止访问 |
5xx | 服务器错误-处理发生错误,责任在服务端。如程序抛出异常 |
目前主要了解:200 处理成功,404 请求资源不存在,500 服务器端异常
更多状态码见网站:
状态 | Status - HTTP 中文开发手册 - 开发者手册 - 腾讯云开发者社区-腾讯云
协议解析
服务器端要做的事情,一方面是要根据请求协议,解析浏览器发送的请求;另一方面是要根据响应协议,发送响应数据。
这种解析的工作较为固定,有不少Web服务器已经完成了这些工作,这样后端就只用关注业务逻辑的实现。常见的Web服务器有:Tomcat、IBM、jetty、WebLogic等
Tomcat服务器
具体内容暂时不用详细了解,SpringBoot已经内嵌了Tomcat服务器,所以不用专门下载。介绍在此省略
2.请求
此处请求的含义:后端接收来自浏览器端的请求指令,进行解析
简单参数
请求:
GET指令:http://localhost:8080/simpleParam?name=miku&age=16
POST指令:http://localhost:8080/simpleParam
请求体:name=Miku&age=16
Java代码:
原始方式:
1 | //在原始的Web程序中,获取请求参数,需要通过HttpServletRequest对象手动获取 |
SpringBoot方式:
简单参数,参数名与形参列表名相同,定义形参即可接收参数
1 |
|
如果形参名和请求参数名不一致,可以使用@RequestParam进行映射
1 |
|
注解@RequestParam中有两个属性,一个是重定向,一个是required属性,第二个参数如果不写默认为true,即参数是必须的,如果缺少该参数会报400的状态码,表明客户端请求错误。
实体参数
简单实体对象,请求参数名与形参对象属性名相同,定义POJO接收即可
请求:http://localhost:8080/simplePojo?name=miku&age=16
1 |
|
需要创建User对象,声明相应属性、getset方法、toString方法
复杂实体对象,请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套POJO属性参数
请求:http://localhost:8080/complexPojoname=miku&age=16&address.city=Tokyo&address.country=Japan
1 |
|
数组参数
请求参数名与形参数组名相同且请求参数为多个,定义数组类型形参即可接收参数
请求:http://localhost:8080/arrayParam?friend=Miku&friend=Kurumi&friend=Marin
1 |
|
集合参数
请求参数名与形参集合名称相同且请求参数为多个,@RequestParam绑定参数关系
请求:http://localhost:8080/arrayParam?friend=Miku&friend=Kurumi&friend=Marin
1 |
|
日期参数
使用@DateTimeFormat注解完成日期参数格式转换
请求:http://localhost:8080/dateParam?updateTime=2025-06-03 17:47:55
1 |
|
json参数
json参数根据键名与形参对象属性名相同,定义POJO类型形参即可接收参数,需要使用@RequestBodt标识
请求:
请求行http://localhost:8080/jsonParam
请求体
1 | { |
1 |
|
路径参数
通过请求URL直接传递该参数,使用{…}来表示该路径参数,需要使用@PathVariable获取路径参数
请求:http://localhost:8080/path/1
1 |
|
获取多个路径参数:
请求:http://localhost:8080/path/1/Miku
1 |
|
3.响应
@Response注解
位置:Controller类上或者方法上
作用:将方法返回值直接响应,若返回值是实体对象/集合,转为JSON格式响应
统一响应结果:
Result(code、msg、data)
4.分层解耦
三层架构
三层架构包括控制层(Controller)、业务逻辑层(Service)、数据访问层(Dao)
graph LR
浏览器==>Controller
Controller==>Service
Service==>Dao
-
Controller:控制层,接收前端发送的请求,(对请求进行处理),进行响应
-
Service:业务逻辑层,处理具体的业务逻辑
-
Dao:数据访问层(持久层),负责数据的访问操作
介绍完三层架构之后,那么就该谈到它的实现了,如果说只是用程序进行控制,那么就很容易会产生耦合,使得代码的拓展性大大降低。好在Spring给我们提供了IOC,我们可以通过Spring容器来对 Bean对象 进行控制,这样不同层的代码就相互独立起来。
IOC(控制反转)
涉及到四个注解:
@Component、@Controller、@Service、@Repository
后边三个都是@Component的衍生注解,实际功能与@Component类似,但是推荐使用后三个,当某一个部分不属于后三个中的任何一个的时候再使用@Component。
- 声明bean的时候,可以使用value属性指定bean的名字,如果没用,则默认为类名的首字母小写形式
- 不只是建议:在使用springboot集成的web开发中,声明控制器bean只能用@Controller
Bean组件扫描
上边的四大注解要想生效,还必须经过Bean组件扫描,使用的是@ComponentScan注解,该注解在启动类的声明注解中已经包含,默认范围是启动类所在包及其子包。可以通过在启动类的注解中加上重写的@ComponentScan来更改扫描路径,但是不推荐更改。
DI(依赖注入)
Spring中,依赖注入是通过@Autowired注解完成的,最简单的的情况下,就在Controller声明Service对象处或者Service声明Dao对象处加上@Autowired注解,就会根据类型自动匹配。
那么如果有多个业务逻辑呢?(以业务逻辑为例)
如果不进行处理,就会存在多个业务逻辑可供选择,直接就会报错。
有三个注解可以用来解决这个问题
- @Primary:见名知意,就是给不同的Service提供一个优先级,那么就会优先注入Primary的依赖
- @Qualified:通过在@Autowired的地方加这个注解,通过其value属性指定相应的Service
- @Resource:不使用@Autowired注解,使用名字进行注入,使用
@Resource(name = "empServiceA")
进行注入,因为是根据名字进行注入的,也就不存在冲突