【老生常谈、查漏补缺】SpringBoot接收参数的几种方式图文详解

news2024/11/19 12:33:37

在这里插入图片描述

前言

  在实际开发过程中,我们经常会遇到各种不同的场景,需要从客户端接收不同的参数。Spring Boot 提供了多种方式来接收这些参数,使得我们的开发更加灵活便捷。这篇文章主要介绍了 SpringBoot 在接收参数的几种常用方式详解。随着前后端的分离,接口方式开发成为普遍的开发形式,前端相对于后端来说,常用的接口传参方式就一定要了解和熟悉。下面我们梳理了常用的几种 Controller 层接受参数的方式,需要的朋友可以参考下。

准备工作

  打开 Spring Initializr 或者常用的 IDE,新建一个 Spring Boot 项目。接下来,我们将在这个项目中实现接收参数的功能。我们需要在 pom.xml 文件中添加 Spring Web 的依赖,打开 pom.xml 文件并添加以下依赖:

<dependencies>
    <!-- Spring Boot Web Starter -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
    <dependency>
		<groupId>org.projectlombok</groupId>
		<artifactId>lombok</artifactId>
		<scope>provided</scope>
	</dependency>
</dependencies>

  接着,我们先定义一个类用来做参数接受类。在 src/main/java/org/dllwh/model 目录下创建一个名为 User.java 的文件,并添加如下内容:

import lombok.Data;

@Data
public class User {
    private String userId;
    private String userCode;
    private String userName;
    private String phone;
}

  然后,我们再定义一个类用来做请求结果的统一返回类。在 src/main/java/org/dllwh/common 目录下创建一个名为 Result.java 的文件,并添加如下内容:

import lombok.Data;

@Data
public class Result<T> {
    // 业务码。不是http状态码,200:成功,其余届时失败
    private Integer code;
    // 错误信息,如果业务成功,errMsg为空
    private String errMsg;
    // 响应数据
    private T data;
    
    private RestResult() {
        super();
    }
    
    public static <T> Result success(T data) {
        Result result = new Result<>();
        result.setCode(200);
        return result;
    }
    
    public static Result fail(String msg) {
        Result result = new Result<>();
        result.setCode(500);
        result.setErrMsg(msg);
        return result;
    }
    
    public static Result fail(int resultStatus, String msg) {
        Result result = new Result<>();
        result.setCode(resultStatus);
        result.setErrMsg(msg);
        return result;
    }
}

一、Get 请求

1.1 以方法的形参接收参数

1.1.1 通过 @RequestParam 注解接收参数

  参数用 @RequestParam 标注,用于将HTTP请求参数绑定到方法的参数上,这是最基本的一种。它可以帮助开发者轻松地获取和处理请求参数,从而简化控制器方法的编写。使用 @RequestParam 注解的方法参数默认为必填参数。这意味着,如果请求中没有该参数,就会报错。直接把请求参数写在Controller相应的方法的形参中,这种方式一般适用参数比较少的情况,

@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
    @GetMapping("/param/query")
    public Result<User> getParamByQuery(@RequestParam String name, @RequestParam String phone) {
        log.info("name:{}", name);
        log.info("phone:{}", phone);
        return Result.success(null);
    }
}

请添加图片描述

📌📌📌注意:Get 请求以方法的形式接收参数时, @RequestParam 注解可以省略不写。关于 @RequestParam 注解的用法及注意事项见附录 5.1。

1.1.2 数组、集合接收参数

  • 数组参数:请求参数名与形参数组名称相同且请求参数为多个,定义数组类型形参即可接收参数。

    @RestController
    @RequestMapping("/user")
    @Slf4j
    public class UserController {
        @GetMapping("/param/array")
        public Result<User> getParamByArray(String[] names) {
            Arrays.asList(names).forEach(System.out::println);
            return Result.success(null);
        }
    }
    

    请添加图片描述

  • 集合参数:请求参数名与形参集合名称相同且请求参数为多个,@RequestParam 绑定参数关系

    @RestController
    @RequestMapping("/user")
    @Slf4j
    public class UserController {
        @GetMapping("/param/collection")
        public Result<User> getParamByCollection(@RequestParam List<String> names) {
            names.forEach(System.out::println);
            return Result.success(null);
        }
    }
    

    请添加图片描述

