前言:请求响应
目录
[一 引子](#一 引子)
[二 请求](#二 请求)
[2.1 Postman](#2.1 Postman)
[2.1.1 安装](#2.1.1 安装)
[2.1.2 创建工作空间](#2.1.2 创建工作空间)
[2.1.3 添加接口](#2.1.3 添加接口)
[2.2 简单参数](#2.2 简单参数)
[2.2.1 原始方式(不推荐)](#2.2.1 原始方式(不推荐))
[2.2.2 SpringBoot方式-GET(参数名与形参变量名相同)](#2.2.2 SpringBoot方式-GET(参数名与形参变量名相同))
[2.2.3 SpringBoot方式-POST(参数名与形参变量名相同)](#2.2.3 SpringBoot方式-POST(参数名与形参变量名相同))
[2.2.4 SpringBoot方式-POST(参数名与形参变量名不相同)](#2.2.4 SpringBoot方式-POST(参数名与形参变量名不相同))
[2.2.5 @RequestParam注解决SpringBoot方式-POST(参数名与形参变量名不相同)](#2.2.5 @RequestParam注解决SpringBoot方式-POST(参数名与形参变量名不相同))
[2.3 实体参数](#2.3 实体参数)
[2.3.1 简单的实体类参数](#2.3.1 简单的实体类参数)
[2.3.1.1 创建实体类User](#2.3.1.1 创建实体类User)
[2.3.1.2 创建接口](#2.3.1.2 创建接口)
[2.3.2 复杂实体参数](#2.3.2 复杂实体参数)
[2.3.2.1 创建实体类Address](#2.3.2.1 创建实体类Address)
[2.3.2.2 修改实体类User](#2.3.2.2 修改实体类User)
[2.3.2.3 创建接口](#2.3.2.3 创建接口)
[2.4 数组集合参数](#2.4 数组集合参数)
[2.4.1 数组参数](#2.4.1 数组参数)
[2.4.2 集合参数](#2.4.2 集合参数)
[2.5 日期参数](#2.5 日期参数)
[2.6 Json参数](#2.6 Json参数)
[2.7 路径参数](#2.7 路径参数)
[2.7.1 单个路径参数](#2.7.1 单个路径参数)
[2.7.2 多个路径参数](#2.7.2 多个路径参数)
[2.8 总结](#2.8 总结)
[三 响应](#三 响应)
[3.1 @Responbody响应示例(发现不便管理、难以维护)编辑](#3.1 @Responbody响应示例(发现不便管理、难以维护)编辑)
[3.1.1 创建类ResponseController](#3.1.1 创建类ResponseController)
[3.1.2 执行结果](#3.1.2 执行结果)
[3.1.2.1 返回字符串](#3.1.2.1 返回字符串)
[编辑3.1.2.2 返回对象json](#编辑3.1.2.2 返回对象json)
[编辑 3.1.2.3 返回集合json](#编辑 3.1.2.3 返回集合json)
[编辑3.2 统一响应结果](#编辑3.2 统一响应结果)
[3.2.1 统一结果处理类Result](#3.2.1 统一结果处理类Result)
[3.2.2 优化类ResponseController](#3.2.2 优化类ResponseController)
[3.2.3 执行结果(返回统一)](#3.2.3 执行结果(返回统一))
[3.3 总结](#3.3 总结)
[3.4 统一响应结果的案例](#3.4 统一响应结果的案例)
[3.4.1 分析步骤](#3.4.1 分析步骤)
[3.4.2 引入dom4j](#3.4.2 引入dom4j)
[3.4.3 引入工具类XmlParserUtils](#3.4.3 引入工具类XmlParserUtils)
[3.4.4 引入实体类 Emp](#3.4.4 引入实体类 Emp)
[3.4.5 引入emp.xml文件](#3.4.5 引入emp.xml文件)
[3.4.6 引入前端页面](#3.4.6 引入前端页面)
[3.4.7 新增EmpController类](#3.4.7 新增EmpController类)
[3.4.8 访问](#3.4.8 访问)
[3.4.9 思考](#3.4.9 思考)
[四 分层解耦](#四 分层解耦)
[4.1 三层架构](#4.1 三层架构)
[4.1.1 概述](#4.1.1 概述)
[4.1.2 Dao层](#4.1.2 Dao层)
[4.1.2.1 新增EmpDao接口](#4.1.2.1 新增EmpDao接口)
[4.1.2.2 新增EmpDaoA实现类](#4.1.2.2 新增EmpDaoA实现类)
[4.1.3 Service层](#4.1.3 Service层)
[4.1.3.1 新增EmpService接口](#4.1.3.1 新增EmpService接口)
[4.1.3.2 新增EmpServiceA实现类](#4.1.3.2 新增EmpServiceA实现类)
[4.1.3 Controller层](#4.1.3 Controller层)
[4.1.3.1 优化EmpController](#4.1.3.1 优化EmpController)
[4.1.4 对比](#4.1.4 对比)
[4.2 分层解耦](#4.2 分层解耦)
[4.2.1 解耦](#4.2.1 解耦)
[4.3 IOC(控制反转) & DI(依赖注入)入门](#4.3 IOC(控制反转) & DI(依赖注入)入门)
[4.3.1 优化EmpDaoA实现类](#4.3.1 优化EmpDaoA实现类)
['4.3.2 优化EmpServiceA实现类](#’4.3.2 优化EmpServiceA实现类)
[4.3.3 优化EmpController类](#4.3.3 优化EmpController类)
[4.3.4 如何更改为:实现类EmpserviceB](#4.3.4 如何更改为:实现类EmpserviceB)
[4.3.5 总结](#4.3.5 总结)
[4.4 IOC详解](#4.4 IOC详解)
[4.4.1 优化EmpDaoA实现类](#4.4.1 优化EmpDaoA实现类)
['4.4.2 优化EmpServiceA实现类](#’4.4.2 优化EmpServiceA实现类)
[4.4.3 优化EmpController类](#4.4.3 优化EmpController类)
[4.4.4 bean组件扫描](#4.4.4 bean组件扫描)
[4.4.5 总结](#4.4.5 总结)
[4.5 DI详解](#4.5 DI详解)
[4.5.1 @Primary](#4.5.1 @Primary)
[4.5.2 @Qualifier](#4.5.2 @Qualifier)
[4.5.3 @Resource](#4.5.3 @Resource)
[4.5.3 总结](#4.5.3 总结)
一 引子


二 请求
2.1 Postman


2.1.1 安装
略
2.1.2 创建工作空间


2.1.3 添加接口



2.2 简单参数
2.2.1 原始方式(不推荐)




2.2.2 SpringBoot方式-GET(参数名与形参变量名相同)



2.2.3 SpringBoot方式-POST(参数名与形参变量名相同)


2.2.4 SpringBoot方式-POST(参数名与形参变量名不相同)

参数不同 获取null


2.2.5 @RequestParam注解决SpringBoot方式-POST(参数名与形参变量名不相同)

此问题是解决2.2.4的问题
java
package com.runa.controller;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class RequestController {
// //原始方式
// @RequestMapping("/simpleParam")
// public String simpleParam(HttpServletRequest request){
//获取请求参数
// String name = request.getParameter("name");
// String ageStr = request.getParameter("age");
// int age = Integer.parseInt(ageStr);
//
// System.out.println(name + ":" + age);
// return "ok";
// }
//SpringBoot 方式 GET POST 都可以(参数名与形参变量名相同)
// @RequestMapping("/simpleParam")
// public String simpleParam(String name, Integer age){
// //获取请求参数
// System.out.println(name + ":" + age);
// return "ok";
// }
//SpringBoot 方式 GET POST 都可以(参数名与形参变量名不相同)
// @RequestMapping("/simpleParam")
// public String simpleParam(String username, Integer age){
// //获取请求参数
// System.out.println(username + ":" + age);
// return "ok";
// }
//SpringBoot 方式 GET POST 都可以(参数名与形参变量名不相同)
@RequestMapping("/simpleParam")
public String simpleParam(@RequestParam(name="name")String username, Integer age){ //@RequestParam(name="name", required = false)
//获取请求参数
System.out.println(username + ":" + age);
return "ok";
}
}

2.3 实体参数

2.3.1 简单的实体类参数

2.3.1.1 创建实体类User

java
package com.runa.pojo;
public class User {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
2.3.1.2 创建接口
java
package com.runa.controller;
import com.runa.pojo.User;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class RequestController {
// 1、 简单参数
// //原始方式
// @RequestMapping("/simpleParam")
// public String simpleParam(HttpServletRequest request){
//获取请求参数
// String name = request.getParameter("name");
// String ageStr = request.getParameter("age");
// int age = Integer.parseInt(ageStr);
//
// System.out.println(name + ":" + age);
// return "ok";
// }
//SpringBoot 方式 GET POST 都可以(参数名与形参变量名相同)
// @RequestMapping("/simpleParam")
// public String simpleParam(String name, Integer age){
// //获取请求参数
// System.out.println(name + ":" + age);
// return "ok";
// }
//SpringBoot 方式 GET POST 都可以(参数名与形参变量名不相同)
// @RequestMapping("/simpleParam")
// public String simpleParam(String username, Integer age){
// //获取请求参数
// System.out.println(username + ":" + age);
// return "ok";
// }
//SpringBoot 方式 GET POST 都可以(参数名与形参变量名不相同)
@RequestMapping("/simpleParam")
public String simpleParam(@RequestParam(name="name")String username, Integer age){ //@RequestParam(name="name", required = false)
//获取请求参数
System.out.println(username + ":" + age);
return "ok";
}
// 2 实体参数
@RequestMapping("/simplePojo")
public String simplePojo(User user){
//获取请求参数
System.out.println(user);
return "ok";
}
}


2.3.2 复杂实体参数

2.3.2.1 创建实体类Address

java
package com.runa.pojo;
public class Address {
private String province;
private String city;
public String getProvince() {
return province;
}
public void setProvince(String province) {
this.province = province;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
@Override
public String toString() {
return "Address{" +
"province='" + province + '\'' +
", city='" + city + '\'' +
'}';
}
}
2.3.2.2 修改实体类User
java
package com.runa.pojo;
public class User {
private String name;
private Integer age;
private Address address;
public String getName() {
return name;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", address=" + address +
'}';
}
}
2.3.2.3 创建接口
java
package com.runa.controller;
import com.runa.pojo.User;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class RequestController {
// 1、 简单参数
// //原始方式
// @RequestMapping("/simpleParam")
// public String simpleParam(HttpServletRequest request){
//获取请求参数
// String name = request.getParameter("name");
// String ageStr = request.getParameter("age");
// int age = Integer.parseInt(ageStr);
//
// System.out.println(name + ":" + age);
// return "ok";
// }
//SpringBoot 方式 GET POST 都可以(参数名与形参变量名相同)
// @RequestMapping("/simpleParam")
// public String simpleParam(String name, Integer age){
// //获取请求参数
// System.out.println(name + ":" + age);
// return "ok";
// }
//SpringBoot 方式 GET POST 都可以(参数名与形参变量名不相同)
// @RequestMapping("/simpleParam")
// public String simpleParam(String username, Integer age){
// //获取请求参数
// System.out.println(username + ":" + age);
// return "ok";
// }
//SpringBoot 方式 GET POST 都可以(参数名与形参变量名不相同)
@RequestMapping("/simpleParam")
public String simpleParam(@RequestParam(name="name")String username, Integer age){ //@RequestParam(name="name", required = false)
//获取请求参数
System.out.println(username + ":" + age);
return "ok";
}
// 2 实体参数
//2.1 简单的实体参数
@RequestMapping("/simplePojo")
public String simplePojo(User user){
//获取请求参数
System.out.println(user);
return "ok";
}
//2.1 复杂的实体参数
@RequestMapping("/complexPojo")
public String complexPojo(User user){
System.out.println(user);
return "ok";
}
}


2.4 数组集合参数

2.4.1 数组参数

java
package com.runa.controller;
import com.runa.pojo.User;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.Arrays;
@RestController
public class RequestController {
// 1、 简单参数
// //原始方式
// @RequestMapping("/simpleParam")
// public String simpleParam(HttpServletRequest request){
//获取请求参数
// String name = request.getParameter("name");
// String ageStr = request.getParameter("age");
// int age = Integer.parseInt(ageStr);
//
// System.out.println(name + ":" + age);
// return "ok";
// }
//SpringBoot 方式 GET POST 都可以(参数名与形参变量名相同)
// @RequestMapping("/simpleParam")
// public String simpleParam(String name, Integer age){
// //获取请求参数
// System.out.println(name + ":" + age);
// return "ok";
// }
//SpringBoot 方式 GET POST 都可以(参数名与形参变量名不相同)
// @RequestMapping("/simpleParam")
// public String simpleParam(String username, Integer age){
// //获取请求参数
// System.out.println(username + ":" + age);
// return "ok";
// }
//SpringBoot 方式 GET POST 都可以(参数名与形参变量名不相同)
@RequestMapping("/simpleParam")
public String simpleParam(@RequestParam(name="name")String username, Integer age){ //@RequestParam(name="name", required = false)
//获取请求参数
System.out.println(username + ":" + age);
return "ok";
}
// 2 实体参数
//2.1 简单的实体参数
@RequestMapping("/simplePojo")
public String simplePojo(User user){
//获取请求参数
System.out.println(user);
return "ok";
}
//2.2 复杂的实体参数
@RequestMapping("/complexPojo")
public String complexPojo(User user){
System.out.println(user);
return "ok";
}
// 3 数组集合参数
// 3.1 数组参数
@RequestMapping("/arrayParam")
public String arrayParam(String[] hobby){
System.out.println(Arrays.toString(hobby));
return "ok";
}
}


2.4.2 集合参数

java
package com.runa.controller;
import com.runa.pojo.User;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.Arrays;
import java.util.List;
@RestController
public class RequestController {
// 1、 简单参数
// //原始方式
// @RequestMapping("/simpleParam")
// public String simpleParam(HttpServletRequest request){
//获取请求参数
// String name = request.getParameter("name");
// String ageStr = request.getParameter("age");
// int age = Integer.parseInt(ageStr);
//
// System.out.println(name + ":" + age);
// return "ok";
// }
//SpringBoot 方式 GET POST 都可以(参数名与形参变量名相同)
// @RequestMapping("/simpleParam")
// public String simpleParam(String name, Integer age){
// //获取请求参数
// System.out.println(name + ":" + age);
// return "ok";
// }
//SpringBoot 方式 GET POST 都可以(参数名与形参变量名不相同)
// @RequestMapping("/simpleParam")
// public String simpleParam(String username, Integer age){
// //获取请求参数
// System.out.println(username + ":" + age);
// return "ok";
// }
//SpringBoot 方式 GET POST 都可以(参数名与形参变量名不相同)
@RequestMapping("/simpleParam")
public String simpleParam(@RequestParam(name="name")String username, Integer age){ //@RequestParam(name="name", required = false)
//获取请求参数
System.out.println(username + ":" + age);
return "ok";
}
// 2 实体参数
//2.1 简单的实体参数
@RequestMapping("/simplePojo")
public String simplePojo(User user){
//获取请求参数
System.out.println(user);
return "ok";
}
//2.2 复杂的实体参数
@RequestMapping("/complexPojo")
public String complexPojo(User user){
System.out.println(user);
return "ok";
}
// 3 数组集合参数
// 3.1 数组参数
@RequestMapping("/arrayParam")
public String arrayParam(String[] hobby){
System.out.println(Arrays.toString(hobby));
return "ok";
}
// 3.2 集合参数
@RequestMapping("/listParam")
public String listParam(@RequestParam List<String> hobby){
System.out.println(hobby);
return "ok";
}
}


2.5 日期参数

java
package com.runa.controller;
import com.runa.pojo.User;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;
@RestController
public class RequestController {
// 1、 简单参数
// //原始方式
// @RequestMapping("/simpleParam")
// public String simpleParam(HttpServletRequest request){
//获取请求参数
// String name = request.getParameter("name");
// String ageStr = request.getParameter("age");
// int age = Integer.parseInt(ageStr);
//
// System.out.println(name + ":" + age);
// return "ok";
// }
//SpringBoot 方式 GET POST 都可以(参数名与形参变量名相同)
// @RequestMapping("/simpleParam")
// public String simpleParam(String name, Integer age){
// //获取请求参数
// System.out.println(name + ":" + age);
// return "ok";
// }
//SpringBoot 方式 GET POST 都可以(参数名与形参变量名不相同)
// @RequestMapping("/simpleParam")
// public String simpleParam(String username, Integer age){
// //获取请求参数
// System.out.println(username + ":" + age);
// return "ok";
// }
//SpringBoot 方式 GET POST 都可以(参数名与形参变量名不相同)
@RequestMapping("/simpleParam")
public String simpleParam(@RequestParam(name="name")String username, Integer age){ //@RequestParam(name="name", required = false)
//获取请求参数
System.out.println(username + ":" + age);
return "ok";
}
// 2 实体参数
//2.1 简单的实体参数
@RequestMapping("/simplePojo")
public String simplePojo(User user){
//获取请求参数
System.out.println(user);
return "ok";
}
//2.2 复杂的实体参数
@RequestMapping("/complexPojo")
public String complexPojo(User user){
System.out.println(user);
return "ok";
}
// 3 数组集合参数
// 3.1 数组参数
@RequestMapping("/arrayParam")
public String arrayParam(String[] hobby){
System.out.println(Arrays.toString(hobby));
return "ok";
}
// 3.2 集合参数
@RequestMapping("/listParam")
public String listParam(@RequestParam List<String> hobby){
System.out.println(hobby);
return "ok";
}
// 4 日期时间参数
@RequestMapping("/dataParam")
public String dataParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){
System.out.println(updateTime);
return "ok";
}
}


2.6 Json参数

java
package com.runa.controller;
import com.runa.pojo.User;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;
@RestController
public class RequestController {
// 1、 简单参数
// //原始方式
// @RequestMapping("/simpleParam")
// public String simpleParam(HttpServletRequest request){
//获取请求参数
// String name = request.getParameter("name");
// String ageStr = request.getParameter("age");
// int age = Integer.parseInt(ageStr);
//
// System.out.println(name + ":" + age);
// return "ok";
// }
//SpringBoot 方式 GET POST 都可以(参数名与形参变量名相同)
// @RequestMapping("/simpleParam")
// public String simpleParam(String name, Integer age){
// //获取请求参数
// System.out.println(name + ":" + age);
// return "ok";
// }
//SpringBoot 方式 GET POST 都可以(参数名与形参变量名不相同)
// @RequestMapping("/simpleParam")
// public String simpleParam(String username, Integer age){
// //获取请求参数
// System.out.println(username + ":" + age);
// return "ok";
// }
//SpringBoot 方式 GET POST 都可以(参数名与形参变量名不相同)
@RequestMapping("/simpleParam")
public String simpleParam(@RequestParam(name="name")String username, Integer age){ //@RequestParam(name="name", required = false)
//获取请求参数
System.out.println(username + ":" + age);
return "ok";
}
// 2 实体参数
//2.1 简单的实体参数
@RequestMapping("/simplePojo")
public String simplePojo(User user){
//获取请求参数
System.out.println(user);
return "ok";
}
//2.2 复杂的实体参数
@RequestMapping("/complexPojo")
public String complexPojo(User user){
System.out.println(user);
return "ok";
}
// 3 数组集合参数
// 3.1 数组参数
@RequestMapping("/arrayParam")
public String arrayParam(String[] hobby){
System.out.println(Arrays.toString(hobby));
return "ok";
}
// 3.2 集合参数
@RequestMapping("/listParam")
public String listParam(@RequestParam List<String> hobby){
System.out.println(hobby);
return "ok";
}
// 4 日期时间参数
@RequestMapping("/dataParam")
public String dataParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){
System.out.println(updateTime);
return "ok";
}
// 5 json 参数
@RequestMapping("/jsonParam")
public String jsonParam(@RequestBody User user){
System.out.println(user);
return "ok";
}
}


2.7 路径参数

2.7.1 单个路径参数
java
package com.runa.controller;
import com.runa.pojo.User;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;
@RestController
public class RequestController {
// 1、 简单参数
// //原始方式
// @RequestMapping("/simpleParam")
// public String simpleParam(HttpServletRequest request){
//获取请求参数
// String name = request.getParameter("name");
// String ageStr = request.getParameter("age");
// int age = Integer.parseInt(ageStr);
//
// System.out.println(name + ":" + age);
// return "ok";
// }
//SpringBoot 方式 GET POST 都可以(参数名与形参变量名相同)
// @RequestMapping("/simpleParam")
// public String simpleParam(String name, Integer age){
// //获取请求参数
// System.out.println(name + ":" + age);
// return "ok";
// }
//SpringBoot 方式 GET POST 都可以(参数名与形参变量名不相同)
// @RequestMapping("/simpleParam")
// public String simpleParam(String username, Integer age){
// //获取请求参数
// System.out.println(username + ":" + age);
// return "ok";
// }
//SpringBoot 方式 GET POST 都可以(参数名与形参变量名不相同)
@RequestMapping("/simpleParam")
public String simpleParam(@RequestParam(name="name")String username, Integer age){ //@RequestParam(name="name", required = false)
//获取请求参数
System.out.println(username + ":" + age);
return "ok";
}
// 2 实体参数
//2.1 简单的实体参数
@RequestMapping("/simplePojo")
public String simplePojo(User user){
//获取请求参数
System.out.println(user);
return "ok";
}
//2.2 复杂的实体参数
@RequestMapping("/complexPojo")
public String complexPojo(User user){
System.out.println(user);
return "ok";
}
// 3 数组集合参数
// 3.1 数组参数
@RequestMapping("/arrayParam")
public String arrayParam(String[] hobby){
System.out.println(Arrays.toString(hobby));
return "ok";
}
// 3.2 集合参数
@RequestMapping("/listParam")
public String listParam(@RequestParam List<String> hobby){
System.out.println(hobby);
return "ok";
}
// 4 日期时间参数
@RequestMapping("/dataParam")
public String dataParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){
System.out.println(updateTime);
return "ok";
}
// 5 json 参数
@RequestMapping("/jsonParam")
public String jsonParam(@RequestBody User user){
System.out.println(user);
return "ok";
}
// 6 路径 参数
@RequestMapping("/path/{id}")
public String pathParam(@PathVariable Integer id){
System.out.println(id);
return "ok";
}
}


2.7.2 多个路径参数

java
package com.runa.controller;
import com.runa.pojo.User;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;
@RestController
public class RequestController {
// 1、 简单参数
// //原始方式
// @RequestMapping("/simpleParam")
// public String simpleParam(HttpServletRequest request){
//获取请求参数
// String name = request.getParameter("name");
// String ageStr = request.getParameter("age");
// int age = Integer.parseInt(ageStr);
//
// System.out.println(name + ":" + age);
// return "ok";
// }
//SpringBoot 方式 GET POST 都可以(参数名与形参变量名相同)
// @RequestMapping("/simpleParam")
// public String simpleParam(String name, Integer age){
// //获取请求参数
// System.out.println(name + ":" + age);
// return "ok";
// }
//SpringBoot 方式 GET POST 都可以(参数名与形参变量名不相同)
// @RequestMapping("/simpleParam")
// public String simpleParam(String username, Integer age){
// //获取请求参数
// System.out.println(username + ":" + age);
// return "ok";
// }
//SpringBoot 方式 GET POST 都可以(参数名与形参变量名不相同)
@RequestMapping("/simpleParam")
public String simpleParam(@RequestParam(name="name")String username, Integer age){ //@RequestParam(name="name", required = false)
//获取请求参数
System.out.println(username + ":" + age);
return "ok";
}
// 2 实体参数
//2.1 简单的实体参数
@RequestMapping("/simplePojo")
public String simplePojo(User user){
//获取请求参数
System.out.println(user);
return "ok";
}
//2.2 复杂的实体参数
@RequestMapping("/complexPojo")
public String complexPojo(User user){
System.out.println(user);
return "ok";
}
// 3 数组集合参数
// 3.1 数组参数
@RequestMapping("/arrayParam")
public String arrayParam(String[] hobby){
System.out.println(Arrays.toString(hobby));
return "ok";
}
// 3.2 集合参数
@RequestMapping("/listParam")
public String listParam(@RequestParam List<String> hobby){
System.out.println(hobby);
return "ok";
}
// 4 日期时间参数
@RequestMapping("/dataParam")
public String dataParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){
System.out.println(updateTime);
return "ok";
}
// 5 json 参数
@RequestMapping("/jsonParam")
public String jsonParam(@RequestBody User user){
System.out.println(user);
return "ok";
}
// 6 路径 参数
// 6。1 单个路径 参数
@RequestMapping("/path/{id}")
public String pathParam(@PathVariable Integer id){
System.out.println(id);
return "ok";
}
// 6。2 多个路径 参数
@RequestMapping("/path/{id}/{name}")
public String pathParam(@PathVariable Integer id, @PathVariable String name){
System.out.println(id + ":" + name);
return "ok";
}
}


2.8 总结

三 响应

3.1 @Responbody响应示例(发现不便管理、难以维护)
3.1.1 创建类ResponseController

java
package com.runa.controller;
import com.runa.pojo.Address;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
/**
* 测试响应数据
*/
@RestController
public class ResponseController {
@RequestMapping("/helloWorld")
public String helloWorld(){
System.out.println("Hello World ~");
return "Hello World ~";
}
@RequestMapping("/getAddr")
public Address getAddr(){
Address addr = new Address();
addr.setProvince("云南");
addr.setCity("大理");
return addr;
}
@RequestMapping("/listAddr")
public List<Address> listAddr(){
List<Address> list = new ArrayList<>();
Address addr = new Address();
addr.setProvince("云南");
addr.setCity("大理");
Address addr2 = new Address();
addr2.setProvince("新疆");
addr2.setCity("乌鲁木齐");
list.add(addr);
list.add(addr2);
return list;
}
}
3.1.2 执行结果
3.1.2.1 返回字符串
3.1.2.2 返回对象json
3.1.2.3 返回集合json
3.2 统一响应结果

3.2.1 统一结果处理类Result

java
package com.runa.pojo;
/**
* 统一响应结果封装类
*/
public class Result {
private Integer code ;//1 成功 , 0 失败
private String msg; //提示信息
private Object data; //数据 data
public Result() {
}
public Result(Integer code, String msg, Object data) {
this.code = code;
this.msg = msg;
this.data = data;
}
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 getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
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(String msg){
return new Result(0, msg, null);
}
@Override
public String toString() {
return "Result{" +
"code=" + code +
", msg='" + msg + '\'' +
", data=" + data +
'}';
}
}
3.2.2 优化类ResponseController
java
package com.runa.controller;
import com.runa.pojo.Address;
import com.runa.pojo.Result;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
/**
* 测试响应数据
*/
@RestController
public class ResponseController {
@RequestMapping("/helloWorld")
public Result helloWorld(){
System.out.println("Hello World ~");
// return new Result(1,"success","Hello World`");
return Result.success("Hello World ~");
}
@RequestMapping("/getAddr")
public Result getAddr(){
Address addr = new Address();
addr.setProvince("云南");
addr.setCity("大理");
return Result.success(addr);
}
@RequestMapping("/listAddr")
public Result listAddr(){
List<Address> list = new ArrayList<>();
Address addr = new Address();
addr.setProvince("云南");
addr.setCity("大理");
Address addr2 = new Address();
addr2.setProvince("新疆");
addr2.setCity("乌鲁木齐");
list.add(addr);
list.add(addr2);
return Result.success(list);
}
}
3.2.3 执行结果(返回统一)



3.3 总结

3.4 统一响应结果的案例

3.4.1 分析步骤


3.4.2 引入dom4j
XML
<!-- 解析XML -->
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.3</version>
</dependency>

3.4.3 引入工具类XmlParserUtils

java
package com.runa.utils;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
public class XmlParserUtils {
public static <T> List<T> parse(String file , Class<T> targetClass) {
ArrayList<T> list = new ArrayList<T>(); //封装解析出来的数据
try {
//1.获取一个解析器对象
SAXReader saxReader = new SAXReader();
//2.利用解析器把xml文件加载到内存中,并返回一个文档对象
Document document = saxReader.read(new File(file));
//3.获取到根标签
Element rootElement = document.getRootElement();
//4.通过根标签来获取 user 标签
List<Element> elements = rootElement.elements("emp");
//5.遍历集合,得到每一个 user 标签
for (Element element : elements) {
//获取 name 属性
String name = element.element("name").getText();
//获取 age 属性
String age = element.element("age").getText();
//获取 image 属性
String image = element.element("image").getText();
//获取 gender 属性
String gender = element.element("gender").getText();
//获取 job 属性
String job = element.element("job").getText();
//组装数据
Constructor<T> constructor = targetClass.getDeclaredConstructor(String.class, Integer.class, String.class, String.class, String.class);
constructor.setAccessible(true);
T object = constructor.newInstance(name, Integer.parseInt(age), image, gender, job);
list.add(object);
}
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
}
3.4.4 引入实体类 Emp

java
package com.runa.pojo;
public class Emp {
private String name;
private Integer age;
private String image;
private String gender;
private String job;
public Emp() {
}
public Emp(String name, Integer age, String image, String gender, String job) {
this.name = name;
this.age = age;
this.image = image;
this.gender = gender;
this.job = job;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
@Override
public String toString() {
return "Emp{" +
"name='" + name + '\'' +
", age=" + age +
", image='" + image + '\'' +
", gender='" + gender + '\'' +
", job='" + job + '\'' +
'}';
}
}
3.4.5 引入emp.xml文件

XML
<?xml version="1.0" encoding="UTF-8" ?>
<emps>
<emp>
<name>金毛狮王</name>
<age>55</age>
<image>https://web-framework.oss-cn-hangzhou.aliyuncs.com/web/1.jpg</image>
<!-- 1: 男, 2: 女 -->
<gender>1</gender>
<!-- 1: 讲师, 2: 班主任 , 3: 就业指导 -->
<job>1</job>
</emp>
<emp>
<name>白眉鹰王</name>
<age>65</age>
<image>https://web-framework.oss-cn-hangzhou.aliyuncs.com/web/2.jpg</image>
<gender>1</gender>
<job>1</job>
</emp>
<emp>
<name>青翼蝠王</name>
<age>45</age>
<image>https://web-framework.oss-cn-hangzhou.aliyuncs.com/web/3.jpg</image>
<gender>1</gender>
<job>2</job>
</emp>
<emp>
<name>紫衫龙王</name>
<age>38</age>
<image>https://web-framework.oss-cn-hangzhou.aliyuncs.com/web/4.jpg</image>
<gender>2</gender>
<job>3</job>
</emp>
</emps>
3.4.6 引入前端页面

3.4.7 新增EmpController类

java
package com.runa.controller;
import com.runa.pojo.Emp;
import com.runa.pojo.Result;
import com.runa.utils.XmlParserUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class EmpController {
@RequestMapping("/listEmp")
public Result list(){
// 1 加载并解析XML 文件
String file = this.getClass().getClassLoader().getResource("emp.xml").getFile();
System.out.println(file);
List<Emp> emplist = XmlParserUtils.parse(file, Emp.class);
// 2 对数据进行转换处理 gender job
empList.stream().forEach(emp ->{
// 处理gender 1 男 2 女
String gender = emp.getGender();
if("1".equals(gender)){
emp.setGender("男");
} else if ("2".equals(gender)) {
emp.setGender("女");
}
// 处理 job 1 讲师 2 班主任 3 就业指导
String job = emp.getJob();
if("1".equals(job)){
emp.setJob("讲师");
} else if ("2".equals(job)) {
emp.setJob("班主任");}
else if ("3".equals(job)) {
emp.setJob("就业指导");
}
});
// 3 响应数据
return Result.success(empList);
}
}
3.4.8 访问
浏览器
XML
http://localhost:8080/emp.html



3.4.9 思考

四 分层解耦
4.1 三层架构
4.1.1 概述




4.1.2 Dao层

4.1.2.1 新增EmpDao接口
java
package com.runa.dao;
import com.runa.pojo.Emp;
import java.util.List;
public interface EmpDao {
// 获取员工列表数据
public List<Emp> listEmap();
}
4.1.2.2 新增EmpDaoA实现类
java
package com.runa.dao.impl;
import com.runa.dao.EmpDao;
import com.runa.pojo.Emp;
import com.runa.utils.XmlParserUtils;
import java.util.List;
public class EmpDaoA implements EmpDao {
@Override
public List<Emp> listEmap() {
// 1 加载并解析XML 文件
String file = this.getClass().getClassLoader().getResource("emp.xml").getFile();
System.out.println(file);
List<Emp> emplist = XmlParserUtils.parse(file, Emp.class);
return emplist;
}
}
4.1.3 Service层
4.1.3.1 新增EmpService接口
java
package com.runa.service;
import com.runa.pojo.Emp;
import java.util.List;
public interface EmpService {
// 获取员工列表
public List<Emp> listEmp();
}
4.1.3.2 新增EmpServiceA实现类
java
package com.runa.service.impl;
import com.runa.dao.EmpDao;
import com.runa.dao.impl.EmpDaoA;
import com.runa.pojo.Emp;
import com.runa.service.EmpService;
import java.util.List;
public class EmpServiceA implements EmpService {
private EmpDao empDao = new EmpDaoA();
@Override
public List<Emp> listEmp() {
//1 调用dao, 获取数据
List<Emp> empList = empDao.listEmap();
// 2 对数据进行转换处理 gender job
empList.stream().forEach(emp ->{
// 处理gender 1 男 2 女
String gender = emp.getGender();
if("1".equals(gender)){
emp.setGender("男");
} else if ("2".equals(gender)) {
emp.setGender("女");
}
// 处理 job 1 讲师 2 班主任 3 就业指导
String job = emp.getJob();
if("1".equals(job)){
emp.setJob("讲师");
} else if ("2".equals(job)) {
emp.setJob("班主任");}
else if ("3".equals(job)) {
emp.setJob("就业指导");
}
});
return empList;
}
}
4.1.3 Controller层
4.1.3.1 优化EmpController
java
package com.runa.controller;
import com.runa.pojo.Emp;
import com.runa.pojo.Result;
import com.runa.service.EmpService;
import com.runa.service.impl.EmpServiceA;
import com.runa.utils.XmlParserUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class EmpController {
private EmpService empService = new EmpServiceA();
@RequestMapping("/listEmp")
public Result list(){
// 1 调用service,获取数据
List<Emp> empList = empService.listEmp();
// 2 响应数据
return Result.success(empList);
}
}
启动

4.1.4 对比

4.2 分层解耦

4.2.1 解耦



4.3 IOC(控制反转) & DI(依赖注入)入门

4.3.1 优化EmpDaoA实现类
java
package com.runa.dao.impl;
import com.runa.dao.EmpDao;
import com.runa.pojo.Emp;
import com.runa.utils.XmlParserUtils;
import org.springframework.stereotype.Component;
import java.util.List;
@Component // 将当前类交给IOC容器管理,成为IOC容器的bean
public class EmpDaoA implements EmpDao {
@Override
public List<Emp> listEmap() {
// 1 加载并解析XML 文件
String file = this.getClass().getClassLoader().getResource("emp.xml").getFile();
System.out.println(file);
List<Emp> emplist = XmlParserUtils.parse(file, Emp.class);
return emplist;
}
}
'4.3.2 优化EmpServiceA实现类
java
package com.runa.service.impl;
import com.runa.dao.EmpDao;
import com.runa.dao.impl.EmpDaoA;
import com.runa.pojo.Emp;
import com.runa.service.EmpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
@Component // 将当前类交给IOC容器管理,成为IOC容器的bean
public class EmpServiceA implements EmpService {
// private EmpDao empDao = new EmpDaoA();
@Autowired // 代表程序在运行时,IOC容器会提供该类型的bean对象,并赋值给该变量,===依赖注入
private EmpDao empDao; //解耦
@Override
public List<Emp> listEmp() {
//1 调用dao, 获取数据
List<Emp> empList = empDao.listEmap();
// 2 对数据进行转换处理 gender job
empList.stream().forEach(emp ->{
// 处理gender 1 男 2 女
String gender = emp.getGender();
if("1".equals(gender)){
emp.setGender("男");
} else if ("2".equals(gender)) {
emp.setGender("女");
}
// 处理 job 1 讲师 2 班主任 3 就业指导
String job = emp.getJob();
if("1".equals(job)){
emp.setJob("讲师");
} else if ("2".equals(job)) {
emp.setJob("班主任");}
else if ("3".equals(job)) {
emp.setJob("就业指导");
}
});
return empList;
}
}
4.3.3 优化EmpController类
java
package com.runa.controller;
import com.runa.pojo.Emp;
import com.runa.pojo.Result;
import com.runa.service.EmpService;
import com.runa.service.impl.EmpServiceA;
import com.runa.utils.XmlParserUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class EmpController {
// private EmpService empService = new EmpServiceA();
@Autowired // 代表程序在运行时,IOC容器会提供该类型的bean对象,并赋值给该变量,===依赖注入
private EmpService empService; //解耦
@RequestMapping("/listEmp")
public Result list(){
// 1 调用service,获取数据
List<Emp> empList = empService.listEmp();
// 2 响应数据
return Result.success(empList);
}
}

4.3.4 如何更改为:实现类EmpserviceB
如果要更换成新的实现类EmpserviceB,只需要将EmpserviceA 的注解@Component 去掉,实现类EmpserviceB加上注解@Component
4.3.5 总结


4.4 IOC详解

4.4.1 优化EmpDaoA实现类
java
package com.runa.dao.impl;
import com.runa.dao.EmpDao;
import com.runa.pojo.Emp;
import com.runa.utils.XmlParserUtils;
import org.springframework.stereotype.Component;
import java.util.List;
//@Component // 将当前类交给IOC容器管理,成为IOC容器的bean
@Repository
public class EmpDaoA implements EmpDao {
@Override
public List<Emp> listEmap() {
// 1 加载并解析XML 文件
String file = this.getClass().getClassLoader().getResource("emp.xml").getFile();
System.out.println(file);
List<Emp> emplist = XmlParserUtils.parse(file, Emp.class);
return emplist;
}
}
'4.4.2 优化EmpServiceA实现类
java
package com.runa.service.impl;
import com.runa.dao.EmpDao;
import com.runa.dao.impl.EmpDaoA;
import com.runa.pojo.Emp;
import com.runa.service.EmpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
//@Component // 将当前类交给IOC容器管理,成为IOC容器的bean
@Service
public class EmpServiceA implements EmpService {
// private EmpDao empDao = new EmpDaoA();
@Autowired // 代表程序在运行时,IOC容器会提供该类型的bean对象,并赋值给该变量,===依赖注入
private EmpDao empDao; //解耦
@Override
public List<Emp> listEmp() {
//1 调用dao, 获取数据
List<Emp> empList = empDao.listEmap();
// 2 对数据进行转换处理 gender job
empList.stream().forEach(emp ->{
// 处理gender 1 男 2 女
String gender = emp.getGender();
if("1".equals(gender)){
emp.setGender("男");
} else if ("2".equals(gender)) {
emp.setGender("女");
}
// 处理 job 1 讲师 2 班主任 3 就业指导
String job = emp.getJob();
if("1".equals(job)){
emp.setJob("讲师");
} else if ("2".equals(job)) {
emp.setJob("班主任");}
else if ("3".equals(job)) {
emp.setJob("就业指导");
}
});
return empList;
}
}
4.4.3 优化EmpController类
java
package com.runa.controller;
import com.runa.pojo.Emp;
import com.runa.pojo.Result;
import com.runa.service.EmpService;
import com.runa.service.impl.EmpServiceA;
import com.runa.utils.XmlParserUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController //有@RestController就不需要使用 @Controller ,因为他包含了
public class EmpController {
// private EmpService empService = new EmpServiceA();
@Autowired // 代表程序在运行时,IOC容器会提供该类型的bean对象,并赋值给该变量,===依赖注入
private EmpService empService; //解耦
@RequestMapping("/listEmp")
public Result list(){
// 1 调用service,获取数据
List<Emp> empList = empService.listEmp();
// 2 响应数据
return Result.success(empList);
}
}

4.4.4 bean组件扫描

4.4.5 总结

4.5 DI详解

4.5.1 @Primary

4.5.2 @Qualifier


4.5.3 @Resource

4.5.3 总结
