day05-SpringBootWeb请求响应

请求响应:

  • 请求(HttpServletRequest):获取请求数据
  • 响应(HttpServletResponse):设置响应数据

BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。
CS架构:Client/Server,客户端/服务器架构模式。
在这里插入图片描述

一、请求

1 Postman

Postman 是一款功能强大的网页调试与发送网页 HTTP 请求的 Chrome 插件。

2 简单参数

简单参数:在向服务器发起请求时,向服务器传递的是一些普通的请求数据。

2.1 原始方式(仅做了解,在以后的开发中不会使用到)

在原始的 Web 程序当中,需要通过 Servlet 中提供的 API:HttpServletRequest(请求对象),获取
请求的相关信息。比如获取请求参数: Tomcat 接收到 http 请求时:把请求的相关信息封装到 HttpServletRequest 对象中

在 Controller 中,我们要想获取 Request 对象,可以直接在方法的形参中声明 HttpServletRequest 对象。然后就可以通过该对象来获取请求信息:

	//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";}

2.2 SpringBoot方式

如果是简单参数,参数名与形参变量名相同,定义同名的形参即可接收参数。

    //springboot方式@RequestMapping("/simpleParam")public String simpleParam(String name, Integer age){System.out.println(name+ ":" + age);return "OK";}

结论:不论是 GET 请求还是 POST 请求,对于简单参数来讲,只要保证请求参数名和 Controller 方法中的形参名保持一致 ,就可以获取到请求参数中的数据值。

2.3 参数名不一致

结论:运行没有报错。对于简单参数来讲,请求参数名和 controller 方法中的形参名不一致时,无法接收到请求数据。

简单参数:如果方法形参名称与请求参数名称不匹配,可以使用 @RequestParam 完成映射。

//    @RequestMapping("/simpleParam")public String simpleParam(@RequestParam(name = "name", required = false) String username, Integer age){System.out.println(username+ ":" + age);return "OK";}

@RequestParam 中的 required 属性默认为 true,代表该请求参数必须传递,如果不传递将报错。 如果该参数是可选的,可以将 required 属性设置为 false。

3 实体参数

3.1 简单实体对象

简单实体对象:请求参数名与形参对象属性名相同,定义 POJO 接收即可
在这里插入图片描述

    //2. 实体参数@RequestMapping("/simplePojo")public String simplePojo(User user){System.out.println(user);return "OK";}
public class User {private String name;private Integer age;
}

3.2 复杂实体对象

复杂实体对象:请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套POJO属性参数。
在这里插入图片描述

    @RequestMapping("/complexPojo")public String complexPojo(User user){System.out.println(user);return "OK";}
public class User {private String name;private Integer age;private Address address;
}
public class Address {private String province;private String city;
}

4 数组集合参数

数组集合参数的使用场景:在 HTML 的表单中,有一个表单项是支持多选的(复选框),可以提交选择的多个值。
在这里插入图片描述

4.1 数组

数组参数:请求参数名与形参数组名称相同且请求参数为多个,定义数组类型形参即可接收参数

	//3. 数组集合参数@RequestMapping("/arrayParam")public String arrayParam(String[] hobby){System.out.println(Arrays.toString(hobby));return "OK";}

4.2 集合

集合参数:请求参数名与形参集合名称相同且请求参数为多个,@RequestParam 绑定参数关系

    @RequestMapping("/listParam")public String listParam(@RequestParam List<String> hobby){System.out.println(hobby);return "OK";}

5 日期参数

日期参数:使用 @DateTimeFormat 注解完成日期参数格式转换,以及其 pattern 属性来设置日期的格式。
在这里插入图片描述

//4. 日期时间参数@RequestMapping("/dateParam")public String dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){System.out.println(updateTime);return "OK";}

6 JSON参数

JSON 参数:JSON 数据 键名 与形参对象 属性名 相同,定义 POJO 类型形参即可接收参数,需要使用 @RequestBody 标识
在这里插入图片描述

	//5. json参数@RequestMapping("/jsonParam")public String jsonParam(@RequestBody User user){System.out.println(user);return "OK";}

7 路径参数

路径参数:通过请求 URL 直接传递参数,使用{…}来标识该路径参数,需要使用 @PathVariable 获取路径参数
在这里插入图片描述

    //6. 路径参数@RequestMapping("/path/{id}")public String pathParam(@PathVariable Integer id){System.out.println(id);return "OK";}@RequestMapping("/path/{id}/{name}")public String pathParam2(@PathVariable Integer id , @PathVariable String name){System.out.println(id);System.out.println(name);return "OK";}

