前言:我们前面学习了HTTP协议,这里我们接着学习HTTP协议的请求与响应。首先我们要明确最本质也是初学者最容易搞不懂的点,我们学的HTTP协议到底是什么,跟我们java程序员有什么关系,数据请求到哪里等等知识。
这里我们首先解释一下HTTP与java程序员的关系,HTTP是浏览器访问者(或者是APP使用者)发送的数据,通过HTTP的传输数据,把数据发送到Java后端,为什么要发送到Java后端呢,因为java后端主要是我们实现业务逻辑的地方,我们通过接收这些数据,我们就能进行相关的业务逻辑,我们为什么要封装这些数据呢,因为这些数据需要被处理,存储(保存到数据库),转发。
简单的理解:


请求的工具:postman/APipost
请求
(HttpServletRequest):获取请求数据响应
找到对应的安装包下载即可
请求的参数:
简单参数:


注意:如果方法形参名称与请求参数名称不匹配,可以使用@RequestParam完成映射。@RequestParam中的required属性默认为true,代表该请求参数必须传递,如果不传递将报错。如果该参数是可选的,可以将required属性设置为false。
请求注解:HTTP请求相关的@注解是Spring框架的核心魔法 ,它们让HTTP请求的处理变得声明式、简洁、强大
1.声明式编程:告诉Spring"做什么",而不是"怎么做"
2.简化代码:自动完成繁琐的HTTP处理
3.类型安全:编译时检查,减少运行时错误
4.灵活配置:丰富的属性满足各种需求
5.统一管理:集中管理路由和参数处理
核心价值:让程序员专注于业务逻辑,而不是HTTP协议的细节处理!
请求映射注解:告诉Spring:哪个URL调用哪个方法

参数绑定注解:告诉Spring:请求数据放在哪

请求体注解:

实体参数:
简单实体对象:请求参数名与形参对象属性名相同,定义POjO接收即可

复杂实体对象:请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套POJO属性参数。

需要手动创建JavaBean
数组集合参数
数组参数:请求参数名与形参数组名称相同且请求参数为多个,定义数组类型形参即可接收参数

集合:请求参数名与形参中集合变量名相同,通过@RequestParam绑定参数关系

日期参数
日期参数:使用@DateTimeFormat注解完成日期参数格式转换

JSON 参数
JSON参数:JSON数据键名与形参对象属性名相同,定义POJ0类型形参即可接收参数,需要使用@RequestBody标识

路径参数
路径参数:通过请求URL直接传递参数,使用{...)来标识该路径参数,需要使用@PathVariable获取路径参数

顾客(客户端) → 服务员(Controller) → 后厨(Service) → 菜品(响应)
-
顾客点餐(HTTP请求)
-
服务员接收订单(Controller接收请求)
-
服务员安排后厨做菜(Controller调用Service)
-
服务员上菜(Controller返回响应)
顾客(客户端) → 服务员(Controller) → 后厨(Service) → 菜品(响应)
-
顾客点餐(HTTP请求)
-
服务员接收订单(Controller接收请求)
-
服务员安排后厨做菜(Controller调用Service)
-
服务员上菜(Controller返回响应)
总结:Controller 的作用
Controller 是 Spring MVC 的交通警察:
-
路由分发:把不同的HTTP请求分发给不同的处理方法
-
数据转换:把HTTP请求数据转换成Java对象
-
业务协调:组织Service层完成业务逻辑
-
响应封装:把处理结果转换成HTTP响应
-
异常处理:统一处理请求过程中的异常
没有 Controller:HTTP请求直接进入业务代码,代码混乱、难以维护、重复劳动。
有 Controller:清晰的层次结构、易于维护、代码复用、团队协作友好。
简单来说 :Controller 就是连接外部世界(HTTP)和你内部业务逻辑的桥梁!
响应数据
@ResponseBody
类型:方法注解、类注解
位置:Controller方法上/类上
作用:将方法返回值直接响应,如果返回值类型是实体对象/集合,将会转换为jSON格式响应说明:@RestController=@Controller +@ResponseBody;

分层解耦
内聚:++软件中各个功能模块内部的功能联系。++
耦合:++衡量软件中各个层/模块之间的依赖、关联的程度。++
软件设计原则:++高内聚低耦合。++
控制反转:++InversionOfControl,简称IOC。对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转。++
依赖注入:++Dependency Injection,简称Dl。容器为应用程序提供运行时,所依赖的资源,称之为依赖注入。++
Bean对象:++IOC容器中创建、管理的对象,称之为bean。++

注意事项
声明bean的时候,可以通过value属性指定bean的名字,如果没有指定,默认为类名首字母小写。
使用以上四个注解都可以声明bean,但是在springboot集成web开发中,声明控制器bean只能用@Controller.

Bean组件扫描
前面声明bean的四大注解,要想生效,还需要被组件扫描注解@ComponentScan扫描。
@Componentscan注解虽然没有显式配置,但是实际上已经包含在了启动类声明注解@SpringBootApplication中,默认扫描的范围是启动类所在包及其子包。
依赖注入的注解
@Autowired:默认按照类型自动装配。
如果同类型的bean存在多个:
@Primary
@Autowired +@Qualifier("bean的名称")
@Resource(name="bean的名称")
@Resource 与 @Autowired区别
@Autowired 是spring框架提供的注解,而@Resource是JDK提供的注解。
@Autowired 默认是按照类型注入,而@Resource默认是按照名称注入。