2. SpringMVC 请求与响应
文章目录
- 1. 请求映射路径
- 2. 请求参数
- 2.1 get 请求发送普通参数
- 2.2 post 请求发送普通参数
- 2.3 五种类型的参数传递
- 2.4.1 普通参数
- 2.4.2 POJO 数据类型
- 2.4.3 嵌套 POJO 类型参数
- 2.4.4 数组类型参数
- 2.4.5 集合类型参数
- 3. json 数据传输参数(重点)
- 3.1 传输 json 普通数组
- 3.2 传输 json 对象
- 3.3 传输 json 对象数组
- 4. 日期类型参数传递
- 5. 响应 json 数据
- 5.1 响应 / 跳转页面(了解)
- 5.2 响应文本数据(了解)
- 5.3 响应 json 数据
- 5.3.1 响应 POJO 对象
- 5.3.2 响应 POJO 对象集合
- 5.3.3 @ResponseBody 注解
1. 请求映射路径
环境准备:
(1) pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><packaging>war</packaging><name>springmvc03_request_mapping</name><groupId>com.itheima</groupId><artifactId>springmvc03_request_mapping</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><!--导入springmvc与servlet的依赖--><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope><!--防止与tomcat插件冲突--></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.10.RELEASE</version></dependency></dependencies><!--tomcat插件--><build><plugins><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.1</version><configuration><port>80</port><!--tomcat端口号--><path>/</path><!--虚拟目录--></configuration></plugin></plugins></build>
</project>
(2) ServletControllerInitConfig
// 定义一个servlet容器启动的配置类
// 要继承AbstractAnnotationConfigDispatcherServletInitializer
public class ServletControllerInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {//加载Spring配置类@Overrideprotected Class<?>[] getRootConfigClasses() {return null;}//加载SpringMVC配置类@Overrideprotected Class<?>[] getServletConfigClasses() {return new Class[]{SpringMvcConfig.class};}//设置哪些请求由springMVC处理@Overrideprotected String[] getServletMappings() {//所有请求都由springMVC处理return new String[]{"/"};}
}
(3) SpringMvcConfig
@Configuration
@ComponentScan("com.itheima.controller")
public class SpringMvcConfig {
}
(4) UserController
//使用Controller定义bean
@Controller
public class UserController {// 当前操作的请求映射路径:用户发出哪个请求能调用到这个方法@RequestMapping("/user/save")// 设置当前操作的返回值类型// 把返回的东西整体作为响应的内容给到外面@ResponseBody// 处理请求的方法// 返回值为String:执行完这个方法,要对外返回json数据public String save(){System.out.println("user save ...");return "{'module':'user save'}";}@RequestMapping("/user/delete")@ResponseBodypublic String delete(){System.out.println("user delete ...");return "{'module':'user delete'}";}
}
(5) BookController
@Controller
public class BookController {@RequestMapping("/book/save")@ResponseBodypublic String save(){System.out.println("book save...");return "{'module':'book save'}";}
}
在 UserController 和 BookController 中,都有 save 方法,若两者的请求映射路径都为 “/save”,则两者的访问路径就都成了 http://localhost/save,会冲突。
解决方法就是如上面代码一样,设置模块名作为请求映射路径的前置。这样,访问路径就分别为:http://localhost/user/save,http://localhost/book/save。
这样在同一个模块中出现命名冲突的情况就比较少了。
问题是解决了,但是每个方法前面都需要进行修改,写起来比较麻烦而且还有很多重复代码,如果 “/user” 后期发生变化,所有的方法都需要改,耦合度太高。
优化方案: 把请求映射路径的前缀写到类上面,这样方法上只写剩余路径即可。
//使用Controller定义bean
@Controller
@RequestMapping("/user")
public class UserController {@RequestMapping("/save")@ResponseBodypublic String save(){System.out.println("user save ...");return "{'module':'user save'}";}@RequestMapping("/delete")@ResponseBodypublic String delete(){System.out.println("user delete ...");return "{'module':'user delete'}";}
}
@Controller
@RequestMapping("/book")
public class BookController {@RequestMapping("/save")@ResponseBodypublic String save(){System.out.println("book save...");return "{'module':'book save'}";}
}
2. 请求参数
2.1 get 请求发送普通参数
//使用Controller定义bean
@Controller
public class UserController {@RequestMapping("/commonParam")@ResponseBodypublic String save(String name){System.out.println("普通参数传递 name="+name+" age="+age);return "{'module':'common param'}";}
}
用 postman 发送带参数的 get 请求,收到请求结果:
同时,处理请求的方法也接收到参数,输出:
普通参数传递 name=tom age=8
GET 请求中文乱码
如果请求中传递的参数有中文,那么接收到的参数会出现中文乱码问题。
如发送请求: http://localhost/commonParam?name=张三&age=18,处理请求的方法接收的参数会是:
普通参数传递 name=å¼ ä¸‰ age=8
原因在于:虽然 Tomcat 8.5 以后的版本已经处理了中文乱码的问题,但是 IDEA 中的 Tomcat 插件目前只到 Tomcat7,所以需要修改 pom.xml 来解决 GET 请求中文乱码问题。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><packaging>war</packaging><name>springmvc04_request_param</name><groupId>com.itheima</groupId><artifactId>springmvc04_request_param</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><!--导入springmvc与servlet的依赖--><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope><!--防止与tomcat插件冲突--></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.10.RELEASE</version></dependency></dependencies><!--tomcat插件--><build><plugins><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.1</version><configuration><port>80</port><!--tomcat端口号--><path>/</path><!--虚拟目录--><uriEncoding>UTF-8</uriEncoding><!--访问路径编解码字符集--></configuration></plugin></plugins></build>
</project>
2.2 post 请求发送普通参数
后台代码不区分 get 请求和 post 请求,所以仍用前面的代码来处理 post 请求。
用 postman 发送带参数的 post 请求:
收到请求结果:
同时,处理请求的方法也接收到参数,输出:
普通参数传递 name=tom age=8
post 请求中文乱码
post 请求发送中文参数时,处理请求的方法打印获取的参数也会出现乱码问题。
解决方法:在 ServletContainersInitConfig 中配置过滤器。
// 定义一个servlet容器启动的配置类
// 要继承AbstractAnnotationConfigDispatcherServletInitializer
public class ServletControllerInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {//加载Spring配置类@Overrideprotected Class<?>[] getRootConfigClasses() {return null;}//加载SpringMVC配置类@Overrideprotected Class<?>[] getServletConfigClasses() {return new Class[]{SpringMvcConfig.class};}//设置哪些请求由springMVC处理@Overrideprotected String[] getServletMappings() {//所有请求都由springMVC处理return new String[]{"/"};}//乱码处理@Overrideprotected Filter[] getServletFilters() {CharacterEncodingFilter filter = new CharacterEncodingFilter();filter.setEncoding("UTF-8");return new Filter[]{filter};}
}
2.3 五种类型的参数传递
前面我们已经能够使用 GET 或 POST 来发送请求和数据,但所携带的数据都是比较简单,接下来在这个基础上,我们来研究一些比较复杂的参数传递,常见的参数种类有:
- 普通参数
- POJO 类型参数
- 嵌套 POJO 类型参数
- 数组类型参数
- 集合类型参数
这些参数如何发送,后台该如何接收?下面将逐个介绍(都以 get 请求为例,post 请求同理)。
2.4.1 普通参数
普通参数 url 地址传参,请求参数名与形参变量名相同,定义形参即可接收参数。
请求结果:
控制台输出:
普通参数传递 name=tom age=8
如果地址参数名与形参不同该如何解决?
如:发出请求 http://localhost/commonParam?userName=tom&age=18
解决方案:使用@RequestParam
注解
2.4.2 POJO 数据类型
简单数据类型一般处理的是参数个数比较少的请求,如果参数比较多,那么后台接收参数的时候就比较复杂,这个时候可以使用 POJO 数据类型(实体类)。
POJO 参数:若请求参数名与形参对象属性名相同,POJO 类型的形参就可接收到参数。
请求结果:
控制台输出:
pojo参数传递 user=User{name='tom', age=8}
2.4.3 嵌套 POJO 类型参数
请求结果:
控制台输出:
pojo嵌套pojo参数传递 user=User{name='tom', age=8, address=Address{province='beijing', city='beijing'}}
2.4.4 数组类型参数
举个简单的例子,如果前端需要获取用户的爱好,爱好绝大多数情况下都是多个,如何发送请求数据和接收数据呢?
数组参数:请求参数名与形参对象属性名相同,且请求参数为多个同名参数,定义数组类型即可接收参数。
请求结果:
控制台输出:
数组参数传递 likes=[travel, game, music]
2.4.5 集合类型参数
数组能接收多个值,那么集合是否也可以实现这个功能呢?
注:同名请求参数可以使用@RequestParam
注解映射到对应名称的集合对象中作为数据。对于简单数据类型使用数组会比集合更简单些。
请求结果:
控制台输出:
集合参数传递 likes=[travel, game, music]
3. json 数据传输参数(重点)
现在比较流行的开发方式为异步调用,前后台以异步方式进行交换,传输的数据使用的是 json。所以前端如果发送的是 json 数据,后端该如何接收?
三种常见的 json 数据类型:
json 普通数组 (["value1","value2","value3",...])
json 对象 ({key1:value1,key2:value2,...})
json 对象数组 ([{key1:value1,...},{key2:value2,...}])
对于上述数据,前端如何发送,后端如何接收?
3.1 传输 json 普通数组
(1) pom.xml 添加依赖
SpringMVC 默认使用 jackson 处理 json 的转换,所以需要添加 jackson 依赖。
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.0</version>
</dependency>
(2) 开启自动转换 json 数据的支持
@EnablewebMvc
注解功能强大,该注解整合了多个功能。此处仅使用其中一部分功能,即 json 数据进行自动类型转换。
@Configuration
@ComponentScan("com.itheima.controller")
@EnableWebMvc//开启将json转换成对象的功能
//以后把@EnableWebMvc当做标配配置上去,不要省略
public class SpringMvcConfig {
}
(3) PostMan 编写 json 数据
(4) 后台处理请求的方法
@RequestBody
注解将请求中请求体所包含的数据传递给方法的形参,此注解一个方法只能使用一次。(因为数据在请求体中,不在请求参数中,所以不能用@RequestParam注解)
//使用Controller定义bean
@Controller
public class UserController {@RequestMapping("/listParamForJson")@ResponseBodypublic String listParamForJson(@RequestBody List<String> likes){System.out.println("list common(json)参数传递 list="+likes);return "{'module':'list common for json param'}";}
}
运行程序后,用 postman 发送 json 数据,得到请求结果:
控制台输出:
list common(json)参数传递 list=[travel, game, music]
3.2 传输 json 对象
要求:json 数据与形参对象属性名相同。
前两步与 3.1 相同。
(3) PostMan 编写 json 数据
(4) 后台处理请求的方法
//使用Controller定义bean
@Controller
public class UserController {@RequestMapping("/pojoParamForJson")@ResponseBodypublic String pojoParamForJson(@RequestBody User user){System.out.println("pojo(json)参数传递 user="+user);return "{'module':'pojo for json param'}";}
}
运行程序后,用 postman 发送 json 数据,得到请求结果:
控制台输出:
pojo(json)参数传递 user=User{name='tom', age=8, address=Address{province='beijing', city='beijing'}}
3.3 传输 json 对象数组
要求:json 数组数据与集合泛型属性名相同。
前两步与 3.1 相同。
(3) PostMan 编写 json 数据
(4) 后台处理请求的方法
//使用Controller定义bean
@Controller
public class UserController {@RequestMapping("/listPojoParamForJson")@ResponseBodypublic String listPojoParamForJson(@RequestBody List<User> list){System.out.println("list pojo(json)参数传递 list="+list);return "{'module':'list pojo for json param'}";}
}
运行程序后,用 postman 发送 json 数据,得到请求结果:
控制台输出:
list pojo(json)参数传递 list=[User{name='tom', age=8, address=null}, User{name='jerry', age=5, address=null}]
@RequestBody 与 @RequestParam
区别:
@RequestParam 用于接收 url 地址传参,表单传参【application/x-www-formurlencoded】(请求映射参数)
@RequestBody 用于接收 json 数据【application/json】(请求体)
应用:
后期开发中,发送 json 格式数据为主,@RequestBody 应用较广。
如果发送非 json 格式数据,选用 @RequestParam 接收请求参数。
4. 日期类型参数传递
前面处理过简单数据类型、POJO 数据类型、数组和集合数据类型以及 json 数据类型,接下来要处理一种开发中比较常见的一种数据类型:日期类型。
日期类型比较特殊,因为对于日期的格式有 N 多中输入方式,比如:
- 2088-08-18
- 2088/08/18
- 08/18/2088
- …
针对这么多日期格式,SpringMVC 该如何接收?
(3) PostMan 编写 json 数据
(4) 后台处理请求的方法
//使用Controller定义bean
@Controller
public class UserController {@RequestMapping("/dataParam")@ResponseBodypublic String dataParam(Date date,@DateTimeFormat(pattern = "yyyy-MM-dd") Date date1,@DateTimeFormat(pattern = "yyyy/MM/dd HH:mm:ss") Date date2) {System.out.println("参数传递 date=" + date);System.out.println("参数传递 date1=" + date1);System.out.println("参数传递 date2=" + date2);return "{'module':'data param'}";}
}
运行程序后,用 postman 发送 json 数据,得到请求结果:
控制台输出:
参数传递 date=Sun Feb 12 00:00:00 CST 2023
参数传递 date1=Sun Feb 12 00:00:00 CST 2023
参数传递 date2=Sun Feb 12 15:59:33 CST 2023
内部实现原理
讲解内部原理之前,需要先思考个问题:
前端传递字符串,后端使用日期 Date 接收
前端传递 json 数据,后端使用对象接收
前端传递字符串,后端使用 Integer 接收
后台需要的数据类型有很多种,在数据的传递过程中存在很多类型的转换,谁来做这个类型转换呢?是SpringMVC。
SpringMVC是如何实现类型转换的?
答:SpringMVC中提供了很多类型转换接口和实现类
在框架中,有一些类型转换接口,其中有 :
(1) Converter 接口:
Converter 接口的实现类:
框架中有提供很多对应 Converter 接口的实现类,用来实现不同数据类型之间的转换,如:
请求参数年龄数据(String→Integer)
日期格式转换(String → Date)
(2) HttpMessageConverter 接口
该接口是实现对象与 json 之间的转换工作
5. 响应 json 数据
SpringMVC 接收到请求和数据后,进行一些了的处理,当然这个处理可以是转发给 Service,Service 层再调用 Dao 层。不管怎样,处理完以后,都需要将结果告知给用户。
比如:根据用户 ID 查询用户信息、查询用户列表、新增用户等。
对于响应,主要就包含两部分内容:
- 响应页面
- 响应数据
- 文本数据
- json数据
之前学 servlet 时主要是响应页面。在学习异步提交之后,还可以响应数据。
因为异步调用是目前的主流方式,所以我们需要更关注的就是如何返回 json 数据,对于其他了解即可。
5.1 响应 / 跳转页面(了解)
(1) 准备页面 page.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>hello springmvc</title>
</head>
<body><h1>hello springmvc</h1>
</body>
</html>
(2) 在 Controller 中设置返回页面
//使用Controller定义bean
@Controller
public class UserController {@RequestMapping("/toJumpPage")//注意//1.此处不能添加@ResponseBody,如果加了该注入,会直接将page.jsp当字符串返回前端//2.方法需要返回Stringpublic String toJumpPage(){return "page.jsp";}
}
在浏览器地址栏输入:http://localhost/toJumpPage,得到:
5.2 响应文本数据(了解)
postman 发出请求:
响应请求:
@Controller
public class UserController {@RequestMapping("/toText")//这里的@ResponseBody注解不能省略//否则会把“response text”当做页面名称查找,找不到该页面就报404错误@ResponseBodypublic String toText(){System.out.println("返回纯文本数据");return "response text";}
}
后台响应,发回请求结果:
控制台输出:
返回纯文本数据
5.3 响应 json 数据
5.3.1 响应 POJO 对象
postman 发出请求:
响应请求:
//使用Controller定义bean
@Controller
public class UserController {@RequestMapping("/toJsonPOJO")@ResponseBodypublic User pojoToJson(){System.out.println("返回json对象数据");User user = new User();user.setName("tom");user.setAge(8);return user;}
}
后台响应,发回请求结果:
控制台输出:
返回json对象数据
5.3.2 响应 POJO 对象集合
postman 发出请求:
响应请求:
@Controller
public class UserController {@RequestMapping("/toJsonList")@ResponseBodypublic List<User> toJsonList() {System.out.println("返回json对象集合");User user1 = new User();user1.setName("tom");user1.setAge(8);User user2 = new User();user2.setName("jerry");user2.setAge(5);List<User> userList = new ArrayList<User>();userList.add(user1);userList.add(user2);return userList;}
}
后台响应,发回请求结果:
控制台输出:
返回json对象集合
5.3.3 @ResponseBody 注解
- @ResponseBody 注解可以写在类或方法上
- 写在类上就是该类的所有方法都有 @ReponseBody 功能
- 当方法上有 @ReponseBody 注解后
- 方法的返回值为字符串,会将其作为文本内容直接响应给前端。
- 方法的返回值为对象,会将对象转换成 json 响应给前端。
相关文章:

2. SpringMVC 请求与响应
文章目录1. 请求映射路径2. 请求参数2.1 get 请求发送普通参数2.2 post 请求发送普通参数2.3 五种类型的参数传递2.4.1 普通参数2.4.2 POJO 数据类型2.4.3 嵌套 POJO 类型参数2.4.4 数组类型参数2.4.5 集合类型参数3. json 数据传输参数(重点)3.1 传输 j…...

leaflet 读取上传的geojson文件,转换为wkt文件(057)
第057个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中上传geojson文件,解析geojson文件并转换为WKT,并在地图上显示图片。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共128行)安装 @terraf…...
面试题-前端开发Vue篇(答案超详细)
文章目录 如何实现跨域?JSONP原理和缺点谈谈你对DOM的理解及常用的DOM API说说你对 Vue 的理解说说 Vue 的优缺点什么是虚拟 DOM请描述下 vue 的生命周期是什么vue 如何监听键盘事件?watch 怎么深度监听对象变化删除数组用 delete 和 Vue.delete 有什么区别watch 和计算属性有…...

PTA甲级-1010 Radix c++
文章目录Input Specification:Output Specification:Sample Input 1:Sample Output 1:Sample Input 2:Sample Output 2:一、题干大意二、题解要点三、具体实现总结Given a…...
【项目重构】第1次思考
回顾与反思 2022年~至今(2023年2月),一共重构了2个项目。 第1个项目在重构的时候,总是想着把别人的代码copy过来,改一改,这就算重构好了。这样做效率太低,原因是前人写的代码不一定有很多注释…...

