当前位置: 首页 > news >正文

请求响应(学习笔记)

请求响应

文章目录

  • 请求响应
    • 请求
      • 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详解 请求响应&#xff1a; 请求(HttpServeltRequest)&#xff1a;获取请求数据…...

JavaScript核心语法(5)

这篇文章讲一下ES6中的核心语法&#xff1a;扩展运算符和模块化。 目录 1.扩展运算符 数组中的扩展运算符 基本用法 合并数组 对象中的扩展运算符 基本用法 合并对象 与解构赋值结合使用 数组解构中的剩余元素 对象解构中的剩余属性 2.模块化 基本概念 1.扩展运算符…...

2024年第15届蓝桥杯C/C++组蓝桥杯JAVA实现

目录 第一题握手&#xff0c;这个直接从49累加到7即可&#xff0c;没啥难度&#xff0c;后面7个不握手就好了&#xff0c;没啥讲的&#xff0c;(然后第二个题填空好难&#xff0c;嘻嘻不会&#xff09; 第三题.好数​编辑 第四题0R格式 宝石组合 数字接龙 最后一题:拔河 第…...

MongoDB 和 Redis 是两种不同类型的数据库比较

MongoDB 和 Redis 是两种不同类型的数据库&#xff0c;设计目标和应用场景各有侧重&#xff0c;因此性能对比需要结合具体需求场景进行评估。 1. MongoDB 性能特点 类型: 文档型数据库&#xff08;NoSQL&#xff09;。适合场景: 复杂查询&#xff1a;支持丰富的查询语法和索引…...

CLIP-Adapter: Better Vision-Language Models with Feature Adapters 论文解读

abstract 大规模对比视觉-语言预训练在视觉表示学习方面取得了显著进展。与传统的通过固定一组离散标签训练的视觉系统不同&#xff0c;(Radford et al., 2021) 引入了一种新范式&#xff0c;该范式在开放词汇环境中直接学习将图像与原始文本对齐。在下游任务中&#xff0c;通…...

Spring Boot 开发环境搭建详解

下面安装spring boot的详细步骤&#xff0c;涵盖了从安装 JDK 和 Maven 到创建和运行一个 Spring Boot 项目的全过程。 文章目录 1. 安装 JDK步骤 1.1&#xff1a;下载 JDK步骤 1.2&#xff1a;安装 JDK步骤 1.3&#xff1a;配置环境变量 2. 安装 Maven步骤 2.1&#xff1a;下载…...

网络安全中的数据科学如何重新定义安全实践?

组织每天处理大量数据&#xff0c;这些数据由各个团队和部门管理。这使得全面了解潜在威胁变得非常困难&#xff0c;常常导致疏忽。以前&#xff0c;公司依靠 FUD 方法&#xff08;恐惧、不确定性和怀疑&#xff09;来识别潜在攻击。然而&#xff0c;将数据科学集成到网络安全中…...

安装数据库客户端工具

如果没有勾选下面的&#xff0c;可以运行下面的两个命令 红框为自带数据库 新建数据库 右键运行mysql文件&#xff0c;找到数据库&#xff0c;并刷新...

GoogleTest做单元测试

目录 环境准备GoogleTest 环境准备 git clone https://github.com/google/googletest.git说cmkae版本过低了&#xff0c;解决方法 进到googletest中 cmake CMakeLists.txt make sudo make installls /usr/local/lib存在以下文件说明安装成功 中间出了个问题就是&#xff0c;…...

深入解析 EasyExcel 组件原理与应用

✨深入解析 EasyExcel 组件原理与应用✨ 官方&#xff1a;EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel 官网 在日常的 Java 开发工作中&#xff0c;处理 Excel 文件的导入导出是极为常见的需求。 今天&#xff0c;咱们就一起来深入了解一款非常实用的操作 Exce…...

JSON数据转化为Excel及数据处理分析

在现代数据处理中&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;因其轻量级和易于人阅读的特点而被广泛使用。然而&#xff0c;有时我们需要将这些JSON数据转化为Excel格式以便于进一步的分析和处理。本文将介绍如何将JSON数据转化为Excel文件&#xff0…...

(计算机网络)期末