📌📌SpringBoot 接收集合参数,需要用 @RequestParam 注解绑定参数,否则会报错!!

1.1.3 以实体类接收参数

  如果需要同时接收一批数据,而不想通过普通方式一个个接收,就可以使用POJO对象的方式来获取提交过来的所有数据,只需要POJO对象的属性名和提交过来的参数一一对应上就可以了。注意:此场景适用于请求参数比较多的情况。

@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
    @GetMapping("/param/bean")
    public Result<User> getParamByBeanObject(User user) {
        log.info("name:{}", user.getUserName());
        log.info("phone:{}", user.getPhone());
        return Result.success(null);
    }
}

请添加图片描述

  上面是使用简单实体对象接收参数,只要请求参数名与形参对象属性名相同,定义POJO接收即可。而实际开发过程中,更多的是复杂实体对象,使用复杂实体对象接收参数时,不仅需要请求参数名与形参对象属性名相同,而且还需要按照对象层次结构关系即可接收嵌套POJO属性参数。例如:

在这里插入图片描述
在这里插入图片描述

📌📌📌注意:Get 请求以实体类接收参数时,不能用 @RequestParam 注解进行标注,因为不支持这样的方式获取参数。

1.1.4 通过 Map 接收参数

  如果我们不想定义一个对象来接受参数,大可以使用Map来接收。使用 Map 来封装多个参数,而无需定义它们的名称(name)或数量。

@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
    /**
     * 接收 GET 请求的多个查询参数
     */
    @GetMapping("/param/multi-query")
    public Result<User> getParamByMultiQuery(@RequestParam Map<String, Object> map) {
        System.out.println(map);
        System.out.println(map.get("name"));
        return Result.success(null);
    }
}

在这里插入图片描述

1.2 通过 HttpServletRequest 接收参数

  在方法的形参中定义 HttpServletRequest,通过原生的 HttpServletRequest 对象手动获取请求参数。【不推荐】

@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
    @GetMapping("/param/httpServletRequest")
    public Result<User> getParamByHttpServletRequest(HttpServletRequest request) {
        String name = request.getParameter("name");
        String phone = request.getParameter("phone");
        log.info("name:{}", name);
        log.info("phone:{}", phone);
        return Result.success(null);
    }
}

在这里插入图片描述

1.3 通过 @PathVariable 注解接收参数

  @PathVariable 注解可用于处理请求 URI 映射中的模板变量,并将其绑定到 Controller 方法参数。注意:若方法参数名称和需要绑定的url中变量名称一致时,可以简写;若方法参数名称和需要绑定的url中变量名称不一致时,则需要转换。例如:

@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
    /**
     * 接收路径变量
     */
    @GetMapping("/param/PathVar/{id}/{phone}")
    public Result<User> getParamByPathVar(@PathVariable("id") String userId, @PathVariable String phone) {
        log.info("userId:{}", userId);
        log.info("phone:{}", phone);
        return Result.success(null);
    }
}

在这里插入图片描述

📌📌注意:@PathVariable 的使用及注意事项与 @RequestParam 基本三是一致的,这里就不再过多阐述。

1.4 通过 @RequestHeader 接收参数

  有些接口要求用请求头传递参数,比如使用token鉴权的系统,token一般都携带在请求头上,我们可以使用 @RequestHeader 注解来获取请求当中的请求头信息。例如:

  • 获取单个header属性

    @RestController
    @RequestMapping("/user")
    @Slf4j
    public class UserController {
        @GetMapping("/param/requestHeader")
        public Result<User> getParamByRequestHeader(@RequestHeader("token") String token) {
            log.info("token:{}", token);
            return Result.success(null);
        }
    }
    

    📌📌📌注意:当header中不存在该参数时,系统会抛出的异常。

  • 获取header对象

    @RestController
    @RequestMapping("/user")
    @Slf4j
    public class UserController {
        @GetMapping("/param/requestHeader")
        public Result<User> getParamsByRequestHeader(@RequestHeader HttpHeaders headers) {
            log.info("token:{}", headers.get("token"));
            return Result.success(null);
        }
    }
    

