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;
    }

    @Override
    public 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的入门学习(二)》,欢迎继续收看。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/504771.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode: 331. 验证二叉树的前序序列化 + DFS】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

我的创作纪念日-一周年

&#x1f600;前言 不知不觉过了一年了很感慨也很期待未来 &#x1f3e0;个人主页&#xff1a;尘觉主页 文章目录 我的创作纪念日-一周年机缘收获(荣誉)日常成就憧憬 我的创作纪念日-一周年 机缘 在我开始在 CSDN 上发布文章之前&#xff0c;我对这个平台几乎一无所知。随着时…

[创业之路-102] :结构化思考:产学研人才联合创业公司的特点、优点与困境

目录 前言&#xff1a; 一、什么是产学研 1.1 什么是产学研 1.2 什么是产学研人才联合创业 二、产、学、研的区别、各自的特点 2.1 产业&#xff08;产&#xff09;特点 2.2 其次&#xff0c;学术&#xff08;学&#xff09;特点 2.3 科学研究&#xff08;研&#xff0…

VS Code常用前端开发插件和基础配置

VS Code插件安装 VS Code提供了非常丰富的插件功能&#xff0c;根据你的需要&#xff0c;安装对应的插件可以大大提高开发效率。 完成前端开发&#xff0c;常见插件介绍&#xff1a; 1、Chinese (Simplified) Language Pack 适用于 VS Code 的中文&#xff08;简体&#xff…

PostCSS的安装及使用 (2):使用及问题解决

PostCSS是一个CSS处理器&#xff0c;它通过插件系统可以转换CSS代码&#xff0c;使其具备更多的功能或符合特定规范。 PostCSS的使用&#xff1a; 安装PostCSS CLI和插件 # 全局安装PostCSS CLI&#xff08;可选&#xff0c;一般在项目内安装&#xff09;npm install -g postc…

Kerberos 认证 javax.security.auth.logon.LoginException:拒绝链接 (Connection refused)

kerberos 服务重启之后异常 项目中用到了hive 和hdfs &#xff0c;权限认证使用了Kerberos&#xff0c;因为机房异常&#xff0c;导致了Kerberos 服务重启&#xff0c;结果发现本来运行正常的应用服务hive 和hdfs 认证失败&#xff0c;报错信息是 典型的网络连接异常 排查思路…

鸿蒙开发之ArkUI组件常用组件图片和文本

ArkUI即方舟开发框架是HarmonyOS应用的UI开发提供了完整的基础设施&#xff0c;包括简洁的UI语法、丰富的UI功能&#xff08;组件、布局、动画以及交互事件&#xff09;&#xff0c;以及实时界面预览工具等&#xff0c;可以支持开发者进行可视化界面开发。 开发文档地址 &…

AI大模型学习在医疗领域的应用与挑战

AI大模型学习在医疗领域的应用与挑战 文章正文&#xff1a;一、AI大模型学习在医疗领域的应用二、AI大模型学习在医疗领域面临的挑战总结&#xff1a; 文章正文&#xff1a; 随着人工智能技术的飞速发展&#xff0c;AI大模型学习在各个领域都取得了显著的成果。本文将探讨AI大…

使用Sui CLI在Sui上创建和执行PTBs

Sui命令行界面&#xff08;CLI&#xff09;中的新命令允许用户直接从终端或Bash脚本创建和执行可编程交易区块&#xff08;PTB&#xff09;。这个新命令为开发人员在实现和执行PTB方面提供了更大的灵活性。 PTB为开发人员提供了一种非常强大的编程工具&#xff0c;这在其他区块…

商务口语每天学习,柯桥英语培训

今天天气好 Its a nice day today. 今天天气真好。(搭讪) Ive heard too much about you. 久仰大名。(恭维) Remember me to... 请代我向……问好。(问候) 半个句型要记牢 Its a ~(nice/good/bad) day today. Tip: 如果你想和某人搭讪而找不着好的借口时&#xff0c;就说天气…

