当前位置: 首页 > news >正文

Spring Web MVC

前言

今天来复习 Spring Web MVC 框架。它提供了一套高效、便捷的方式来构建 Web 应用程序。今天,就让我们一同深入 Spring Web MVC,从基础概念到实际应用,好好补补.


一、Spring Web MVC 是什么?

官方定义解读

根据官方描述,Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从一开始就被纳入了 Spring 框架之中。其正式名称 “Spring Web MVC” 源于它的源模块名称(spring-webmvc),不过在日常开发中,我们通常简称它为 “Spring MVC”。那么,这里提到的 Servlet 又是什么呢?简单来说,Servlet 是一种实现动态页面的技术,更准确地讲,它是一套 Java Web 开发的规范,或者说是技术标准。

打个比方,Servlet 规范就像是一份建筑蓝图,它规定了各种功能的实现方式,但要真正建成一座 “建筑”,还需要有人按照这份蓝图去编写代码。目前,常见的实现了 Servlet 规范的产品有 Tomcat、Weblogic、Jetty、Jboss、WebSphere 等,这些产品都被称为 “Servlet 容器”,它们的主要作用是管理程序员编写的 Servlet 类。从这里我们可以看出,Spring Web MVC 本质上是一个 Web 框架。

MVC 定义详解

要深入理解 Spring MVC,首先得搞清楚 MVC 的概念。MVC 是 Model - View - Controller 的缩写,它是软件工程中的一种软件架构设计模式,将软件系统分为模型、视图和控制器三个基本部分。

  • View(视图):这部分主要负责在应用程序中与浏览器进行交互,展示数据的资源。比如说,我们日常浏览的网页页面,那些展示商品信息、新闻内容的部分,都属于视图层。它就像是一家餐厅的服务员,负责接待顾客,将顾客需要的信息展示给他们。
  • Model(模型):作为应用程序的主体部分,模型主要用于处理程序中的数据逻辑。以餐厅为例,后厨的厨师们根据顾客的订单准备食物,这个准备食物的过程就类似于模型层处理数据逻辑。它根据前端传来的请求,对数据进行处理和运算。
  • Controller(控制器):可以把它理解为一个分发器,其作用是决定对于视图发来的请求,应该使用哪一个模型来处理,以及处理完成后跳回到哪一个视图。还拿餐厅来说,前厅的工作人员根据顾客的点餐情况,将订单传递给相应的后厨,这就是控制器的作用。它连接着视图和模型,起到了桥梁的作用。

为了更好地理解,我们再举个例子。比如去公司面试,我们到了公司之后,HR 会给我们安排会议室,并根据候选人的情况通知不同的部门来安排面试,面试结束后,由 HR 来告诉面试结果。在这个过程中,HR 就相当于 View(视图),负责接待候选人并告知结果;不同的部门就像是Controller(控制器),HR 根据候选人来选择对应的部门进行面试;而面试官则是 Model 层,负责处理面试这个事情。

Spring MVC 的本质

MVC 是一种架构设计模式,也是一种思想,而 Spring MVC 则是对 MVC 思想的具体实现,同时它还是一个 Web 框架。总结来说,Spring MVC 就是一个实现了 MVC 模式的 Web 框架。所以,我们在学习 Spring MVC 时,主要关注两个关键要点:

一是 MVC 架构模式,

二是它作为 Web 框架的特性。

实际上,我们在之前创建 Spring Boot 项目时,勾选的 Spring Web 框架,其实就是 Spring MVC 框架。可能有些同学会疑惑,之前创建的不是 Spring Boot 项目吗?怎么又和 Spring MVC 扯上关系了呢?Spring Boot 是在 2014 年发布的,而 Spring 早在 2004 年就发布了。在 Spring Boot 发布之前,当然也可以用 Spring 来实现 MVC 架构。Spring Boot 只是实现 Spring MVC 的其中一种方式。Spring Boot 可以添加很多依赖,借助这些依赖实现不同的功能,其中通过添加 Spring Web MVC 框架,就可以实现 web 功能。

打个比方,Spring Boot 就像是一个厨房,它可以添加各种 “设备”(依赖)来实现不同的功能,而做饭(实现 MVC)就是其中之一。在很久以前,没有现代意义上的厨房,人们也可以利用火和食材做饭,这就如同在 Spring Boot 出现之前,Spring 也能实现 MVC。只不过 Spring 在实现 MVC 时,结合了自身项目的特点,做了一些优化和改变。


二、学习 Spring MVC

项目准备

