Springboot学习笔记3.20
目录
1.实战篇第一课
我们将会在本次实战中学习到哪些知识点?
开发模式和环境搭建:
注册接口
1.Lombok
2.开发流程
1.controller层,这个层会指明访问路径和要执行的逻辑:
2.我们把返回结果根据接口文档包装成一个类result,它有code代表成败,message代表返回信息,data代表响应数据
3.service接口和service实现类,实现controller层调用的方法,并且对数据进行加密:
4.Mapper层,使用@select,@Insert等注释在Mapper层实现对数据库的操作:
5.至此三层写完,实现了注册的流程,我们可以使用postman测试api是否可用(测试用的JSON文件另外提供):
2.学习过程中的疑惑:
1.@Controller和@RestController有啥区别
@Controller
@RestController
总结
示例代码
使用 @Controller
使用 @RestController
2. 什么是RESTful web 服务
RESTful Web 服务的特点:
RESTful Web 服务的操作:
示例:
3.@RequestMapping 或 @GetMapping、@PostMapping的区别
@RequestMapping
@GetMapping
@PostMapping
示例
使用 @RequestMapping
使用 @GetMapping 和 @PostMapping
注意事项
4.$和#在Spring中的区别
# 符号
$ 符号
示例
使用 # 符号
使用 $ 符号
总结
1.实战篇第一课
我们将会在本次实战中学习到哪些知识点?

开发模式和环境搭建:

步骤:
1.在xml文件中引入启动依赖,如web、mybatis、MySQL:


2.在yml文件中配置mybatis的参数:

3.创建项目结构和实体类:

4.配置启动类,添加@SpringBootApplication和SpringApplication.run()方法:
注册接口
1.Lombok
为了避免手动编写大量的 getter 和 setter 方法以及构造方法,你可以使用 Lombok 库。Lombok 是一个 Java 库,可以通过注解自动生成 getter、setter、构造方法等。
例如,在类上添加 @Data 注解,Lombok 会自动为类中的所有字段生成 getter 和 setter 方法,以及一个全参构造方法和一个无参构造方法:
@Data
public class User {private Integer id;//主键IDprivate String username;//用户名private String password;//密码private String nickname;//昵称private String email;//邮箱private String userPic;//用户头像地址private LocalDateTime createTime;//创建时间private LocalDateTime updateTime;//更新时间}
它在编译后的class里面会包含getset方法以及equals,toString等方法:



lombok还有
这两个注释,可以让你不用手动去写构造方法。
2.开发流程

对于一个注册模块,思考他的三层架构长什么样?

1.controller层,这个层会指明访问路径和要执行的逻辑:

2.我们把返回结果根据接口文档包装成一个类result,它有code代表成败,message代表返回信息,data代表响应数据

3.service接口和service实现类,实现controller层调用的方法,并且对数据进行加密:
工具类md5,这是一个加密工具类,调用里面的getMd5String()方法可以返回一个加密好的密码


4.Mapper层,使用@select,@Insert等注释在Mapper层实现对数据库的操作:

5.至此三层写完,实现了注册的流程,我们可以使用postman测试api是否可用(测试用的JSON文件另外提供):

测试成功!
2.学习过程中的疑惑:
1.@Controller和@RestController有啥区别
在 Spring MVC 框架中,@Controller 和 @RestController 都是用来创建控制器的注解注解,但它们有一些关键的区别:
@Controller
-
@Controller是一个通用的控制器注解注解,它主要用于处理传统的 MVC 模型,其中控制器只负责处理请求,返回视图(页面)和模型(数据)。 -
使用
@Controller时,返回的数据通常通过视图解析器(ViewResolver)解析为具体的页面。 -
它通常与
@RequestMapping或@GetMapping、@PostMapping等注解一起使用来映射请求路径。 -
@Controller控制器通常返回一个ModelAndView对象,或者返回一个视图名称让视图解析器决定如何渲染视图。
@RestController
-
@RestController是@Controller和@ResponseBody注解的结合体,用于创建 RESTful web 服务。 -
使用
@RestController时,Spring MVC 会自动将返回的对象序列化为 JSON 格式(默认使用 Jackson 库),并直接写入 HTTP 响应体中,而不是返回一个视图名称。 -
@RestController通常用于构建 API 接口,它使得编写 RESTful 服务变得更加简单。 -
它也与
@RequestMapping或@GetMapping、@PostMapping等注解一起使用来映射请求路径。
总结
-
如果你需要返回一个视图(如 JSP 页面),使用
@Controller。 -
如果你需要返回 JSON 或 XML 格式的数据,使用
@RestController。
示例代码
使用 @Controller
java复制
@Controller
public class MyController {@RequestMapping("/hello")public String sayHello(Model model) {model.addAttribute("message", "Hello, World!");return "hello"; // 返回视图名称}
}
使用 @RestController
java复制
@RestController
public class MyRestController {@GetMapping("/hello")public Map<String, Object> sayHello() {Map<String, Object> map = new HashMap<>();map.put("message", "Hello, World!");return map; // 直接返回 JSON 数据}
}
2. 什么是RESTful web 服务
RESTful Web 服务是一种基于表现层状态转移(Representational State Transfer,简称 REST)原则构建的网络应用程序接口(API)。REST 是由 Roy Fielding 在 2000 年提出的,它是一种设计风格,用于设计网络应用程序,以便它们可以通过标准的 HTTP 方法访问和操作网络资源。
RESTful Web 服务的特点:
-
无状态(Stateless): 每个请求从客户端到服务器必须包含所有必要的信息来理解和处理请求,服务器不会存储任何会话信息。
-
统一接口(Uniform Interface): 通过统一和预定义的接口简化和标准化架构之间的交互。RESTful API 通常使用标准的 HTTP 方法(如 GET、POST、PUT、DELETE)来操作资源。
-
可缓存(Cacheable): 响应可以被标记为可缓存或不可缓存。这可以减少网络通信量,提高响应速度。
-
分层系统(Layered System): 客户端不能通常不能直接知道它是否正在与中间层(如代理服务器、网关或应用服务器)通信,还是直接与最终服务器通信。
-
按需代码(Code on Demand,可选): 服务器可以按需向客户端发送代码(如 JavaScript),以扩展客户端的功能。
-
超文本传输协议(HTTP): RESTful Web 服务通常使用 HTTP 协议来传输数据,这使得它们可以在 Web 浏览器中直接访问。
RESTful Web 服务的操作:
-
GET:请求从服务器检索特定资源。
-
POST:在服务器上创建一个新的资源。
-
PUT:更新服务器上的现有资源或创建一个新资源。
-
DELETE:从服务器删除特定资源。
示例:
假设有一个 RESTful Web 服务用于管理博客文章:
-
GET /articles:检索所有文章的列表。 -
GET /articles/{id}:检索特定 ID 的文章。 -
POST /articles:创建一篇新文章。 -
PUT /articles/{id}:更新特定 ID 的文章。 -
DELETE /articles/{id}:删除特定 ID 的文章。
RESTful Web 服务因其简单性、可扩展性和易于维护性而在现代 Web 开发中非常流行。它们使得不同应用程序和服务之间的交互变得更加容易,并且可以轻松地与各种客户端(包括浏览器、移动应用和第三方服务)集成。
3.@RequestMapping 或 @GetMapping、@PostMapping的区别
在 Spring MVC 框架中,@RequestMapping、@GetMapping 和 @PostMapping 是用于映射 HTTP 请求到处理器方法上的注解(annotations)。这些注解帮助定义了 URL 路径和 HTTP 方法之间的对应关系。
@RequestMapping
@RequestMapping 是一个通用的请求映射注解,它可以映射到任何 HTTP 方法。它是最灵活的映射注解,可以指定路径、方法、参数等。@RequestMapping 可以用于类或方法上。
-
用于方法上:映射特定的 HTTP 请求到一个处理方法。
-
用于类上:为类中的所有方法提供一个共同的基础请求路径。
@GetMapping
@GetMapping 是 @RequestMapping 的一个特化,专门用于映射 HTTP GET 请求。它简化了只处理 GET 请求的方法的定义。
@PostMapping
@PostMapping 也是 @RequestMapping 的一个特化,专门用于映射 HTTP POST 请求。它用于处理需要通过 POST 方法提交数据的场景。
示例
使用 @RequestMapping
java复制
@Controller
public class MyController {@RequestMapping(value = "/users", method = RequestMethod.GET)public String listUsers(Model model) {// 获取用户列表并添加到模型中model.addAttribute("users", userService.findAll());return "userList"; // 返回视图名称}@RequestMapping(value = "/users", method = RequestMethod.POST)public String addUser(@ModelAttribute("user") User user) {// 保存新用户userService.save(user);return "redirect:/users"; // 重定向到用户列表}
}
使用 @GetMapping 和 @PostMapping
java复制
@RestController
public class MyRestController {@GetMapping("/users")public List<User> listUsers() {// 获取用户列表并返回return userService.findAll();}@PostMapping("/users")public User addUser(@RequestBody User user) {// 保存新用户并返回return userService.save(user);}
}
注意事项
-
返回类型:
@Controller通常返回视图名称,而@RestController返回数据(如 JSON)。 -
请求体:
@RequestBody注解用于将 HTTP 请求体绑定到方法参数上,通常与@PostMapping一起使用。 -
路径变量:可以使用
{variableName}语法在路径中定义变量,例如@RequestMapping("/users/{userId}")。
这些注解使得在 Spring MVC 中处理不同类型的 HTTP 请求变得更加简单和直观。通过合理使用这些注解,可以清晰地定义应用程序的 API 接口。
4.$和#在Spring中的区别
在 Spring 框架中,$ 和 # 这两个符号在不同的上下文中有不同的用途,尤其是在 Spring Expression Language(SpEL)和 Bean 属性注入中。
# 符号
在 Spring 中,# 符号通常与 SpEL(Spring Expression Language)一起使用。SpEL 是一种功能强大的表达式语言,它支持在运行时查询和操作对象图。
-
属性访问:使用
#可以访问对象的属性。例如,#user.name可以获取user对象的name属性。 -
方法调用:使用
#可以调用对象的方法。例如,#math.max(1, 2)可以调用math对象的max方法。 -
数组和集合访问:使用
#可以访问数组和集合的元素。例如,#users[0]可以获取users集合的第一个元素。
$ 符号
在 Spring 中,$ 符号通常用于属性占位符,它允许你引用配置文件中的值。
-
配置文件引用:使用
$可以引用外部配置文件(如application.properties或application.yml)中的值。例如,${app.name}可以引用配置文件中的app.name属性。 -
环境变量引用:使用
$也可以引用环境变量。例如,${ENV_VAR}可以引用名为ENV_VAR的环境变量。
示例
使用 # 符号
假设你有一个 User 类,并且想要在 Spring 中通过 SpEL 获取 User 对象的 name 属性:
java复制
public class User {private String name;// getters and setters
}@Autowired
private User user;public String getUserName() {return user.getName(); // Java 代码直接访问// 或者使用 SpEL// return #user.name;
}
使用 $ 符号
假设你的 application.properties 文件中有以下配置:
properties复制
app.name=MyApp
你可以在 Spring 应用中这样引用它:
java复制
@Value("${app.name}")
private String appName;public void printAppName() {System.out.println(appName); // 输出:MyApp
}
总结
-
#符号用于 SpEL 中,用于对象图的查询和操作。 -
$符号用于属性占位符,用于引用配置文件或环境变量中的值。
这两个符号在 Spring 框架中扮演着不同的角色,正确使用它们可以提高代码的灵活性和可维护性。
相关文章:
Springboot学习笔记3.20
目录 1.实战篇第一课 我们将会在本次实战中学习到哪些知识点? 开发模式和环境搭建: 注册接口 1.Lombok 2.开发流程 1.controller层,这个层会指明访问路径和要执行的逻辑: 2.我们把返回结果根据接口文档包装成一个类result&a…...
Ubuntu和Windows实现文件互传
1.开启Ubuntu下的FTP服务: (1)终端输入: sudo apt-get install vsftpd(2)安装完成后: 终端输入: /etc 是 Linux 系统的全局配置文件目录,存储系统和应用程序的配置信息…...
java面向对象从入门到入土
面向对象进阶 (写程序的套路) 面向:拿,找 对象:能干活的东西 面向对象编程:拿东西过来做对应的事情 (写程序的套路) 面向:拿,找 对象:能干活的东西 面向对象编程:拿东西过来做对应的事情 重点学习:学习已有对象并使用,学习如何自己设计对象并使用 设计对…...
linux ACL权限控制之用户权限控制程序设计
linux中的ACL(Access Control List,访问控制列表)是一种比传统UNIX权限更细粒度的权限控制机制,允许为文件和目录设置更为具体的用户和组权限。本文介绍使用acl命令和程序api对文件进行更精细的用户权限控制。 1. 命令行示例 使…...
Java多线程与JConsole实践:从线程状态到性能优化!!!
目录 一、前言二、JConsole 使用教程二、线程的基本状态2.1新建状态(New)2.2就绪状态(Ready)2.3运行状态(Running)2.4 阻塞状态(Blocked)2.5. 等待状态(Waitingÿ…...
从入门到精通:SQL注入防御与攻防实战——红队如何突破,蓝队如何应对!
引言:为什么SQL注入攻击依然如此强大? SQL注入(SQL Injection)是最古老且最常见的Web应用漏洞之一。尽管很多公司和组织都已经采取了WAF、防火墙、数据库隔离等防护措施,但SQL注入依然在许多情况下能够突破防线&#…...
Stable Diffusion vue本地api接口对接,模型切换, ai功能集成开源项目 ollama-chat-ui-vue
1.开启Stable Diffusion的api服务 编辑webui-user.bat 添加 –api 开启api服务,然后保存启动就可以了 2.api 文档地址 http://127.0.0.1:7860/docs3. 文生图 接口 地址 /sdapi/v1/txt2img //post 请求入参 {enable_hr: false, // 开启高清hrdenoising_stre…...
缓存使用纪要
一、本地缓存:Caffeine 1、简介 Caffeine是一种高性能、高命中率、内存占用低的本地缓存库,简单来说它是 Guava Cache 的优化加强版,是当下最流行、最佳(最优)缓存框架。 Spring5 即将放弃掉 Guava Cache 作为缓存机…...
第十四届蓝桥杯真题(PWM输出)
一.LED 先配置LED的八个引脚为GPIO_OutPut,锁存器PD2也是,然后都设置为起始高电平,生成代码时还要去解决引脚冲突问题 二.按键 按键配置,由原理图按键所对引脚要GPIO_Input 生成代码,在文件夹中添加code文件夹&#…...
【Qt】ffmpeg编码—存储(H264)
目录 一、编码分析 1.解码线程: 编辑2.编码线程: 编辑 编辑 二、ffmpeg编码 1.注册所有组件 2.编码初始化函数 (2)打开视频流 4.查找编码器 5. 写文件头信息,写到formatContex中 6.发送一帧数据给编码器…...
Webview详解(下)
第三阶段:性能优化 加载速度优化 缓存策略 缓存策略可以显著减少网络请求,提升页面加载速度。常用的缓存策略包括 HTTP 缓存和本地资源预加载。 1. HTTP 缓存 HTTP 缓存利用 HTTP 协议中的缓存机制(如 Cache-Control、ETag 等࿰…...
【MySQL基础-16】MySQL DELETE语句:深入理解与应用实践
1. DELETE语句基础:数据删除的艺术 在数据库管理中,DELETE语句是维护数据完整性和清理过期信息的关键工具。与日常生活中的"删除"不同,数据库中的删除操作需要更加谨慎和精确,因为数据一旦删除,恢复可能非常…...
相对位置嵌入和旋转位置编码
1. 相对位置嵌入:给注意力机制加“人际关系记忆” 像班级座位表 想象全班同学(序列的各个元素)坐成一个圈,老师(模型)要记住每个人之间的相对位置: 传统方法:老师给每个座位贴绝对…...
Unity编辑器功能及拓展(1) —特殊的Editor文件夹
Unity中的Editor文件夹是一个具有特殊用途的目录,主要用于存放与编辑器扩展功能相关的脚本和资源。 一.纠缠不清的UnityEditor 我们Unity中进行游戏构建时,我们经常遇到关于UnityEditor相关命名空间丢失的报错,这时候,只得将报错…...
REC一些操作解法
一.Linux命令长度突破 1.源码如下 <?php $param $_REQUEST[param];if ( strlen($param) < 8 ) {echo shell_exec($param); } 2.源码分析 echo执行函数,$_REQUEST可以接post、get、cookie传参 3.破题思路 源码中对参数长度做了限制,小于8位&a…...
powershell7.5.0不支持conda的问题
经历:这周手欠使用vscode的powershell时提示我更新,我就更新了,更新完激活不了conda环境了,查询了半天是powershell最新版7.5.0与目前conda25.1.1以前的版本不支持的问题。 问题环境:powershell版本>7.5.0ÿ…...
Android Jetpack学习总结(源码级理解)
ViewModel 和 LiveData 是 Android Jetpack 组件库中的两个核心组件,它们能帮助开发者更有效地管理 UI 相关的数据,并且能够在配置变更(如屏幕旋转)时保存和恢复 UI 数据。 ViewModel作用 瞬态数据丢失的恢复,比如横竖…...
Unity中UDP异步通信常用API使用
Begin开头的方法 BeginSendTo BeginSendTo 是 UdpClient 类中的一个重要方法,用于开始一个异步操作来发送 UDP 数据报到指定的远程端点 public IAsyncResult BeginSendTo(byte[] datagram,int bytes,IPEndPoint endPoint,AsyncCallback requestCallback,object s…...
解决Dify:failed to init dify plugin db问题
Dify最新版本1.1.3(langgenius/dify: Dify is an open-source LLM app development platform. Difys intuitive interface combines AI workflow, RAG pipeline, agent capabilities, model management, observability features and more, letting you quickly go from prototy…...
[AI绘图] ComfyUI 中自定义节点插件安装方法
ComfyUI 是一个强大的 AI 图像生成工具,支持自定义节点插件扩展其功能。本文介绍 ComfyUI 中安装自定义节点插件的三种方法,包括 Git Clone 方式、插件管理器安装方式,以及手动解压 ZIP 文件的方法,并分析它们的优缺点。 1. Git Clone 方法 使用 git clone 是最稳定且推荐…...
【机械视觉】C#+VisionPro联合编程———【六、visionPro连接工业相机设备】
【机械视觉】C#VisionPro联合编程———【六、visionPro连接工业相机设备】 目录 【机械视觉】C#VisionPro联合编程———【六、visionPro连接工业相机设备】 前言: 连接步骤说明 一. 硬件连接 支持的相机接口类型: 连接步骤 2. 软件配置 Visio…...
CI/CD基础知识
什么是CI/CD CI:持续集成,开发人员频繁地将代码集成到主干(主分支)中每次集成都通过自动化构建和测试来验证,从而尽早发现集成错误,常用的CI工具包括Jenkins、Travis CI、CircleCI、GitLab CI等 CD&#…...
蓝桥杯 之 图论基础+并查集
文章目录 习题联盟X蓝桥幼儿园 图论基础 并查集 并查集,总的来说,操作分为三步初始化(每一个节点的父亲是自己),定义union(index1,index2)函数,定义find(index)函数 并查集详细内容博客 习题 联盟X 联盟X 典型的求解连通分支…...
C# .net ai Agent AI视觉应用 写代码 改作业 识别屏幕 标注等
C# net deepseek RAG AI开发 全流程 介绍_c# 向量处理 deepseek-CSDN博客 视觉多模态大模型 通义千问2.5-VL-72B AI大模型能看懂图 看懂了后能干啥呢 如看懂图 让Agent 写代码 ,改作业,识别屏幕 标注等等。。。 据说是目前最好的免费图片识别框架 通…...
不使用自动映射驼峰命名法,直接在接口上使用注解@Results方法映射
3. 使用注解方式配置 在接口方法上使用 Results 注解: java 复制 Select("SELECT user_name, create_time FROM user WHERE id #{id}") Results({Result(column "user_name", property "userName"),Result(column "crea…...
15届蓝桥JavaB组 前6道题解
15届蓝桥JavaB组 前6道题解 报数游戏类斐波那契循环数分布式队列食堂最优分组星际旅行 报数游戏 import java.util.Scanner;//分析: //20和24的最小公倍数是120 //题目给出了前10个数,发现第10个数是120,说明每10个数出现一个公倍数 //第20个…...
蓝桥杯 14 天 十五届蓝桥杯 数字诗意
static boolean kkk(long x) {if(x1)return true;else {// 初始化xx为1,用于计算2的幂long xx 1;// 循环60次,检查2的幂是否等于xfor (int i 1; i < 60; i) {xx * 2; // 每次将xx乘以2if (xx x) { // 如果xx等于x,说明x是2的幂…...
MP4音视频格式
1.MP4 MP4是一种用于封装音视频/字幕/图片/章节信息等数据的多媒体容器格式,是MPEG-4系列的成员之一 2.文件结构 MP4由一层层的嵌套Box(atom)组成 [ size (4 bytes) ][ type (4 bytes)][ payload (嵌套box或者数据) ] 3.常见Box 类型名称…...
国内GitHub镜像源全解析:加速访问与替代方案指南
在数字化开发日益普及的今天,GitHub作为全球最大的代码托管平台,已成为开发者不可或缺的资源库。然而,由于网络环境的限制,国内用户在访问GitHub时常常面临速度慢、连接不稳定等问题。为了提升开发效率,国内涌现出多个GitHub镜像源,为开发者提供了快速、稳定的代码克隆与…...
CentOS 7 挂载与卸载文件系统笔记
挂载文件系统 挂载的基本概念 挂载是将存储设备(如硬盘分区、U 盘、光盘等)连接到 Linux 文件系统的特定目录(挂载点),使得系统能够访问存储设备上的数据。 查看已挂载的文件系统 命令:mount 或 df -h mo…...
