SpringBoot入门(黑马)
1. SpringBootWeb入门开发
需求:使用SpringBoot 开发一个web 应用,浏览器发起请求 /hello 后,给浏览器返回字符串"Hello World~"。
步骤:
1. 创建springBoot工程,并勾选web开发相关依赖。
2. 定义 HelloController类,添加方法 hello,并添加注释。
3. 运行测试
@RestController
// @RestController 标识下面这个类为请求处理类
public class HelloController {@RequestMapping("/hello")// @RequestMapping("/hello") 指定请求处理路径public String hello(){System.out.println("hello world~");return "hello world~";}
}
启动类
// 启动类 启动springBoot 工程
@SpringBootApplication
public class Demo1Application {public static void main(String[] args) {SpringApplication.run(Demo1Application.class, args);}
}
2. postman
2.1 postman简介
Postman 是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件。
作用:常用于进行接口测试
2.2 postman安装
下方为安装链接
Postman API Platform | Sign Up for Free
3. 请求
3.1 简单参数
原始方式
在原始的web程序中,获取请求参数,需要通过HttpServletRequest 对象手动获取。
比较繁琐,需要手动的类型转换
@RestController
public class RequestController {@RequestMapping("/simpleParam")public String simpleParam(HttpServletRequest request) {String name = request.getParameter("name");String age = request.getParameter("age");int intAge = Integer.parseInt(age);System.out.println(name + "-" + age);return "ok";}
}
springboot方式
简单参数:参数名与形参变量名相同,定义形参即可接收参数。
@RestController
public class RequestController {@RequestMapping("/simpleParam")public String simpleParam(String name,Integer age) {System.out.println(name + "-" + age);return "ok";}
}
如果请求参数名不一致会出现什么结果呢
// 请求参数名不一致
@RequestMapping("/simpleParam")
public String simpleParam(String username,Integer age) {System.out.println(username + ":" + age);return "ok";
}
如果请求参数不一致如何请求成功呢?
如果方法形参名称与请求参数名称不匹配,可以使用@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。
小结
1. 原始方式获取请求参数
controller 方法形参中声明HttpServletRequest 对象
调用对象的getParameter(参数名)
2. SpringBoot 中接收简单参数
请求参数名与方法形参变量名相同
会自动进行类型转换
3. @RequestParam注解
方法形参名称与请求参数名称不匹配,通过该注解完成映射
该注解的required属性默认为true,代表请求参数必须传递
3.2 实体参数
简单实体对象
请求参数名与形参对象属性名相同,定义POJO接收即可
@NoArgsConstructor
@AllArgsConstructor
@Data
public class User {private String name;private Integer age;
}
@RequestMapping("/simplePojo")public String simplePojo(User user) {System.out.println(user);return "ok";}
复杂实体对象
请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套POJO属性参数。
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Address {private String province;private String city;
}
@NoArgsConstructor
@AllArgsConstructor
@Data
public class User {private String name;private Integer age;private Address address;
}
@RequestMapping("/simplePojo")public String simplePojo(User user) {System.out.println(user);return "ok";}
小结
规则:请求参数名与形参对象属性名相同,即可直接通过POJO接收
3.3 数组集合参数
数组参数
请求参数名与形参数组名称相同且请求参数为多个,定义数组类型形参即可传递参数
@RequestMapping("/arrayParam")public String arrayParam(String[] hobby) {System.out.println(Arrays.toString(hobby));return "OK";}
集合参数
请求参数名与形参集合名称相同且请求参数为多个,@RequestParam 绑定参数关系
@RequestMapping("/listParam")public String listParam(@RequestParam List<String> hobby) {System.out.println(hobby);return "OK";}
小结
数组:请求参数名与形参中数组变量名相同,可以直接使用数组封装
集合:请求参数名与形参中集合变量名相同,通过@RequestParam 绑定参数关系
3.4 日期时间参数
日期参数:使用 @DateTimeFormat 注解完成日期参数格式转换
@RequestMapping("/dateParam")public String dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime) {System.out.println(updateTime);return "OK";}
3.5 JSON参数
JSON参数:JSON数据键名与形参对象属性名相同,定义POJO类型形参即可接收参数,需要使用@RequestBody 标识
{"name":"ITCAST","age":16,"address":{"province":"山西","city":"晋中"}
}
@RequestMapping("/jsonParam")public String jsonParam(@RequestBody User user) {System.out.println(user);return "OK";}
3.6 路径参数
路径参数:通过请求URL直接传递参数,使用{...}来标识该路径参数,需要使用 @PathVariable 获取路径参数
传递一个参数
@RequestMapping("/path/{id}")public String pathParam(@PathVariable Integer id) {System.out.println(id);return "OK";}
传递多个参数
@RequestMapping("/path/{id}/{name}")public String pathParam(@PathVariable Integer id,@PathVariable String name) {System.out.println(id);System.out.println(name);return "OK";}
3.7 总结
简单参数
定义方法形参,请求参数名与形参变量名一致。
如果不一致,通过@RequstParam 手动映射。
实体参数
请求参数名,与实体对象的属性名一致,会自动接收封装
数组集合参数
数组:请求参数名与数组名一致,直接封装
集合:请求参数名与集合名一致,@RequestParam 绑定关系
日期参数
@DateTimeFormat
JSON参数
@RequestBody
路径参数
@PathVariable
4. 响应
注解解释
4.1 @ResponceBody
类型:方法注解、类注解
位置:Controller方法上/类上
作用:将方法返回值直接响应,如果返回值类型是 实体对象/集合,将会转换为JSON格式响应
说明:@RestController = @Controller + @ResponseBody
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {/*** The value may indicate a suggestion for a logical component name,* to be turned into a Spring bean in case of an autodetected component.* @return the suggested component name, if any (or empty String otherwise)* @since 4.0.1*/@AliasFor(annotation = Controller.class)String value() default "";}
4.2 演示案例
@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() {ArrayList<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;}
4.3 通一规范
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Result {private Integer code; // 1 成功,0失败private String msg; // 提示信息private Object data; // 数据datapublic 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);}
}
改造原始代码
@RequestMapping("hello")public Result hello() {System.out.println("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() {ArrayList<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);}
4.4 小结
1. @ResponseBody
位置:Controller类上/方法上
作用:将方法返回值直接响应,若返回值类型是 实体对象/集合,转JSON格式响应
2. 通一响应结果
Result(code、msg、data)
5. 分层解耦 - 三层架构
5.1 三层架构
1. controller:控制层,接收前端发送的请求,对请求进行处理,并响应数据。
2. service:业务逻辑层,处理具体的业务逻辑。
3. dao:数据访问层(Data Access Object)(持久层),负责数据访问操作,包括数据的增、删、改、查。
5.2 分层解耦
内聚:软件中各个功能模块内部的功能联系
耦合:衡量软件中各个层/模块之间的依赖、关联的程度。
软件设计原则:高内聚,低耦合。
控制反转:Inversion Of Control,简称IOC。对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转。
依赖注入:Dependency Injection,简称DI。容器为应用程序提供运行时,所依赖的资源称之为依赖注入。
Bean对象:IOC容器中创建、管理的对象,称之为bean。
5.3 IOC&DI入门
步骤:
1. Service层 及 Dao 层的实现类,交给IOC容器管理。
2. 为Controller及Service注入运行时,依赖的对象。
3. 运行测试。
@Component // 将当前的类交给IOC容器管理,成为IOC容器中的bean
@AutoWired // 运行时,IOC容器会提供该类型的bean对象,并复制给改变量 - 依赖注入
5.4 IOC详解
bean 的声明
要把某个对象交给IOC容器管理,需要在对应的类上加上如下注解之一:
注意事项
声明bean的时候,可以通过value属性指定bean的名字,如果没有指定,默认为类名首字母小写。
使用以上四个注解都可以声明bean,但是在springboot继承web开发中,声明控制器bean只能用@Controller
bean组件扫描
前面的bean的四大注解,要想生效,还需要被组件扫描注解@ComponentScan扫描。
@ComponentScan 注解虽然没有显示配置,但是实际上已经包含在了启动类声明注解 @SpringBootApplication中,默认扫描的范围是启动类所在的包及其自包。
5.5 DI详解
依赖注入
@AutoWired注解,默认是按照类型进行,如果存在多个相同类型的bean,将会报出如下错误:
解决方式
@Resource 与 @Autowired区别
@Autowired 是spring框架提供的注解,而@Resource 是JDK提供的注解。
@Autowired 默认是按照类型注入,而@Resource 默认是按照名称注入。
相关文章:

SpringBoot入门(黑马)
1. SpringBootWeb入门开发 需求:使用SpringBoot 开发一个web 应用,浏览器发起请求 /hello 后,给浏览器返回字符串"Hello World~"。 步骤: 1. 创建springBoot工程,并勾选web开发相关依赖。 2. 定义 HelloCo…...
Stream流操作
准备工作 准备 Gender 枚举类以及 Customer 类 enum Gender {MALE("男性"), FEMALE("女性");private String value;Gender() {}Gender(String value) {this.value value;}Overridepublic String toString() {return "Gender{" "value&qu…...

【Linux】查看操作系统开机时初始化的驱动模块列表的一个方法
这个方法是摸索出来的,也不一定对: 1、驱动层module_init(module_init_function)作为模块初始化,并且提供模块内部初始化的函数名; 2、找到所有驱动目录drivers下所有module_init(module_init_function),在内核6.9.0…...

快速入门Vue
Vue是什么 Vue.js(通常简称为Vue)是一个开源的JavaScript框架,用于构建用户界面和单页应用程序(SPA)。它由尤雨溪(Evan You)在2014年开发并发布。Vue的核心库只关注视图层,易于上手…...
ubuntu系统服务器离线安装python包
一、根据工程需要本地下载所需python包 1. 下载环境requirements.txt pip freeze > requirements.txt2. 根据requirements.txt下载python包 注意:查看服务器属于x_86架构还是arm架构、cpython还是pypy 2.1 确定服务器架构(终端输入) …...

re题(30)BUUCTF-[HDCTF2019]Maze
BUUCTF在线评测 (buuoj.cn) 查一下壳,32位upx壳 脱完壳放到ida,shiftF12看一下字符串,是个迷宫,maze(迷宫) 这里有一个经典的花指令 (导致找不到main函数) 下方有个奇怪的jnz指令,它跳转到了下…...
day36+day37 0-1背包
### 9.9 01背包问题(一维二维) 背包问题分类:01背包(一种物品只有一个),完全背包(一种物品有无数个),多重背包(不同物品有不同数量) 46. 携带研究…...

PostMan使用变量
环境变量 使用场景 当测试过程中,我们需要对开发环境、测试环境、生产环境进行测试 不同的环境对应着不同的服务器,那么这个时候我们就可以使用环境变量来区分它们 避免切换测试环境后,需要大量的更改接口的url地址 全局变量 使用场景 当…...

多线程同步
多线程 程序中默认只有一个线程,pthread_create()函数调用后就有2个线程。 pthread_create() #include <pthread.h> #include <string.h> #include <unistd.h> #include <iostream> using namespace std; //线程函数 void * callback(vo…...

第159天:安全开发-Python-协议库爆破FTPSSHRedisSMTPMYSQL等
案例一: Python-文件传输爆破-ftplib 库操作 ftp 协议 开一个ftp 利用ftp正确登录与失败登录都会有不同的回显 使用ftplib库进行测试 from ftplib import FTP # FTP服务器地址 ftp_server 192.168.172.132 # FTP服务器端口(默认为21) ftp_po…...

软件测试 | APP测试 —— Appium 的环境搭建及工具安装教程
大家应该都有同一种感觉,学习appium最大的难处之一在于环境的安装,安装流程比较繁琐,安装的工具和步骤也较多,以下是基于Windows系统下的Android手机端的安装流程。就像我们在用Selenium进行web自动化测试的时候一样,我…...

计算机人工智能前沿进展-大语言模型方向-2024-09-13
计算机人工智能前沿进展-大语言模型方向-2024-09-13 1. OneEdit: A Neural-Symbolic Collaboratively Knowledge Editing System Authors: Ningyu Zhang, Zekun Xi, Yujie Luo, Peng Wang, Bozhong Tian, Yunzhi Yao, Jintian Zhang, Shumin Deng, Mengshu Sun, Lei Liang, Z…...
衡石分析平台使用手册-替换衡石minio
替换衡石minio 在使用HENGSHI SENSE服务过程中,可以根据业务需要替换HENGSHI自带的minio。本文讲述使用Aws S3和Aliyun OSS替代衡石minio的过程。 准备工作 在进行配置前,请在aws s3或aliyun oss完成如下准备工作。 创建access_key和secret_acces…...

怎么将几个pdf合成为一个?把几个PDF合并成为一个的8种方法
怎么将几个pdf合成为一个?将多个PDF文件合并成一个整体可以显著提高信息整合的效率,并简化文件的管理与传递。例如,将不同章节的电子书合成一本完整的书籍,或者将多个部门的报告整合成一个统一的文档,可以使处理流程变…...
明明没有程序占用端口,但是启动程序却提示端口无法使用,项目也启动失败
明明没有程序占用端口,但是启动程序却提示端口无法使用,项目也启动失败 win10、端口占用、port、netstat、used背景 曾在springboot中遇到过,新建spring cloud时又遇到这个问题,如果不从根本上解决,就需要改端口&…...

ClickHouse的安装配置+DBeaver远程连接
1、clickhouse的下载: 先去clickhouse官网进行下载,继续往下翻找文档,将DBeaver也下载下来 下载地址:https://packages.clickhouse.com/rpm/stable/ 下载这个四个rpm包 2、上传rmp文件到Linux中 自己创建的一个clickhouse-ins…...
UVM仿真的运行(四)—— objection 机制
目录 0. 引言 1. uvm_phase::execute_phase line 1432~1470 2. uvm_objection 2.1 get_objection_total 2.2 raise_objection 2.3 drop_objection 2.4 m_execute_scheduled_forks 2.5 wait_for 3. 小结 0. 引言 前面介绍了uvm仿真的启动,按照domain中指定的DAG的pha…...
【ShuQiHere】算法分析:揭开效率与复杂度的神秘面纱
【ShuQiHere】 🚀 引言 在计算机科学的世界中,算法 是每一个程序背后的隐形支柱。从简单的排序到复杂的人工智能,算法无处不在。然而,编写一个能运行的程序只是开始,当程序面对庞大的数据集时,算法的效率…...

记忆化搜索专题——算法简介力扣实战应用
目录 1、记忆化搜索算法简介 1.1 什么是记忆化搜索 1.2 如何实现记忆化搜索 1.3 记忆化搜索与动态规划的区别 2、算法应用【leetcode】 2.1 题一:斐波那契数 2.1.1 递归暴搜解法代码 2.1.2 记忆化搜索解法代码 2.1.3 动态规划解法代码 2.2 题二࿱…...

【Java】【力扣】83.删除排序链表中的重复元素
题目 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 示例 1: 输入:head [1,1,2] 输出:[1,2]示例 2: 输入:head [1,1,2,3,3] 输出&#…...

铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...

前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

免费数学几何作图web平台
光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...