既然 Spring MVC 是一个 Web 框架,那么当用户在浏览器中输入 url 之后,我们的 Spring MVC 项目就需要能够感知到用户的请求,并给予响应。我们学习 Spring MVC,重点就是学习如何通过浏览器与用户程序进行交互,这主要分为以下三个方面:

  1. 建立连接:将用户(浏览器)和 Java 程序连接起来,即访问一个地址能够调用到我们的 Spring 程序。
  2. 请求:用户请求时会携带一些参数,我们需要在程序中获取这些参数,所以请求部分主要是实现获取参数的功能。
  3. 响应:执行完业务逻辑之后,要把程序执
    import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;@RestControllerpublic class UserController {// 路由器规则注册@RequestMapping("/sayHi")public String sayHi() {return "hello,Spring MVC";}}
    行的结果返回给用户,这就是响应。

比如用户去银行存款,去柜台就是建立连接;带着银行卡、身份证去存款,这就是请求;银行返回一张存折,这就是响应。对于 Spring MVC 来说,掌握了以上这三个功能,就相当于掌握了 Spring MVC 的核心。

在创建 Spring MVC 项目时,和创建 Spring Boot 项目的方式类似。我们在创建项目时,勾选 Spring Web 模块,就相当于创建了一个 Spring MVC 项目。这里需要注意的是,Spring MVC 早期还有其他的实现方式,但在本课程中我们不再进行讲解。


建立连接

在 Spring MVC 中,我们使用@RequestMapping来实现 URL 路由映射,也就是实现浏览器与程序的连接。下面我们通过一段代码来看看具体的实现方式:

在这段代码中,我们创建了一个UserController类,并在其中定义了一个sayHi方法。通过@RequestMapping("/sayHi")注解,我们将/sayHi这个 URL 路径映射到了sayHi方法上。当我们访问http://127.0.0.1:8080/sayHi时,就可以看到程序返回的数据 “hello,Spring MVC”。

@RequestMapping 注解介绍

@RequestMapping是 Spring Web MVC 应用程序中最常用的注解之一,它主要用于注册接口的路由映射。也就是说,当服务收到请求时,路径为/sayHi的请求就会调用sayHi这个方法的代码。这里涉及到一个概念叫路由映射,简单来说,就是当用户访问一个 URL 时,将用户的请求对应到程序中某个类的某个方法的过程。那么,我们为什么要在类上添加@RestController注解呢?

如果我们把@RestController去掉,再访问http://127.0.0.1:8080/sayHi,就会发现程序报了 404 错误,找不到该页面。这是因为在一个项目中,会有很多类,每个类可能又有很多方法,Spring 程序需要知道要执行哪个方法。当类加上@RestController注解后,Spring 才会去扫描这个类里面的方法是否加了@RequestMapping注解。当然,@RestController的作用不止这一点,后面会详细讲解。

@RequestMapping 使用

@RequestMapping既可以修饰类,也可以修饰方法。当它修饰类和方法时,访问的地址是类路径 + 方法路径。例如:

@RequestMapping("/user")@RestControllerpublic class UserController {@RequestMapping("/sayHi")public String sayHi() {return "hello,Spring MVC";}}

在这个例子中,类上的@RequestMapping("/user")设置了映射请求的请求路径的初始信息,方法上的@RequestMapping("/sayHi")设置了映射请求请求路径的具体信息。此时,我们访问的地址就是http://127.0.0.1:8080/user/sayHi。需要注意的是,@RequestMapping的 URL 路径最前面加不加/(斜杠)都可以,Spring 程序启动时会进行判断,如果前面没有加/,Spring 会自动拼接上一个/。另外,@RequestMapping的 URL 路径也可以是多层路径,最终访问时,依然是类路径 + 方法路径。比如:

@RequestMapping("/user/m1")@RestControllerpublic class UserController {@RequestMapping("/say/hi")public String sayHi() {return "hello,Spring MVC";}}

此时,访问路径就是http://127.0.0.1:8080/user/m1/say/hi。

@RequestMapping 是 GET 还是 POST 请求?

我们来测试一下就知道答案了。首先,浏览器发送的请求类型默认都是 GET,通过前面的案例,我们可以看出@RequestMapping支持 GET 请求。那么对于 POST 请求呢?我们可以通过 form 表单来构造请求进行测试。创建一个test.html文件,代码如下:

<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Title</title></head><body><form action="/user/sayHi" method="post"><input type="submit" value="提交"></form></body></html>

将这个前端代码放在static目录下,访问方式为http://127.0.0.1:8080/test.html。从运行结果可以看出,@RequestMapping既支持 Get 请求,又支持 Post 请求。同理,它也支持其他的请求方式。那么如何指定 GET 或者 POST 类型呢?我们可以通过显式地指定@RequestMapping来接收特定类型的请求,例如:

import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.ResponseBody;@RestControllerpublic class UserController {@RequestMapping(value = "/getRequest", method = RequestMethod.POST)public String sayHi() {return "get request...";}}

在这段代码中,我们通过method = RequestMethod.POST指定了该请求只接收 POST 类型的请求。


Postman 介绍

在前面的案例中,我们发现测试后端方法时,还需要编写前端代码,这对于后端开发人员来说是一件比较麻烦的事情。随着互联网的发展,项目难度不断增加,企业也将开发人员按照功能拆分成了不同的团队,界面显示由 “前端开发工程师” 负责,业务逻辑的实现则交给 “后端开发工程师”。后端开发工程师不需要掌握前端技能,那么他们如何测试自己的程序呢?这就需要使用专业的接口测试工具,在我们的课堂中,使用的是 Postman。

下载安装 postman

我们可以通过Postman 官方下载链接进行下载,也可以使用课件中提供的Postman-win64-Setup.exe进行安装。安装后可能会提示有版本升级,点击 “Dismiss” 即可(无需升级)。

创建请求

安装完成后,打开 Postman,我们可以看到它的界面。在界面中,我们可以创建各种类型的请求,包括 GET、POST 等。例如,我们要测试前面编写的/sayHi接口,我们可以在 Postman 中创建一个 GET 请求,输入http://127.0.0.1:8080/sayHi,然后点击发送按钮,就可以看到返回的结果。

传参介绍
  • 在使用 Postman 进行测试时,我们经常需要传递参数。常见的传参方式有以下几种:
  • 普通传参:也就是通过查询字符串来传参。在学习 HTTP 时,我们知道 URL 的格式为协议://主机:端口/路径?查询字符串,其中查询字符串就是请求的参数。例如,http://127.0.0.1:8080/param/m1?name=spring,这里的name=spring就是普通传参。
  • form - data(完整表示为:multipart/form - data):表单提交的数据,在 form 标签中加上enctyped="multipart/form - data",通常用于提交图片 / 文件。对应Content - Type: multipart/form - data。
  • x - www - form - urlencoded:form 表单,对应Content - Type: application/x - www - from - urlencoded。
  • raw:可以上传任意格式的文本,可以上传 text、json、xml、html 等。

请求

在 Spring MVC 中,学习请求部分主要是学习如何传递参数到后端以及后端如何接收参数。传递参数我们主要使用浏览器和 Postman 来模拟,后端开发人员无需过度关注如何传递参数,了解即可,实际开发中以 Postman 测试为主。

传递单个参数

在 Spring MVC 中,接收单个参数非常简单,直接在方法中使用参数即可。例如:

import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestController@RequestMapping("/param")public class ParamController {@RequestMapping("/m1")public String method1(String name) {return "接收到参数name:" + name;}}

我们使用浏览器发送请求http://127.0.0.1:8080/param/m1?name=spring,可以看到后端程序正确拿到了name参数的值。Spring MVC 会根据方法的参数名,找到对应的参数并赋值给方法。需要注意的是,如果参数不一致,是获取不到参数的。另外,使用基本类型来接收参数时,参数必须传(除 boolean 类型),否则会报 500 错误;类型不匹配时,会报 400 错误。例如:

@RequestMapping("/m1/int")public Object method1GetInt(int age) {return "接收到参数age:" + age;}

当我们正常传递参数http://127.0.0.1:8080/param/m1/int?age=1时,浏览器响应正常;但当我们不传递age参数http://127.0.0.1:8080/param/m1/int时,浏览器会报 500 错误;当我们传递参数类型不匹配http://127.0.0.1:8080/param/m1/int?age=abc时,浏览器会报 400 错误。对于包装类型,如果不传对应参数,Spring 接收到的数据则为 null。所以在企业开发中,对于参数可能为空的数据,建议使用包装类型。

传递多个参数

接收多个参数和接收单个参数类似,直接在方法中使用多个形参即可。例如:

@RequestMapping("/m2")public Object method2(String name, String password) {return "接收到参数name:" + name + ", password:" + password;}

我们使用浏览器发送请求http://127.0.0.1:8080/param/m2?name=zhangsan&password=123456,可以看到后端程序正确拿到了name和password参数的值。当有多个参数时,前后端进行参数匹配时,是以参数的名称进行匹配的,因此参数的位置不影响后端获取参数的结果。比如访问http://127.0.0.1:8080/param/m2?password=123456&name=zhangsan同样可以拿到正确的结果。

传递对象

当参数较多时,方法声明需要很多形参,并且每次新增参数都需要修改方法声明。这时,我们可以把这些参数封装为一个对象。Spring MVC 可以自动实现对象参数的赋值。例如,我们定义一个Person对象:

public class Person {private int id;private String name;private String password;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "Person{" +"id=" + id +", name='" + name + '\'' +", password='" + password + '\'' +'}';}}