在这里插入图片描述

1.5 通过 @CookieValue 接收参数

  接受cookie参数,可以使用 @CookieValue 注解来接收

@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
    @GetMapping(value = "/param/cookie")
    public Result<User> getParamsByCookie(@CookieValue(name = "token") String token) {
        log.info("token:{}", token);
        return Result.success(null);
    }
}

在这里插入图片描述

二、Post 请求

2.1 以方法的形参接收参数

2.1.1 RequestParam 注解接收参数

  参数用 @RequestParam 标注,用于将HTTP请求参数绑定到方法的参数上,这是最基本的一种。它可以帮助开发者轻松地获取和处理请求参数,从而简化控制器方法的编写。注意:这种方式一般适用参数比较少的情况,而且被 @RequestParam 标注的参数,需要必传,否则会报错。

@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
    @PostMapping("/param/query")
    public Result<User> postParamByQuery(@RequestParam String name, @RequestParam String phone) {
        log.info("name:{}", name);
        log.info("phone:{}", phone);
        return Result.success(null);
    }
}

在这里插入图片描述

📌📌注:和 Get 请求一样,如果方法形参用 @RequestParam 注解标注,表示这个参数需要必传。

2.1.2 通过 Map 接收参数

@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
    @PostMapping("/param/multi")
    public Result<User> postParamByMulti(@RequestParam Map<String, Object> map) {
        System.out.println(map);
        System.out.println(map.get("name"));
        return Result.success(null);
    }
}

在这里插入图片描述

2.2 通过 HttpServletRequest 接收参数

  在方法的形参中定义 HttpServletRequest,通过原生的 HttpServletRequest 对象手动获取请求参数。【不推荐】

@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
    @PostMapping("/param/httpServletRequest")
    public Result<User> postParamByHttpServletRequest(HttpServletRequest httpServletRequest) {
        log.info("name:{}", httpServletRequest.getParameter("name"));
        log.info("phone:{}", httpServletRequest.getParameter("phone"));
        return Result.success(null);
    }
}

在这里插入图片描述

2.3 以实体类接收参数

2.3.1 通过 param 提交参数

@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
    @PostMapping("/param/bean")
    public Result<User> postParamByBeanObject(User user) {
        log.info("name:{}", user.getUserName());
        log.info("phone:{}", user.getPhone());
        return Result.success(null);
    }
}

在这里插入图片描述

📌📌注:Post 请求以实体类接收参数时,不能用 @RequestParam 注解进行标注,因为不支持这样的方式获取参数。

2.3.2 请求体以 form-data 提交参数

  form-data 是表单提交的一种方式,比如常见的登录请求。

@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
    @PostMapping("/param/form-data")
    public Result<User> postParamByFormData(User user) {
        log.info("name:{}", user.getUserName());
        log.info("phone:{}", user.getPhone());
        return Result.success(null);
    }
}

2.3.3 请求体以 x-www-form-urlencoded 提交参数

  x-www-form-urlencoded 也是表单提交的一种方式,只不过提交的参数被进行了编码,并且转换成了键值对。

@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
    @PostMapping("/param/urlencoded")
    public Result<User> postParamByUrlencoded(User user) {
        log.info("name:{}", user.getUserName());
        log.info("phone:{}", user.getPhone());
        return Result.success(null);
    }
}

在这里插入图片描述

2.4 通过 @PathVariable 注解进行接收

  @PathVariable 注解可用于处理请求 URI 映射中的模板变量,并将其绑定到 Controller 方法参数。注意:若方法参数名称和需要绑定的url中变量名称一致时,可以简写;若方法参数名称和需要绑定的url中变量名称不一致时,则需要转换。例如:

@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
    @PostMapping("/param/PathVar/{name}")
    public Result<User> getParamByPathVar(@PathVariable String name) {
        log.info("name:{}", name);
        return Result.success(null);
    }
}

在这里插入图片描述

2.5 通过 @RequestBody 注解接收参数

📌📌注:@RequestBody 注解主要用来接收前端传过来的请求体中的参数,并将其映射到一个对象上,需要使用POST请求,不能使用 Get 请求。

2.5.1 接收实体类参数

  以实体类的方式接收body 的数据 【最常用】。

