Spring Boot 可以帮助我们非常快速的构建应用程序,简化开发,提高效率。
HTTP协议
请求协议
响应协议
请求响应-请求-简单参数-实体参数
简单参数
原始方式:在原始web程序中,获取请求参数,需要通过HttpServlet对象手动获取。
/**
测试请求参数接收
*/
// 原始写法
@RestController
public class RequestController {
@RequestMapping("/simple")
public String simpleParams(HttpServletRequest Request){
String name = Request.getParameter("name");
String ageStr = Request.getParameter("age");
Integer age = Integer.parseInt(ageStr);
System.out.println(name + ":" + age);
return "OK";
}
}
SpringBoot方式:参数名与形参变量名相同,定义形参即可接收参数。
/**
测试请求参数接收
*/
@RestController
public class RequestController {
//SpringBoot写法
@RequestMapping("/simple")
public String simpleParams(String name, Integer age){
System.out.println(name + ":" + age);
return "OK";
}
}
如果方法形参名称与请求参数名称不匹配,可以使用 @RequestParam 完成以映射
注意:@RequestParam中的require属性默认为true, 代表该请求参数必须传递,如果不传递将报错。如果该参数是可选的,可以将required属性设置为false。
/**
测试请求参数接收
*/
@RestController
public class RequestController {
//形参 与 请求参数不一样 @RequestParam
@RequestMapping("/simple")
public String simpleParams(@RequestParam(name = "name") String Username, Integer age){
System.out.println(Username + ":" + age);
return "OK";
}
}
实体参数
复杂实体对象:请求参数名与对象属性名相同,按照对象层次结构关系即可接收嵌套POJO属性参数。
/**
测试请求参数接收
*/
@RestController
public class RequestController {
// 实体参数
@RequestMapping("/simplePojo")
public String simplePojoParams(User user){
System.out.println(user.getName() + ":" + user.getAge());
return "OK";
}
}
请求响应-请求-数组集合参数
数组参数
请求参数名与形参数组名称形同且请求参数为多个,定义数组类型即可接收参数
/**
测试请求参数接收
*/
@RestController
public class RequestController {
// 数组集合参数
@RequestMapping("/arrayParams")
public String arrayParams(String[] hobby){
System.out.println(Arrays.toString(hobby));
return "OK";
}
}
集合参数
请求参数名与形参名称形同且请求参数为多个,@RequestParam绑定参数关系
/**
测试请求参数接收
*/
@RestController
public class RequestController {
// 集合参数
@RequestMapping("/listParams")
public String listParams(@RequestParam List<String> hobby){
System.out.println(hobby);
return "OK";
}
}
请求响应-请求-日期,json,路径参数
日期参数
使用@DteTimeFormat注解完成日期参数格式转换
@RestController
public class RequestController {
//日期参数
@RequestMapping("/dateTime")
public String dateTime(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){
System.out.println(updateTime);
return "Ok";
}
}
json参数
json数据键名与下形参对象属性名相同,定义POJO类型形参即可接收参数,需要使用@RequestBody标识符
/**
测试请求参数接收
*/
@RestController
public class RequestController {
//json参数
@RequestMapping("/jsonParams")
public String jsonParams(@RequestBody User user){
System.out.println(user);
return "OK";
}
}
路径参数
通过请求URL直接传送参数,使用{...}来标识该路径参数,需要使用@PathVariable获取路径参数
/**
测试请求参数接收
*/
@RestController
public class RequestController {
//路径参数
@RequestMapping("/path/{id}")
public String path(@PathVariable Integer id){
System.out.println(id);
return "OK";
}
//路径参数 -- 多个参数
@RequestMapping("/path/{id}/{name}")
public String pathParams2(@PathVariable Integer id, @PathVariable String name){
System.out.println(id);
System.out.println(name);
return "OK";
}
}
统一响应结果
Result.class
package com.itheima.springbootwebreqresp.Pojo;
/*
统一响应结果封装
*/
public class Result {
//响应码, 1,代表成功;0代表失败
private Integer code;
//提示信息
private String msg;
//返回的数据
private Object date;
public Result() {
}
public Result(Integer code, String msg, Object date) {
this.code = code;
this.msg = msg;
this.date = date;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Object getDate() {
return date;
}
public void setDate(Object date) {
this.date = date;
}
public static Result success(Object data){
return new Result(1, "success", data);
}
public static Result success(){
return new Result(1, "success", null);
}
public static Result error(){
return new Result(0, "error", null);
}
@Override
public String toString() {
return "Result{" +
"code=" + code +
", msg='" + msg + '\'' +
", date=" + date +
'}';
}
}
响应代码
@RestController
public class responseController {
//改造
//String
@RequestMapping("/holle")
public Result hello(){
System.out.println("Holle World");
return Result.success("Holle World");
}
//对象
@RequestMapping("/getAddress")
public Result getAddress(){
Address address = new Address();
address.setProvince("广州");
address.setCity("广东");
return Result.success(address);
}
// 集合
@RequestMapping("/listAddress")
public Result listAddress() {
List<Address> list = new ArrayList<>();
Address address = new Address();
address.setProvince("广州");
address.setCity("深圳");
Address address1 = new Address();
address1.setProvince("江西");
address1.setCity("南昌");
list.add(address);
list.add(address1);
return Result.success(list);
}
}
分层解耦 - 三层架构
三层架构
分成解耦
IOC & DI
1.Service层 及 Dao层的实现类,交给IOC容器管理。
@Component //将当前类交给IOC容器管理,成为IOC容器中的bean
2.Controller及Service注入运行时,依赖的对象
@Autowired //运行时,IOC如容器会提供该类型的bean对象,并赋值给该变量 - 依赖注入
3.运行测试
IOC详解
组件扫描
1. 前面申明bean的四大注解,要想生效,还需要被组件扫描注解@ComponentScan扫描
2. @ComponentScan注解虽然没有显式怕配置,但是实际上已经包含在了启动类声明注解@SpringBootApplication中,默认扫描的范围是启动类所在包及其子包
@ComponentScan("dao", "com.itheima")
DI详解
Beean注解
@Autowired注解,默认是按照类型进行,如果存在多个相同类型的bean,将会报出如下错误:
通过以下几种方案来解决:
@primary
@Primary
@Service //将当前类交给IOC容器管理,成为IOC容器中的bean
public class EmpServiceA implements EmpService {
}
@Qualifier
@RestController
public class EmpController {
//调用service
@Qualifier("empServiceB")
@Autowired //运行时,IOC如容器会提供该类型的bean对象,并赋值给该变量 - 依赖注入
private EmpService empService;
}
@Resource (jdk)
@RestController
public class EmpController {
//调用service
@Resource(name = "empServiceB")
private EmpService empService;
}
总结: