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

Spring Web MVC的入门学习(一)

目录

一、什么是 Spring Web MVC

1、MVC 定义

二、学习Spring MVC

1、项目准备

2、建立连接

2.1 @RequestMapping 注解的学习

2.2 @RequestMapping 使用

3、请求

 3.1 传递单个参数

3.2 传递多个参数

3.3 传递对象

3.4 后端参数重命名(后端参数映射)

3.5 传递数组

3.6 传递集合

3.7 传递JSON数据

1、JSON语法

2、JSON字符串和Java对象互转

3、JSON优点

4、传递JSON对象

3.8 获取URL中参数@PathVariable

3.9 上传文件@RequestPart


 

一、什么是 Spring Web MVC

官方对于 Spring MVC 的描述是这样的:

Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框架中。它的 正式名称“Spring Web MVC”来自其源模块的名称(Spring-webmvc),但它通常被称为"Spring MVC".

什么是Servlet呢?

Servlet 是⼀种实现动态页面的技术. 准确来讲Servlet是⼀套 Java Web 开发的规范,或者说是⼀套 Java Web 开发的技术标准. 只有规范并不能做任何事情,必须要有人去实现它. 所谓实现 Servlet 规 范,就是真正编写代码去实现 Servlet 规范提到的各种功能,包括类、方法、属性等.
Servlet 规范是开放的,除了 Sun 公司,其它公司也可以实现 Servlet 规范,目前常见的实现了Servlet 规范的产品包括 Tomcat、Weblogic、Jetty、Jboss、WebSphere 等,它们都被称为"Servlet 容器". Servlet 容器用来管理程序员编写的 Servlet 类.

总之,我们可以知道:Spring Web MVC 是⼀个 Web 框架. 简称 “Spring MVC”。

1、MVC 定义

MVC 是 Model View Controller 的缩写,它是软件工程中的⼀种软件架构设计模式,它把软件系统分为 模型、视图和控制器 三个基本部分。

View(视图):指在应用程序中专门用来与浏览器进行交互,展示数据的资源.
Model(模型) :是应用程序的主体部分,用来处理程序中数据逻辑的部分.
Controller(控制器):可以理解为⼀个分发器,用来决定对于视图发来的请求,需要用哪⼀个模型 来处理,以及处理完后需要跳回到哪⼀个视图,即用来连接视图和模型
MVC 是⼀种架构设计模式, 也⼀种思想, 而 Spring MVC 是对 MVC 思想的具体实现 . 除此之外, Spring MVC还是⼀个Web框架.
总结来说, Spring MVC 是⼀个实现了 MVC 模式的 Web 框架 .

二、学习Spring MVC

既然 Spring MVC 是 Web 框架, 那么当用户在浏览器中输入了 url 之后,我们的 Spring MVC 项目就可以感知到用户 的请求, 并给予响应。
学习 Spring MVC,其实就是学习如何通过浏览器和用户程序进行交互
主要分以下三个方面:
  1. 建立连接:将用户(浏览器)和 Java 程序连接起来,也就是访问⼀个地址能够调用到我们的 Spring 程序。
  2. 请求:用户请求的时候会带⼀些参数,在程序中要想办法获取到参数, 所以请求这块主要是 获取参数的功能.
  3. 响应:执行了业务逻辑之后,要把程序执行的结果返回给用户, 也就是响应。

1、项目准备

我们要创建一个Spring MVC 项目,和 Spring Boot 创建项目相同,在创建的时候选择 Spring Web 就相当于创建了 Spring MVC 的项目。
创建项目时, 勾选上 Spring Web 模块即可,如下图所示:

2、建立连接

在 Spring MVC 中使用 @RequestMapping 来实现 URL 路由映射 ,也就是 浏览器连接程序的作⽤。

我们通过一个简单的代码来实现一下:

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class demo {@RequestMapping("/hello")public String getHello() {return "Hello,Spring MVC";}
}

 然后来访问: http://127.0.0.1:8080/hello, 就可以看到程序返回的数据了,如图:

2.1 @RequestMapping 注解的学习

@RequestMapping 是 Spring Web MVC 应用程序中最常被用到的注解之⼀, 它是用来注册接口的路由映射的.
表示服务器收到请求时, 路径为 /hello 的请求就会调用 getHello 这个方法的代码。
路由映射: 当用户访问⼀个 URL 时, 将用户的请求对应到程序中某个类的某个方法的过程就叫路由映射.

 那么对于程序中加的 @RestController 注解有什么作用?

 我们把 @RestController 去掉, 再来访问⼀次:

 可见,报错了404,我们找不到该页面。所以@RestController 注解也很重要,不能不加。

一个项目中, 会有很多类, 每个类可能有很多的方法, Spring程序怎么知道要执行哪个方法呢?

Spring会对所有的类进行扫描, 如果类加了注解@RestController, Spring才会去看这个类里面的方法有没有加 @RequestMapping 这个注解。

2.2 @RequestMapping 使用

@RequestMapping 既可修饰类,也可以修饰方法 ,当修饰类和方法时,访问的地址是类路径 +方法路径.
@RequestMapping标识⼀个类:设置映射请求的请求路径的初始信息
@RequestMapping标识⼀个方法:设置映射请求的请求路径的具体信息

看如下代码:

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RequestMapping("/test")
@RestController
public class demo {@RequestMapping("/hello")public String getHello() {return "Hello,Spring MVC";}
}

访问地址:http://127.0.0.1:8080/test/hello

 

这里我们注意一下:

@RequestMapping 的URL 路径最前面加不加 / (斜杠)都可以, Spring程序启动时, 会进行判断, 如果 前面没有加 / , Spring会拼接上⼀个 /。
如:
上面代码中 @RequestMapping("/test") 我们可以写为 @RequestMapping("test")
通常情况下,我们加上 / 。
@RequestMapping 的URL路径也可以是多层路径, 最终访问时, 依然是 类路径 + 方法路径
如:
@RequestMapping("/user/m1")
@RestController
public 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请求. 同理, 也支持其他的请 求方式.

 

3、请求

访问不同的路径, 就是发送不同的请求. 在发送请求时, 可能会带⼀些参数, 所以学习Spring的请求, 主要 学习如何传递参数到后端以及后端如何接收.

 3.1 传递单个参数

 接收单个参数, 在 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 会根据方法的参数名, 找到对应的参数, 赋值给方法

如果参数名不⼀致, 是获取不到参数的.
比如请求URL: http://127.0.0.1:8080/param/m1?name1=spring
响应结果:

注意:

使用基本类型来接收参数时, 参数必须传(除boolean类型), 否则会报500错误。
类型不匹配时, 会报400错误.

我们以下面代码为例,来测试一下:

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

1、正常传递参数

http://127.0.0.1:8080/param/m1/int?age=1
浏览器响应情况:

2、不传递age参数

 http://127.0.0.1:8080/param/m1/int

浏览器响应情况:

报500 错误,可见 使用基本类型来接收参数时, 参数必须传(除boolean类型), 否则会报500错误。

3、传递参数类型不匹配

http://127.0.0.1:8080/param/m1/int?age=abc
浏览器响应情况:

报400 错误,可见 传递的参数类型不匹配时, 会报400错误.

对于包装类型, 如果不传对应参数,Spring 接收到的数据则为null。

3.2 传递多个参数

接收多个参数, 和接收单个参数⼀样, 直接使用方法的参数接收即可. 使用多个形参.

 

@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参数的值。

当有多个参数时,前后端进行参数匹配时,是以参数的名称进行匹配的因此 参数的位置是不影响后端获取参数的结果.

3.3 传递对象

如果参数比较多时, 方法声明就需要有很多形参. 并且后续每次新增一个参数, 也需要修改方法声明。 我们可以把这些参数封装为⼀个对象。 Spring MVC 也可以自动实现对象参数的赋值
比如 Student 对象:
public class Student {private Integer id;private String name;private int age;public Student(){}public Student(Integer id, String name, int age) {this.id = id;this.name = name;this.age = age;}public void setName(String name) {this.name = name;}public void setAge(int age) {this.age = age;}public void setId(Integer id) {this.id = id;}public Integer getId() {return id;}public String getName() {return name;}public int getAge() {return age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +", id=" + id +'}';}
}

传递对象代码实现:

@RequestMapping("/m3")
public Object method3(Student student){return student.toString();
}
使用浏览器发送请求并传参:
http://127.0.0.1:8080/param/m3? id=5&name=zhangsan&age=20

 可以看到, 后端程序正确拿到了Student对象里各个属性的值。

Spring 会根据参数名称自动绑定到对象的各个属性上, 如果某个属性未传递, 则赋值为null(基本类型则赋值为默认初识值, 比如int类型的属性, 会被赋值为0)。

3.4 后端参数重命名(后端参数映射)

某些特殊的情况下,前端传递的参数 key 和我们后端接收的 key 可以不⼀致,比如前端传递了⼀个 time 给后端,而后端是使用 createtime 字段来接收的,这样就会出现参数接收不到的情况,如果出现 这种情况,我们就可以使用 @RequestParam 来重命名前后端的参数值.
具体示例如下,后端实现代码:
@RequestMapping("/m4")
public Object method4(@RequestParam("time") String createtime) {return "接收到参数createtime:" + createtime;
}
使用浏览器发送请求并传参: http://127.0.0.1:8080/param/m4?time=2023-09-12

响应:

可以看到, Spring可以正确的把浏览器传递的参数 time 绑定到了后端参数 caretetime 参数上。
那么此时, 如果浏览器使用createtime进行参数传递呢?
我们来试一下:
访问URL: http://127.0.0.1:8080/param/m4?createtime=2023-09-12
响应结果:

 

通过控制台打印的日志信息显示: 请求参数 'time' 不存在。

可以得出结论:
  1. 使用 @RequestParam 进行参数重命名时, 请求参数只能和 @RequestParam 声明的名称⼀ 致, 才能进行参数绑定和赋值.
  2. 使用 @RequestParam 进行参数重命名时, 参数就变成了必传参数.

那么如何进行非必传参数的设置呢?

非必传参数设置
先来了解下参数必传的原因, 我们查看 @RequestParam 注解的实现细节就可以发现端倪,注解
实现如下:
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestParam {@AliasFor("name")String value() default "";@AliasFor("value")String name() default "";boolean required() default true;String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";
}
可以看到 required 的默认值为true, 表示含义就是: 该注解修饰的参数默认为必传
那么, 我们可以通过设置 @RequestParam 中的 required=false 来避免不传递时报错
具体实现如下:
@RequestMapping("/m4")
public Object method4(@RequestParam(value = "time", required = false) String createtime) {return "接收到参数createtime:" + createtime;
}
可以看到, 添加required=false之后, time前⾯也加了key, 变成了 value = "time"
注解属性赋值时, 没有指明key的话, 默认为value属性.
如果需要有多个属性进行赋值时, 需要写上key

3.5 传递数组

Spring MVC 可以自动绑定数组参数的赋值。
后端实现代码:
@RequestMapping("/m5")
public String method5(String[] array) {return "接收到参数:"+ Arrays.toString(array);
}
使用浏览器发送请求并传参:
数组参数:请求参数名与形参数组名称相同且请求参数为多个, 后端定义数组类型形参即可接收参数
http://127.0.0.1:8080/param/m5? array=zhangsan&array=lisi&array=wangwu
或者使用 http://127.0.0.1:8080/param/m5?array=zhangsan,lisi,wangwu

 浏览器响应结果:

可以看到后端对数组参数进行了正确的接收和响应。

3.6 传递集合

集合参数:和数组类似, 同⼀个请求参数名为多个, 且需要使用 @RequestParam 绑定参数关系。
默认情况下,请求中参数名相同的多个值,是封装到数组. 如果要封装到集合,要使用
@RequestParam 绑定参数关系。

 请求方式和数组类似:

浏览器传参:
方式⼀: http://127.0.0.1:8080/param/m6?listParam=zhangsan&listParam=lisi&listParam=wangwu
⽅式⼆: http://127.0.0.1:8080/param/m6?listParam=zhangsan%2clisi%2cwangwu
%2c 是逗号的转义编码, 解码后的url为:
http://127.0.0.1:8080/param/m6? listParam=zhangsan,lisi,wangwu

 后端接收代码:

@RequestMapping("/m6")
public String method6(@RequestParam List<String> listParam){return "size:"+listParam.size() + ",listParam:"+listParam;
}

3.7 传递JSON数据

JSON就是⼀种数据格式, 有自己的格式和语法, 使用文本表示一个对象或数组的信息, 因此
JSON本质是字符串,主要负责在不同的语言中数据传递和交换.
注意: JSON与Javascript的关系: 没有关系, 只是语法相似
1、JSON语法
JSON 是⼀个字符串,其格式非常类似于 JavaScript 对象字面量的格式。
我们先来看⼀段JSON数据:
{"squadName": "Super hero squad","homeTown": "Metro City","formed": 2016,"secretBase": "Super tower","active": true,"members": [{"name": "Molecule Man","age": 29,"secretIdentity": "Dan Jukes","powers": ["Radiation resistance", "Turning tiny", "Radiation blast"]}, {"name": "Madame Uppercut","age": 39,"secretIdentity": "Jane Wilson","powers": ["Million tonne punch", "Damage resistance", "Superhuman reflexes"]}, {"name": "Eternal Flame","age": 1000000,"secretIdentity": "Unknown","powers": ["Immortality", "Heat Immunity", "Inferno","Teleportation", "Interdimensional travel"]}]
}
JSON的语法:
  1. 数据在键值对(Key/Value)
  2. 数据由逗号 , 分隔
  3. 对象用 {} 表示
  4. 数组用 [] 表示
  5. 值可以为对象, 也可以为数组, 数组中可以包含多个对象
JSON的两种结构
  1. 对象: 大括号 {} 保存的对象是⼀个无序的 键值对 集合. ⼀个对象以左括号 { 开始, 右括号 } 结束。每个"键"后跟⼀个冒号 ,键值对使用逗号 , 分隔
  2. 数组: 中括号 [] 保存的数组是值(value)的有序集合. ⼀个数组以左中括号 [ 开始, 右中括 ] 结束,值之间使用逗号 , 分隔
2、JSON字符串和Java对象互转

 JSON本质上是⼀个字符串, 通过文本来存储和描述数据。

 Spring MVC框架也集成了JSON的转换工具, 我们可以直接使用, 来完成JSON字符串和Java对象的互转。

参考代码如下:

public class JSONUtils {private static ObjectMapper objectMapper = new ObjectMapper();public static void main(String[] args) throws JsonProcessingException {Person person = new Person();person.setId(5);person.setName("zhangsan");person.setPassword("123456");//对象转为JSON字符串String jsonStr = objectMapper.writeValueAsString(person);System.out.println("JSON字符串为:"+jsonStr);//JSON字符串转为对象Person p = objectMapper.readValue(jsonStr,Person.class);System.out.println("转换的对象id:"+p.getId()+",name:"+p.getName()+",password:"+p.getPassword());}
}
使用ObjectMapper 对象提供的两个方法, 可以完成对象和JSON字符串的互转
writeValueAsString: 把对象转为JSON字符串
readValue: 把字符串转为对象
3、JSON优点
  1. 简单易用: 语法简单,易于理解和编写,可以快速地进行数据交换
  2. 跨平台支持: JSON可以被多种编程语言解析和生成, 可以在不同的平台和语言之间进行数据交换和传输
  3. 轻量级: 相较于XML格式, JSON数据格式更加轻量级, 传输数据时占用带宽较小, 可以提高数据传输速度
  4. 易于扩展: JSON的数据结构灵活,支持嵌套对象和数组等复杂的数据结构,便于扩展和使用
  5. 安全性: JSON数据格式是⼀种纯文本格式,不包含可执行代码, 不会执行恶意代码,因此具有较高的安全性
4、传递JSON对象
接收JSON对象, 需要使用 @RequestBody 注解
RequestBody: 请求正文,意思是这个注解作用在请求正文的数据绑定,请求参数必须在写在请求正文中。