@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
    @PostMapping("/param/requestBody/bean")
    public Result<User> postRequestBodyParamByBean(@RequestBody User user) {
        log.info("name:{}", user.getUserName());
        log.info("phone:{}", user.getPhone());
        return Result.success(null);
    }
}

在这里插入图片描述

2.5.2 接收数组和集合

@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
    @PostMapping("/param/array")
    public Result<User> postRequestBodyParamByArray(@RequestBody String[] names) {
        Arrays.asList(names).forEach(System.out::println);
        return Result.success(null);
    }
}
@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
    @PostMapping("/param/collection")
    public Result<User> postRequestBodyParamByCollection(@RequestBody List<String> names) {
        names.forEach(System.out::println);
        return Result.success(null);
    }
}

在这里插入图片描述

2.5.3 通过 Map 接收参数

  以Map的方式接收body 的数据。

@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
    @PostMapping("/param/map")
    public Result<User> postRequestBodyParamByMap(@RequestBody Map<String, Object> map) {
        System.out.println(map);
        System.out.println(map.get("name"));
        return Result.success(null);
    }
}

在这里插入图片描述

2.5.4 接收一个参数

  以字符串的方式接收 body 的数据。

@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
    @PostMapping("/param/")
    public Result<User> postRequestBodyParam(@RequestBody String name) {
        System.out.println(name);
        return Result.success(null);
    }
}

在这里插入图片描述

三、Delete 请求

3.1 以方法形参接收参数

@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
    @DeleteMapping("/param/query")
    public Result<User> deleteParamByQuery(@RequestParam String name) {
        System.out.println(name);
        return Result.success(null);
    }
}

在这里插入图片描述

3.2 以实体类接收参数

📌📌注:需要用 @RequestBody 注解,否则接收的参数为 null。

@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
    @DeleteMapping("/param/bean")
    public Result<User> deleteParamByBean(@RequestBody User user) {
        System.out.println(user);
        return Result.success(null);
    }
}

在这里插入图片描述

3.3 以 map 接收参数

📌📌注:需要用 @RequestBody 注解,否则接收的参数为 null。

@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
    @DeleteMapping("/param/map")
    public Result<User> deleteRequestBodyParamByMap(@RequestBody User user) {
        System.out.println(user);
        return Result.success(null);
    }
}

在这里插入图片描述

3.4 @PathVariable 接收参数

@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
    @DeleteMapping("/param/{name}")
    public Result<User> deleteParamByPathVar(@PathVariable String name) {
        System.out.println(name);
        return Result.success(null);
    }
}

在这里插入图片描述

四、Put 请求

五、附录

5.1 @RequestParam

  除了基本用法,@RequestParam还支持一些高级特性,帮助开发者更灵活地处理请求参数。

  • 指定参数名:在某些情况下,请求参数的名称与方法参数的名称不一致。可以通过 @RequestParam 注解的 value 属性指定请求参数的名称:

    @GetMapping("/info")
    public String sayHello(@RequestParam(value = "userName") String name) {
        return "Hello, " + name + "!";
    }
    
  • 设置默认值:在某些情况下,请求参数可能不存在或为空。可以通过 @RequestParam 注解的 defaultValue 属性设置默认值,表示如果请求中没有同名参数时的默认值。

    @GetMapping("/hello")
    public String sayHello(@RequestParam(value = "userName", defaultValue = "World") String name) {
        return "Hello, " + name + "!";
    }
    
  • 处理可选参数:在某些情况下,请求参数是可选的。可以通过 @RequestParam 注解的 required 属性设置参数是否为必填项,默认是true,表示请求中一定要有相应的参数,否则将异常;

    @GetMapping("/hello")
    public String sayHello(@RequestParam(value = "userName", required = false) String name) {
        if (name == null) {
            name = "World";
        }
        return "Hello, " + name + "!";
    }
    
  • 处理多个参数:在某些情况下,可能需要处理多个请求参数。可以通过多个 @RequestParam 注解来实现:

    @GetMapping("/greet")
    public String greet(@RequestParam String name, @RequestParam int age) {
        return "Hello, " + name + "! You are " + age + " years old.";
    }
    
  • 处理Date类型的参数:在某些情况下,请求参数可能是Date类型的,这个时候就需要加注解 @DateTimeFormat

    @GetMapping("/greet")
    public String greet(
    	@RequestParam(value="starTime", required= alse) @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") Date starTime,
    	@RequestParam(value="endTime", required= alse) @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") Date endTime) {
        
    }
    

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何从huggingface下载