Java:SpringMVC的使用(2)
目录第十二章 REST风格CRUD练习12.1 搭建环境12.2 实现功能思路第十三章 SpringMVC消息转换器13.1 消息转换器概述13.2 使用消息转换器处理请求报文(1) 使用RequestBody获取请求体(2) 使用HttpEntity\<T>获取请求体及请求头13.3 使用消息转换器处理响应报文(1) 使用Respo…...

Elasticsearch7.8.0版本进阶——分布式集群(应对故障)
目录一、Elasticsearch集群的安装1.1、Elasticsearch集群的安装(win10环境)1.2、Elasticsearch集群的安装(linux环境)二、应对故障(win10环境集群演示)2.1、启动集群(三个节点)2.2、…...

【LeetCode】每日一题(2)
目录 题目:1138. 字母板上的路径 - 力扣(Leetcode) 题目的接口: 解题思路: 代码: 过啦!!! 写在最后: 题目:1138. 字母板上的路径 - 力扣&am…...

软件设计师教程(六)计算机系统知识-操作系统知识
软件设计师教程 软件设计师教程(一)计算机系统知识-计算机系统基础知识 软件设计师教程(二)计算机系统知识-计算机体系结构 软件设计师教程(三)计算机系统知识-计算机体系结构 软件设计师教程(…...

Zookeeper下载安装与集群搭建
Zookeeper下载安装与集群搭建1.下载安装1.1 下载安装1.2 配置启动2.集群搭建2.1 搭建要求2.2 准备工作2.3 配置集群2.4 启动集群2.5 模拟集群异常1.下载安装 1.1 下载安装 1、环境准备 ZooKeeper服务器是用Java创建的,它运行在JVM之上。需要安装JDK 7或更高版本。…...

Filter防火墙(8)
实验目的 1、了解个人防火墙的基本工作原理; 2、掌握Filter防火墙的配置。 预备知识防火墙 防火墙(Firewall)是一项协助确保信息安全的设备,会依照特定的规则,允许或是限制传输的数据通过。防火墙可以是一台专属的硬…...
Spring事务的传播级别——包你一文通
文章目录一、简单说明二、具体案例描述2.1.PROPAGATION_REQUIRED2.2.PROPAGATION_REQUIRED_NEW2.3.PROPAGATION_SUPPORTS2.4.PROPAGATION_NOT_SUPPORTED2.5.PROPAGATION_MANDATORY2.6.PROPAGATION_NEVER2.7.PROPAGATION_NESTED三、总结3.1、PROPAGATION_REQUIRED3.2、PROPAGATI…...

C语言(C预编译指令)
目录 1.undef 2.条件编译#ifdef,#else和#endif 3.#ifndef 4.#if和#elif 5.预定义宏 6.#line和#error 7.#pragma 1.undef #undef指令用于取消已定义的#define指令 #define LIMIT 400 #undef LIMIT 如果想使用一个名称但又不确定之前是否已经用过,为了安全起…...

JMeter 接口测试/并发测试/性能测试
Jmter工具设计之初是用于做性能测试的,它在实现对各种接口的调用方面已经做的比较成熟,因此,本次直接使用Jmeter工具来完成对Http接口的测试。因为再做接口测试时可以设置线程组,所以也可做接口性能测试。本篇使用JMeter完成了一个…...

大家心心念念的RocketMQ5.x入门手册来喽
1、前言 为了更好的拥抱云原生,RocketMQ5.x架构进行了大的重构,提出了存储与计算分离的设计架构,架构设计图如下所示: RocketMQ5.x提供了一套非常建议的消息发送、消费API,并统一放在Apache顶级开源项目rocketmq-clie…...

(考研湖科大教书匠计算机网络)第四章网络层-第三节1:IPv4地址概述
获取pdf:密码7281专栏目录首页:【专栏必读】考研湖科大教书匠计算机网络笔记导航 文章目录一:IPv4地址概述二:IPv4地址表示方法(1)概述(2)8位无符号二进制数转十进制正整数ÿ…...

B站Python与OpenCV人脸识别项目超详细记录(对图片、视频、摄像头人脸的检测)
课程来源:一天搞定人脸识别项目!学不会up直接下跪!(pythonopencv)_哔哩哔哩_bilibili 图片来源:感谢王鹤棣先生友情出镜~ 环境配置详见: 在conda虚拟环境中安装OpenCv并在pycharm中使用_cond…...

【Node.js实战】一文带你开发博客项目之Koa2重构(实现session、开发路由、联调、日志)
个人简介 👀个人主页: 前端杂货铺 🙋♂️学习方向: 主攻前端方向,也会涉及到服务端 📃个人状态: 在校大学生一枚,已拿多个前端 offer(秋招) 🚀未…...

第一部分:简单句——第二章:简单句的补充
简单句的核心构成:一主一谓 主语/宾语/表语 可以变成名词/代词/doing/to do 谓语动词有四种核心变化:三态 一否 时态语态情态否定 简单句的核心:将简单句给写对 简单句的补充:将简单句给写的更好、更充分 简单句的补充 1、限定…...

Spring Security简介
前面我们已经完成了传智健康后台管理系统的部分功能,例如检查项管理、检查组管理、套餐管理、预 约设置等。接下来我们需要思考2个问题: 问题1:在生产环境下我们如果不登录后台系统就可以完成这些功能操作吗? 答案显然是否定的&am…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...

多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...

Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...

android RelativeLayout布局
<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...
API网关Kong的鉴权与限流:高并发场景下的核心实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中,API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关,Kong凭借其插件化架构…...
Pydantic + Function Calling的结合
1、Pydantic Pydantic 是一个 Python 库,用于数据验证和设置管理,通过 Python 类型注解强制执行数据类型。它广泛用于 API 开发(如 FastAPI)、配置管理和数据解析,核心功能包括: 数据验证:通过…...