然后在控制器中接收对象:

@RequestMapping("/m3")public Object method3(Person p) {return p.toString();}

我们使用浏览器发送请求http://127.0.0.1:8080/param/m3?id=5&name=zhangsan&password=123456,可以看到后端程序正确拿到了Person对象里各个属性的值。

传递数组参数

在实际开发中,有时需要传递数组参数,比如批量删除操作。在 Spring MVC 中接收数组参数也较为简单。例如,要接收一个包含多个用户 ID 的数组:

@RequestMapping("/m4")public Object method4(int[] userIds) {StringBuilder result = new StringBuilder("接收到的用户ID数组: ");for (int id : userIds) {result.append(id).append(" ");}return result.toString();}

使用浏览器发送请求http://127.0.0.1:8080/param/m4?userIds=1&userIds=2&userIds=3,后端程序就能正确获取并处理这个数组参数。


响应

在 Spring MVC 中,响应部分涉及如何将处理结果返回给前端。响应的方式多种多样,主要取决于业务需求和前端期望接收的数据格式。

返回字符串

前面的示例中,我们已经多次使用方法直接返回字符串作为响应。例如:

@RequestMapping("/response/string")public String responseString() {return "这是一个字符串响应";}

当访问http://127.0.0.1:8080/response/string时,浏览器会直接显示 “这是一个字符串响应”。这种方式简单直接,适用于返回简单文本信息的场景。