我尝试了一下若干步骤&#xff0c;莫名奇妙就成功了 命令行代理 如果有使用魔法上网&#xff0c;可以使用命令行代码&#xff0c;解决所有命令行连不上外网的问题&#xff1a; #配置http git config --global http.proxy 127.0.0.1:xxxx git config --global https.proxy 127…

Redis入门第二步:Redis数据类型详解

摘要&#xff1a; 欢迎继续跟随《Redis新手指南&#xff1a;从入门到精通》专栏的步伐&#xff01;在本文中&#xff0c;我们将深入探讨Redis支持的各种数据类型&#xff0c;这些类型是Redis强大功能的核心。通过学习不同的数据类型&#xff0c;你将能够根据具体的应用需求选择…

Sping源码:三级缓存

目录 一、概念1、三级缓存的作用2、循环依赖的含义 二、代码1、代码下载2、文件功能介绍3、源码分析3.1、找到获取A对象的位置&#xff0c;打断点进行debug操作3.2、一步步找到在A对象中注入B对象的位置3.3、一步步找到B对象注入A对象的位置3.4、往下找到通过三级缓存解决循环依…

综合绩效考核系统源码,三级医院绩效管理系统源码,基于springboot、mybaits+avue技术开发,支持项目二开。

医院综合绩效考核系统源码 商业项目源码&#xff0c;支持二次开发 采用多维度综合绩效考核的形式&#xff0c;针对院内实际情况分别对工作量、KPI指标、科研、教学、管理等进行全面考核。医院可结合实际需求&#xff0c;对考核方案中各维度进行灵活配置&#xff0c;对各维度的权…

MPS---MP87180芯片layout设计总结

今天是一个特殊的日子&#xff0c;十一节前最后一天了&#xff0c;小编我还在迪拜出差中&#xff0c;而且组内也就剩下我一个人在值班了&#xff0c;来自韩国首尔的测试同事杰总提前一周就回韩国了&#xff0c;EE同事龟田一郎桑也是提前三天回日本东京去了&#xff0c;只有我最…

Brave编译指南2024 MacOS篇-构建与运行(六)

引言 在上一篇文章中&#xff0c;我们成功初始化了Brave浏览器的构建环境。现在&#xff0c;我们进入了这个编译指南的核心部分&#xff1a;实际构建Brave浏览器并运行它。这个过程将把我们之前准备的所有源代码和依赖项转化为一个可运行的浏览器实例。 1. 编译Brave浏览器 …

C++—vector的使用及实现

✨✨ 欢迎大家来到小伞的大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C学习 小伞的主页&#xff1a;xiaosan_blog 1.vector 1.1vector的介绍 cplusplus.com/reference/vector/vector/ 1.2vecto…

wpa_cli支持EAP-TTLS认证运行设计

wpa_cli支持EAP-TTLS认证运行设计 1 输入 1.1 启动wpa_supplicant 和 wpa_cli 在OpenHarmony开发板或华为开发机的命令行中输入 wpa_supplicant -Dnl80211 -c/data/service/el1/public/wifi/wpa_supplicant/wpa_supplicant.conf -gabstract:/data/service/el1/public/wifi/s…

【D3.js in Action 3 精译_026】3.4 小节 DIY 实战:基于 Mocha 在浏览器客户端测试 D3 线性比例尺

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一部分 D3.js 基础知识 第一章 D3.js 简介&#xff08;已完结&#xff09; 1.1 何为 D3.js&#xff1f;1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践&#xff08;上&#xff09;1.3 数据可…

力扣(leetcode)每日一题 2286 以组为单位订音乐会的门票 | 线段树

2286. 以组为单位订音乐会的门票 题干 一个音乐会总共有 n 排座位&#xff0c;编号从 0 到 n - 1 &#xff0c;每一排有 m 个座椅&#xff0c;编号为 0 到 m - 1 。你需要设计一个买票系统&#xff0c;针对以下情况进行座位安排&#xff1a; 同一组的 k 位观众坐在 同一排座…

