请求流程
请求
简单参数
简单参数:在向服务器发起请求时,向服务器传递的是一些普通的请求数据。
就是在URL后面加上一个?然后加上其他数据
后端接收
在Springboot的环境中,对原始的API进行了封装,接收参数的形式更加简单。
// http://localhost:8080/simpleParam?name=Tom&age=10
// 第1个请求参数: name=Tom 参数名:name,参数值:Tom
// 第2个请求参数: age=10 参数名:age , 参数值:10
//springboot方式
@RequestMapping("/simpleParam")
public String simpleParam(String name , Integer age ){//形参名和请求参数名保持一致
}
结论:不论是GET请求还是POST请求,对于简单参数来讲,只要保证==请求参数名和Controller方法中的形参名保持一致==,就可以获取到请求参数中的数据值。
实体参数
要想完成数据封装,需要遵守如下规则:请求参数名与实体类的属性名相同
public class User {
private String name;
private Integer age;
}
集合参数
集合参数:请求参数名与形参集合对象名相同且请求参数为多个,@RequestParam 绑定参数关系
如果要封装到集合,要使用@RequestParam绑定参数关系
日期参数
对于日期类型的参数在进行封装的时候,需要通过@DateTimeFormat注解,以及其pattern属性来设置日期的格式。
public String dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
LocalDateTime updateTime){
}
JSON参数
JSON是开发中最常用的前后端数据交互方式
如何传递json格式的请求参数
json格式数据需要存放在请求体里面(在url路径上不体现)
如何接收json格式的请求参数
传递json格式的参数,在Controller中会使用实体类进行封装。
封装规则:JSON数据键名与形参对象属性名相同,定义POJO类型形参即可接收参数。需要使用 @RequestBody标识。
@RequestBody注解:将JSON数据映射到形参的实体类对象中(JSON中的key和实体类中的属性名保持一致)
路径参数
直接在请求的URL中传递参数。
例如:http://localhost:8080/user/1
如何接收路径参数
使用{…}来标识该路径参数,需要使用@PathVariable获取路径参数
//路径参数
@RequestMapping("/path/{id}")
//因为前端传递的路径参数值是可变的,所以后端接收到路径参数时,使用”[key)"方式来标记路径参数
//@PathVariable注解:
//1、获取到路径参数[id]
//2、把路径参数绑定到形参变量id
public String pathParam(@PathVariable Integer id){
}
响应
统一响应结果
统一的返回结果使用类来描述,在这个结果中包含:
-
响应状态码:当前请求是成功,还是失败
-
状态码信息:给页面的提示信息
-
返回的数据:给前端响应的数据(字符串、对象、集合)
public class Result {
private Integer code;//响应码,1 代表成功; 0 代表失败
private String msg; //响应码 描述字符串
private Object data; //返回的数据
//增删改 成功响应(不需要给前端返回数据)
public static Result success(){
return new Result(1,"success",null);
}
//查询 成功响应(把查询结果做为返回数据响应给前端)
public static Result success(Object data){
return new Result(1,"success",data);
}
//失败响应
public static Result error(String msg){
return new Result(0,msg,null);
}
}
分层解耦
三层架构
在我们进行程序设计以及程序开发时,尽可能让每一个接口、类、方法的职责更单一些(单一职责原则)。
单一职责原则:一个类或一个方法,就只做一件事情,只管一块功能。
这样就可以让类、接口、方法的复杂度更低,可读性更强,扩展性更好,也更利用后期的维护。
从组成上看可以分为三个部分:
数据访问:负责业务数据的维护操作,包括增、删、改、查等操作。
逻辑处理:负责业务逻辑处理的代码。
请求处理、响应数据:负责,接收页面的请求,给页面响应数据。
在我们项目开发中呢,可以将代码分为三层:
Controller:控制层。接收前端发送的请求,对请求进行处理,并响应数据。
Service:业务逻辑层。处理具体的业务逻辑。
(后面用的mapper)Dao:数据访问层(Data Access Object),也称为持久层。负责数据访问操作,包括数据的增、删、改、查。
前端发起的请求,由Controller层接收(Controller响应数据给前端)
Controller层调用Service层来进行逻辑处理(Service层处理完后,把处理结果返回给Controller层)
Serivce层调用Dao(后面用的mapper)层(逻辑处理过程中需要用到的一些数据要从Dao(后面用的mapper)层获取)
Dao层(后面用的mapper)操作文件中的数据(Dao(后面用的mapper)拿到的数据会返回给Service层)
分层解耦
-
内聚:软件中各个功能模块内部的功能联系。
-
耦合:衡量软件中各个层/模块之间的依赖、关联的程度。
高内聚、低耦合的目的是使程序模块的可重用性、移植性大大增强。
怎么解耦
-
首先不能在EmpController中使用new对象。
解决思路
Spring中的两个核心概念:
-
控制反转: Inversion Of Control,简称IOC。对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转。
对象的创建权由程序员主动创建转移到容器(由容器创建、管理对象)。这个容器称为:IOC容器或Spring容器
-
依赖注入: Dependency Injection,简称DI。容器为应用程序提供运行时,所依赖的资源,称之为依赖注入。
程序运行时需要某个资源,此时容器就为其提供这个资源。
例:EmpController程序运行时需要EmpService对象,Spring容器就为其提供并注入EmpService对象
IOC容器中创建、管理的对象,称之为:bean对象
IOC&DI
-
使用Spring提供的注解:@Component ,就可以实现类交给IOC容器管理
-
controller用@controller;sevice用@service;mapper用@mapper
-
-
使用Spring提供的注解:@Autowired ,就可以实现程序运行时IOC容器自动注入需要的依赖对象
Spring框架为了更好的标识web应用程序开发当中,bean对象到底归属于哪一层,又提供了@Component的衍生注解:
@Controller (标注在控制层类上)@RestController = @Controller + @ResponseBody
@Service (标注在业务层类上)
@Repository (标注在数据访问层类上)
要把某个对象交给IOC容器管理,需要在对应的类上加上如下注解之一:
注解 | 说明 | 位置 |
---|---|---|
@Controller | @Component的衍生注解 | 标注在控制器类上 |
@Service | @Component的衍生注解 | 标注在业务类上 |
@Repository | @Component的衍生注解 | 标注在数据访问类上(由于与mybatis整合,用的少) |
@Component | 声明bean的基础注解 | 不属于以上三类时,用此注解 |
IOC容器中,存在多个相同类型的bean对象
Spring提供了以下几种解决方案:
-
@Primary确定默认的实现。
-
@Qualifier指定注入的bean的名称。
-
@Resource。通过name属性指定要注入的bean的名称。