web--请求响应、分层解耦

BS架构:可以直接通过网站网页访问
CS架构:需要下载响应客户端
请求
前置工具:postman

请求参数接收
简单参数接收
手动接收(了解)

springboot方式接收



实体参数接收

数组集合参数接收
数组封装

集合封装:加上requestparam绑定集合

日期参数

JSON格式参数
postman发送请求传递JSON参数
注:key值要用引号包裹

接收参数

路径参数

总结

响应
responsebody注解:

统一响应结果


分层解耦
web开发三层架构


Dao
面向接口编程,用以实现多种不同的处理数据方法


Service


Controller

解耦
控制反转(IOC):对象的创建控制权从应用程序转移到外部容器
依赖注入(DI):外部容器为程序运行提供需要的资源
bean:IOC中创建的对象

@Component 注解:将当前类交给IOC容器管理(控制反转)
@Autowired注解:IOC容器为程序提供该类型的bean对象,并赋值给该变量(依赖注入)
IOC

bean的组件扫描
SpringbootApplication默认扫描范围是springboot启动类所在包及其子包范围,若bean类声明在范围之外则无法扫描对应bean类

解决1:
在启动类中通过ComponentScan注解手动设置扫描范围(不建议)

解决2:
将springboot对应代码写在启动类所属包或其子包下,保证其默认扫描能覆盖所有bean类
DI
Autowired注解默认以类型为注入方式从IOC中获取对象进行注入,若IOC中有多个同类型bean类,则默认注入方式会报错
解决1:
通过Primary注解设置bean类注入优先级

解决2:
Qualifier与Autowired配合使用

解决3:
Resource注解

解决2与解决3区别:
- @Autowired+- @Qualifier: 这是 Spring 原生的注解组合。先按类型匹配,如果有多个同类型 Bean,再通过- @Qualifier指定的名称进行精确匹配。它的匹配过程是 “类型 -> 名称”。
- @Resource: 这是 JSR-250 (Java 规范) 提供的注解。它默认先按 Bean 的名称匹配,如果找不到,再回退到按类型匹配。它的匹配过程是 “名称 -> 类型”。
- 例:统一接口两实现类 - // 接口 public interface PaymentService {void pay(); }// 实现类1 @Component("creditCardPayment") // 指定Bean的名称为 "creditCardPayment" public class CreditCardPaymentService implements PaymentService {@Overridepublic void pay() {System.out.println("Paying with credit card.");} }// 实现类2 @Component("alipayPayment") // 指定Bean的名称为 "alipayPayment" public class AlipayPaymentService implements PaymentService {@Overridepublic void pay() {System.out.println("Paying with Alipay.");} }- 解决2: 
- @Component public class ShoppingCart {private PaymentService paymentService;// 使用 @Qualifier 明确指定要注入的 Bean 名称@Autowired@Qualifier("alipayPayment") // 告诉Spring,我要用名为 "alipayPayment" 的PaymentServicepublic void setPaymentService(PaymentService paymentService) {this.paymentService = paymentService;}public void checkout() {paymentService.pay();} }- 解决3: - @Component public class ShoppingCart {// 方式1:通过 name 属性指定@Resource(name = "alipayPayment")private PaymentService paymentService;// 方式2:如果不指定 name,则默认使用字段名 "paymentService" 去匹配// 但我们的Bean叫 "alipayPayment" 或 "creditCardPayment",所以这会失败// @Resource// private PaymentService alipayPayment; // 如果有一个Bean正好叫 "alipayPayment",这会成功public void checkout() {paymentService.pay();} }