 后端实现:

@RequestMapping(value = "/m7")
public Object method7(@RequestBody Person person) {return person.toString();
}

这里我们来使用postman工具测试我们的后端程序,

使用Postman来发送json请求参数:

 可以看到, 后端正确接收了.

去除掉 @RequestBody 的结果:

可见,后端未能成功给Person对象赋值。

3.8 获取URL中参数@PathVariable

path variable: 路径变量
和字面表达的意思⼀样, 这个注解主要作用在请求URL路径上的数据绑定。 默认传递参数写在URL上,SpringMVC就可以获取到。
后端实现代码:
@RequestMapping("/m8/{id}/{name}")
public String method8(@PathVariable Integer id, @PathVariable("name") String userName){return "解析参数id:"+id+",name:"+userName;
}
使用浏览器发送请求或者使用Postman发送请求: http://127.0.0.1:8080/param/m8/5/zhangsan

 

可以看到, 后端正确获取到了URL中的参数.
参数对应关系如下:
如果方法参数名称和需要绑定的URL中的变量名称⼀致时, 可以简写, 不用给@PathVariable的属性赋值 , 如上述例子中的id变量;
如果方法参数名称和需要绑定的URL中的变量名称不⼀致时, 需要@PathVariable的属性value赋值, 如上述例⼦中的userName变量。

3.9 上传文件@RequestPart

后端代码实现:

@RequestMapping("/m9")
public String getfile(@RequestPart("file") MultipartFile file) throws IOException {//获取⽂件名称String fileName = file.getOriginalFilename();//⽂件上传到指定路径file.transferTo(new File("D:/temp/" + file.getOriginalFilename()));return "接收到⽂件名称为: "+fileName;
}

