请求响应(学习笔记)
请求响应
文章目录
- 请求响应
- 请求
- Postman
- 简单参数
- 实体参数
- 数组集合参数
- 数组参数
- 集合参数
 
- 日期参数
- JSON参数
- 路径参数
 
- 响应
- 响应数据
- 统一响应结果
 
 
- 分层解耦
- 三层架构
- 分层解耦
- IOC & DI 入门
- IOC详解
- DI详解
 
 
请求响应:
- 请求(HttpServeltRequest):获取请求数据
- 响应(HttpServletResponse): 设置响应数据
- BS架构:Browser/Server 浏览器/服务器 架构模式,客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。(维护方便,体验一般)
- CS架构:Client/Server 客户端/服务端架构模式。(开发、维护麻烦,体验不错)
请求
Postman
当前最主流的开发模式:前后端分离开发。
由于前后端分离,后端开发没有前端页面,浏览器发送的请求都是get请求
Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件
作用:常用于进行接口测试。
简单参数
-  原始方式 在原始的web程序中,获取请求参数,需要通过HttpServletRequest对象手动获取 
package com.itheima;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;@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";}
}//使用postman发送Get请求
//http://localhost:8080/simpleParam?name=Tom&age=10
//ok
-  SpringBoot方式 简单参数:参数名与形参变量名相同,定义形参即可接收参数 
    //SpringBoot方式@RequestMapping("simpleParam")public String simpleParam(String name,Integer age) {System.out.println(name+":"+age);return"OK";}
 简单参数:如果方法形参名称与请求参数名称不匹配,可以使用@RequestParam完成映射
    @RequestMapping("/simpleParam")public String simpleParam(@RequestParam(name ="name")String username,Integer age) {System.out.println(username+":"+age);return "OK";}//使用postname发送GET请求
//http://localhost:8080/simpleParam?name=ZAY&age=3
//
@RequestParm 中的required默认属性为true,代表该请求参数必须传递,如果不传递将报错。如果该参数是可选的,可以将required属性设置为false
实体参数
当参数需要传输过多,使用简单参数就会变得繁琐,可以将所有的参数封装到一个实体类之中
- 简单实体对象:请求参数名与形参对象属性名相同,定义POJO接收即可
    @RequestMapping("/simplePojo")public String simplePojo(User user) {System.out.println(user);return "OK";}public class User{private String name;private Integer age;public User(String name,Integer age){this.name = name;this.age = age;}public User(){}public String getName(){return this.name;}public void setName(String name){this.name = name;}public Integer getAge(){return age;}public void setAge(Integer age){this.age = age;}
}
- 复杂实体对象:请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套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;}@Overridepublic String toString() {return "Address{" +"province='" + province + '\'' +", city='" + city + '\'' +'}';}
}public class User {private String name;private Integer age;private Address address;public User(String name, Integer age) {this.name = name;this.age = 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;}public User() {}public Address getAddress() {return address;}public void setAddress(Address address) {this.address = address;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +", address=" + address +'}';}
}@RequestMapping("/complexPojo")
public String complexPojo(User user){Systm.out.println(user);return "OK";
}//使用Postman发送GET请求
//http://localhost:8080/complexPojo?name=ZAY&age=10&address.province=北京&address.city=上海
//console返回OK
数组集合参数
数组参数
数组参数:请求参数名与形参组名称相同且请求参数为多个,定义数组类型形参即可接收参数
@RequestMapping("/arrayParam")
public String arrayParam(String []hobby){System.out.println(Arrays,toString(hobby));return "OK";
}//使用Postman发送GET请求
//http://localhost:8080/arrayParam?hobby=game&hobby=java&hobby=sing//[game, java, sing]
集合参数
集合参数:请求参数名与形参集合名称相同且请求参数为多个,通过@RequestParam绑定参数关系
    @RequestMapping("/listParam")public String listParam(@RequestParam List<String> hobby) {System.out.println(hobby);return "OK";}//使用Postman发送GET请求
//http://localhost:8080/listParam?hobby=game&hobby=java&hobby=sing//[game, java, sing]
日期参数
日期参数:使用@DateTimeFormat注解完成日期参数格式转换
    //日期时间参数@RequestMapping("/dateParam")public String dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){System.out.println(updateTime);return "OK";}
//使用Postman发送GET请求
//http://localhost:8080/dateParam?updateTime=2022-12-12 10:00:05//2022-12-12T10:00:05
JSON参数
Json参数:JSON数据键名与形参对象属性名相同,定义POJO类型形参即可接收参数,需要使用**@RequestBody**表示
    @RequestMapping("/jsonParam")public String jsonParam(@RequestBody User user) {System.out.println(user);return "OK";}
