Spring Boot--@PathVariable、@RequestParam、@RequestBody
目录
声明!!
什么是RESTful?
RESTful 的基本原则
无状态性(Stateless)
统一接口(Uniform Interface)
分层系统(Layered System)
缓存(Cacheable)
按需代码(Code on Demand, 可选)
HTTP 协议里面,四个表示操作方式的动词:
@PathVariable
@PathVariable 映射 URL 绑定的占位符
@PathVariable的参数
基本用法
多个路径变量
默认值
注意事项
@RequestParam
@RequestParam的参数
基本用法
默认值
多个值
必填与可选参数
数据验证
注意事项
@RequestBody
基本用法
支持的数据格式
数据验证
异常处理
注意事项
URL(统一资源定位符)
URL 的基本结构
完整 URL 示例
URL 编码
URL 的作用
资源定位:
导航:
交互:
搜索引擎优化(SEO):
@PathVariable、@RequestParam、@RequestBody是构建 RESTful Web 服务的非常有用的工具
声明!!
本文大多引用出处来自:
Spring Boot中@PathVariable、@RequestParam和@RequestBody的区别和使用_spring boot pathvariable-CSDN博客
本文仅作学习记录参考,若有侵权,麻烦告知删除
什么是RESTful?
RESTful 是一种基于HTTP协议的软件架构风格,它用于设计网络应用程序接口(API)。
REST 代表“表述性状态转移”(Representational State Transfer),其核心思想是通过一组标准的操作和资源来实现客户端与服务器之间的交互。RESTful API 设计强调简洁、直观和易于理解,遵循无状态通信原则,使得开发者能够快速构建和维护分布式系统。
RESTful 的基本原则
无状态性(Stateless)
每个请求都必须包含所有必要的信息,以使服务器能够理解和处理该请求,而不依赖于任何先前的交互或会话状态。
统一接口(Uniform Interface)
使用一致的方式定义资源及其操作,包括:
资源标识(Resource Identification):每个资源都有一个唯一的URI(统一资源标识符)下文有详解。
自描述消息(Self-descriptive Messages):响应中包含足够的信息让客户端知道如何处理数据,例如内容类型(如JSON、XML)。
HATEOAS(Hypermedia as the Engine of Application State):允许API返回链接到其他相关资源的数据,指导客户端下一步操作。
分层系统(Layered System)
系统可以由多个层级组成,每一层只与紧邻的一层进行交互,从而增加了灵活性和可扩展性。
缓存(Cacheable)
响应可以被标记为可缓存,以便后续相同的请求可以直接从缓存中获取结果,减少对服务器的压力。
按需代码(Code on Demand, 可选)
服务器可以在响应中提供可执行代码(如JavaScript),以增强客户端的功能。这一特性在RESTful API中较少使用。
HTTP 协议里面,四个表示操作方式的动词:
GET、POST、PUT、DELETE
它们分别对应四种基本操作:
- GET 用来获取资源
- POST 用来新建资源
- PUT 用来更新资源
- DELETE 用来删除资源
@PathVariable
主要用于将 URL 中的模板变量映射到方法参数上。它允许开发者从请求路径中提取出特定部分的数据,并直接传递给控制器方法的参数,从而简化了对动态路径元素的处理。
@PathVariable 映射 URL 绑定的占位符
通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器(controller)处理方法的形参中:URL 中的 {xxx} 占位符可以通过@PathVariable(“xxx“) 绑定到操作方法的形参中。
@PathVariable的参数
- **String value:**可指定占位符 { } 中的参数名,若只指定value这一个属性可省略属性名不写,若占位符中的参数名和处理方法中的参数名相同可省略此属性;
- **String name:**等价与value,和value无本质上的差异,两个属性指定其一即可;
- **boolean required:**是否必需,默认为 true,即 请求中必须包含该参数,如果没有包含,将会抛出异常;
基本用法
假设你有一个 RESTful API 用来管理用户信息,每个用户的详细信息可以通过其唯一的 ID 来访问。你可以定义如下形式的 URL:
GET /users/{id}
在这个例子中,{id} 就是一个路径变量,表示用户 ID。为了在控制器方法中获取这个 ID 的值,可以使用 @PathVariable 注解:
@RestController
@RequestMapping("/users")
public class UserController {@GetMapping("/{id}")public ResponseEntity<User> getUserById(@PathVariable Long id) {// 根据ID查找用户逻辑User user = userService.findById(id);if (user != null) {return ResponseEntity.ok(user);} else {return ResponseEntity.notFound().build();}}
}
在这个例子中,@PathVariable Long id
表示从 URL 路径 /users/{id}
中提取 id 参数,并将其转换为 Long 类型后赋值给方法参数 id。
多个路径变量
当需要同时处理多个路径变量时,可以在同一个方法签名中使用多个 @PathVariable 注解:
@GetMapping("/users/{userId}/posts/{postId}")
public ResponseEntity<Post> getPostByUserAndPostId(@PathVariable("userId") Long userId,@PathVariable("postId") Long postId) {// 查找指定用户下的指定帖子逻辑Post post = postService.findByUserAndPostId(userId, postId);if (post != null) {return ResponseEntity.ok(post);} else {return ResponseEntity.notFound().build();}
}
注意:如果你的方法参数名与路径变量名相同,则可以直接省略 @PathVariable 的参数名称(如上面的第一个例子)。如果不同,则必须显式指定路径变量的名字,如 @PathVariable("userId") Long userId
。
默认值
有时你可能希望为路径变量提供默认值,以防万一客户端没有提供或提供了无效的值。Spring 5.1 及以上版本支持通过 defaultValue属性来设置默认值:
@GetMapping("/users/{id}")
public ResponseEntity<String> getUserById(@PathVariable(value = "id", required = false) String id) {if (id == null || id.isEmpty()) {id = "default"; // 使用默认值}// 其他业务逻辑...
}
不过需要注意的是,默认值通常不适用于主键等关键字段,因为这些字段往往要求必须由客户端提供准确的值。
注意事项
- 类型转换:@PathVariable 支持自动进行简单的类型转换(如字符串到整数、长整型等),但如果遇到复杂的类型转换需求,可能需要自定义转换器。
- 验证:虽然 @PathVariable 可以结合 JSR 303 Bean Validation 注解(如 @NotNull, @Size 等)一起使用来进行参数验证,但在实际应用中,由于路径变量通常是唯一标识符,更多时候是通过服务层逻辑来确保其有效性。
- 安全性:确保正确处理潜在的安全问题,例如防止注入攻击。避免直接将未经验证的路径变量拼接到 SQL 查询或其他敏感操作中。
总之,@PathVariable 是构建 RESTful Web 服务的一个非常有用的工具,它使得 URL 设计更加清晰且易于理解和维护。正确使用它可以大大提高代码的可读性和灵活性。
@RequestParam
@RequestParam 是 Spring 框架中的一个注解,主要用于将 HTTP 请求中的查询参数(Query Parameters)或表单数据绑定到控制器方法的参数上。它允许开发者轻松地从 GET 或 POST 请求中获取用户传递的参数值,并将其直接映射到方法参数中进行处理。这对于构建动态且灵活的 Web 应用程序非常重要。
@RequestParam的参数
- **String value:**请求中传入参数的名称,如果不设置value值,则会默认为该变量名;
- **String name:**等价与value,和value无本质上的差异,两个属性指定其一即可;
- **boolean required:**是否必需,默认为 true,即 请求中必须包含该参数,如果没有包含,将会抛出异常(可选配置);
- **String defaultValue:**参数的默认值,如果请求中没有同名的参数时,该变量默认为此值;
基本用法
假设你有一个 RESTful API 用来搜索用户信息,可以通过用户名或者邮箱来查找用户。你可以定义如下形式的 URL:
GET /users?username=john&email=john@example.com
在这个例子中,username 和 email 就是查询参数。为了在控制器方法中获取这些参数的值,可以使用 @RequestParam 注解:
@RestController
@RequestMapping("/users")
public class UserController {@GetMappingpublic ResponseEntity<List<User>> searchUsers(@RequestParam(value = "username", required = false) String username,@RequestParam(value = "email", required = false) String email) {// 根据提供的参数查找用户逻辑List<User> users = userService.searchByUsernameOrEmail(username, email);return ResponseEntity.ok(users);}
}
在这个例子中:
@RequestParam(value = "username", required = false)
表示从请求中提取名为 username 的查询参数,并将其赋值给方法参数 username。如果该参数不存在,则不会抛出异常,因为 required = false。- 类似地,
@RequestParam(value = "email", required = false)
处理 email 参数。
默认值
有时你可能希望为某些参数提供默认值,以防万一客户端没有提供或提供了无效的值。可以通过 defaultValue 属性来设置默认值:
@GetMapping
public ResponseEntity<List<User>> searchUsers(@RequestParam(value = "page", defaultValue = "1") int page,@RequestParam(value = "size", defaultValue = "20") int size) {// 分页查询用户逻辑Pageable pageable = PageRequest.of(page - 1, size);Page<User> userPage = userService.findAll(pageable);return ResponseEntity.ok(userPage.getContent());
}
在这个例子中,如果没有提供 page 或 size 参数,它们将分别被赋予默认值 1 和 20。
多个值
对于某些情况下,一个参数可能会有多个值(例如,多选框提交的数据)。可以使用数组或集合类型作为方法参数:
@GetMapping("/filter")
public ResponseEntity<List<User>> filterUsers(@RequestParam("role") List<String> roles) {// 根据角色过滤用户逻辑List<User> filteredUsers = userService.findByRoles(roles);return ResponseEntity.ok(filteredUsers);
}
在这个例子中,roles 参数可以接受多个值,如 /filter?role=admin&role=user
。
必填与可选参数
通过设置 required 属性,可以指定某个参数是否为必填项。如果设置为 true(默认),则当请求中缺少该参数时会抛出 MissingServletRequestParameterException
异常;如果设置为 false,则即使缺少该参数也不会报错,参数值将为 null 或者使用默认值。
@RequestParam(value = "username", required = true)
数据验证
虽然 @RequestParam 支持简单的类型转换(如字符串到整数、长整型等),但在实际应用中,通常还需要对参数进行更严格的验证。可以结合 JSR 303 Bean Validation 注解(如 @NotNull, @Size 等)一起使用来进行参数验证:
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
@GetMapping
public ResponseEntity<List<User>> searchUsers(@RequestParam @Size(min = 3, max = 50) String username,@RequestParam @NotNull String email) {// 验证后的业务逻辑...
}
注意事项
- 安全性:确保正确处理潜在的安全问题,例如防止SQL注入攻击。避免直接将未经验证的参数拼接到 SQL 查询或其他敏感操作中。
- 编码问题:对于包含特殊字符或非ASCII字符的参数值,注意URL编码和解码的问题,确保正确传输和解析。
总之,@RequestParam 是构建动态Web应用程序的一个非常有用的工具,它使得从HTTP请求中获取参数变得简单而直观。正确使用它可以大大提高代码的可读性和灵活性,同时也能增强系统的健壮性和安全性。
@RequestBody
@RequestBody 是 Spring 框架中的一个注解,主要用于将 HTTP 请求体(Request Body)中的内容绑定到控制器方法的参数上。它允许开发者直接处理客户端发送过来的 JSON、XML 或其他格式的数据,并将其转换为 Java 对象,从而简化了数据的接收和解析过程。
@RequestBody接收数据时,前端不能使用GET方式提交数据,而是用POST等方式进行提交。
基本用法
假设你有一个 RESTful API 用来创建新用户。客户端会发送一个包含用户信息的 JSON 对象作为 POST 请求的主体。你可以使用 @RequestBody 注解将这个 JSON 数据映射到一个 Java 对象中:
@PostMapping("/users")
public ResponseEntity<User> createUser(@RequestBody User user) {// 处理新用户的逻辑...User savedUser = userService.save(user);return ResponseEntity.ok(savedUser);
}
在这个例子中:
@RequestBody User user
表示从请求体中读取 JSON 数据,并将其反序列化为 User 类型的对象。
Spring 会自动处理 JSON 到 Java 对象的转换,前提是已经配置了适当的 Jackson 或 Gson 等 JSON 解析库。
支持的数据格式
@RequestBody 可以处理多种数据格式,包括但不限于:
- JSON:最常用的格式之一,适合表示结构化的数据。
- XML:某些系统可能更倾向于使用 XML 格式。
- 自定义格式:如果需要支持特定的应用程序或行业标准格式,可以通过实现自己的消息转换器来扩展 @RequestBody 的功能。
为了确保 Spring 能够正确地解析和转换这些不同格式的数据,通常需要在请求头中指定 Content-Type
,例如:
application/json
:用于 JSON 格式的数据。application/xml
:用于 XML 格式的数据。
数据验证
结合 JSR 303 Bean Validation 注解(如 @NotNull, @Size 等),可以对传入的请求体进行验证,确保接收到的数据符合预期的要求:
import javax.validation.Valid;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Size;
public class User {@NotEmpty(message = "用户名不能为空")private String username;@Size(min = 5, max = 20, message = "密码长度应在5到20个字符之间")private String password;// Getters and Setters...
}@PostMapping("/users")
public ResponseEntity<User> createUser(@Valid @RequestBody User user) {// 验证后的业务逻辑...
}
在这个例子中,@Valid 注解告诉 Spring 在调用 createUser 方法之前先对 User 对象进行验证。如果验证失败,Spring 会自动返回一个包含错误信息的响应给客户端。
异常处理
当请求体不符合预期格式或无法正确解析时,可能会抛出异常。常见的异常包括:
HttpMessageNotReadableException
:当请求体为空或者格式不正确时抛出。MethodArgumentNotValidException
:当使用 @Valid 注解且验证失败时抛出。
为了优雅地处理这些异常,可以使用 @ControllerAdvice 和 @ExceptionHandler 来全局捕获并定制响应:
@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(HttpMessageNotReadableException.class)public ResponseEntity<String> handleHttpMessageNotReadable(HttpMessageNotReadableException ex) {return ResponseEntity.badRequest().body("请求体格式错误: " + ex.getMessage());}@ExceptionHandler(MethodArgumentNotValidException.class)public ResponseEntity<String> handleValidationErrors(MethodArgumentNotValidException ex) {StringBuilder errors = new StringBuilder();ex.getBindingResult().getAllErrors().forEach((error) -> {errors.append(error.getDefaultMessage()).append(", ");});return ResponseEntity.badRequest().body(errors.toString());}
}
注意事项
- 性能考虑:对于大型请求体或频繁的请求,应评估性能影响,并考虑使用流式处理或其他优化策略。
- 安全性:避免直接将未经验证的请求体数据用于敏感操作,如数据库查询等,以防 SQL 注入或其他类型的攻击。
- 大小限制:可以通过配置服务器或框架参数来限制请求体的最大允许大小,防止恶意用户上传过大的文件导致服务崩溃。
如果后端参数是一个对象,且该参数前是以**@RequestBody**修饰的,那么前端传递json参数时,必须满足以下要求:
后端**@RequestBody注解对应的类在将HTTP的输入流(含请求体)装配到目标类(@RequestBody**后的类)时,会根据json字符串中的key来匹配对应实体类的属性,如果匹配一致且json中的该key对应的值符合实体类的对应属性类型时,会调用实体类的setter方法,将值赋给该属性。
json字符串中,如果value为"“的话,后端对应属性如果是String类型的,那么接受到的就是”",如果是后端属性的类型是Integer、Double等类型,那么接收到的就是null。
json字符串中,如果value为null的话,后端对应收到的就是null。
如果某个参数没有value的话,在传json字符串给后端时,要么干脆就不把该字段写到json字符串中;要么写value时, 必须有值,null 或""都行。
总之,@RequestBody 是构建 RESTful Web 应用程序的一个非常有用的工具,它使得从 HTTP 请求体中获取和处理复杂数据变得简单而直观。正确使用它可以大大提高代码的可读性和灵活性,同时也能增强系统的健壮性和安全性。
URL(统一资源定位符)
URL是Uniform Resource Locator的缩写,意为“统一资源定位符”。它是互联网上用来标识资源位置的地址,通常用于访问网页、文件、图片等网络资源。一个URL通常包含以下几个部分:
URL 的基本结构
一个典型的 URL 由以下几个部分组成:
scheme://[userinfo@]host[:port]/path?query#fragment
scheme(协议):指定用于访问资源的协议类型,如 http
、https
、ftp
等。这是 URL 中最前面的部分,后面跟有两个斜杠 //
。
示例:https
userinfo(用户信息,可选):包含用户名和密码(已不推荐使用),用于认证目的。如果存在,则以 username:password@
的形式出现在主机名之前。
示例:alice:bob@
host(主机名):表示托管资源的服务器地址,可以是域名或 IP 地址。
示例:example.com
port(端口号,可选):指明服务器监听的服务端口,默认情况下,HTTP 使用 80 端口,HTTPS 使用 443 端口。如果使用默认端口,通常省略此部分。
示例::8080
path(路径):指定资源在服务器上的具体位置,类似于文件系统的目录路径。它可以包括多个层级。
示例:/articles/2023/12/new-article.html
query(查询字符串,可选):包含一系列键值对参数,用于向服务器传递额外信息。查询字符串以问号 ?
开始,各个参数之间用与号 &
分隔。
示例:?search=RESTful&lang=en
fragment(片段标识符,可选):用于指示文档内的某个特定部分,通常用于 HTML 页面中的锚点链接。片段标识符以井号 #
开始。
示例:#section-3
完整 URL 示例
https://user:pass@example.com:8080/articles/2023/12/new-article.html?search=RESTful&lang=en#section-3
在这个例子中:
https
是协议。
user:pass@
是用户信息(尽管这种做法已不推荐)。
example.com 是主机名。
:8080
是端口号。
/articles/2023/12/new-article.html
是路径。
?search=RESTful&lang=en
是查询字符串。
#section-3
是片段标识符。
URL 编码
由于 URL 只能包含某些字符集(如 ASCII 字符),因此对于不在允许范围内的字符(如空格、非英文字符等),需要进行编码处理。URL 编码遵循 RFC 3986 标准,使用百分号 %
后接两位十六进制数来表示特殊字符。
例如:
- 空格会被编码为
%20
。 - 汉字“中”可能会被编码为
%E4%B8%AD
。
URL 的作用
资源定位:
URL 提供了一种标准化的方式来唯一地标识和定位互联网上的任何资源。
导航:
用户可以通过点击链接或直接输入 URL 来浏览不同的网页和服务。
交互:
开发人员利用 URL 来构建 RESTful API,通过不同的 HTTP 方法(如 GET、POST、PUT、DELETE)对资源进行 CRUD 操作。
搜索引擎优化(SEO):
良好的 URL 结构有助于提高网站在搜索引擎结果页面中的排名,因为清晰且描述性的 URL 更容易被索引和理解。
总之,URL 是互联网通信的基础之一,它不仅简化了我们访问在线资源的过程,也为开发者提供了强大的工具来设计和实现各种网络应用。正确理解和使用 URL 对于创建高效、易用且安全的 Web 应用至关重要。
若本文存在问题,欢迎批评指出,谢谢!
相关文章:
Spring Boot--@PathVariable、@RequestParam、@RequestBody
目录 声明!! 什么是RESTful? RESTful 的基本原则 无状态性(Stateless) 统一接口(Uniform Interface) 分层系统(Layered System) 缓存(Cacheable&#…...
网站HTTP改成HTTPS
您不仅需要知道如何将HTTP转换为HTTPS,还必须在不妨碍您的网站自成立以来建立的任何搜索排名权限的情况下进行切换。 为什么应该从HTTP转换为HTTPS? 与非安全HTTP于不同,安全域使用SSL(安全套接字层)服务器上的加密代…...
Spring Boot + Netty + WebSocket 实现消息推送
1、关于Netty Netty 是一个利用 Java 的高级网络的能力,隐藏其背后的复杂性而提供一个易于使用的 API 的客户端/服务器框架。 2、Maven依赖 <dependencies><!-- https://mvnrepository.com/artifact/io.netty/netty-all --><dependency><gr…...
AI之HardWare:英伟达NvidiaGPU性价比排名(消费级/专业级/中高端企业级)以及据传英伟达Nvidia2025年将推出RTX 5090/5080、华为2025年推出910C/910D
AI之HardWare:英伟达NvidiaGPU性价比排名(消费级/专业级/中高端企业级)以及据传英伟达Nvidia2025年将推出RTX 5090/5080、华为2025年推出910C/910D 目录 英伟达NvidiaGPU性能排名(消费级/专业级/中高端企业级) NVIDIA中消费级和专业级 GPU NVIDIA中高端企业GPU …...
ESP32云开发二( http + led + lcd)
文章目录 前言先上效果图platformio.iniwokwi.tomldiagram.json源代码编译编译成功上传云端完结撒花⭐⭐⭐⭐⭐ 前言 阅读此篇前建议先看 此片熟悉下wokwi https://blog.csdn.net/qq_20330595/article/details/144289986 先上效果图 Column 1Column 2 platformio.ini wokwi…...
JavaScript语言的软件工程
JavaScript语言的软件工程 引言 在当今软件开发的浪潮中,JavaScript已不仅仅是一个简单的前端脚本语言。它的位置已经升华为全栈开发的重要语言之一,借助Node.js等技术,JavaScript不仅可以用于浏览器环境,还可以在后端服务器中运…...
【Qt】04-Lambda表达式
前言一、概念引入二、使用方法2.1 基本用法代码示例2.2 捕获外部变量2.3 参数列表 三、完整代码mywidget.cppsecondwidget.cppmywidget.hsecondwidget.h 总结 前言 一、概念引入 Lambda表达式(Lambda Expressions)是C11标准引入的一种匿名函数对象&…...
Golang 生态学习
1. Go 语言基础 在深入 Go 语言的生态之前,首先需要掌握 Go 语言本身的核心特性。 • Go 语言官方文档:https://golang.org/doc/ Go 官方文档是学习语言基础和标准库的首选资源。 • 学习内容: • 基础语法:数据类型、控制流…...
Arcgis Pro安装完成后启动失败的解决办法
场景 之前安装的Arcgis Pro 今天突然不能使用了,之前是可以使用的,自从系统更新了以后就出现了这个问题。 环境描述 Arcgis Pro 3.0 Windows 10 问题描述 打开Arcgis Pro,页面也不弹出来,打开任务管理器可以看到进程创建之后&…...
支持向量机SVM的应用案例
支持向量机(Support Vector Machine,SVM)是一种强大的监督学习算法,广泛应用于分类和回归任务。 基本原理 SVM的主要目标是周到一个最优的超平面,该超平面能够将不同类别的数据点尽可能分开,并且使离该超平面最近的数…...
Linux中的Iptables介绍
文章目录 iptables1. 概述2. **工作原理**3. 数据包处理流程与规则匹配顺序4. 常用的匹配条件5. 动作类型6. 基本命令7. 高级功能 iptables 1. 概述 Iptables 是一个用于配置 Linux 内核防火墙的用户空间工具。它能够对进出服务器的网络数据包进行过滤、修改和转发等操作&…...
14天学习微服务-->第2天:Spring Cloud深入与实践
第2天:Spring Cloud深入与实践 一、Spring Cloud核心组件深入 在微服务架构中,Spring Cloud 提供了一系列核心组件来支持服务的注册与发现、配置管理、负载均衡等功能。今天我们将深入学习其中的三个关键组件:Eureka/Nacos(服务…...
使用 Box2D 库开发愤怒的小鸟游戏
使用 Box2D 库开发愤怒的小鸟游戏 Box2D 是一个开源的 2D 物理引擎,广泛应用于游戏开发中,特别是在模拟物体的运动、碰撞、重力等方面。在本文中,我们将利用 Box2D 库开发一个简化版的 愤怒的小鸟 游戏。我们将一步步展示如何实现物理引擎的…...
C# ComboBox 控件属性
ComboBox 的基本属性 在C#中,ComboBox控件具有多种属性,这些属性可以帮助开发者更好地控制和管理控件的各个方面。以下是一些基本的ComboBox属性及其功能: 公共属性 AccessibilityObject:获取分配给该控件的AccessibleObject。 Ac…...
《keras 3 内卷神经网络》
keras 3 内卷神经网络 作者:Aritra Roy Gosthipaty 创建日期:2021/07/25 最后修改时间:2021/07/25 描述:深入研究特定于位置和通道无关的“内卷”内核。 (i) 此示例使用 Keras 3 在 Colab 中查看 GitHub …...
Linux:文件描述符fd、系统调用open
目录 一、文件基础认识 二、C语言操作文件的接口 1.> 和 >> 2.理解“当前路径” 三、相关系统调用 1.open 2.文件描述符 3.一切皆文件 4.再次理解重定向 一、文件基础认识 文件 内容 属性。换句话说,如果在电脑上新建了一个空白文档࿰…...
ToDesk设置临时密码和安全密码都可以当做连接密码使用
ToDesk 在各领域办公都已经是非常常见了 为了安全 ToDesk 设置了连接密码,想连接 需要输入远程码和连接密码 我们刚打开 系统默认给我们用的是临时密码,安全性确实很强 和定时Tokey一样,固定时间切换。 但是 如果我们要经常连接这个电脑&a…...
C#防止重复提交
C#防止重复提交 文章目录 C#防止重复提交前言防止重复提交的思路Web API 防止重复提交代码实现代码讲解使用方法 MVC防止重复提交总结 前言 当用户在前端进行提交数据时,如果网络出现卡顿和前端没有给出响应的话顾客通常都会狂点提交按钮,这样就很容易导…...
递归算法学习v2.2
46. 全排列 class Solution {List<List<Integer>> ret;List<Integer> path;boolean[] check;public List<List<Integer>> permute(int[] nums) {ret new ArrayList<>();path new ArrayList<>();check new boolean[nums.length…...
unity插件Excel转换Proto插件-ExcelToProtobufferTool
unity插件Excel转换Proto插件-ExcelToProtobufferTool **ExcelToProtobufTool 插件文档****1. 插件概述****2. 默认配置类:DefaultIProtoPathConfig****属性说明** **3. 自定义配置类****定义规则****示例代码** **4. 使用方式****4.1 默认路径****4.2 自定义路径**…...
manim(manimgl)安装教学-win11(2024-08)
manim 目前的两种版本:★★ 稍微捋一捋【项目中的 readme.md 十分重要】 manimgl 是 Grant Sanderson(YouTube频道 3Blue1Brown的作者)等人开发。 现在为 manimgl,在维护中。 manimCE 是2020年后的 manim 分支 manim community e…...
【语言处理和机器学习】概述篇(基础小白入门篇)
前言 自学笔记,分享给语言学/语言教育学方向的,但对语言数据处理感兴趣但是尚未入门,却需要在论文中用到的小伙伴,欢迎大佬们补充或绕道。ps:本文不涉及公式讲解(文科生小白友好体质)ÿ…...
脚本工具:PYTHON
Python 是一种高级编程语言,以其简洁清晰的语法和强大的功能被广泛应用于各种领域,包括自动化脚本编写、数据分析、机器学习、Web开发等。以下是一些关于使用 Python 编写脚本工具的基本介绍、常用库以及一些实用技巧总结。 这里写目录标题 基础知识安装…...
一文讲解Redis常见使用方式
1. 单机模式部署 适用场景: • 开发和测试环境,或者对高可用性要求不高的小型项目。 部署步骤: 1. 拉取 Redis 镜像: docker pull redis:latest 2. 运行 Redis 容器: docker run -d --name redis-single -p 637…...
Gin 源码概览 - 路由
本文基于gin 1.1 源码解读 https://github.com/gin-gonic/gin/archive/refs/tags/v1.1.zip 1. 注册路由 我们先来看一段gin代码,来看看最终得到的一颗路由树长啥样 func TestGinDocExp(t *testing.T) {engine : gin.Default()engine.GET("/api/user", f…...
【计算机网络】传输层协议TCP与UDP
传输层 传输层位于OSI七层网络模型的第四层,主要负责端到端通信,可靠性保障(TCP),流量控制(TCP),拥塞控制(TCP),数据分段与分组,多路复用与解复用等,通过TCP与UDP协议实现…...
iOS UIScrollView的一个特性
1如果UIScrollView 的contentSize.height > scrollView.bounds.size.height - scrollView.contentInset.top - scrollView.contentInset.bottom , 则scrollView就可以滚动,否则无法滚动 并且最大的滚动范围就是 contentSize.height - ( s…...
Docker 实现MySQL 主从复制
一、拉取镜像 docker pull mysql:5.7相关命令: 查看镜像:docker images 二、启动镜像 启动mysql01、02容器: docker run -d -p 3310:3306 -v /root/mysql/node-1/config:/etc/mysql/ -v /root/mysql/node-1/data:/var/lib/mysql -e MYS…...
python爬虫入门(实践)
python爬虫入门(实践) 一、对目标网站进行分析 二、博客爬取 获取博客所有h2标题的路由 确定目标,查看源码 代码实现 """ 获取博客所有h2标题的路由 """url "http://www.crazyant.net"import re…...
通过Ukey或者OTP动态口令实现windows安全登录
通过 安当SLA(System Login Agent)实现Windows安全登录认证,是一种基于双因素认证(2FA)的解决方案,旨在提升 Windows 系统的登录安全性。以下是详细的实现方法和步骤: 1. 安当SLA的核心功能 安…...
C 语言雏启:擘画代码乾坤,谛观编程奥宇之初瞰
大家好啊,我是小象٩(๑ω๑)۶ 我的博客:Xiao Xiangζั͡ޓއއ 很高兴见到大家,希望能够和大家一起交流学习,共同进步。* 这一课主要是让大家初步了解C语言,了解我们的开发环境,main函数,库…...
【Linux系统编程】—— 进程替换及其在操作系统中的应用与实现
文章目录 什么是进程替换?进程替换当中的接口单进程替换多进程的替换详解exec接口execlexeclpexecv 前言: 本篇博客将深入探讨进程替换的概念及其在操作系统中的作用。我们将介绍进程替换的基本原理,探讨操作系统如何通过进程的切换来实现任务…...
“裸奔”时代下该如何保护网络隐私
网络隐私的保护之道 引言 在这个信息爆炸的时代,网络已经深入到我们生活的每一个角落。你是否曾想过,在享受这些便利时,你的个人隐私正面临着严峻的挑战?网络隐私的现状警示着我们,信息泄露的事件屡见不鲜࿰…...
分类问题(二元,多元逻辑回归,费歇尔判别分析)spss实操
分类模型: 二分类和多分类: 对于二分类模型 ,我们将介绍逻辑回归和Fisher线性判别分析两种分类算法; 对于多分类模型,我们将简单介绍Spss中的多分类线性判别分析和多分类逻辑回归的操作步骤 二分类: 基于广义线性模型&#x…...
推荐一个开源的轻量级任务调度器!TaskScheduler!
大家好,我是麦鸽。 这次推荐一款轻量级的嵌入式任务调度器,目前已经有1.4K的star,这个项目比较轻量化,只有5个源文件,可以作为学习的一个开源项目。 核心文件 项目概述: 这是一个轻量级的协作式多任务处理&…...
Spring 核心技术解析【纯干货版】- IV:Spring 切面编程模块 Spring-Aop 模块精讲
随着软件开发技术的不断进步,面向切面编程(AOP)作为一种重要的编程思想,已经在现代开发中占据了重要地位。它通过将横切逻辑从业务逻辑中分离出来,使得代码更加清晰、易于维护。Spring AOP 作为 Spring 框架的核心模块…...
STM32之FreeRTOS开发介绍(十九)
STM32F407 系列文章 - freertos(十九) 目录 前言 一、简述 二、开源网址 三、原理及功能特性 1.原理简介 2.功能介绍 1.任务调度 2.任务管理 3.中断管理 4.消息队列 3.特点说明 4.优缺点 四、参考书籍 五、实现方式 总结 前言 FreeRTOS是…...
2024年美赛C题评委文章及O奖论文解读 | AI工具如何影响数学建模?从评委和O奖论文出发-O奖论文做对了什么?
模型假设仅仅是简单陈述吗?允许AI的使用是否降低了比赛难度?还在依赖机器学习的模型吗?处理题目的方法有哪些?O奖论文的优点在哪里? 本文调研了当年赛题的评委文章和O奖论文,这些问题都会在文章中一一解答…...
第14篇:从入门到精通:掌握python上下文管理器
第14篇:上下文管理器 内容简介 本篇文章将深入探讨Python中的上下文管理器(Context Manager)。您将了解上下文管理器的概念与用途,学习如何实现自定义的上下文管理器,以及如何使用contextlib模块来简化上下文管理器的…...
cuda从零开始手搓PB神经网络
cuda实现PB神经网络 基于上一篇的矩阵点乘,实现了矩阵的加减乘除、函数调用等。并且复用之前元编程里面写的梯度下降、Adam、NAdam优化方法。实现PB神经网络如下: #ifndef __BP_NETWORK_HPP__ #define __BP_NETWORK_HPP__ #include "matrix.hpp&quo…...
Java 大视界 -- Java 大数据物联网应用:数据处理与设备管理(八)
💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...
大模型之三十三- 开源Melo 语音合成
大模型之三十三- 开源Melo 语音合成 文本到语音(TTS)系统从基于基础音素的模型演变成复杂的端到端神经方法,这种方法可以直接将文本转换为语音。这一变革得益于深度学习的进步和计算能力的提升,已经在语音的自然度、韵律控制和跨语言能力方面取得了重大进展 。现代TTS系统…...
全同态加密理论、生态现状与未来展望(上)
《全同态加密理论、生态现状与未来展望》系列由lynndell2010gmail.com和mutourend2010gmail.com整理原创发布,分为上中下三个系列: 全同态加密理论、生态现状与未来展望(上):专注于介绍全同态加密理论知识。全同态加密…...
cursor重构谷粒商城02——30分钟构建图书管理系统【cursor使用教程番外篇】
前言:这个系列将使用最前沿的cursor作为辅助编程工具,来快速开发一些基础的编程项目。目的是为了在真实项目中,帮助初级程序员快速进阶,以最快的速度,效率,快速进阶到中高阶程序员。 本项目将基于谷粒商城…...
提升大语言模型的三大策略
1.概述 随着大语言模型(LLMs)在技术和应用上的不断发展,它们已经深刻地改变了我们与计算机的互动方式。从文本生成到语言理解,LLMs的应用几乎涵盖了各个行业。然而,尽管这些模型已展现出令人印象深刻的能力,…...
Ubuntu 24.04 LTS 安装 Docker Desktop
Docker 简介 Docker 简介和安装Ubuntu上学习使用Docker的详细入门教程Docker 快速入门Ubuntu版(1h速通) Docker 安装 参考 How to Install Docker on Ubuntu 24.04: Step-by-Step Guide。 更新系统和安装依赖 在终端中运行以下命令以确保系统更新并…...
mysql查看binlog日志
mysql 配置、查看binlog日志: 示例为MySQL8.0 1、 检查binlog开启状态 SHOW VARIABLES LIKE ‘log_bin’; 如果未开启,修改配置my.ini 开启日志 安装目录配置my.ini(mysql8在data目录) log-binmysql-bin(开启日志并指定日志前缀ÿ…...
2. Flink分区策略
一. Flink分区策略概述 Flink任务在执行过程中,一个流(stream)包含一个或多个分区(Stream partition),TaskManager中的一个slot的SubTask就是一个stream partition(流分区)。 Flink分区之间进行数据传递模式有两种。 1. one-to-one模式 数据不需要重新…...
Qt 5.14.2 学习记录 —— 십칠 窗口和菜单
文章目录 1、Qt窗口2、菜单栏设置快捷键添加子菜单添加分割线和菜单图标 3、工具栏 QToolBar4、状态栏 QStatusBar5、浮动窗口 QDockWidget 1、Qt窗口 QWidget,即控件,是窗口的一部分。在界面中创建控件组成界面时,Qt自动生成了窗口…...
微信小程序中实现背景图片完全覆盖显示,可以通过设置CSS样式来实现
wxml页面代码 <view class"beijing"></view>wxss样式代码 /* pages/beiJing/beiJing.wxss */ .beijing {background-image: url("https://www.qipa250.com/qipa.jpg");/* 定位:绝对定位 */position: absolute;/* 上下左右都定位到…...