返回 JSON 数据

在前后端分离的项目中,JSON 是一种非常常用的数据格式。Spring MVC 默认支持将对象转换为 JSON 格式返回。要返回 JSON 数据,需要确保项目中引入了 Jackson 相关依赖(在 Spring Boot 项目中,Spring Web Starter 通常已经包含了 Jackson 依赖)。假设我们有一个User类:

public class User {private String name;private int age;// 省略getter和setter方法}

在控制器中返回User对象:

@RequestMapping("/response/json")public User responseJson() {User user = new User();user.setName("张三");user.setAge(25);return user;}

当访问http://127.0.0.1:8080/response/json时,浏览器会接收到类似{"name":"张三","age":25}的 JSON 数据。这里 Spring MVC 会自动使用 Jackson 库将User对象转换为 JSON 格式。


总结

  • 学习Spring MVC, 其实就是学习各种Web开发需要⽤的到注解
  • @RequestMapping: 路由映射
  • @RequestParam: 后端参数重命名
  • @RequestBody: 接收JSON类型的参数
  • @PathVariable: 接收路径参数
  • @RequestPart: 上传⽂件
  • @ResponseBody: 返回数据
  • @CookieValue: 从Cookie中获取值
  • @Controller: 定义⼀个控制器, Spring 框架启动时加载, 把这个对象交给Spring管理. 默认返回视图.
  • @RestController: @ResponseBody + @Controller 返回数据

以上描述了 MVC 学习要点为建立连接(用@RequestMapping)、请求(接收多种参数)、响应。还讲解了相关注解、Postman 工具等等,但其实 MVC 的知识内容远远不止这些,还有很多知识等着我们去深究,这里只是简单入门咯,感谢阅览!!

相关文章:

Spring Web MVC

前言 今天来复习 Spring Web MVC 框架。它提供了一套高效、便捷的方式来构建 Web 应用程序。今天&#xff0c;就让我们一同深入 Spring Web MVC&#xff0c;从基础概念到实际应用&#xff0c;好好补补. 一、Spring Web MVC 是什么&#xff1f; 官方定义解读 根据官方描述&…...

蓝桥杯备考:动态规划线性dp之下楼梯问题进阶版

老规矩&#xff0c;按照dp题的顺序 step1 定义状态表达 f[i]表示到第i个台阶的方案数 step2:推导状态方程 step3:初始化 初始化要保证 1.数组不越界 2.推导结果正确 如图这种情况就越界了&#xff0c;我们如果把1到k的值全初始化也不现实&#xff0c;会增加程序的时间复杂度…...

机器视觉开发教程——封装Halcon通用模板匹配工具【含免费教程源码】

目录 引言前期准备Step1 设计可序列化的输入输出集合【不支持多线程】Step2 设计程序框架1、抽象层【IProcess】2、父类【HAlgorithm】3、子类【HFindModelTool】 Step3 设计UI结果展示 引言 通过仿照VisionPro软件二次开发Halcon的模板匹配工具&#xff0c;便于在客户端软件中…...

UDP透传程序

UDP透传程序 本脚本用于在 设备 A 和 设备 B 之间建立 UDP 数据转发桥梁&#xff0c;适用于 A 和 B 设备无法直接通信的情况。 流程&#xff1a; A --> 电脑 (中继) --> B B --> 电脑 (中继) --> A 需要修改参数&#xff1a; B_IP “192.168.1.123” # 设备 B 的…...

【USRP】NVIDIA Sionna:用于 6G 物理层研究的开源库

目录 Sionna&#xff1a;用于 6G 物理层研究的开源库主要特点实现6G研究的民主化支持 5G、6G 等模块化、可扩展、可伸缩快速启动您的研究 好处原生人工智能支持综合研究平台开放生态系统 安装笔记使用 pip 安装基于Docker的安装从源代码安装“你好世界&#xff01;”探索锡奥纳…...

Spring WebFlux 中 WebSocket 使用 DataBuffer 的注意事项

以下是修改后的完整文档&#xff0c;包含在多个多线程环境中使用 retain() 和 release() 方法的示例&#xff0c;且确保在 finally 块中调用 release()&#xff1a; 在 Spring WebFlux 中&#xff0c;WebSocketMessage 主要用于表示 WebSocket 的消息载体&#xff0c;其中 getP…...

SQL经典常用查询语句

1. 基础查询语句 1.1 查询表中所有数据 在SQL中&#xff0c;查询表中所有数据是最基本的操作之一。通过使用SELECT * FROM table_name;语句&#xff0c;可以获取指定表中的所有记录和列。例如&#xff0c;假设有一个名为employees的表&#xff0c;包含员工的基本信息&#xf…...

0005__PyTorch 教程

PyTorch 教程 | 菜鸟教程 离线包&#xff1a;torch-1.13.1cpu-cp39-cp39-win_amd64.whl https://download.pytorch.org/whl/torch_stable.html...

高并发场景下的数据库优化

在高并发系统中&#xff0c;数据库通常是性能瓶颈。面对高并发请求&#xff0c;我们需要采用合适的优化策略&#xff0c;以保证数据库的稳定性和高效性。本文将介绍数据库高并发问题的成因&#xff0c;并结合 Mybatis-Plus&#xff0c;探讨 乐观锁、悲观锁、高并发优化及数据库…...

Linux:同步

目录 一、同步概念 条件变量 二、生产者消费者模型 三、环形队列 一、同步概念 互斥用来解决 访问临界资源 的非原子性&#xff0c;通俗来说&#xff0c;由于互斥锁的实现&#xff0c;保证了在用户角度看&#xff0c;同一个时间内访问临界资源的代码只有一个线程在执行。 而…...

GB28181开发--ZLMediaKit‌+WVP+Jessibuca‌

一、核心组件功能 1‌、ZLMediaKit‌ 定位‌:基于 C++11 的高性能流媒体服务框架,支持 RTSP/RTMP/HLS/HTTP-FLV 等协议互转,具备低延迟(最低 100ms)、高并发(单机 10W 级连接)特性,适用于商用级流媒体服务器部署‌。 ‌特性‌:跨平台(Linux/Windows/ARM 等)、支持 …...

23种设计模式之《备忘录模式(Memento)》在c#中的应用及理解

程序设计中的主要设计模式通常分为三大类&#xff0c;共23种&#xff1a; 1. 创建型模式&#xff08;Creational Patterns&#xff09; 单例模式&#xff08;Singleton&#xff09;&#xff1a;确保一个类只有一个实例&#xff0c;并提供全局访问点。 工厂方法模式&#xff0…...

Oracle删除重复数据保留其中一条

Oracle删除重复数据保留其中一条 在Oracle数据库中&#xff0c;要删除重复数据并保留其中一条记录&#xff0c;可以使用多种方法。这里介绍两种常见的方法&#xff1a;使用ROWID或使用ROW_NUMBER()窗口函数。 方法1&#xff1a;使用ROWID ROWID是Oracle中用来唯一标识表中每…...

deepseek助力运维和监控自动化

将DeepSeek与Agent、工作流及Agent编排技术结合&#xff0c;可实现IT运维与监控的智能化闭环管理。以下是具体应用框架和场景示例&#xff1a; 一、智能Agent体系设计 多模态感知Agent 日志解析Agent&#xff1a;基于DeepSeek的NLP能力&#xff0c;实时解析系统日志中的语义&a…...

16.1STM32_ADC

STM32_ADC 数字信号分为高/低电平两种状态 模拟信号就是任意的电压值 STM32芯片内就是一整套的数字逻辑电路&#xff0c;来实现我们的程序执行&#xff0c;以及各种各样的外设功能&#xff0c; ADC&#xff08;模拟-数字转换技术&#xff09;的功能就是将模拟信号转化为数字…...

神经网络 - 激活函数(Swish函数、GELU函数)

一、Swish 函数 Swish 函数是一种较新的激活函数&#xff0c;由 Ramachandran 等人在 2017 年提出&#xff0c;其数学表达式通常为 其中 σ(x) 是 Sigmoid 函数&#xff08;Logistic 函数&#xff09;。 如何理解 Swish 函数 自门控特性 Swish 函数可以看作是对输入 x 进行“…...

VS2015 c++和cmake配置编程

Visual Studio 2015&#xff1a;确保安装了C开发工具&#xff0c;并安装“使用C的桌面开发”工作负载。CMake&#xff1a;可以从 CMake官网 下载并安装&#xff0c;并将其添加到系统环境变量中。vs加载项目启动Visual Studio。选择“继续但无代码”。点击“文件”。选择 “打开…...

如何为 Web 前端开发面试做好准备

大家好&#xff01;我是 [数擎AI]&#xff0c;一位热爱探索新技术的前端开发者&#xff0c;在这里分享前端和Web3D、AI技术的干货与实战经验。如果你对技术有热情&#xff0c;欢迎关注我的文章&#xff0c;我们一起成长、进步&#xff01; 开发领域&#xff1a;前端开发 | AI 应…...

深入探索像ChatGPT这样的大语言模型

参考 【必看珍藏】2月6日&#xff0c;安德烈卡帕西最新AI普及课&#xff1a;深入探索像ChatGPT这样的大语言模型&#xff5c;Andrej Karpathy fineweb知乎翻译介绍 fineweb-v1原始连接 fineweb中文翻译版本 Chinese Fineweb Edu数据集 查看网络的内部结果&#xff0c;可以参…...

代码贴——堆(二叉树)数据结构

头文件Heap.h #pragma once #include<bits/stdc.h> typedef int HPDataType;typedef struct Heap {HPDataType* a;int size;int capacity; }HP;void HPInit(HP* php); void HPDestory(HP* php); //出入后保持数据是堆 void HPPush(HP* php,HPDataType x); HPDataType HP…...

office或者word排版中,复制/黏贴进来文字不会自动换行,如何处理?

李升伟 整理 一、思考与分析 在Office或Word中复制粘贴文字时&#xff0c;文字不会自动换行&#xff0c;需要处理这个问题。首先&#xff0c;我得回想一下常见的原因和解决方法。可能的情况有很多&#xff0c;比如文本带有硬回车、段落格式设置问题&#xff0c;或者文本框的自…...

最新!!!DeepSeek开源周发布内容汇总

本周&#xff0c;人工智能领域的新锐力量DeepSeek宣布将于本周举办“开源周”&#xff08;Open Source Week&#xff09;&#xff0c;连续五天每日开源一个核心代码库&#xff0c;以透明的方式与全球开发者分享其在通用人工智能&#xff08;AGI&#xff09;探索中的最新成果。以…...

【MySQL】(2) 库的操作

SQL 关键字&#xff0c;大小写不敏感。 一、查询数据库 show databases; 注意加分号&#xff0c;才算一句结束。 二、创建数据库 {} 表示必选项&#xff0c;[] 表示可选项&#xff0c;| 表示任选其一。 示例&#xff1a;建议加上 if not exists 选项。 三、字符集编码和排序…...

记一次渗透测试实战:SQL注入漏洞的挖掘与利用

0x01 漏洞发现 在对某网站进行安全测试时&#xff0c;发现以下URL存在异常&#xff1a; https://******.com/search.php?keyword1&zt1954&dw1885&zz& 当参数keyword和zt被赋值为-1时页面返回特殊内容&#xff0c;初步判断存在SQL注入漏洞。 0x02 注入验证…...

Gin框架从入门到实战:核心用法与最佳实践

为什么选择Gin框架&#xff1f; Gin 是一个基于 Go 语言的高性能 Web 框架&#xff0c;具备以下优势&#xff1a; 轻量高效&#xff1a;底层依赖 net/http&#xff0c;性能接近原生。简洁优雅&#xff1a;API 设计友好&#xff0c;支持路由分组、中间件链、参数绑定等特性。生…...

PyTorch 的 nn.NLLLoss:负对数似然损失全解析

PyTorch 的 nn.NLLLoss&#xff1a;负对数似然损失全解析 在 PyTorch 的损失函数家族中&#xff0c;nn.NLLLoss&#xff08;Negative Log Likelihood Loss&#xff0c;负对数似然损失&#xff09;是一个不太起眼但非常重要的成员。它经常跟 LogSoftmax 搭配出现&#xff0c;尤…...

ROS2软件调用架构和机制解析:Publisher创建

术语 DDS (Data Distribution Service): 用于实时系统的数据分发服务标准&#xff0c;是ROS 2底层通信的基础RMW (ROS Middleware): ROS中间件接口&#xff0c;提供与具体DDS实现无关的抽象APIQoS (Quality of Service): 服务质量策略&#xff0c;控制通信的可靠性、历史记录、…...

vue2 以及vue3中 v-if和v-for是否可以同时使用

vue2以及vue3官方文档中都明确的指出 避免 v-if 和 v-for 用在一起 vue2 官方文档 解释 在 Vue 2 中&#xff0c;v-for 的优先级高于 v-if&#xff0c;也就是说&#xff0c;Vue 2 在渲染时&#xff0c;会先处理 v-for 生成列表项&#xff0c;再对子项判断 v-if 是否渲染。 …...

Hbase伪分布安装教程,详细版

注意Hbase版本与Hadoop版本的兼容&#xff0c;还有与JDK版本的兼容 本次用到的Hbase为2.4.6版本&#xff0c;Hadoop为3.1.3版本&#xff0c;JDK为JDK8 打开下面的网址查看兼容问题 Apache HBase Reference Guidehttps://hbase.apache.org/book.html#configuration 点击基础先…...

SSL: CERTIFICATE_VERIFY_FAILED Error in Python 是什么问题?

在最新版本的Stable Diffusion webui 版本上使用最新下载的模型时&#xff0c;出现了类似的错误。 SSL: CERTIFICATE_VERIFY_FAILED 错误在Python中通常表示你的程序试图通过HTTPS连接到某个服务器&#xff0c;但Python无法验证该服务器提供的SSL证书。这可能是因为以下几种原…...

15Metasploit框架介绍

metasploit目录结构 MSF ——the metasploit framework 的简称。MSF高度模块化&#xff0c;即框架结构由多个module组成&#xff0c;是全球最受欢迎的工具 是一筐开源安全漏洞利用和测试工具&#xff0c;集成了各种平台上常见的溢出漏洞和流行sheellcode&#xff0c;并且保持…...

【Qt】ffmpeg解码—照片提取、视频播放▲

目录 一、图像的成像原理&#xff1a; RGB成像原理&#xff1a; YUV成像原理&#xff1a; 二、多线程 三、ffmpeg解码&#xff08;照片提取&#xff09; 1.准备工作 &#xff08;1&#xff09;在工程文件夹里面新建三个文件夹 &#xff08;2&#xff09;在main函数中加…...

Springboot整合WebSocket+Redis以及微信小程序如何调用

一、 Springboot整合WebSocket 1. 引入socket依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dependency>引入依赖后需要刷新maven,Websocket的版本默认跟随S…...

HOW - 在Windows浏览器中模拟MacOS的滚动条

目录 一、原生 CSS 代码实现模拟 macOS 滚动条额外优化应用到某个特定容器 二、Antd table中的滚动条场景三、使用第三方工具/扩展 如果你想让 Windows 里的滚动条 模拟 macOS 的效果&#xff08;细窄、圆角、隐藏默认轨道&#xff09;。 可以使用以下几种方案&#xff1a; 一…...

openEuler环境下GlusterFS分布式存储集群部署指南

1.环境准备&#xff1a; os&#xff1a;openEuler 22.03 主机名 IP地址 主机用途 Rocky8192.168.121.160客户端 open-Euler1192.168.121.150节点1&#xff0c;提供两块6G硬盘open-Euler4192.168.121.153节点2&#xff0c;提供两块6G硬盘open-Euler5192.168.121.154 …...

C++学习(七)(标准库+STL(iotstream公司,日期/时间,器皿,算法,迭代器,多线程))

C 标准模板库 &#xff08;STL&#xff09; C 标准模板库 &#xff08;STL&#xff09; 是头文件的集合&#xff0c;提供了多种数据结构、算法和函数&#xff0c;以简化您的 C 编码体验。STL 的主要目的是通过提供一套现成的有用工具来节省时间并提高效率。STL 最常用的功能可…...

c高级第五天

1> 在终端提示输入一个成绩&#xff0c;通过shell判断该成绩的等级 [90,100] : A [80, 90) : B [70, 80) : C [60, 70) : D [0, 60) : 不及格 #!/bin/bash# 提示用户输入成绩 read -p "请输入成绩&#xff08;0-100&#xff09;&#xff1a;" score# 判断成…...

Windows上使用go-ios实现iOS17自动化

前言 在Windows上运行iOS的自动化&#xff0c;tidevice对于iOS17以上并不支持&#xff0c;原因是iOS 17 引入新通信协议 ‌RemoteXPCQUIC‌&#xff0c;改变了 XCUITest 的启动方式。 一、go-ios的安装 1、安装命令&#xff1a;npm i go-ios 2、安装完成后输入命令which io…...

迷你世界脚本小地图接口:Mapmark

小地图接口&#xff1a;Mapmark 彼得兔 更新时间: 2023-10-25 10:33:48 具体函数名及描述如下: 序号 函数名 函数描述 1 newShape(...) 新增一个形状(线&#xff0c;矩形&#xff0c;圆形) 2 deleteShape(...) 删除一个形状 3 setShapeColor(...) 设置…...

TMS320F28P550SJ9学习笔记1:CCS导入工程以及测试连接单片机仿真器

学习记录如何用 CCS导入工程以及测试连接单片机仿真器 以下为我的CCS 以及驱动库C2000ware 的版本 CCS版本&#xff1a; Code Composer Studio 12.8.1 C2000ware &#xff1a;C2000Ware_5_04_00_00 目录 CCS导入工程&#xff1a; 创建工程&#xff1a; 添加工程&#xff1a; C…...

为什么要提倡尽早返回(Early Return)

为什么要提倡尽早返回&#xff08;Early Return&#xff09; 在编程中&#xff0c;“尽早返回”&#xff08;Early Return&#xff09;是一种常被提倡的编程方式&#xff0c;特别是在需要提升代码可读性、减少嵌套层级、以及快速处理异常情况时。本文将讨论尽早返回的优点、应…...

Gartner发布安全运营指标构建指南

如何为安全运营指标构建坚实的基础 安全运营经理需要报告威胁检测、调查和响应计划的有效性&#xff0c;但难以驾驭大量潜在的 SOC 指标。本研究提供了设计针对 SOC 的指标系统的示例和实践。 主要发现 需要清晰、一致的衡量标准来向董事会成员或服务提供商等更广泛的团队传达…...

vue3:初学 vue-router 路由配置

承上一篇&#xff1a;nodejs&#xff1a;express js-mdict 作为后端&#xff0c;vue 3 vite 作为前端&#xff0c;在线查询英汉词典 安装 cnpm install vue-router -S 现在讲一讲 vue3&#xff1a;vue-router 路由配置 cd \js\mydict-web\src mkdir router cd router 我还…...

数据结构入门篇——什么是数据结构。

一、引入 工具是一种什么东西呢&#xff1f;是一种转化媒介&#xff0c;我们需要熟食&#xff0c;我们要通过用火来将生肉烤熟。在这个过程中。我们要输入一个东西——生肉&#xff0c;通过工具——火的加工&#xff0c;从而得到我们的目的产物——熟肉。 将上面的例子和红字部…...

uniapp+vue3搭建项目

工具使用&#xff1a; Pinia Vue 3 官方推荐的状态管理库&#xff0c;比 Vuex 更轻量&#xff0c;支持模块化&#xff0c;结合 persistedstate 插件可以持久化存储数据。uView-plus 专为 UniApp 设计&#xff0c;支持 App、小程序、H5。UnoCSS 更轻量&#xff0c;比 TailwindCS…...

unity大坐标抖动处理测试

第二幅图就是相机坐标是0 6360094 0的地方看见的模型&#xff0c;可以看见这个球体已经烂了 那么这里可以知道的是坐标太大了导致的&#xff0c;那么把所有物体共同偏移一下&#xff0c;即可得到第一幅图的效果&#xff0c;圆润的sphere又回来了 浮点数的计算是需要位数的&…...

CASAIM与承光电子达成深度合作,三维扫描逆向建模技术助力车灯设计与制造向数字化与智能化转型

近日&#xff0c;CASAIM与广州承光电子科技有限公司正式达成深度合作&#xff0c;CASAIM将为承光电子提供全方位的技术支持&#xff0c;包括高精度三维扫描设备、逆向建模软件以及定制化的技术解决方案。双方将共同组建技术团队&#xff0c;针对车灯设计中的难点进行攻关&#…...

C++类与对象:银行管理系统项目实战开发LeetCode每日一题

[Bank-Management-System]银行管理系统项目 以下是一个可运行的C银行账户类&#xff08;支持简单的存款/取款&#xff09;。后面会继续完善该项目&#xff1a; #include <iostream> #include <string> using namespace std;class Account{public://构造函数Accou…...

领域驱动设计:事件溯源架构简介

概述 事件溯源架构通常由3种应用设计模式组成,分别是:事件驱动(Event Driven),事件溯源(Event Source)、CQRS(读写分离)。这三种应用设计模式常见于领域驱动设计(DDD)中,但它们本身是一种应用设计的思想,不仅仅局限于DDD,每一种模式都可以单独拿出来使用。 E…...

景联文科技:以专业标注赋能AI未来,驱动智能时代的精准跃迁

在人工智能技术重塑全球产业格局的今天&#xff0c;高质量训练数据已成为驱动算法进化的核心燃料。作为数据智能服务领域的领军者&#xff0c;景联文科技深耕数据标注行业多年&#xff0c;以全栈式数据解决方案为核心&#xff0c;构建起覆盖数据采集、清洗、标注、质检及算法调…...