二、响应

1 @ResponseBody

类型:方法注解、类注解
位置:Controller 方法上/类上
作用:将方法返回值直接响应,如果返回值类型是 实体对象/集合 ,将会转换为 JSON 格式响应
说明:@RestController = @Controller + @ResponseBody

/*** 测试响应数据*/
@RestController
public class ResponseController {@RequestMapping("/hello")public String hello(){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;}}

2 统一响应结果

前端:只需要按照统一格式的返回结果进行解析(仅一种解析方案),就可以拿到数据。

统一的返回结果使用类来描述,在这个结果中包含:

  • 响应状态码:当前请求是成功,还是失败
  • 状态码信息:给页面的提示信息
  • 返回的数据:给前端响应的数据(字符串、对象、集合)
/*** 统一响应结果封装类*/
public class Result {private Integer code ;//1 成功 , 0 失败private String msg; //提示信息private Object data; //数据 datepublic 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 +'}';}
}
@RestController
public class ResponseController {@RequestMapping("/hello")public Result hello(){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 案例

加载并解析 emp.xml 文件中的数据,完成数据处理,并在页面展示。
在这里插入图片描述

实现步骤

  1. 在 pom.xml 文件中引入 dom4j 的依赖,用于解析 XML 文件
  2. 引入资料中提供的解析 XML 的工具类 XMLParserUtils、对应的实体类 Emp、XML文件 emp.xml
  3. 引入资料中提供的静态页面文件,放在 resources 下的 static 目录下
  4. 编写 Controller 程序,处理请求,响应数据

Springboot 项目的静态资源(html,css,js等前端资源)默认存放目录为:classpath:/static 、 classpath:/public、 classpath:/resources

@RestController
public class EmpController {@RequestMapping("/listEmp")public Result list(){//1. 加载并解析emp.xmlString file = this.getClass().getClassLoader().getResource("emp.xml").getFile();System.out.println(file);List<Emp> empList = XmlParserUtils.parse(file, Emp.class);//2. 对数据进行转换处理 - gender, jobempList.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);}}

三、分层解耦

1 三层架构

在这里插入图片描述

那其实我们上述案例的处理逻辑呢,从组成上看可以分为三个部分:

  1. 数据访问:负责业务数据的维护操作,包括增、删、改、查等操作。
  2. 逻辑处理:负责业务逻辑处理的代码。
  3. 请求处理、响应数据:负责,接收页面的请求,给页面响应数据。

在这里插入图片描述

  1. Controller:控制层。接收前端发送的请求,对请求进行处理,并响应数据。
  2. Service:业务逻辑层。处理具体的业务逻辑。
  3. Dao:数据访问层(Data Access Object),也称为持久层。负责数据访问操作,包括数据的增、删、改、查。

在这里插入图片描述

2 分层解耦

  • 内聚:软件中各个功能模块内部的功能联系。
  • 耦合:衡量软件中各个层/模块之间的依赖、关联的程度。
  • 软件设计原则:高内聚低耦合。

在这里插入图片描述

  • 控制反转: Inversion Of Control,简称 IOC。对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转。
  • 依赖注入: Dependency Injection,简称 DI。容器为应用程序提供运行时,所依赖的资源,称之为依赖注入。
  • Bean对象:IOC容器中创建、管理的对象,称之为bean。

3 IOC&DI

3.1 IOC&DI入门

①. Service 层 及 Dao 层的实现类,交给 IOC 容器管理。
②. 为 Controller 及 Service 注入运行时,依赖的对象。
③. 运行测试。
在这里插入图片描述

3.2 IOC详解

3.2.1 bean的声明

要把某个对象交给 IOC 容器管理,需要在对应的类上加上如下注解之一:
在这里插入图片描述

注意事项:

  • 声明 bean 的时候,可以通过 value 属性指定 bean 的名字,如果没有指定,默认为类名首字母小写。
  • 使用以上四个注解都可以声明 bean,但是在 springboot 集成 web 开发中,声明控制器 bean 只能用 @Controller。
3.2.2 组件扫描
  • 前面声明 bean 的四大注解,要想生效,还需要被组件扫描注解 @ComponentScan 扫描。
  • @ComponentScan 注解虽然没有显式配置,但是实际上已经包含在了启动类声明注解 @SpringBootApplication 中,默认扫描的范围是启动类所在包及其子包
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {@Filter(type = FilterType.CUSTOM,classes = {TypeExcludeFilter.class}
), @Filter(type = FilterType.CUSTOM,classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {

3.3 DI详解

@Autowired注解,默认是按照 类型 进行,如果存在多个相同类型的bean,将会报出如下错误:
在这里插入图片描述

通过以下几种方案来解决:

  1. @Primary
  2. @Qualifier
  3. @Resource
@Primary
@Service
public class EmpServiceA implements EmpService {
}
@RestController
public class EmpController {@Autowired    @Qualifier("empServiceA")private EmpService empService ;
@RestController
public class EmpController {@Resource(name = "empServiceB")private EmpService empService ;

@Autowird 与 @Resource的区别

  1. @Autowired 是 spring 框架提供的注解,而 @Resource 是 JDK 提供的注解
  2. @Autowired 默认是按照类型注入,而 @Resource 是按照名称注入

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/748572.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python环境安装及Selenium引入

Python环境安装 环境下载 Download Python | Python.org 环境安装 需使用管理员身份运行 查看环境是否安装成功 python --version 如果未成功则检查环境变量配置 安装 Selenium 库 pip install selenium Selenium 可以模拟用户在浏览器中的操作&#xff0c;如点击按钮、填写…

轻松玩转消息通信:SimpleAmqpClient 和 RabbitMQ 在C++中的终极指南

Rabbmq服务端 安装 这里我使用docker安装rabbitmq服务端,没有安装的就先去看其他的博客安装rabbitmq或者docker #拉取rabbitmq docker pull rabbitmq:management #运行rabbitmq,记得打开防火墙端口 docker run -d --hostname rabbitsrv --name rabbit -p 5672:5672 -p 15672…

前端和后端权限控制【笔记】

前端权限设置【笔记】 前言版权推荐前端权限设置需求效果实现资源 后端权限控制1.给所有前端请求都携带token2.添加拦截器3.配置到WebMvcConfiguration4.更多的权限验证 最后 前言 2024-3-15 18:27:26 以下内容源自《【笔记】》 仅供学习交流使用 版权 禁止其他平台发布时删…

Seata 2.x 系列【11】多数据源分布式事务

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Seata 版本 2.0.0 本系列Spring Boot 版本 3.2.0 本系列Spring Cloud 版本 2023.0.0 源码地址&#xff1a;https://gitee.com/pearl-organization/study-seata-demo 文章目录 1. 概述2. 多数据…

SQLiteC/C++接口简介

快速跳转文章列表&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLite——世界上部署最广泛的开源数据库&#xff08;简介&#xff09; 下一篇&#xff1a;SQLiteC/C接口详细介绍&#xff08;一&#xff09; 引言&#xff1a; 作为一种轻量级、嵌入式关系型数据库…

MAC M芯片 Anaconda安装

Anaconda安装 1.M芯片下载AnaConda 1.M芯片下载AnaConda https://www.anaconda.com/download 安装完成 conda的版本是24.1.2

Go语言中的make和new:内存分配与对象创建的巧妙之道

Go语言中的make和new&#xff1a;内存分配与对象创建的巧妙之道 Go语言作为一门简洁而强大的编程语言&#xff0c;提供了多种用于动态内存分配和对象创建的关键词。其中&#xff0c;make和new是两个常见且常被混淆的关键词。本文将深入讲解Go语言中make和new的区别&#xff0c;…

python来判断密码强弱-类

设计者&#xff1a;ISDF 版本&#xff1a;v1.0 日期&#xff1a;2019/4/3设计者&#xff1a;ISDF 版本&#xff1a;v2.0 日期&#xff1a;2024/4/3 class PasswordTool:密码工具类def __init__(self,password):#类的属性self.password passwordself.stregth_level 0def check…

考研C语言复习进阶(5)

目录 1. 为什么使用文件 2. 什么是文件 2.1 程序文件 2.2 数据文件 2.3 文件名 3. 文件的打开和关闭 3.1 文件指针 3.2 文件的打开和关闭 4. 文件的顺序读写 ​编辑 ​编辑 4.1 对比一组函数&#xff1a; ​编辑 5. 文件的随机读写 5.1 fseek 5.2 ftell 5.3 rewind…

【C语言】linux内核pci_save_state

一、中文注释 //include\linux\pci.h /* 电源管理相关的例程 */ int pci_save_state(struct pci_dev *dev);//drivers\pci\pci.c /*** pci_save_state - 在挂起前保存PCI设备的配置空间* dev: - 我们正在处理的PCI设备*/ int pci_save_state(struct pci_dev *dev) {int i;/* X…

谷歌网络营销方案有几种?​

谷歌作为海外的头部工具&#xff0c;本身其实就有多种工具可以供你使用&#xff0c;在这里说说谷歌那些工具 Google My Business&#xff0c;对于小企业或者本地服务来说&#xff0c;把自己的业务信息优化并完善在Google My Business上是个不错的选择。这样当人们在附近搜索相…

微信小程序云开发教程——墨刀原型工具入门(表单组件)

引言 作为一个小白&#xff0c;小北要怎么在短时间内快速学会微信小程序原型设计&#xff1f; “时间紧&#xff0c;任务重”&#xff0c;这意味着学习时必须把握微信小程序原型设计中的重点、难点&#xff0c;而非面面俱到。 要在短时间内理解、掌握一个工具的使用&#xf…

【NC223888】红色和紫色

题目 红色和紫色 博弈论&#xff0c;想得出来思路就简单&#xff0c;想不出来就难。一般使用猜测法。 思路 如果小红随意取一个格子涂色&#xff0c;那么小紫怎么涂色才是她的最优选择呢&#xff1f; 假设小紫只能选择小红涂色的格子的相邻格子或者是最近斜对角的一个格子涂色…

LeetCode 2684.矩阵中移动的最大次数:一列一列处理,只记能到哪行(BFS)

【LetMeFly】2684.矩阵中移动的最大次数&#xff1a;一列一列处理&#xff0c;只记能到哪行(BFS) 力扣题目链接&#xff1a;https://leetcode.cn/problems/maximum-number-of-moves-in-a-grid/ 给你一个下标从 0 开始、大小为 m x n 的矩阵 grid &#xff0c;矩阵由若干 正 整…

【漏洞复现】大华智慧园区综合管理平台SQL注入漏洞

Nx01 产品简介 大华智慧园区综合管理平台是一款综合管理平台&#xff0c;具备园区运营、资源调配和智能服务等功能。该平台旨在协助优化园区资源分配&#xff0c;满足多元化的管理需求&#xff0c;同时通过提供智能服务&#xff0c;增强使用体验。 Nx02 漏洞描述 大华智慧园区…

Halcon图像预处理、阈值分割

1、blob&#xff08;Binary Large Object&#xff09;是指二值图像中连通区域。 预处理通常包括一系列步骤&#xff0c;例如去噪、形态学操作、特征提取等。 read_image(Image,claudia) get_image_size(Image,Width,Height) dev_open_window_fit_size (0, 0, Width, Width, -1,…

如何在iPhone上恢复已删除的微信聊天记录?

你好&#xff0c;我前几天删除了微信聊天记录。有什么办法可以恢复iPhone上已删除的微信聊天记录吗&#xff1f; 有些人每次使用设备时都会遇到在 iPhone 上丢失消息的风险。特别是&#xff0c;由于多种因素&#xff0c;可能会丢失第三方数据&#xff0c;微信消息也是如此。微…

2024Vue高频面试题

前言: Vue 在前端开发领域拥有强劲的发展势头,以下是一些 Vue 的发展趋势: 1.持续增长的用户数量: Vue 作为一款轻量级、易学易用的前端框架,吸引了越来越多的开发者和企业选择使用。其活跃的社区和丰富的资源也促进了用户数量的不断增长。 2.生态系统不断丰富: 随着 V…

远超预期,特效吹爆!《武庚纪》:建议漫改都按这个标准来!

作为《武庚纪》动画党&#xff0c;听闻要改编成真人电视剧时&#xff0c;最害怕的无非五毛钱特效&#xff0c;流水线仙侠&#xff0c;无脑古偶。但在看过《烈焰》&#xff08;原名&#xff1a;武庚纪&#xff09;之后&#xff0c;不得不感叹一句&#xff1a;“倒也不用这么还原…

【计算机网络篇】计算机网络的性能指标

文章目录 &#x1f354;计算机网络的性能指标&#x1f5c3;️常见的计算机网络性能指标⭐速率⭐带宽⭐吞吐量⭐时延⭐时延带宽积⭐往返时间⭐利用率⭐丢包率 &#x1f50e;总结 &#x1f354;计算机网络的性能指标 计算机网络的性能指标被用来从不同方面度量计算机网络的性能 …