Macs Fan Control Pro--精准掌控Mac风扇,优化散热新选择

Macs Fan Control Pro是一款专为Mac电脑设计的高级风扇控制工具。它具备强大的温度监测能力&#xff0c;可以实时监测Mac电脑各个核心组件的温度&#xff0c;并通过直观的界面展示给用户。同时&#xff0c;用户可以根据个人需求自定义风扇速度&#xff0c;或者选择预设的自动风…

【STL】vector的模拟实现

目录 前言 vector概述 vector的数据结构 vector迭代器的运用 vector的构造和析构 vector的拷贝构造与赋值 拷贝构造 传统写法 现代写法 赋值重载 vector的扩容 reserve() resize() vector的元素操作 push_back() pop_back() insert() erase() 迭代器…

[linux初阶][vim-gcc-gdb] TwoCharter: gcc编译器

目录 一.Linux中gcc编译器的下载与安装 二.使用gcc编译器来翻译 C语言程序 ①.编写C语言代码 ②翻译C语言代码 a.预处理 b.编译 c.汇编 d.链接 ③.执行Main 二进制可执行程序(.exe文件) 三.总结 一.Linux中gcc编译器的下载与安装 使用yum命令(相当于手机上的应用…

HTTPS RSA 握手解析(计算机网络)

传统的 TLS 握手基本都是使用 RSA 算法来实现密钥交换的&#xff0c;在将 TLS 证书部署服务端时&#xff0c;证书文件其实就是服务端的公钥&#xff0c;会在 TLS 握手阶段传递给客户端&#xff0c;而服务端的私钥则一直留在服务端。 在 RSA 密钥协商算法中&#xff0c;客户端会…

算法学习——LeetCode力扣动态规划篇5(198. 打家劫舍、213. 打家劫舍 II、337. 打家劫舍 III )

算法学习——LeetCode力扣动态规划篇5 198. 打家劫舍 198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09; 描述 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统…

Python|OpenCV-实现检测人脸以及性别检测(12)

前言 本文是该专栏的第13篇,后面将持续分享OpenCV计算机视觉的干货知识,记得关注。 性别检测是计算机视觉领域里面的一个重要学习领域,简单的来说,它可以实现自动识别一张图片中的人物性别。为此在本文中,笔者将结合OpenCV和Tensorflow来实现对一张图进行“图片中的人物人…

探索c++:string常用接口 迷雾

个人主页&#xff1a;日刷百题 系列专栏&#xff1a;〖C/C小游戏〗〖Linux〗〖数据结构〗 〖C语言〗 &#x1f30e;欢迎各位→点赞&#x1f44d;收藏⭐️留言&#x1f4dd; ​ ​ 一、string类 这里我们对string类进行一个简单的总结&#xff1a; string是表示字符串的字…

【更新】在湘源7、8中使用2023年11月国空用地用海分类

之前为了做控规&#xff0c;从湘源8中扒了一套国空用地用海的绘图参数给湘源7使用。 【预告】在湘源控规7中使用 国空用地用海分类标准 但是部里在2023年11月又发布了一套新的用地用海分类。 本想去湘源8里面再扒一下&#xff0c;结果发现湘源8自己还没有更新呢&#xff0c;…

使用STM32 MCU模拟实现PPS+TOD授时信号

简介 PPSTOD是授时信号的一种&#xff0c;用来传递准确的时间信息。 PPS&#xff0c;Pulse Per Second&#xff0c;是每秒一次的脉冲信号&#xff0c;其上升沿表示整秒的时刻。TOD&#xff0c;Time of Day&#xff0c;是时间信息。是跟随在每个PPS信号后的由串口发出的一句报…

Servlet Response的常用方法 缓存和乱码处理

前言 Servlet Response相关的信息&#xff0c;在service方法中使用的是HttpServletResponse&#xff0c;它继承自ServletResponse&#xff0c;扩展了Http协议相关的内容&#xff0c;下面简单记录一下它的基本用法。 一、response组成内容 以下是一个常见response响应的内容&…