在SpringBoot进行web程序开发时,它内置了一个核心的Servlet程序 DispatcherServlet,称之为 核心控制器。
简单参数
简单参数的SpringBoot方式:SpringBoot是对原始API的包装,让接受参数的形式变简单;
简单参数:参数名与形参变量名相同,定义同名的形参即可接收参数。
如果方法的形参名称与请求的参数不一致还有使用@RequestParam来完成映射。
@RequestMapping("/simpleParam")
public String simpleParam(@RequestParam("username")String name , Integer age ){
System.out.println(name+" : "+age);
return "OK";
}
实体参数
如果请求参数比较多,一个一个接受比较繁琐,这时就可以将请求的参数装到一个POJO对象中,想要完成封装就要完成规则:
简单实体参数: 请求参数名与POJO属性名相同。
复杂实体参数指定是实体类中有一个或多个属性
复杂实体参数:请求参数名与POJO属性名相同,按照对象层次结构关系就可以获得POJO属性参数。
@RequestMapping("/simplePojo")
public String simplePojo(User user){
System.out.println(user);
return "OK";
}
数组集合参数
数组参数:请求参数名与形参对象属性名相同且请求参数为多个,定义数组类型形参即可接收参数
@RequestMapping("/arrayParam")
public String arrayParam(String[] hobby){
System.out.println(Arrays.toString(hobby));
return "OK";
}
集合参数:请求参数名与形参集合对象名相同且请求参数为多个,@RequestParam 绑定参数关系
@RequestMapping("/listParam")
public String listParam(@RequestParam List<String> hobby){
System.out.println(hobby);
return "OK";
}
日期参数
日期类型的参数在进行封装的时,需要@DateTimeFormat注解pattern属性来设置日期的格式
@RequestMapping("/dateParam")
public String dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){
System.out.println(updateTime);
return "OK";
}
JSON参数
前后端交互时,如果参数太复杂会使用,就会使用JSON参数进行数据传输,传递JSON参数时我们通常会用实体类封装,封装规则:JSON数据键名与形参对象属性名相同,定义POJO类型形参即可接收参数。需要使用 @RequestBody 标识。
@RequestMapping("/jsonParam")
public String jsonParam(@RequestBody User user){
System.out.println(user);
return "OK";
}
路径参数
在请求体传递参数,在请求的url后面通过 ?xxx=xxx 的形式传递参数,直接在请求的URL中传递参数,被称为路径参数
路径参数:通过请求URL直接传递参数,使用{…}来标识该路径参数,需要使用 @PathVariable 获取路径参数
@RequestMapping("/path/{id}")
public String pathParam(@PathVariable Integer id){
System.out.println(id);
return "OK";
}
@RequestMapping("/path/{id}/{name}")
public String pathParam2(@PathVariable Integer id, @PathVariable String name){
System.out.println(id+ " : " +name);
return "OK";
}
响应
@ResponseBody
- 名称:@ResponseBody
- 类型:方法注解、类注解
- 位置:SpringMVC控制器方法上/类上
- 作用:将当前方法返回值直接返回,如果是 实体/集合 转换为JSON返回
我们没有使用@ResponseBody的原因是@RestController注解里面包装了@ResponseBody
统一响应结果
由于Controller的方法,返回值各种各样,所以我们要规定一个统一的项目,
A. 当前请求是成功,还是失败。
B. 当前给页面的提示信息。
C . 返回的数据。
对于上述的这些数据呢,我们一般都会定义在一个实体类Result中和javaBean差不多,
分层解耦
三层架构:
- Controller:接收前端发送的请求,对请求进行处理,并响应数据
- Service:处理具体的业务逻辑
- Dao:负责数据的访问操作,包含数据的增、删、改、查
耦合问题:
我们首先需要了解软件开发领导涉及到的两个概念:内聚和耦合。
内聚:软件中各个功能模块内部的功能联系。
耦合:衡量软件中各个层/模块之间的依赖、关联的程度。
软件设计原则:高内聚低耦合。
高内聚指的是:一个模块中各个元素之间的联系的紧密程度,如果各个元素(语句、程序段)之间的联系程度越高,则内聚性越高,即 "高内聚"。
低耦合指的是:软件中各个层、模块之间的依赖关联程度越低越好。
高内聚、低耦合的目的是使程序模块的可重用性、移植性大大增强。
解耦思路
将对象交给容器管理的过程 , 称之为 控制反转。 Inversion Of Control,简称IOC。对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转。 而这个容器, 称之为IOC容器,或者Spring容器。
应用程序运行时, 容器为其提供运行时所需要的资源, 这个过程我们称之为依赖注入。 Dependency Injection,简称DI。
IOC容器中创建、管理的对象,称之为bean。
IOC&DI
Service层 及 Dao层的实现类,交给IOC容器管理。
在类上加上 @Component 注解,就是将该类声明为IOC容器中的bean
为Controller及Service注入运行时依赖的对象。
在成员变量上加上 @Autowired 注解,表示在程序运行时,Springboot会自动的从IOC容器中找到UserService类型的bean对象,然后赋值给该变量。
bean的声明
要把某个对象交给IOC容器管理,需要在对应的类上加上如下注解之一
- 声明bean的时候,可以通过value属性指定bean的名字,如果没有指定,默认为类名首字母小写。
- 目前来说,我们使用以上四个注解都可以声明bean,但是在集成后端web开发之后,声明控制器bean只能用@Controller。
但是需要注意:@Autowired注解,默认是按照类型进行,如果存在多个相同类型的bean,将会报出如下错误:
我们可以通过如下几种方案来解决:
1). @Primary 注解
当存在多个相同类型的Bean注入时,加上@Primary注解,来确定默认的实现。
2). @Qualifier 注解
可以通过@Autowired ,配合@Qualifier 来指定我们当前要注入哪一个bean对象。 在@Qualifier的value属性中,指定注入的bean的名称。
3). @Resource注解
通过@Resource注解,并指定其name属性,通过name指定要注入的bean的名称。这种方式呢,是按照bean的名称进行注入。
@Autowird 与 @Resource的区别:
- @Autowird 属于spring框架,默认按照bean的类型注入。 可以配合 @Qualifier注解,实现按照名称注入。
- @Resource是JavaEE自带的注解,根据bean的名称进行注入的。