//使用Postman发送POST请求
//http://localhost:8080/jsonParam{"name":"ZAY","age":18,"address":{"province":"安徽","city":"合肥"}
}//User{name='ZAY', age=18, address=Address{province='安徽', city='合肥'}}
路径参数
路径参数:通过请求URL直接传递参数,使用{…}来表示该路径参数,需要使用**@PathVariable**获取路径参数
    //路径参数@RequestMapping("/path/{id}")public String path(@PathVariable Integer id) {System.out.println(id);return "OK";}//使用Postman发送GET请求
//http://localhost:8080/path/10086
//10086
@RequestMapping("/path/{id}/{name}")
public String path(@PathVariable Integer id, @PathVariable String name) {System.out.println(id +":"+name);return "OK";
}//使用Postman发送请求
//http://localhost:8080/path/1/ITCAST
//1:ITCAST
响应
响应数据
@ResponseBody
- 类型:方法注解、注解类
- 位置:Controller方法上/类上
- 作用:将方法返回值直接响应,如果返回值类型是 实体对象/集合,将会转换为JSON格式响应
- 说明:@RestController = @Controller + @ResponseBody
统一响应结果
public class Result{//响应码 1,成功  / 0,失败private Integer code;//提示信息private String msg;//返回数据private Object data;
}
{"code":"1","msg":"操作成功","data":...
}统一响应结果
package com.itheima.pojo;/*** 统一响应结果封装类*/
public class Result {private Integer code ;//1 成功 , 0 失败private String msg; //提示信息private Object data; //数据 datapublic 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);}@Overridepublic String toString() {return "Result{" +"code=" + code +", msg='" + msg + '\'' +", data=" + data +'}';}
}分层解耦
三层架构
三层架构: Controller(接收请求、响应数据)、Service(逻辑处理)、Dao(数据访问)
- controller:控制层,接收前端发送的请求,对请求进行处理,并响应数据。
- service:业务逻辑层,处理具体的业务逻辑
- dao:数据访问层(Data Access Object)(持久层),负责数据访问操作,包括数据的增删改查
//controller层
@RestController
public class EmpController{private EmpService empService = new EmpServiceA();@RequestMapping("/listEmp")public Result list(){//调用service 获取数据List<Emp> empList = empService.listEmp();//组装数据并返回return Result.success(empList);}
}
//dao层
public class EmpDaoA implements EmpDao{public List<Emp>listEmp(){//加载emp.xml 解析emp.xml中的数据String file = this.getClass().getClassLoader().getResource("emp.xml").getFile();List<Emp> empList = XmlParesrUtiles.parse(file,Emp.class);return empList;}
}
//service层
public class EmpServiceA implements EmpService{private EmpDao empDao = new EmpDaoA();pulic List<Emp> listEmp(){//调用dao层 获取数据List<Emp> empList = empDao.listEmp();//对员工信息中的gender job字段进行处理empList.stream().forEach(emp ->{if('1'.equals(gender)){emp.setGender('男');}else if("2".equlas(gender)){emp.setGender('女');}});return empList;}
}
分层解耦
- 内聚:软件中各个模块内部的功能联系
- 耦合:衡量软件中各个层/模块之间的依赖、关联的成都
- 软件设计原则:高内聚、低耦合
控制反转:Inversion Of Control 简称IOC。对象的串讲控制权由程序自身转移到外部(容器),这种思想称为控制反转
依赖注入:Dependency Injection 简称DI。容器为应用程序提供运行时,所依赖的资源,称之为依赖注入。
Bean对象:IOC容器中创建、管理的对象,称之为bean
IOC & DI 入门
- Service层 及 Dao层的实现类,交给IOC容器管理
@Component
public class EmpDaoA implements EmpDao{public List<Emp> listEmp(){//从文件中查询数据String file = this.getClass().getClassLoader().getResource("emp.xml").getFile();List<Emp> empList = XmpParserUtils.parse(file,Emp.class);return empList;}
}
@Component
public class EmpServiceA implements EmpService{private EmpDao empDao;public List<Emp>listEmp(){//调用dao层 查询数据List<Emp> empList = empDao.listEmp();}
}
- 为Controller及Service注入运行时,依赖的对象
@RestController
public class EmpController{@Autowiredprivate EmpService empService;@RequestMapping("/listEmp")public Result listEmp() throws Exception{List<Emp> empList = empService.listEmp();return Resultsuccess(empList);}
}
@Component
public class EmpServiceA implements EmpService{@Autowiredprivate EmpDao empDao;public List<Emp> listEmp(){//调用dao层 查询数据List<Emp>empList = empDao.listEmp();}
}
- 运行测试
@Component 	//将当前类交给IOC容器管理,称为IOC容器中的bean(对象)
@Autowired	//运行时,IOC容器会提供该类型的bean对象,并赋值给该变量-依赖注入
IOC详解
Bean的声明:
要把某个对象交给IOC容器管理,需要在对应的类上加上如下注解之一
| 注解 | 说明 | 位置 | 
|---|---|---|
| @Component | 声明bean的基础注解 | 不属于以下三类,用此注解 | 
| @Controller | @Component的衍生注解 | 标注在控制器类上 | 
| @Service | @Component的衍生注解 | 标注在业务类上 | 
| @Repository | @Component的衍生注解 | 标注在数据访问类上 | 
注意事项
- 声明bean的时候,可以通过value属性指定bean的名字,如果没有指定,默认为雷鸣的首字母小写
- 使用以上四个注解都可以声明bean,但是在springboot集成web开发中,声明控制器bean只能用@Controller
Bean组件扫描
- 前面声明bean的四大注解,想要生效,还需要被组件扫描注解@ComponentScan扫描
- @ComponentScan注解虽然没有显式配置,但是时间上已经包含在了启动类声明注解@SpringBootApplication中,默认扫描的范围是启动类所在包及其子包
DI详解
Bean注入:
- @Autowired注解默认是按照类型进行,如果存在多个相同类型的bean,会报错
- 通过以下几种方案解决: - @Primary
- @Qualifiler
- @Resource
 
相关文章:
请求响应(学习笔记)
请求响应 文章目录 请求响应请求Postman简单参数实体参数数组集合参数数组参数集合参数 日期参数JSON参数路径参数 响应响应数据统一响应结果 分层解耦三层架构分层解耦IOC & DI 入门IOC详解DI详解 请求响应: 请求(HttpServeltRequest):获取请求数据…...
 
JavaScript核心语法(5)
这篇文章讲一下ES6中的核心语法:扩展运算符和模块化。 目录 1.扩展运算符 数组中的扩展运算符 基本用法 合并数组 对象中的扩展运算符 基本用法 合并对象 与解构赋值结合使用 数组解构中的剩余元素 对象解构中的剩余属性 2.模块化 基本概念 1.扩展运算符…...
 
2024年第15届蓝桥杯C/C++组蓝桥杯JAVA实现
目录 第一题握手,这个直接从49累加到7即可,没啥难度,后面7个不握手就好了,没啥讲的,(然后第二个题填空好难,嘻嘻不会) 第三题.好数编辑 第四题0R格式 宝石组合 数字接龙 最后一题:拔河 第…...
MongoDB 和 Redis 是两种不同类型的数据库比较
MongoDB 和 Redis 是两种不同类型的数据库,设计目标和应用场景各有侧重,因此性能对比需要结合具体需求场景进行评估。 1. MongoDB 性能特点 类型: 文档型数据库(NoSQL)。适合场景: 复杂查询:支持丰富的查询语法和索引…...
 
CLIP-Adapter: Better Vision-Language Models with Feature Adapters 论文解读
abstract 大规模对比视觉-语言预训练在视觉表示学习方面取得了显著进展。与传统的通过固定一组离散标签训练的视觉系统不同,(Radford et al., 2021) 引入了一种新范式,该范式在开放词汇环境中直接学习将图像与原始文本对齐。在下游任务中,通…...
Spring Boot 开发环境搭建详解
下面安装spring boot的详细步骤,涵盖了从安装 JDK 和 Maven 到创建和运行一个 Spring Boot 项目的全过程。 文章目录 1. 安装 JDK步骤 1.1:下载 JDK步骤 1.2:安装 JDK步骤 1.3:配置环境变量 2. 安装 Maven步骤 2.1:下载…...
 
网络安全中的数据科学如何重新定义安全实践?
组织每天处理大量数据,这些数据由各个团队和部门管理。这使得全面了解潜在威胁变得非常困难,常常导致疏忽。以前,公司依靠 FUD 方法(恐惧、不确定性和怀疑)来识别潜在攻击。然而,将数据科学集成到网络安全中…...
 
安装数据库客户端工具
如果没有勾选下面的,可以运行下面的两个命令 红框为自带数据库 新建数据库 右键运行mysql文件,找到数据库,并刷新...
 
GoogleTest做单元测试
目录 环境准备GoogleTest 环境准备 git clone https://github.com/google/googletest.git说cmkae版本过低了,解决方法 进到googletest中 cmake CMakeLists.txt make sudo make installls /usr/local/lib存在以下文件说明安装成功 中间出了个问题就是,…...
 
深入解析 EasyExcel 组件原理与应用
✨深入解析 EasyExcel 组件原理与应用✨ 官方:EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel 官网 在日常的 Java 开发工作中,处理 Excel 文件的导入导出是极为常见的需求。 今天,咱们就一起来深入了解一款非常实用的操作 Exce…...
JSON数据转化为Excel及数据处理分析
在现代数据处理中,JSON(JavaScript Object Notation)因其轻量级和易于人阅读的特点而被广泛使用。然而,有时我们需要将这些JSON数据转化为Excel格式以便于进一步的分析和处理。本文将介绍如何将JSON数据转化为Excel文件࿰…...
 
(计算机网络)期末
计算机网络概述 物理层 信源就是发送方 信宿就是接收方 串行通信--一次只发一个单位的数据(串行输入) 并行通信--一次可以传输多个单位的数据 光纤--利用光的反射进行传输 传输之前,要对信源进行一个编码,收到信息之后要进行一个…...
【AI技术赋能有限元分析应用实践】将FEniCS 软件安装在Ubuntu22.04
FEniCS 完整介绍 FEniCS 是一个开源的计算工具包,专门用于解决偏微分方程(PDE)的建模和求解。它以灵活的数学抽象和高效的计算性能著称,可以让用户使用高层次的数学表达来定义问题,而无需关注底层的数值实现细节。 具体来看,FEniCS 是一个开源的高性能计算工具包,用于…...
 
快速识别模型:simple_ocr,部署教程
快速识别图片中的英文、标点符号、数学符号、Emoji, 模型会输出图片中文字行的坐标位置、最低得分、识别结果。当前服务用到的模型:检测模型、数字识别、英文符号识别。 一、部署流程 1.更新基础环境 apt update2.安装miniconda wget https://repo.anaconda.com/…...
 
【C/C++】数据库链接入门教程:从零开始的详细指南!MySQL集成与操作
文章目录 环境配置:搭建开发环境的基础步骤2.1 安装MySQL数据库2.2 配置C/C开发环境2.3 下载并安装MySQL Connector/C 基础操作:实现C/C与MySQL的基本交互3.1 建立数据库连接3.2 执行SQL语句3.3 处理查询结果 进阶技巧:提升数据库操作效率与安…...
C#中面试的常见问题005
1、重载和重写 重载(Overloading) 重载是指在同一个类中定义多个同名方法,但参数列表不同(参数的数量、类型或顺序不同)。返回类型可以相同也可以不同。重载方法允许你根据传入的参数类型和数量来调用不同的方法。 …...
使用Redis生成全局唯一id
为了生成一个符合要求的分布式全局ID,我们可以使用 StringRedisTemplate 来实现。这个ID由三部分组成: 符号位(1 bit):始终为0,表示正数。时间戳(31 bit):表示从某个起始…...
 
pnpm:包管理的新星,平替 npm 和 yarn
 pnpm,一个老牌的 node.js 包管理器,支持 npm 的所有功能,完全足以用来替代 npm。它采用全局存储,每个项目内部使用了硬链接,所以很省空间,安装速度快。 本文介绍下 pnpm 的基本概念,安装、…...
 
Android调起系统分享图片到其他应用
Android调起系统分享图片到其他应用 有时候分享不想接第三方的,其实如果你的分享要求不是很高,调系统的分享也是可以的。 一、思路: 用intent.action Intent.ACTION_SEND 二、效果图: 三、关键代码: //这个是分享…...
详解Qt QBuffer
文章目录 **QBuffer 的详解****前言****QBuffer 是什么?****QBuffer 的主要用途****构造函数****主要成员函数详解****1. open()****原型:****作用:****参数:****返回值:****示例代码:** **2. write()****原…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
 
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
 
C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...
 
【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制
目录 节点的功能承载层(GATT/Adv)局限性: 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能,如 Configuration …...
 
tauri项目,如何在rust端读取电脑环境变量
如果想在前端通过调用来获取环境变量的值,可以通过标准的依赖: std::env::var(name).ok() 想在前端通过调用来获取,可以写一个command函数: #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...
深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向
在人工智能技术呈指数级发展的当下,大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性,吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型,成为释放其巨大潜力的关键所在&…...
