DAY04_SpringMVC—SpringMVC简介PostMan和ApiFox工具使用SpringMVC请求与响应REST风格
目录
- 一 SpringMVC简介
- 1 SpringMVC概述
- 问题导入
- 1.1 SpringMVC概述
- 2 入门案例
- 问题导入
- 2.0 回顾Servlet技术开发web程序流程
- 2.1 使用SpringMVC技术开发web程序流程
- 2.2 代码实现
- 【第一步】创建web工程(Maven结构)
- 【第二步】设置tomcat服务器,加载web工程(tomcat插件)
- 【第三步】导入坐标(SpringMVC+Servlet)
- 【第四步】定义处理请求的功能类(UserController)
- 【第五步】编写SpringMVC配置类,加载处理请求的Bean。
- 【第六步】加载SpringMVC配置,并设置SpringMVC请求拦截的路径
- 2.3 运行结果
- 2.4 案例注解和类解析
- 2.4.1 @Controller注解
- 2.4.2 @RequestMapping注解
- 2.4.3 @ResponseBody注解
- 2.4.4 AbstractDispatcherServletInitializer类
- 2.5 入门程序开发总结(1+N)
- 3 入门案例工作流程分析
- 3.1 启动服务器初始化过程
- 3.2 单次请求过程
- 4 Controller加载控制
- 问题导入
- 4.1 Controller加载控制与业务bean加载控制
- 4.2 方式一代码实现
- 4.3 Bean的加载格式
- 5 PostMan
- 5.1 PostMan介绍
- 5.2 PostMan安装
- 5.3 PostMan的使用
- 5.3.1 创建WorkSpace工作空间
- 5.3.2 发送请求获取json数据
- 5.3.3 保存当前请求
- 5.4 PostMan汉化
- 5.4.1 下载&安装 Postman
- 5.4.2 开始汉化 Postman
- 5.4.3 禁掉 Postman 自动更新
- 6 ApiFox
- 6.1 ApiFox的介绍
- 6.2 ApiFox的安装
- 6.3 ApiFox的使用
- 6.3.1 新建团队新建项目
- 6.3.2 发送请求获取json数据
- 6.3.3 保存当前请求
- 二 请求与响应
- 1 请求映射路径
- 问题导入
- 1.1 @RequestMapping注解
- 2 请求参数
- 2.1 发送普通类型参数
- 问题导入
- 2.1.1 请求方式
- 2.1.2 GET请求传递普通参数
- 2.1.3 POST请求传递普通参数
- 2.1.4 POST请求中文乱码处理
- 2.2 五种类型参数传递
- 问题导入
- 2.2.1 五种类型参数介绍
- 2.2.2 普通参数
- 2.2.3 POJO类型参数
- 2.2.4 嵌套POJO类型参数
- 2.2.5 数组类型参数
- 2.2.6 集合类型参数
- 2.3 json数据参数传递
- 问题导入
- 2.3.1 json数据参数介绍
- 2.3.2 传递json普通数组
- 2.3.2.1 代码演示
- 2.3.2.2 @EnableWebMvc注解介绍
- 2.3.2.3 @RequestBody注解介绍
- 2.3.3 传递json对象
- 2.3.4 传递json对象数组
- 2.3.5 @RequestBody与@RequestParam区别
- 3 日期类型参数传递
- 问题导入
- 3.1 代码演示
- 3.2 @DateTimeFormat注解介绍
- 3.3 工作原理
- 3.4 注意事项
- 4 响应
- 问题导入
- 4.1响应页面
- 4.2 文本数据
- 4.3 json数据
- 4.4 @RequestBody注解介绍
- 4.5 转Json原理/过程
- 三 REST风格
- 1 REST简介
- 问题导入
- 1.1 REST介绍
- 1.2 RESTful介绍
- 1.3 注意事项
- 2 RESTful入门案例
- 问题导入
- 2.1 快速入门
- 2.2 @PathVariable介绍
- 2.3 @RequestBody、@RequestParam、@PathVariable区别和应用
- 3 REST快速开发
- 3.1 代码中的问题
- 3.2 Rest快速开发
- 4 案例:基于RESTful页面数据交互
- 4.1 案例效果和环境准备
- 4.1.1 案例效果
- 4.1.2 环境准备
- 4.2 代码实现
- 4.2.1 制作SpringMVC控制器,并通过PostMan测试接口功能
- 4.2.2 设置对静态资源的访问放行
- 4.2.3 前端页面通过异步提交访问后台控制器
一 SpringMVC简介
1 SpringMVC概述
问题导入
SpringMVC框架有什么优点?
1.1 SpringMVC概述
- SpringMVC是一种基于Java实现MVC模型的轻量级Web框架
- 优点
- 使用简单,开发便捷(相比于Servlet)
- 灵活性强
2 入门案例
问题导入
在Controller中如何定义访问路径,如何响应数据?
2.0 回顾Servlet技术开发web程序流程
- 创建web工程(Maven结构)
- 设置tomcat服务器,加载web工程(tomcat插件)
- 导入坐标(Servlet)
- 定义处理请求的功能类(UserServlet)
- 设置请求映射(配置映射关系)
2.1 使用SpringMVC技术开发web程序流程
- 创建web工程(Maven结构)
- 设置tomcat服务器,加载web工程(tomcat插件)
- 导入坐标(SpringMVC+Servlet)
- 定义处理请求的功能类(UserController)
- 设置请求映射(配置映射关系)
- 编写SpringMVC配置类,加载处理请求的Bean。
- 加载SpringMVC配置,并设置SpringMVC请求拦截的路径
- 将SpringMVC设定加载到Tomcat容器中
2.2 代码实现
【第一步】创建web工程(Maven结构)
【第二步】设置tomcat服务器,加载web工程(tomcat插件)
<build><plugins><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version><configuration><port>80</port><path>/</path></configuration></plugin></plugins>
</build>
【第三步】导入坐标(SpringMVC+Servlet)
<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.23</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency></dependencies>
【第四步】定义处理请求的功能类(UserController)
//定义表现层控制器bean
@Controller
public class UserController {//设置映射路径为/save,即外部访问路径@RequestMapping("/save")//设置当前操作返回结果为指定json数据(本质上是一个字符串信息)@ResponseBodypublic String save(){System.out.println("user save ...");return "{'info':'springmvc'}";}
}
注意事项:
对于SpringMVC而言,Controller方法返回值默认表示要跳转的页面,没有对应的页面就会报错。如果不想跳转页面而是响应数据,那么就需要在方法上使用@ResponseBody注解。
【第五步】编写SpringMVC配置类,加载处理请求的Bean。
//springmvc配置类,本质上还是一个spring配置类
@Configuration
@ComponentScan("com.itheima.controller")
public class SpringMvcConfig {
}
【第六步】加载SpringMVC配置,并设置SpringMVC请求拦截的路径
//web容器配置类
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {//加载springmvc配置类,产生springmvc容器(本质还是spring容器)protected WebApplicationContext createServletApplicationContext() {//初始化WebApplicationContext对象AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();//加载指定配置类ctx.register(SpringMvcConfig.class);return ctx;}//设置由springmvc控制器处理的请求映射路径protected String[] getServletMappings() {return new String[]{"/"};}//加载spring配置类protected WebApplicationContext createRootApplicationContext() {return null;}
}
2.3 运行结果
2.4 案例注解和类解析
2.4.1 @Controller注解
- 名称:@Controller
- 类型:类注解
- 位置:SpringMVC控制器类定义上方
- 作用:设定SpringMVC的核心控制器bean
- 范例
@Controller
public class UserController {
}
2.4.2 @RequestMapping注解
- 名称:@RequestMapping
- 类型:方法注解
- 位置:SpringMVC控制器方法定义上方
- 作用:设置当前控制器方法请求访问路径
- 范例
@RequestMapping("/save")
public void save(){System.out.println("user save ...");
}
注意:其实@RequestMapping注解还可以写到类上面
2.4.3 @ResponseBody注解
- 名称:@ResponseBody
- 类型:方法注解
- 位置:SpringMVC控制器方法定义上方
- 作用:设置当前控制器方法响应内容为当前返回值,无需解析
- 范例
@RequestMapping("/save")
@ResponseBody
public String save(){System.out.println("user save ...");return "{'info':'springmvc'}";
}
2.4.4 AbstractDispatcherServletInitializer类
- AbstractDispatcherServletInitializer类是SpringMVC提供的快速初始化Web3.0容器的抽象类
- AbstractDispatcherServletInitializer提供三个接口方法供用户实现
- createServletApplicationContext()方法,创建Servlet容器时,加载SpringMVC对应的bean并放入WebApplicationContext对象范围中,而WebApplicationContext的作用范围为ServletContext范围,即整个web容器范围。
//加载springmvc配置类,产生springmvc容器(本质还是spring容器) protected WebApplicationContext createServletApplicationContext() {AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();ctx.register(SpringMvcConfig.class);return ctx; }
- getServletMappings()方法,设定SpringMVC对应的请求映射路径,设置为/表示拦截所有请求,任意请求都将转入到SpringMVC进行处理。
//设置由springmvc控制器处理的请求映射路径 protected String[] getServletMappings() {return new String[]{"/"}; }
- createRootApplicationContext()方法,如果创建Servlet容器时需要加载非SpringMVC对应的bean,使用当前方法进行,使用方式同createServletApplicationContext()
//加载spring配置类 protected WebApplicationContext createRootApplicationContext() {return null; }
2.5 入门程序开发总结(1+N)
- 一次性工作
- 创建工程,设置服务器,加载工程
- 导入坐标
- 创建web容器启动类,加载SpringMVC配置,并设置SpringMVC请求拦截路径
- SpringMVC核心配置类(设置配置类,扫描controller包,加载Controller控制器bean)
- 多次工作
- 定义处理请求的控制器类
- 定义处理请求的控制器方法,并配置映射路径(@RequestMapping)与返回json数据(@ResponseBody)
3 入门案例工作流程分析
3.1 启动服务器初始化过程
- 服务器启动,执行ServletContainersInitConfig类,初始化web容器
- 执行createServletApplicationContext方法,创建了WebApplicationContext对象
- 加载SpringMvcConfig配置类
- 执行@ComponentScan加载对应的bean
- 加载UserController,每个@RequestMapping的名称对应一个具体的方法
- 执行getServletMappings方法,定义所有的请求都通过SpringMVC
3.2 单次请求过程
- 发送请求localhost/save
- web容器发现所有请求都经过SpringMVC,将请求交给SpringMVC处理
- 解析请求路径/save
- 由/save匹配执行对应的方法save()
- 执行save()
- 检测到有@ResponseBody直接将save()方法的返回值作为响应求体返回给请求方
4 Controller加载控制
问题导入
因为功能不同,如何避免Spring错误的加载到SpringMVC的bean?
4.1 Controller加载控制与业务bean加载控制
- SpringMVC相关bean(表现层bean)
- Spring控制的bean
- 业务bean(Service)
- 功能bean(DataSource等)
- SpringMVC相关bean加载控制
- SpringMVC加载的bean对应的包均在com.itheima.controller包内
- Spring相关bean加载控制
- 方式一:Spring加载的bean设定扫描范围为com.itheima,排除掉controller包内的bean
- 方式二:Spring加载的bean设定扫描范围为精准范围,例如service包、dao包等
- 方式三:不区分Spring与SpringMVC的环境,加载到同一个环境中
4.2 方式一代码实现
- 名称:@ComponentScan
- 类型:类注解
- 范例
@Configuration
@ComponentScan(value = "com.itheima",excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION,classes = Controller.class))
public class SpringConfig {
}
- 属性
- excludeFilters:排除扫描路径中加载的bean,需要指定类别(type)与具体项(classes)
- includeFilters:加载指定的bean,需要指定类别(type)与具体项(classes)
4.3 Bean的加载格式
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {protected WebApplicationContext createServletApplicationContext() {AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();ctx.register(SpringMvcConfig.class);return ctx;}protected WebApplicationContext createRootApplicationContext() {AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();ctx.register(SpringConfig.class);return ctx;}protected String[] getServletMappings() {return new String[]{"/"};}
}
简化格式
public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer{protected Class<?>[] getServletConfigClasses() {return new Class[]{SpringMvcConfig.class}};protected String[] getServletMappings() {return new String[]{"/"};}protected Class<?>[] getRootConfigClasses() {return new Class[]{SpringConfig.class};}
}
5 PostMan
5.1 PostMan介绍
- Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件。
- 作用:常用于进行接口测试
- 特征
- 简单
- 实用
- 美观
- 大方
5.2 PostMan安装
官网:https://www.postman.com/
双击“Postman-Setup.exe”即可自动按照,打开之后需要注册,如果底部有如下链接,可以点击跳过注册
5.3 PostMan的使用
5.3.1 创建WorkSpace工作空间
5.3.2 发送请求获取json数据
5.3.3 保存当前请求
注意:第一次请求需要创建一个新的目录,后面就不需要创建新目录,直接保存到已经创建好的目录即可。
5.4 PostMan汉化
5.4.1 下载&安装 Postman
- 想要汉化 Postman, 就必须导入汉化补丁包
- 补丁包的版本号需与 Postman 版本号一致才行,否则大概率无法汉化。
- 所以,需先确认汉化补丁包的版本号,再下载对应版本的 Postman 使用。
汉化补丁下载链接:https://github.com/hlmd/Postman-cn/releases
目前补丁包版本为9.12.2
确认了补丁包版本号后,再下载对应版本的 Postman :
Postman 历史版本下载 | 请把下面链接的"版本号"替换为指定的版本号, 然后浏览器中访问即可直接下载 |
---|---|
Windows64位 | https://dl.pstmn.io/download/version/版本号/win64 |
Windows32位 | https://dl.pstmn.io/download/version/版本号/win32 |
Mac Intel Chip | https://dl.pstmn.io/download/version/版本号/osx_64 |
Mac Apple Chip | https://dl.pstmn.io/download/version/版本号/osx_arm64 |
Linux | https://dl.pstmn.io/download/version/版本号/linux |
比如当前补丁版本号为 9.12.2
, 如果想要下载 Windows 64 位的 Postman,则下载链接为 https://dl.pstmn.io/download/version/9.12.2/win64,浏览器访问该地址,可直接下载。下载成功后双击安装即可。
5.4.2 开始汉化 Postman
- Windows 系统
- 下载好对应版本的汉化补丁包 app.zip;
- 进入到 Postman 安装目录下的 /resources 文件夹中:
- 桌面找到 Postman 应用程序右键 -> 打开文件所在位置,再进入 app-..*/resources 目录下, 默认安装地址:C:/Users/用户名/AppData/Local/Postman, 示例:C:/Users/用户名/AppData/Local/Postman/app-8.8.0/resources
- 桌面找到 Postman 应用程序右键 -> 打开文件所在位置,再进入 app-..*/resources 目录下, 默认安装地址:C:/Users/用户名/AppData/Local/Postman, 示例:C:/Users/用户名/AppData/Local/Postman/app-8.8.0/resources
- 复制 app.zip 到 resources 目录,将app.zip解压到当前文件夹会生成一个app目录,如上图所示;
- 重启 Postman 即可看到已经汉化成功~
- Mac 系统
- 下载对应版本的 app.zip;
- 解压 app.zip;
- 进入 访达/应用程序/Postman.app/Contents/Resources/:
- 进入访达/应用程序找到Postman.app右键查看包内容,再进入Contents/Resources
- 替换 app 文件夹
- 如果目录下没有 app 文件夹,那么直接解压 app.zip 得到 app 文件夹即可 将app.zip解压出来的app文件夹复制到Resources目录,替换原本的app文件夹 可以先删除或重命名原本的app文件夹
- 重启 Postman 就可以了~
- Linux 系统
- 下载对应版本的 app.zip:
# 下方为Github地址 将版本号替换为对应版本号,例如:8.8.0 uwget https://github.com/hlmd/Postman-cn/releases/download/版本号/app.zip
- 解压&&替换app文件夹:
# Postman安装地址 自行替换 unzip -o -d Postman安装地址/app/resources app.zip
5.4.3 禁掉 Postman 自动更新
- Windows
- Windows 删除安装目录的 update.exe 即可。
- Mac / Linux
-
将此解析加入你电脑的主机文件 hosts :
0.0.0.0 dl.pstmn.io
-
注意:这是一项危险操作,将会使你的电脑无法与 Postman 下载服务器连接,当然这就可以使你的 Postman 应用程序不再更新, 如果想更新请将此解析注释或移除。
-
hosts 文件在哪里?
- Windows:
C:/Windows/System32/drivers/etc/hosts
- Linux & Mac:
/etc/hosts
- Windows:
-
6 ApiFox
6.1 ApiFox的介绍
- API 文档、API 调试、API Mock、API 自动化测试
- API 一体化协作平台
- 更先进的 API 设计/开发/测试工具
- Apifox = Postman + Swagger + Mock + JMeter
6.2 ApiFox的安装
官网:https://apifox.com/
下一步指定安装位置即可
6.3 ApiFox的使用
6.3.1 新建团队新建项目
6.3.2 发送请求获取json数据
6.3.3 保存当前请求
二 请求与响应
1 请求映射路径
问题导入
@RequestMapping注解注解可以写在哪?有什么作用?
1.1 @RequestMapping注解
- 名称:@RequestMapping
- 类型:方法注解 类注解
- 位置:SpringMVC控制器方法定义上方
- 作用:设置当前控制器方法请求访问路径,如果设置在类上统一设置当前控制器方法请求访问路径前缀
- 范例
@Controller
//类上方配置的请求映射与方法上面配置的请求映射连接在一起,形成完整的请求映射路径
@RequestMapping("/user")
public class UserController {//请求路径映射@RequestMapping("/save") //此时save方法的访问路径是:/user/save@ResponseBodypublic String save(){System.out.println("user save ...");return "{'module':'user save'}";}
}
2 请求参数
2.1 发送普通类型参数
问题导入
如何解决POST请求中文乱码问题?
2.1.1 请求方式
- GET请求
- POST请求
2.1.2 GET请求传递普通参数
- 普通参数:url地址传参,地址参数名与形参变量名相同,定义形参即可接收参数
//普通参数:请求参数与形参名称对应即可完成参数传递
@RequestMapping("/commonParam")
@ResponseBody
public String commonParam(String name ,int age){System.out.println("普通参数传递 name ==> "+name);System.out.println("普通参数传递 age ==> "+age);return "{'module':'common param'}";
}
- 问题:如果同学们传递的参数是中文试试,你们会发现接收到的参数出现了中文乱码问题。
- 原因:tomcat 8.5版本之后GET请求就不再出现中文乱码问题,但是我们使用的是tomcat7插件,所以会出现GET请求中文乱码问题。
- 解决:在pom.xml添加tomcat7插件处配置UTF-8字符集,解决GET请求中文乱码问题。
<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>
2.1.3 POST请求传递普通参数
- 普通参数:form表单post请求传参,表单参数名与形参变量名相同,定义形参即可接收参数
//普通参数:请求参数与形参名称对应即可完成参数传递
@RequestMapping("/commonParam")
@ResponseBody
public String commonParam(String name ,int age){System.out.println("普通参数传递 name ==> "+name);System.out.println("普通参数传递 age ==> "+age);return "{'module':'common param'}";
}
问题:我们发现,POST请求传递的参数如果包含中文那么就会出现中文乱码问题,说明我们之前配置的tomcat插件uri路径编解码字符集无法解决POST请求中文乱码问题。那么如何解决呢?
2.1.4 POST请求中文乱码处理
在加载SpringMVC配置的配置类中指定字符过滤器。
public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {protected Class<?>[] getRootConfigClasses() {return new Class[0];}protected Class<?>[] getServletConfigClasses() {return new Class[]{SpringMvcConfig.class};}protected String[] getServletMappings() {return new String[]{"/"};}//乱码处理@Overrideprotected Filter[] getServletFilters() {CharacterEncodingFilter filter = new CharacterEncodingFilter();filter.setEncoding("UTF-8");return new Filter[]{filter};}
}
2.2 五种类型参数传递
问题导入
当请求参数名与形参变量名不同,该如何接收请求参数?
2.2.1 五种类型参数介绍
- 普通参数
- POJO类型参数
- 嵌套POJO类型参数
- 数组类型参数
- 集合类型参数
2.2.2 普通参数
- 普通参数:当请求参数名与形参变量名不同,使用@RequestParam绑定参数关系
//普通参数:请求参数名与形参名不同时,使用@RequestParam注解关联请求参数名称与形参名称之间的关系
@RequestMapping("/commonParamDifferentName")
@ResponseBody
public String commonParamDifferentName(@RequestParam("name") String userName , int age){System.out.println("普通参数传递 userName ==> "+userName);System.out.println("普通参数传递 age ==> "+age);return "{'module':'common param different name'}";
}
- 名称:@RequestParam
- 类型:形参注解
- 位置:SpringMVC控制器方法形参定义前面
- 作用:绑定请求参数与处理器方法形参间的关系
- 参数:
- required:是否为必传参数
- defaultValue:参数默认值
2.2.3 POJO类型参数
- POJO参数:请求参数名与形参对象属性名相同,定义POJO类型形参即可接收参数
public class User {private String name;private int age;//同学们自己添加getter/setter/toString()方法
}
//POJO参数:请求参数与形参对象中的属性对应即可完成参数传递
@RequestMapping("/pojoParam")
@ResponseBody
public String pojoParam(User user){System.out.println("pojo参数传递 user ==> "+user);return "{'module':'pojo param'}";
}
注意事项:请求参数key的名称要和POJO中属性的名称一致,否则无法封装。
2.2.4 嵌套POJO类型参数
- POJO对象中包含POJO对象
public class User {private String name;private int age;private Address address;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public Address getAddress() {return address;}public void setAddress(Address address) {this.address = address;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +", address=" + address +'}';}
}
public class Address {private String province;private String city;@Overridepublic String toString() {return "Address{" +"province='" + province + '\'' +", city='" + 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;}
}
- 嵌套POJO参数:请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套POJO属性参数
//嵌套POJO参数:嵌套属性按照层次结构设定名称即可完成参数传递
@RequestMapping("/pojoContainPojoParam")
@ResponseBody
public String pojoContainPojoParam(User user){System.out.println("pojo嵌套pojo参数传递 user ==> "+user);return "{'module':'pojo contain pojo param'}";
}
注意事项:请求参数key的名称要和POJO中属性的名称一致,否则无法封装。
2.2.5 数组类型参数
- 数组参数:请求参数名与形参对象属性名相同且请求参数为多个,定义数组类型即可接收参数
//数组参数:同名请求参数可以直接映射到对应名称的形参数组对象中
@RequestMapping("/arrayParam")
@ResponseBody
public String arrayParam(String[] likes){System.out.println("数组参数传递 likes ==> "+ Arrays.toString(likes));return "{'module':'array param'}";
}
2.2.6 集合类型参数
- 集合保存普通参数:请求参数名与形参集合对象名相同且请求参数为多个,@RequestParam绑定参数关系
//集合参数:同名请求参数可以使用@RequestParam注解映射到对应名称的集合对象中作为数据
@RequestMapping("/listParam")
@ResponseBody
public String listParam(@RequestParam List<String> likes){System.out.println("集合参数传递 likes ==> "+ likes);return "{'module':'list param'}";
}
2.3 json数据参数传递
问题导入
问题:@EnableWebMvc注解和@ResponseBody注解有什么用?
2.3.1 json数据参数介绍
- json普通数组([“”,“”,“”,…])
- json对象({key:value,key:value,…})
- json对象数组([{key:value,…},{key:value,…}])
2.3.2 传递json普通数组
2.3.2.1 代码演示
- 添加json数据转换相关坐标
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.14.2</version>
</dependency>
- 设置发送json数据(请求body中添加json数据)
- 开启自动转换json数据的支持
@Configuration
@ComponentScan("com.itheima.controller")
//开启json数据类型自动转换
@EnableWebMvc
public class SpringMvcConfig {
}
注意事项:
@EnableWebMvc注解功能强大,该注解整合了多个功能,此处仅使用其中一部分功能,即json数据进行自动类型转换
4. 在Controller中编写方法接收json参数
//集合参数:json格式
//1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc
//2.使用@RequestBody注解将外部传递的json数组数据映射到形参的集合对象中作为数据
@RequestMapping("/listParamForJson")
@ResponseBody
public String listParamForJson(@RequestBody List<String> likes){System.out.println("list common(json)参数传递 list ==> "+likes);return "{'module':'list common for json param'}";
}
2.3.2.2 @EnableWebMvc注解介绍
- 名称:@EnableWebMvc
- 类型:配置类注解
- 位置:SpringMVC配置类定义上方
- 作用:开启SpringMVC多项辅助功能
- 范例:
@Configuration
@ComponentScan("com.itheima.controller")
@EnableWebMvc
public class SpringMvcConfig {
}
2.3.2.3 @RequestBody注解介绍
- 名称:@RequestBody
- 类型:形参注解
- 位置:SpringMVC控制器方法形参定义前面
- 作用:将请求中请求体所包含的数据传递给请求参数,此注解一个处理器方法只能使用一次
- 范例:
@RequestMapping("/listParamForJson")
@ResponseBody
public String listParamForJson(@RequestBody List<String> likes){System.out.println("list common(json)参数传递 list ==> "+likes);return "{'module':'list common for json param'}";
}
2.3.3 传递json对象
- POJO参数:json数据与形参对象属性名相同,定义POJO类型形参即可接收参数
//POJO参数:json格式
//1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc
//2.使用@RequestBody注解将外部传递的json数据映射到形参的实体类对象中,要求属性名称一一对应
@RequestMapping("/pojoParamForJson")
@ResponseBody
public String pojoParamForJson(@RequestBody User user){System.out.println("pojo(json)参数传递 user ==> "+user);return "{'module':'pojo for json param'}";
}
2.3.4 传递json对象数组
- POJO集合参数:json数组数据与集合泛型属性名相同,定义List类型形参即可接收参数
//集合参数:json格式
//1.开启json数据格式的自动转换,在配置类中开启@EnableWebMvc
//2.使用@RequestBody注解将外部传递的json数组数据映射到形参的保存实体类对象的集合对象中,要求属性名称一一对应
@RequestMapping("/listPojoParamForJson")
@ResponseBody
public String listPojoParamForJson(@RequestBody List<User> list){System.out.println("list pojo(json)参数传递 list ==> "+list);return "{'module':'list pojo for json param'}";
}
2.3.5 @RequestBody与@RequestParam区别
- 区别
- @RequestParam用于接收url地址传参,表单传参【application/x-www-form-urlencoded】
- @RequestBody用于接收json数据【application/json】
- 应用
- 后期开发中,发送json格式数据为主,@RequestBody应用较广
- 如果发送非json格式数据,选用@RequestParam接收请求参数
3 日期类型参数传递
问题导入
@DateTimeFormat注解的作用是什么?
3.1 代码演示
- 日期类型数据基于系统不同格式也不尽相同
2088-08-18
2088/08/18
08/18/2088 - 接收形参时,根据不同的日期格式设置不同的接收方式
//日期参数 http://localhost:80/dataParam?date=2088/08/08&date1=2088-08-18&date2=2088/08/28 8:08:08
//使用@DateTimeFormat注解设置日期类型数据格式,默认格式yyyy/MM/dd
@RequestMapping("/dataParam")
@ResponseBody
public 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(yyyy-MM-dd) ==> "+date1);System.out.println("参数传递 date2(yyyy/MM/dd HH:mm:ss) ==> "+date2);return "{'module':'data param'}";
}
3.2 @DateTimeFormat注解介绍
- 名称:@DateTimeFormat
- 类型:形参注解
- 位置:SpringMVC控制器方法形参前面
- 作用:设定日期时间型数据格式
- 属性:pattern:指定日期时间格式字符串
3.3 工作原理
- 其内部依赖Converter接口
public interface Converter<S, T> {@NullableT convert(S var1);
}
- 请求参数年龄数据(String→Integer)
- json数据转对象(json → POJO)
- 日期格式转换(String → Date)
3.4 注意事项
传递日期类型参数必须在配置类上使用@EnableWebMvc注解。其功能之一:根据类型匹配对应的类型转换器。
4 响应
问题导入
如何响应json数据?
4.1响应页面
@Controller
public class UserController {//响应页面/跳转页面//返回值为String类型,设置返回值为页面名称,即可实现页面跳转@RequestMapping("/toJumpPage")public String toJumpPage(){System.out.println("跳转页面");return "page.jsp";}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html><head><title>Title</title></head><body><h2>Hello Spring MVC!</h2></body>
</html>
4.2 文本数据
//响应文本数据
//返回值为String类型,设置返回值为任意字符串信息,即可实现返回指定字符串信息,需要依赖@ResponseBody注解
@RequestMapping("/toText")
@ResponseBody
public String toText(){System.out.println("返回纯文本数据");return "response text";
}
4.3 json数据
//响应POJO对象
//返回值为实体类对象,设置返回值为实体类类型,即可实现返回对应对象的json数据,需要依赖@ResponseBody注解和@EnableWebMvc注解
@RequestMapping("/toJsonPOJO")
@ResponseBody
public User toJsonPOJO(){System.out.println("返回json对象数据");User user = new User();user.setName("itcast");user.setAge(15);return user;
}
//响应POJO集合对象
//返回值为集合对象,设置返回值为集合类型,即可实现返回对应集合的json数组数据,需要依赖@ResponseBody注解和@EnableWebMvc注解
@RequestMapping("/toJsonList")
@ResponseBody
public List<User> toJsonList(){System.out.println("返回json集合数据");User user1 = new User();user1.setName("传智播客");user1.setAge(15);User user2 = new User();user2.setName("黑马程序员");user2.setAge(12);List<User> userList = new ArrayList<User>();userList.add(user1);userList.add(user2);return userList;
}
注意:需要添加jackson-databind依赖以及在SpringMvcConfig配置类上添加@EnableWebMvc注解
4.4 @RequestBody注解介绍
- 名称:@RequestBody
- 类型:方法注解
- 位置:SpringMVC控制器方法定义上方
- 作用:设置当前控制器返回值作为响应体
- 范例
@RequestMapping("/save")
@ResponseBody
public void save(){System.out.println("save()...");retuen "{'info':'springmvc'}"
}
4.5 转Json原理/过程
- HttpMessageConverter接口
三 REST风格
1 REST简介
问题导入
Rest风格使用了几种请求方式定义访问行为?
1.1 REST介绍
- REST(Representational State Transfer),表现形式状态转换
- 传统风格资源描述形式
- http://localhost/user/getById?id=1
- http://localhost/user/saveUser
- REST风格描述形式
- http://localhost/user/1
- http://localhost/user
- 传统风格资源描述形式
- 优点:
- 隐藏资源的访问行为,无法通过地址得知对资源是何种操作
- 书写简化
1.2 RESTful介绍
- 按照REST风格访问资源时使用行为动作区分对资源进行了何种操作
链接 | 操作 | 如何区分 |
---|---|---|
http://localhost/users | 查询全部用户信息 | GET查询 |
http://localhost/users/1 | 查询指定用户信息 | GET查询 |
http://localhost/users | 添加用户信息 | POST(新增/保存) |
http://localhost/users | 修改用户信息 | PUT(修改/更新) |
http://localhost/users/1 | 删除用户信息 | DELETE(删除) |
- 根据REST风格对资源进行访问称为RESTful
1.3 注意事项
- 上述行为是约定方式,约定不是规范,可以打破,所以称REST风格,而不是REST规范
- 描述模块的名称通常使用复数,也就是加s的格式描述,表示此类资源,而非单个资源,例如:users、books、accounts……
2 RESTful入门案例
问题导入
Rest风格如何通过路径传递参数?
2.1 快速入门
做法:在Controller中定义方法时设定"http请求动作(请求方式)“和"设定请求参数(路径变量)”
@Controller
public class UserController {//设置当前请求方法为POST,表示REST风格中的添加操作@RequestMapping(value = "/users",method = RequestMethod.POST)@ResponseBodypublic String save(){System.out.println("user save...");return "{'module':'user save'}";}//设置当前请求方法为DELETE,表示REST风格中的删除操作//@PathVariable注解用于设置路径变量(路径参数),要求路径上设置对应的占位符,并且占位符名称与方法形参名称相同@RequestMapping(value = "/users/{id}",method = RequestMethod.DELETE)@ResponseBodypublic String delete(@PathVariable Integer id){System.out.println("user delete..." + id);return "{'module':'user delete'}";}//设置当前请求方法为PUT,表示REST风格中的修改操作@RequestMapping(value = "/users",method = RequestMethod.PUT)@ResponseBodypublic String update(@RequestBody User user){System.out.println("user update..."+user);return "{'module':'user update'}";}//设置当前请求方法为GET,表示REST风格中的查询操作//@PathVariable注解用于设置路径变量(路径参数),要求路径上设置对应的占位符,并且占位符名称与方法形参名称相同@RequestMapping(value = "/users/{id}" ,method = RequestMethod.GET)@ResponseBodypublic String getById(@PathVariable Integer id){System.out.println("user getById..."+id);return "{'module':'user getById'}";}//设置当前请求方法为GET,表示REST风格中的查询操作@RequestMapping(value = "/users",method = RequestMethod.GET)@ResponseBodypublic String getAll(){System.out.println("user getAll...");return "{'module':'user getAll'}";}
}
2.2 @PathVariable介绍
- 名称:@PathVariable
- 类型:形参注解
- 位置:SpringMVC控制器方法形参定义前面
- 作用:绑定路径参数与处理器方法形参间的关系,要求路径参数名与形参名一一对应
2.3 @RequestBody、@RequestParam、@PathVariable区别和应用
- 区别
- @RequestBody:接收请求体参数
- 用于接收json数据
- @RequestParam:接收路径参数
- 用于接收url地址传参或表单传参
- @PathVariable:接收路径变量
- 用于接收路径参数,使用{参数名称}描述路径参数
- @RequestBody:接收请求体参数
- 应用
- 后期开发中,发送请求参数超过1个时,以json格式为主,@RequestBody应用较广
- 如果发送非json格式数据,选用@RequestParam接收请求参数
- 采用RESTful进行开发,当参数数量较少时,例如1个,可以采用@PathVariable接收请求路径变量,通常用于传递id值
3 REST快速开发
3.1 代码中的问题
以上截图中的代码和我们之前写的UserController中的方法类似,其中图中两个方法都有三处是有问题的,可以进行优化。存在的问题如下:
问题1:每个方法的@RequestMapping注解中都定义了访问路径/books,重复性太高。
问题2:每个方法的@RequestMapping注解中都要使用method属性定义请求方式,重复性太高。
问题3:每个方法响应json都需要加上@ResponseBody注解,重复性太高。
3.2 Rest快速开发
解决以上三个问题
解决问题1:在Controller类上使用@RequestMapping定义共同的访问路径。
@Controller
@RequestMapping("/books")
public class BookController {@RequestMapping(method = RequestMethod.POST)public String save(@RequestBody Book book){System.out.println("book save..." + book);return "{'module':'book save'}";}@RequestMapping(value = "/{id}" ,method = RequestMethod.DELETE)public String delete(@PathVariable Integer id){System.out.println("book delete..." + id);return "{'module':'book delete'}";}@RequestMapping(method = RequestMethod.PUT)public String update(@RequestBody Book book){System.out.println("book update..."+book);return "{'module':'book update'}";}@RequestMapping(value = "/{id}" ,method = RequestMethod.GET)public String getById(@PathVariable Integer id){System.out.println("book getById..."+id);return "{'module':'book getById'}";}@RequestMapping(method = RequestMethod.GET)public String getAll(){System.out.println("book getAll...");return "{'module':'book getAll'}";}
}
解决问题2:使用@GetMapping @PostMapping @PutMapping @DeleteMapping代替@RequestMapping(method=RequestMethod.XXX)
@Controller
@RequestMapping("/books")
public class BookController {// @RequestMapping( method = RequestMethod.POST)@PostMapping//使用@PostMapping简化Post请求方法对应的映射配置public String save(@RequestBody Book book){System.out.println("book save..." + book);return "{'module':'book save'}";}// @RequestMapping(value = "/{id}" ,method = RequestMethod.DELETE)@DeleteMapping("/{id}") //使用@DeleteMapping简化DELETE请求方法对应的映射配置public String delete(@PathVariable Integer id){System.out.println("book delete..." + id);return "{'module':'book delete'}";}// @RequestMapping(method = RequestMethod.PUT)@PutMapping //使用@PutMapping简化Put请求方法对应的映射配置public String update(@RequestBody Book book){System.out.println("book update..."+book);return "{'module':'book update'}";}// @RequestMapping(value = "/{id}" ,method = RequestMethod.GET)@GetMapping("/{id}") //使用@GetMapping简化GET请求方法对应的映射配置public String getById(@PathVariable Integer id){System.out.println("book getById..."+id);return "{'module':'book getById'}";}// @RequestMapping(method = RequestMethod.GET)@GetMapping //使用@GetMapping简化GET请求方法对应的映射配置public String getAll(){System.out.println("book getAll...");return "{'module':'book getAll'}";}
}
- 名称:@GetMapping @PostMapping @PutMapping @DeleteMapping
- 类型:方法注解
- 位置:基于SpringMVC的RESTful开发控制器方法定义上方
- 作用:设置当前控制器方法请求访问路径与请求动作,每种对应一个请求动作,例如@GetMapping对应GET请求
- 属性:value(默认):请求访问路径
解决问题3:在Controller类上使用@RestController注解,等同于@Controller与@ResponseBody两个注解组合功能
@RestController //使用@RestController注解替换@Controller与@ResponseBody注解,简化书写
@RequestMapping("/books")
public class BookController {//方法省略了没写
}
- 名称:@RestController
- 类型:类注解
- 位置:基于SpringMVC的RESTful开发控制器类定义上方
- 作用:设置当前控制器类为RESTful风格,等同于@Controller与@ResponseBody两个注解组合功能
4 案例:基于RESTful页面数据交互
4.1 案例效果和环境准备
4.1.1 案例效果
4.1.2 环境准备
//POJO实体类
public class Book {private Integer id;private String type;private String name;private String description;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getType() {return type;}public void setType(String type) {this.type = type;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getDescription() {return description;}public void setDescription(String description) {this.description = description;}@Overridepublic String toString() {return "Book{" +"id=" + id +", type='" + type + '\'' +", name='" + name + '\'' +", description='" + description + '\'' +'}';}
}
//SpringMVC容器初始化类
public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {protected Class<?>[] getRootConfigClasses() {return new Class[0];}protected Class<?>[] getServletConfigClasses() {return new Class[]{SpringMvcConfig.class};}protected String[] getServletMappings() {return new String[]{"/"};}//乱码处理@Overrideprotected Filter[] getServletFilters() {CharacterEncodingFilter filter = new CharacterEncodingFilter();filter.setEncoding("UTF-8");return new Filter[]{filter};}
}
//SpringMVC配置类
@Configuration
@ComponentScan({"com.itheima.controller","com.itheima.config"})
@EnableWebMvc
public class SpringMvcConfig {
}
4.2 代码实现
4.2.1 制作SpringMVC控制器,并通过PostMan测试接口功能
@RestController
@RequestMapping("/books")
public class BookController {@PostMappingpublic String save(@RequestBody Book book){System.out.println("book save ==> "+ book);return "{'module':'book save success'}";}@GetMappingpublic List<Book> getAll(){System.out.println("book getAll is running ...");List<Book> bookList = new ArrayList<Book>();Book book1 = new Book();book1.setType("计算机");book1.setName("SpringMVC入门教程");book1.setDescription("小试牛刀");bookList.add(book1);Book book2 = new Book();book2.setType("计算机");book2.setName("SpringMVC实战教程");book2.setDescription("一代宗师");bookList.add(book2);Book book3 = new Book();book3.setType("计算机丛书");book3.setName("SpringMVC实战教程进阶");book3.setDescription("一代宗师呕心创作");bookList.add(book3);return bookList;}
}
4.2.2 设置对静态资源的访问放行
@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {//设置静态资源访问过滤,当前类需要设置为配置类,并被扫描加载@Overrideprotected void addResourceHandlers(ResourceHandlerRegistry registry) {//当访问/pages/????时候,从/pages目录下查找内容registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");registry.addResourceHandler("/js/**").addResourceLocations("/js/"); registry.addResourceHandler("/css/**").addResourceLocations("/css/"); registry.addResourceHandler("/plugins/**").addResourceLocations("/plugins/");}
}
4.2.3 前端页面通过异步提交访问后台控制器
//添加
saveBook () {axios.post("/books",this.formData).then((res)=>{});
},
//主页列表查询
getAll() {axios.get("/books").then((res)=>{this.dataList = res.data;});
},
相关文章:

DAY04_SpringMVC—SpringMVC简介PostMan和ApiFox工具使用SpringMVC请求与响应REST风格
目录 一 SpringMVC简介1 SpringMVC概述问题导入1.1 SpringMVC概述 2 入门案例问题导入2.0 回顾Servlet技术开发web程序流程2.1 使用SpringMVC技术开发web程序流程2.2 代码实现【第一步】创建web工程(Maven结构)【第二步】设置tomcat服务器,加…...

phpstorm配置ftp同步文件到服务器
这里的默认快捷键 不是 CtrlS ;需要设置快捷键,这里原来是save all操作时上传文件到服务器; ** 设置好快捷键后按 CtrlS就会同步文件(添加删除文件后保存,服务器也会同步) ** 搜索出save all 后…...
前端jd要求:了解一门后端开发语言优先 解决方案之Node.js
前端jd要求:了解一门后端开发语言优先 解决方案之Node.js 前言常见的后端开发语言一、什么是 Node.js二、学习 Node.js 的前置知识三、学习 Node.js 的步骤1、Node.js 的安装2、Node.js 的基本语法和 API模块导入和导出文件读写操作HTTP 服务器命令行参数 3、Node.j…...
什么是ServiceMesh(Istio一)
现在最火的后端架构无疑是微服务了,微服务将之前的单体应用拆分成了许多独立的服务应用,每个微服务都是独立的,好处自然很多,但是随着应用的越来越大,微服务暴露出来的问题也就随之而来了,微服务越来越多&a…...

【腾讯云 Cloud Studio 实战训练营】Hexo 框架 Butterfly 主题搭建个人博客
什么是Cloud Studio Cloud Studio 是基于浏览器的集成式开发环境(IDE),为开发者提供了一个永不间断的云端工作站。用户在使用 Cloud Studio 时无需安装,随时随地打开浏览器就能在线编程。 Hexo 博客成品展示 本人博客如下&…...

搭建Excel服务器
1、下载Excel服务器 下载地址 2、解压文件 3、打开服务器 4、服务器运行信息 5、连接测试 打开客户端 6、登录到服务器 默认账号 密码 admin 3 修改文件保存路径(服务器端点击配置) 7、客户端整体界面 8、配置权限 9、设计模板 10、其他用户登录就可以填写信息 11、用户&#…...
渗透测试成功的8个关键
渗透测试 (penetration test)并没有一个标准的定义,国外一些安全组织达成共识的通用说法是:渗透测试是通过模拟恶意黑客的攻击方法,来评估计算机网络系统安全的一种评估方法。这个过程包括对系统的任何弱点、技术缺陷或漏洞的主动分析&#x…...
【leetcode】链表part2
24. 两两交换链表中的节点 迭代方法 public static ListNode swapPairs(ListNode head) {// 输入:head [1,2,3,4]// 输出:[2,1,4,3]ListNode dummy new ListNode(0);dummy.next head;ListNode cur dummy;while (cur.next ! null && cur.ne…...

C#数据类型转换
目录 1.常用的数据类型: 编辑1.1别名概念例子: 输出结果: 2.数值类型之间的相互转换: 2.1举例: 编辑输出结果: 1.常用的数据类型: 1.1别名概念例子: 输出结果: 用GetType来获取数据类型的时候,就是指向System.Byte和System.Char这个…...

mybatis-plus逻辑删除的坑
一旦在逻辑字段上加了TableLogic逻辑删除的配置,并且使用mybatis-plus自带的方法时(如果自己用xml写SQL不会出现下面的情况) 查询、修改时会自动排除逻辑删除的数据 当使用mybatis-plus自带的查询方法时,就不用每次查询的时候跟…...

SQL Server基础之游标
一:认识游标 游标是SQL Server的一种数据访问机制,它允许用户访问单独的数据行。用户可以对每一行进行单独的处理,从而降低系统开销和潜在的阻隔情况,用户也可以使用这些数据生成的SQL代码并立即执行或输出。 1.游标的概念 游标是…...

(二)结构型模式:4、组合模式(Composite Pattern)(C++实例)
目录 1、组合模式(Composite Pattern)含义 2、组合模式应用场景 3、组合模式的优缺点 4、组合模式的UML图学习 5、C实现组合模式的简单示例(公司的OA系统) 1、组合模式(Composite Pattern)含义 组合模…...
flask接口请求频率限制
pip install Flask-Limiter Flask-Limiter官方文档 基本使用 默认是用IP作为key进行计数的,你也可以自定义key,具体看官网 from flask import Flask from flask_limiter import Limiter from flask_limiter.util import get_remote_addressapp Flas…...

javaweb监听器和juery技术
监听servlet创建 package com.hspedu.listener;import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener;/*** 老韩解读* 1. 当一个类实现了 ServletContextListener* 2. 该类就是一个监听器* 3. 该类可…...
C++并发多线程--std::unique_lock的使用
目录 1--std::unique_lock的使用 1-1--std::adopt_lock参数 1-2--std::try_to_lock参数 1-3--std::defer_lock参数 1-4--互斥量所有权转移 1--std::unique_lock的使用 常用成员函数: ① lock(): 加锁; ② unlock(): 解锁; ③ try_lock()…...

【ChatGLM】ChatGLM-6B模型Win+4GB显卡本地部署笔记
ChatGLM-6B是清华大学知识工程和数据挖掘小组发布的一个类似ChatGPT的开源对话机器人,由于该模型是经过约1T标识符的中英文训练,且大部分都是中文,因此十分适合国内使用。 预期环境 本机电脑备注: Win10专业版 32G内存256固态系统…...

青翼科技自研2路250MSPS DA回放FMC子卡模块
FMC150_V30是一款基于VITA57.1规范的2路125MSPS采样率16位分辨率AD采集、2路250MSPS采样率16位分辨率DA回放FMC子卡模块。该模块遵循VITA57.1规范,可直接与符合VITA57.1规范的FPGA载卡配合使用,板卡ADC器件采用ADI公司的AD9268芯片,板卡DAC器…...

硬件产品经理:从入门到精通(新书发布)
目录 简介 新书 框架内容 相关课程 简介 在完成多款硬件产品从设计到推向市场的过程后。 笔者于2020年开始在产品领域平台输出硬件相关的内容。 在这个过程中经常会收到很多读者的留言,希望能推荐一些硬件相关的书籍或资料。 其实,笔者刚开始做硬…...

Opencv-C++笔记 (17) : 模板匹配
文章目录 1--概念2-- 方法3 结果3.1 ROI区域的获取使用自适应目标匹配 1–概念 opencv 提供了一个专门用于模板匹配的函数 cv::matchTemplate();其调用方式如下: void cv::matchTemplate(cv::InputArray image, // 用于搜索的输入图像, 8U 或 32F, 大小 W-Hcv::Inpu…...

Maven(四)常用命令大全
目录 一、mvn 命令参数二、mvn 插件命令1.介绍2.查看插件的使用文档3.常用的插件命令 官网地址: https://maven.apache.org/官方插件清单: https://maven.apache.org/plugins/index.html Maven 是一个强大的构建工具,它提供了许多命令来进行项…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...

GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...