 使用Postman发送请求:

然后观察 D:/temp 路径下, 文件是否上传成功。

该篇文章就先介绍到这里了,后续内容在下篇《Spring Web Mvc的入门学习(二)》,欢迎继续收看。

相关文章:

Spring Web MVC的入门学习(一)

目录 一、什么是 Spring Web MVC 1、MVC 定义 二、学习Spring MVC 1、项目准备 2、建立连接 2.1 RequestMapping 注解的学习 2.2 RequestMapping 使用 3、请求 3.1 传递单个参数 3.2 传递多个参数 3.3 传递对象 3.4 后端参数重命名&#xff08;后端参数映射&#xf…...

如何使用Java语言发票查验接口实现发票真伪查验、票据ocr

随着时代潮流的发展&#xff0c;企业也在寻找更加便捷、高效的办公模式&#xff0c;尤其是针对财务工作人员而言&#xff0c;繁琐的发票录入、查验工作占据了财务人员的大部分时间。对此&#xff0c;翔云提供了发票识别接口、发票查验接口&#xff0c;那么企业应当如何将这些接…...

CAPL实现关闭TCP连接的几种方式以及它们的区别

在讲正文前,我们有必要复习下关闭TCP连接的过程:四次挥手。 假设A和B建立TCP连接并进行数据传输,当A的数据发送完后,需要主动发起断开连接的请求: A发送FIN报文,发起断开连接的请求B收到FIN报文后,首先回复ACK确认报文B把自己的数据发送完,发送FIN报文,发起断开连接的…...

Git--08--Git分支合并操作

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 Git分支合并操作案例流程客户端&#xff1a;GitExtensions操作步骤&#xff1a;A操作步骤&#xff1a;B操作步骤&#xff1a;C操作步骤&#xff1a;D操作步骤&#…...

深度学习训练中的种子设置

文章目录 深度学习训练中的种子设置1. 为什么需要设置随机种子2. 随机种子的设置及使用 深度学习训练中的种子设置 1. 为什么需要设置随机种子 在神经网络训练过程中&#xff0c;经常会通过随机的方式对一些数据进行初始化&#xff1a; 1、随机权重&#xff0c;网络有些部分…...

LLM:函数调用(Function Calling)

1 函数调用 虽然大模型能解决很多问题&#xff0c;但大模型并不能知晓一切。比如&#xff0c;大模型不知道最新消息(GPT-3.5 的知识截至 2021年9月&#xff0c;GPT-4 是 2023 年12月)。另外&#xff0c;大模型没有“真逻辑”。它表现出的逻辑、推理&#xff0c;是训练文本的统计…...

ssm 房屋销售管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

一、源码特点 ssm 房屋销售管理系统是一套完善的信息系统&#xff0c;结合springMVC框架完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模…...

MySQL使用ALTER命令创建与修改索引

索引&#xff08;index&#xff09;分类 单列索引&#xff0c;即一个索引只包含单个列&#xff0c;一个表可以有多个单列索引。组合索引&#xff0c;即一个索引包含多个列。 创建索引时&#xff0c;需要确保该索引是应用在 SQL查询语句的条件(一般作为 WHERE 子句的条件)。 实…...

54 npm run serve 和 npm run build 输出的关联和差异

前言 通常来说 我们开发的时候一般会用到的命令是 “npm run serve”, “npm run build” 前者会编译当前项目, 然后将编译之后的结果以 node 的形式启动一个服务, 暴露相关业务资源, 因此 我们可以通过 该服务访问到当前项目 后者是编译当前项目, 然后做一下最小化代码的优…...

iOS —— 初识KVO

iOS —— 初始KVO KVO的基础1. KVO概念2. KVO使用步骤注册KVO监听实现KVO监听销毁KVO监听 3. KVO基本用法4. KVO传值禁止KVO的方法 注意事项&#xff1a; KVO的基础 1. KVO概念 KVO是一种开发模式&#xff0c;它的全称是Key-Value Observing (观察者模式) 是苹果Fundation框架…...

什么是HTTP? HTTP 和 HTTPS 的区别?

文章目录 一、HTTP二、HTTPS三、区别参考文献 一、HTTP HTTP (HyperText Transfer Protocol)&#xff0c;即超文本运输协议&#xff0c;是实现网络通信的一种规范 在计算机和网络世界有&#xff0c;存在不同的协议&#xff0c;如广播协议、寻址协议、路由协议等等… 而HTTP是…...

微信小程序如何进行npm导入组件

文章目录 目录 文章目录 前言 一、安装node 二、微信小程序通过npm安装组件&#xff08;以Vant-weapp为例&#xff09; 一、Vant-weapp下载 二 、修改 app.json 三 、修改 project.config.json 四 、 构建 npm 包 前言 微信小程序使用npm导入有很多的教程&#xff0c;我…...

MySQL编程实战LeetCode经典考题

文章简介 本文主要收集了LeetCode上关于MySQL的一些经典考题。 后续也会陆续把所有经典考题补充完整。 175.组合两个表 175.组合两个表 解答&#xff1a; select p.FirstName as firstName, p.LastName as lastName,a.City as city, a.State as state from Person p l…...

发生播放错误,即将重试 jellyfin

上周在家里的小主机上部署了jellyfin&#xff0c;真香&#xff0c;手机安卓端使用无问题&#xff0c;于是今天准备在电视上安装一个 首先是直接安装的手机版客户端&#xff0c;操作卡顿&#xff0c;而且很多操作没法实现&#xff0c;于是去下了一个tv版本 安装上后发现&#…...

BIONIOAIO

通信技术整体解决的问题 1.局域网内的通信要求 2.多系统间的底层消息传递机制 3.高并发下&#xff0c;大数据量的通信场景需要 4.游戏行业。无论是手游服务端、还是大型网络游戏&#xff0c;java的应用越来越广 IO模型基本说明 就是用什么样的通道或者说是通信模式和架构…...

SpringSecurity学习总结(三更草堂)

SpringSecurity安全框架的核心功能是认证和授权&#xff1a; 认证&#xff1a;验证当前访问系统的是不是本系统的用户&#xff0c;并且要确认具体是哪个用户。 授权&#xff1a;经过认证后判断当前用户是否具有进行某个操作的权限。 一般来说中大型的项目都是使用SpringSecurit…...

C++20中的jthread

一、多线程开发 c11以前&#xff0c;是不包含线程库的&#xff0c;开发多线程&#xff0c;必须使用OS系统自带的线程API&#xff0c;这就导致了很多问题&#xff0c;最主要的是&#xff0c;跨平台的开发&#xff0c;一般要保持几个主流应用的库的代码支持&#xff0c;特别是对…...

Xception模型详解

简介 Xception的名称源自于"Extreme Inception"&#xff0c;它是在Inception架构的基础上进行了扩展和改进。Inception架构是Google团队提出的一种经典的卷积神经网络架构&#xff0c;用于解决深度卷积神经网络中的计算和参数增长问题。 与Inception不同&#xff0…...

【合合TextIn】AI构建新质生产力,合合信息Embedding模型助力专业知识应用

目录 一、合合信息acge模型获MTEB中文榜单第一 二、MTEB与C-MTEB 三、Embedding模型的意义 四、合合信息acge模型 &#xff08;一&#xff09;acge模型特点 &#xff08;二&#xff09;acge模型功能 &#xff08;三&#xff09;acge模型优势 五、公司介绍 一、合合信息…...

Flutter 拦截系统键盘,显示自定义键盘

一、这里记录下在开发过程中&#xff0c;下单的时候输入金额需要使用自定义的数字键盘 参考链接: https://juejin.cn/post/7166046328609308685 效果图 二、屏蔽系统键盘 怎样才能够在输入框获取焦点的时候&#xff0c;不让系统键盘弹出呢&#xff1f;同时又显示我们自定义的…...

内存泄漏是什么?如何避免内存泄漏?

1.2 内存泄漏 使用new开辟空间泄漏&#xff0c;抛出异常 int main() {int size 0;try{while (1){//int* p (int*)malloc(sizeof(int) * 1024 * 1024);/*if (p NULL){break;}*/int* p new int[1024 * 1024];size size 4 * 1024 * 1024;cout << p << endl;}}…...

linux 中的syslog的含义和用法

在Linux系统中&#xff0c;syslog是一种系统日志服务&#xff0c;用于收集、存储和管理系统和应用程序生成的日志消息。syslog服务负责记录系统的运行状态、错误信息、警告、调试信息等&#xff0c;以便系统管理员可以监控系统的健康状况、故障排查和性能优化。 含义和作用&am…...

kubernetes(K8S)学习(一):K8S集群搭建(1 master 2 worker)

K8S集群搭建&#xff08;1 master 2 worker&#xff09; 一、环境资源准备1.1、版本统一1.2、k8s环境系统要求1.3、准备三台Centos7虚拟机 二、集群搭建2.1、更新yum&#xff0c;并安装依赖包2.2、安装Docker2.3、设置hostname&#xff0c;修改hosts文件2.4、设置k8s的系统要求…...

巧克力(蓝桥杯)

文章目录 巧克力题目描述解题分析贪心 巧克力 题目描述 小蓝很喜欢吃巧克力&#xff0c;他每天都要吃一块巧克力。 一天小蓝到超市想买一些巧克力。超市的货架上有很多种巧克力&#xff0c;每种巧克力有自己的价格、数量和剩余的保质期天数&#xff0c;小蓝只吃没过保质期的…...

Python爬虫之pyquery和parsel的使用

三、pyquery的使用 1、准备工作 pip3 install pyquery2、初始化 2.1、字符串初始化 把HTML的内容当做参数&#xff0c;来初始化PyQuery对象。 html <div><ul><li class"item-0">first item</li><li class"item-1">&l…...

移动硬盘怎么加密?移动硬盘加密软件有哪些?

移动硬盘是我们在工作中最常用的移动存储设备&#xff0c;为了保护数据安全&#xff0c;需要使用专业的移动硬盘加密软件加密保护。那么&#xff0c;移动硬盘加密软件有哪些&#xff1f; ​BitLocker BitLocker是Windows的磁盘加锁功能&#xff0c;可以用于加密保护移动硬盘中…...

openEuler 22.03 安装 .NET 8.0

openEuler 22.03 安装 .NET 8.0 openEuler 22.03 安装 .NET 8.0 openEuler 22.03 安装 .NET 8.0 查看内核信息 [jeffPC-20240314EIAA ~]$ cat /proc/version Linux version 5.15.146.1-microsoft-standard-WSL2 (root65c757a075e2) (gcc (GCC) 11.2.0, GNU ld (GNU Binutils)…...

【转载】OpenCV ECC图像对齐实现与代码演示(Python / C++源码)

发现一个有很多实践代码的git 库,特记录下: 地址:GitHub - luohenyueji/OpenCV-Practical-Exercise: OpenCV practical exercise 作者博客地址:https://blog.csdn.net/LuohenYJ 已关注。 Items项目Resources1age_gender1基于深度学习识别人脸性别和年龄Model2OpenCV_dlib_…...

每日一题(相交链表 )

欢迎大家来我们主页进行指导 LaNzikinh-CSDN博客 160. 相交链表 - 力扣&#xff08;LeetCode&#xff09; 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节…...

C#WPF控件大全

本文列出WPF控件大全,点击可以进入详情页查看。 列表如下: AccessText用下划线来指定用作访问键的字符。 ActivatingKeyTipEventArgs为 ActivatingKeyTip 事件提供数据。...

做酒业网站的要求/河南关键词优化搜索

4月18日&#xff0c;“屏价不凡”2019酷开网络大屏价值优选推介活动在北京举行。会上&#xff0c;酷开网络分享了大屏价值的用户思维&#xff0c;大屏价值可养成的生态体系&#xff0c;大屏价值的创新营销模式等&#xff0c;带领OTT营销走向新的技术流、数据化阶段。 本次会议…...

家居企业网站建设效果/合肥seo建站

今天给大侠带来基于FPGA的VGA/LCD显示控制器设计&#xff0c;由于篇幅较长&#xff0c;分三篇。今天带来第二篇&#xff0c;中篇&#xff0c;VGA 显示原理以及VGA/LCD 显示控制器的基本框架&#xff0c;话不多说&#xff0c;上货。 之前也有图像处理以及VGA显示相关的文章&…...

网站建设运营维护合同/平台推广营销

除了使用xlrd库或者xlwt库进行对excel表格的操作读与写&#xff0c;而且pandas库同样支持excel的操作&#xff1b;且pandas操作更加简介方便。首先是pd.read_excel的参数&#xff1a;函数为&#xff1a;pd.read_excel(io, sheetname0,header0,skiprowsNone,index_colNone,names…...

辛集哪做网站/中国万网域名查询

1. 卸载 1.1 删除ubuntu系统的分区 首先【win】【R】&#xff0c;然后输入【diskpart】&#xff0c;如下图。 输入【list disk】查看分区&#xff0c;有多个磁盘分区可分别使用【select disk 0】或者【select disk 1】&#xff0c;然后再list partition查看分区&#xff0c;其…...

wordpress如何制作单页订单/湖人最新消息

文章目录1、表格 table1.1、创建表格1.2、表格属性1.3、表头单元格标签th1.4、表格标题caption1.5、合并单元格1.5.1、合并单元格2种方式1.5.2、合并单元格顺序1.5.3、合并单元格三步曲1.6、总结表格1.7、表格划分结构2、列表标签2.1、无序列表 ul2.2、有序列表 ol2.3、自定义列…...

企业人力资源管理师/长沙百度网站推广优化

在网页中很多小的图标不一定是图片。通过字符符号做出来的图标&#xff0c;可以矢量放大&#xff0c;更加方便实用。这里就学习一下如何在网页中加入iconfont。更多的文章请关注我的头条号&#xff0c;我是落笔承冰。一、创建一个空白的html网页test1.html。二、浏览器中打开ic…...