计算机网络概述 物理层 信源就是发送方 信宿就是接收方 串行通信--一次只发一个单位的数据&#xff08;串行输入&#xff09; 并行通信--一次可以传输多个单位的数据 光纤--利用光的反射进行传输 传输之前&#xff0c;要对信源进行一个编码&#xff0c;收到信息之后要进行一个…...

【AI技术赋能有限元分析应用实践】将FEniCS 软件安装在Ubuntu22.04

FEniCS 完整介绍 FEniCS 是一个开源的计算工具包,专门用于解决偏微分方程(PDE)的建模和求解。它以灵活的数学抽象和高效的计算性能著称,可以让用户使用高层次的数学表达来定义问题,而无需关注底层的数值实现细节。 具体来看,FEniCS 是一个开源的高性能计算工具包,用于…...

快速识别模型:simple_ocr,部署教程

快速识别图片中的英文、标点符号、数学符号、Emoji, 模型会输出图片中文字行的坐标位置、最低得分、识别结果。当前服务用到的模型&#xff1a;检测模型、数字识别、英文符号识别。 一、部署流程 1.更新基础环境 apt update2.安装miniconda wget https://repo.anaconda.com/…...

【C/C++】数据库链接入门教程:从零开始的详细指南!MySQL集成与操作

文章目录 环境配置&#xff1a;搭建开发环境的基础步骤2.1 安装MySQL数据库2.2 配置C/C开发环境2.3 下载并安装MySQL Connector/C 基础操作&#xff1a;实现C/C与MySQL的基本交互3.1 建立数据库连接3.2 执行SQL语句3.3 处理查询结果 进阶技巧&#xff1a;提升数据库操作效率与安…...

C#中面试的常见问题005

1、重载和重写 重载&#xff08;Overloading&#xff09; 重载是指在同一个类中定义多个同名方法&#xff0c;但参数列表不同&#xff08;参数的数量、类型或顺序不同&#xff09;。返回类型可以相同也可以不同。重载方法允许你根据传入的参数类型和数量来调用不同的方法。 …...

使用Redis生成全局唯一id

为了生成一个符合要求的分布式全局ID&#xff0c;我们可以使用 StringRedisTemplate 来实现。这个ID由三部分组成&#xff1a; 符号位&#xff08;1 bit&#xff09;&#xff1a;始终为0&#xff0c;表示正数。时间戳&#xff08;31 bit&#xff09;&#xff1a;表示从某个起始…...

pnpm:包管理的新星,平替 npm 和 yarn

​ pnpm&#xff0c;一个老牌的 node.js 包管理器&#xff0c;支持 npm 的所有功能&#xff0c;完全足以用来替代 npm。它采用全局存储&#xff0c;每个项目内部使用了硬链接&#xff0c;所以很省空间&#xff0c;安装速度快。 本文介绍下 pnpm 的基本概念&#xff0c;安装、…...

Android调起系统分享图片到其他应用

Android调起系统分享图片到其他应用 有时候分享不想接第三方的&#xff0c;其实如果你的分享要求不是很高&#xff0c;调系统的分享也是可以的。 一、思路&#xff1a; 用intent.action Intent.ACTION_SEND 二、效果图&#xff1a; 三、关键代码&#xff1a; //这个是分享…...

详解Qt QBuffer

文章目录 **QBuffer 的详解****前言****QBuffer 是什么&#xff1f;****QBuffer 的主要用途****构造函数****主要成员函数详解****1. open()****原型&#xff1a;****作用&#xff1a;****参数&#xff1a;****返回值&#xff1a;****示例代码&#xff1a;** **2. write()****原…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...

嵌入式常见 CPU 架构

架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集&#xff0c;单周期执行&#xff1b;低功耗、CIP 独立外设&#xff1b;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel&#xff08;原始…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文通过代码驱动的方式&#xff0c;系统讲解PyTorch核心概念和实战技巧&#xff0c;涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...

【51单片机】4. 模块化编程与LCD1602Debug

1. 什么是模块化编程 传统编程会将所有函数放在main.c中&#xff0c;如果使用的模块多&#xff0c;一个文件内会有很多代码&#xff0c;不利于组织和管理 模块化编程则是将各个模块的代码放在不同的.c文件里&#xff0c;在.h文件里提供外部可调用函数声明&#xff0c;其他.c文…...