物联网实训室建设的必要性

物联网实训室建设的必要性 一、物联网发展的背景 物联网&#xff08;IoT&#xff09;是指通过信息传感设备&#xff0c;按照约定的协议&#xff0c;将任何物品与互联网连接起来&#xff0c;进行信息交换和通信&#xff0c;以实现智能化识别、定位、跟踪、监控和管理的一种网络…

c语言实例 068

大家好&#xff0c;欢迎来到无限大的频道 今天给大家带来的是c语言。 题目描述 创建一个单链表&#xff0c;进行存储数据并且打印 创建一个单链表的基本步骤包括定义链表节点的结构体、实现插入数据的功能&#xff0c;以及打印链表的内容。以下是一个简单的C语言示例&#…

QT将QBytearray的data()指针赋值给结构体指针变量后数据不正确的问题

1、问题代码 #include <QCoreApplication>#pragma pack(push, 1) typedef struct {int a; // 4字节float b; // 4字节char c; // 1字节int *d; // 8字节 }testStruct; #pragma pack(pop)#include <QByteArray> #include <QDebug>int main() {testStruct …

【C++前缀和 数论 贪心】2245. 转角路径的乘积中最多能有几个尾随零|2036

本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 质数、最大公约数、菲蜀定理 贪心&#xff08;决策包容性) LeetCode2245. 转角路径的乘积中最多能有几个尾随零 给你一个二维整数数组 grid &#xff0c;大小为 m x …

【有啥问啥】二分图(Bipartite Graph)算法原理详解

二分图&#xff08;Bipartite Graph&#xff09;算法原理详解 引言 二分图&#xff08;Bipartite Graph&#xff09;&#xff0c;又称二部图&#xff0c;是图论中的一个重要概念。在实际应用中&#xff0c;二分图模型经常用于解决如匹配问题、覆盖问题和独立集问题等。本文将…

实验2思科网院项目2.7.2-packet-tracer---configure-single-area-ospfv2---实践练习

实践练习 2.7.2-packet-tracer---configure-single-area-ospfv2---实践练习physical-mode 实验拓扑 相关设备配置 实验目标: 第 1 部分&#xff1a;构建网络并配置设备的基本设置 第 2 部分&#xff1a;配置和验证单区域 OSPFv2 的基本部署 第 3 部分&#xff1a;优化和验…

【STM32】 TCP/IP通信协议(3)--LwIP网络接口

LwIP协议栈支持多种不同的网络接口&#xff08;网卡&#xff09;&#xff0c;由于网卡是直接跟硬件平台打交道&#xff0c;硬件不同则处理也是不同。那Iwip如何兼容这些不同的网卡呢&#xff1f; LwIP提供统一的接口&#xff0c;底层函数需要用户自行完成&#xff0c;例如网卡的…

动态时钟控件:Qt/C++ 项目代码解读

基于Qt的动态时钟控件项目。该项目展示了如何通过Qt的绘图系统绘制一个带有表盘背景、时针、分针、秒针、以及时间日期显示的时钟。同时&#xff0c;这个时钟控件支持背景切换&#xff0c;并且每秒钟刷新一次&#xff0c;实时显示当前时间。 项目结构与功能概述 该时钟控件主…

Redis接口访问优化

说明&#xff1a;之前写过一篇使用Redis接口访问的博客&#xff0c;如下。最近有相关需求&#xff0c;把代码拿出来后&#xff0c;做了一些优化&#xff0c;挺有意思的&#xff0c;本文介绍在原基础上 使用Redis实现接口防抖 优化 总的来说&#xff0c;这次使用Redis实现接口…

自动驾驶汽车横向控制方法研究综述

【摘要】 为实现精确、稳定的横向控制&#xff0c;提高车辆自主行驶的安全性和保障乘坐舒适性&#xff0c;综述了近年来自动驾驶汽车横向控制方法的最新进展&#xff0c;包括经典控制方法和基于深度学习的方法&#xff0c;讨论了各类方法的性能特点及在应用中的优缺点&#xff…