1.SpringMVC的概述
学习SpringMVC我们先来回顾下现在web程序是如何做的,咱们现在web程序大都基于三层架构来实现。
三层架构
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SV32ZDY9-1677418889816)(assets/1630427303762.png)]](https://img-blog.csdnimg.cn/651d9c149639433b9bd50d4b53b8a5a2.png)
-  浏览器发送一个请求给后端服务器,后端服务器现在是使用Servlet来接收请求和数据 
-  如果所有的处理都交给Servlet来处理的话,所有的东西都耦合在一起,对后期的维护和扩展极为不利 
-  将后端服务器Servlet拆分成三层,分别是 web、service和dao- web层主要由servlet来处理,负责页面请求和数据的收集以及响应结果给前端
- service层主要负责业务逻辑的处理
- dao层主要负责数据的增删改查操作
 
-  servlet处理请求和数据的时候,存在的问题是一个servlet只能处理一个请求 
-  针对web层进行了优化,采用了MVC设计模式,将其设计为 controller、view和Model- controller负责请求和数据的接收,接收后将其转发给service进行业务处理
- service根据需要会调用dao对数据进行增删改查
- dao把数据处理完后将结果交给service,service再交给controller
- controller根据需求组装成Model和View,Model和View组合起来生成页面转发给前端浏览器
- 这样做的好处就是controller可以处理多个请求,并对请求进行分发,执行不同的业务操作。
 
随着互联网的发展,上面的模式因为是同步调用,性能慢慢的跟不是需求,所以异步调用慢慢的走到了前台,是现在比较流行的一种处理方式。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OSJidkkc-1677418889817)(assets/1630427769938.png)]](https://img-blog.csdnimg.cn/f9fbd66e39104908a98db866d04a9795.png)
- 因为是异步调用,所以后端不需要返回view视图,将其去除
- 前端如果通过异步调用的方式进行交互,后台就需要将返回的数据转换成json格式进行返回
- SpringMVC主要负责的就是 
  - controller如何接收请求和数据
- 如何将请求和数据转发给业务层
- 如何将响应数据转换成json发回到前端
 
介绍了这么多,对SpringMVC进行一个定义
-  SpringMVC是一种基于Java实现MVC模型的轻量级Web框架 
-  优点 - 使用简单、开发便捷(相比于Servlet)
- 灵活性强
 这里所说的优点,就需要我们在使用的过程中慢慢体会。 
2.SpringMVC中各注解的使用
知识点1:@Controller
| 名称 | @Controller | 
|---|---|
| 类型 | 类注解 | 
| 位置 | SpringMVC控制器类定义上方 | 
| 作用 | 设定SpringMVC的核心控制器bean | 
知识点2:@RequestMapping
| 名称 | @RequestMapping | 
|---|---|
| 类型 | 类注解或方法注解 | 
| 位置 | SpringMVC控制器类或方法定义上方 | 
| 作用 | 设置当前控制器方法请求访问路径 | 
| 相关属性 | value(默认),请求访问路径 | 
知识点3:@ResponseBody
| 名称 | @ResponseBody | 
|---|---|
| 类型 | 类注解或方法注解 | 
| 位置 | SpringMVC控制器类或方法定义上方 | 
| 作用 | 设置当前控制器方法响应内容为当前返回值,无需解析 | 
知识点4:@ComponentScan
| 名称 | @ComponentScan | 
|---|---|
| 类型 | 类注解 | 
| 位置 | 类定义上方 | 
| 作用 | 设置spring配置类扫描路径,用于加载使用注解格式定义的bean | 
| 相关属性 | excludeFilters:排除扫描路径中加载的bean,需要指定类别(type)和具体项(classes) includeFilters:加载指定的bean,需要指定类别(type)和具体项(classes) | 
知识点5:@RequestParam
| 名称 | @RequestParam | 
|---|---|
| 类型 | 形参注解 | 
| 位置 | SpringMVC控制器方法形参定义前面 | 
| 作用 | 绑定请求参数与处理器方法形参间的关系 | 
| 相关参数 | required:是否为必传参数 defaultValue:参数默认值 | 
知识点6:@EnableWebMvc
| 名称 | @EnableWebMvc | 
|---|---|
| 类型 | 配置类注解 | 
| 位置 | SpringMVC配置类定义上方 | 
| 作用 | 开启SpringMVC多项辅助功能 | 
知识点7:@RequestBody
| 名称 | @RequestBody | 
|---|---|
| 类型 | 形参注解 | 
| 位置 | SpringMVC控制器方法形参定义前面 | 
| 作用 | 将请求中请求体所包含的数据传递给请求参数,此注解一个处理器方法只能使用一次 | 
@RequestBody与@RequestParam区别
-  区别 - @RequestParam用于接收url地址传参,表单传参【application/x-www-form-urlencoded】
- @RequestBody用于接收json数据【application/json】
 
-  应用 - 后期开发中,发送json格式数据为主,@RequestBody应用较广
- 如果发送非json格式数据,选用@RequestParam接收请求参数
 
知识点8:@DateTimeFormat
| 名称 | @DateTimeFormat | 
|---|---|
| 类型 | 形参注解 | 
| 位置 | SpringMVC控制器方法形参前面 | 
| 作用 | 设定日期时间型数据格式 | 
| 相关属性 | pattern:指定日期时间格式字符串 | 
知识点9:@PathVariable
| 名称 | @PathVariable | 
|---|---|
| 类型 | 形参注解 | 
| 位置 | SpringMVC控制器方法形参定义前面 | 
| 作用 | 绑定路径参数与处理器方法形参间的关系,要求路径参数名与形参名一一对应 | 
关于接收参数,我们学过三个注解@RequestBody、@RequestParam、@PathVariable,这三个注解之间的区别和应用分别是什么?
- 区别 
  - @RequestParam用于接收url地址传参或表单传参
- @RequestBody用于接收json数据
- @PathVariable用于接收路径参数,使用{参数名称}描述路径参数
 
- 应用 
  - 后期开发中,发送请求参数超过1个时,以json格式为主,@RequestBody应用较广
- 如果发送非json格式数据,选用@RequestParam接收请求参数
- 采用RESTful进行开发,当参数数量较少时,例如1个,可以采用@PathVariable接收请求路径变量,通常用于传递id值
 
知识点10:@RestController
| 名称 | @RestController | 
|---|---|
| 类型 | 类注解 | 
| 位置 | 基于SpringMVC的RESTful开发控制器类定义上方 | 
| 作用 | 设置当前控制器类为RESTful风格, 等同于@Controller与@ResponseBody两个注解组合功能 | 
知识点11:@GetMapping @PostMapping @PutMapping @DeleteMapping
| 名称 | @GetMapping @PostMapping @PutMapping @DeleteMapping | 
|---|---|
| 类型 | 方法注解 | 
| 位置 | 基于SpringMVC的RESTful开发控制器方法定义上方 | 
| 作用 | 设置当前控制器方法请求访问路径与请求动作,每种对应一个请求动作, 例如@GetMapping对应GET请求 | 
| 相关属性 | value(默认):请求访问路径 | 



















