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] 输出&#…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
Redis上篇--知识点总结
Redis上篇–解析 本文大部分知识整理自网上,在正文结束后都会附上参考地址。如果想要深入或者详细学习可以通过文末链接跳转学习。 1. 基本介绍 Redis 是一个开源的、高性能的 内存键值数据库,Redis 的键值对中的 key 就是字符串对象,而 val…...
【笔记】AI Agent 项目 SUNA 部署 之 Docker 构建记录
#工作记录 构建过程记录 Microsoft Windows [Version 10.0.27871.1000] (c) Microsoft Corporation. All rights reserved.(suna-py3.12) F:\PythonProjects\suna>python setup.py --admin███████╗██╗ ██╗███╗ ██╗ █████╗ ██╔════╝…...
MLP实战二:MLP 实现图像数字多分类
任务 实战(二):MLP 实现图像多分类 基于 mnist 数据集,建立 mlp 模型,实现 0-9 数字的十分类 task: 1、实现 mnist 数据载入,可视化图形数字; 2、完成数据预处理:图像数据维度转换与…...
MCP和Function Calling
MCP MCP(Model Context Protocol,模型上下文协议) ,2024年11月底,由 Anthropic 推出的一种开放标准,旨在统一大模型与外部数据源和工具之间的通信协议。MCP 的主要目的在于解决当前 AI 模型因数据孤岛限制而…...
八、【ESP32开发全栈指南:UDP客户端】
1. 环境准备 安装ESP-IDF v4.4 (官方指南)确保Python 3.7 和Git已安装 2. 创建项目 idf.py create-project udp_client cd udp_client3. 完整优化代码 (main/main.c) #include <string.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h&…...
