10000 字详细讲解 Spring 中常用注解及其使用

news2024/12/28 3:20:29

如下图京东购物页面,当我们选择点击访问某一类商品时,就会向后端发起 HTTP 请求,当后端收到请求时,就会找到对应的代码逻辑对请求进行处理,那么,后端是如何来查找处理请求相对应的代码呢?答案就是:通过注解来寻找,同时,注解也有其他很多的功能,也分成了很多的注解,下面就来讲解一些网站开发中,一些常见的,使用频率比较高的注解。

在这里插入图片描述

文章目录

  • 建立连接
  • 使用注解处理请求
    • 传递单个参数
    • 传递多个参数
    • 后端参数重命名(@RequestParam)
    • 传递对象
    • 传递数组
    • 传递集合
    • 传递 JSON 数据
      • JSON 字符串和 JAVA 对象的互转
    • 获取 URL 中的参数(@PathVariable)
    • 上传文件(@RequestPart)
    • 获取 Cookie
  • 获取 Session
    • 获取 Header
  • 处理响应
    • 返回静态页面
    • @ResponseBody
    • 响应中 body 的类型
    • 设置状态码

建立连接

既然 客户端 和 服务器 想要进行交互,就需要先建立起连接,而这个建立连接,就相当于在客户端和服务器之间建立了一个桥梁,能够让客户端发起的请求,通过这个桥梁,找到后端对应的处理请求的代码,所以就需要使用以下两个注解:

  • @RequestMapping
  • @RestController
  1. @RequestMapping

@RequestMapping 是 Spring MVC 中最常用的注解之一,用来进行路由映射。

路由映射:当用户访问一个 URL 时,将用户的请求对应到后端代码中的某一个类中的某一个方法。

例如:当服务器收到请求为 127.0.0.1:8080/m1 时,在后端就会映射到 /m1 所修饰的方法,然后进行处理,返回响应,如下图:

在这里插入图片描述

🚼注意:

@RequestMapping 中进行映射的参数不需要一定和方法名相同,但是,一定要和URL中的相同

在这里插入图片描述

既然有 @RequestMapping 了,那么为什么还要使用 @RestController 呢?

因为,当客户端发来请求时,Spirng 会根据请求扫描后端的代码,从而找到处理请求所对应的方法,但是,在扫描时,只会对 Spring 管理的对象进行扫描,所以,@RestController 注解其中一个作用就是,将该类交给 Spring 管理。

@RequestMapping 既可以修饰方法,也可以修饰类,如下图:

在这里插入图片描述

  • @RequestMapping 修饰类时,表示请求路径的初始信息
  • @RequestMapping 修饰方法时,表示请求路径的具体信息
  • RequestMapping 同时修饰类和方法时,访问时的路径就是 类路径 + 方法路径

最好是同时修饰类和方法,因为,根据请求调用对应的方法时,如果没有使用 @RequestMapping 修饰类的话,会在所有的类中逐个寻找,会拉低效率,没有修饰方法的,反之,@RequestMapping 修饰类,会先根据路径的初始信息确定是哪个类,然后在这一个类中寻找。

🚼注意:路径中,加不加 ‘/’ 都可以,但习惯上都是会加上

使用注解处理请求

传递单个参数

以下的讲解,均使用 Postman 工具来模拟前端发送的请求。

@RestController
@RequestMapping("/main1")
public class Main1 {
    @RequestMapping("/m1")
    public String m1(String name){
        return "name:" + name;
    }
}

🚼注意:

在这里插入图片描述

🚼注意:当传递的参数为基本数据类型,在后端接受时,尽量使用包装类型,否则可能会出现 500 这样的错误,如下图:

如下图,后端的形参为基本数据类型时,在不进行传参的情况下,就会报错。

在这里插入图片描述

将形参改换成包装类,即使前端不进行传参,后端也不会报错,如下图:

在这里插入图片描述

传递多个参数

    @RequestMapping("/m2")
    public String m2(String userName, Integer password) {
        return "userName:" + userName + "\npassword:" + password;
    }

在这里插入图片描述

🚼注意:当有多个参数时,前后端进行参数匹配时,是根据参数名进行匹配的,和参数的顺序无关

@RequestMapping 处理的是 GET 请求,还是 POST 请求呢?

下面通过实验来验证:

验证方法:通过 Postman 工具发送请求

1 . 发送 GET 请求

在这里插入图片描述

  1. 发送 POST 请求

在这里插入图片描述

结论:从上述演示结果得出,@RequestMapping 既支持 GET 请求,又支持 POST 请求。

那么,如果想要指定只能接收 GET / POST 请求时,可以对 @RequestMapping 进行参数设置,将 method 设置成指定的请求方法,如下图:

限制后端只能接收 GET 请求,发送POST请求就会报错

    @RequestMapping(value = "/m1",method = RequestMethod.GET)
    public String m1(Integer age){
        return "age:" + age;
    }

在这里插入图片描述

后端参数重命名(@RequestParam)

上面讲过,请求中的参数名必须和方法的形参名相同,否则无法获取到请求中的参数,但是,如果想要两者不相同,可以使用 @RequestParam 注解,如下图:

@RestController
@RequestMapping("/main1")
public class Main1 {
    @RequestMapping("/m1")
    public String m1(@RequestParam("name") String NAME){
        return "name:" + NAME;
    }
}

在这里插入图片描述

🚼注意:当使用 @RequestParam 进行修饰时,为必传参数,如果前端不传参数,那么就会报错,如下图:

在这里插入图片描述

解决办法:将 @RequestParam 中的 required 参数,设置为 false,即使不传参,也不会报错

在这里插入图片描述

传递对象

  1. 先创建一个 User 对象
public class User {
    private String name;
    private Integer age;
    private Integer id;

    public String getName(String name) {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", id=" + id +
                '}';
    }
}
  1. 设置形参类型为 User
    @RequestMapping("/m3")
    public String m3(User user) {
        return user.toString();
    }

在这里插入图片描述

传递数组

 @RequestMapping("/m4")
    public String m4(String[] array) {
        return Arrays.toString(array);
    }

在这里插入图片描述

传递数组时,形参同样也可以使用@RequestParam进行重命名

传递集合

当传递的参数有多个值时,默认情况下是封装到数组中的,如果想要封装到集合中,需要使用 @RequestParam 注解进行绑定,如下图:

    @RequestMapping("/m5")
    public String m5(@RequestParam List<String> list) {
        return list.toString();
    }

在这里插入图片描述

传递 JSON 数据

JSON就是⼀种数据格式,有⾃⼰的语法,它是使⽤⽂本表⽰⼀个对象或数组的信息,因此JSON本质是字符串.主要负责在不同的语⾔中进行数据传递和交换.

JSON 字符串和 JAVA 对象的互转

**在不使用SpringMVC的情况下,进行互转需要引入jackson依赖,但在Spring MVC框架中,已经把这个依赖给引入进来了,所以我们直接使用即可 **

jackson-databind 依赖

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.5</version>
</dependency>
  1. 不使用注解的情况
 @RequestMapping("/m6")
    public String m6() throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();
        User user = new User();
        user.setName("李四");
        user.setAge(18);
        user.setId(1);
        //JAVA 对象转 JSON 字符串
        String json = objectMapper.writeValueAsString(user);
        System.out.println(json);

        //JSON 字符串转 JAVA 对象
        User user1 = objectMapper.readValue(json, User.class);
        System.out.println(user1.toString());
        return "转换成功";

    }
  • JSON 字符串转成 JAVA 对象,使用 readValue()
  • JAVA 对象转成 JSON 字符串,使用writeValueAsString()
  1. 使用 @RequestBody 注解

    将客户端传来的 json 对象转换成 Java 对象

    @RequestMapping("/m7")
    public String m7(@RequestBody User user){
        return user.toString();
    }

在这里插入图片描述

获取 URL 中的参数(@PathVariable)

这个注解的作用是获取请求URL中的参数,如下图:

    @RequestMapping("/m8/{name}/{age}")
    public String m8(@PathVariable String name, @PathVariable Integer age){
        return "name:" + name + ",age" + age;
    }

在这里插入图片描述

在这里插入图片描述

  • 方法的形参名和URL中的变量名一致时,不需要给 @PathVariable 中的Value属性赋值,不一致时,则需要进行赋值,类似于重命名操作
    @RequestMapping("/m8/{name}/{age}")
    public String m8(@PathVariable String name, @PathVariable("age") Integer AGE){
        return "name:" + name + ",age" + AGE;
    }

上传文件(@RequestPart)

    @RequestMapping("/m9")
	//如果后端参数的名字和请求中的参数名字不一致,可以在注解中重命名
    public String m9(@RequestPart("file")MultipartFile file) throws IOException {
        //获取文件名称
        String fileName = file.getOriginalFilename();
        //文件上传到指定路径
        file.transferTo(new File("D:/gitee/" + fileName));
        return "接收到的文件名称为:" + fileName;
    }

在这里插入图片描述

获取 Cookie

1.传统方式获取Cookie

@RequestMapping("/getCookie1")
    public String getCookie1(HttpServletRequest request) {
        Cookie[] cookies = request.getCookies();
        StringBuilder stringBuilder = new StringBuilder();
        //判断 cookies 是否为空
        if(cookies != null) {
            for(Cookie cookie : cookies) {
                stringBuilder.append(cookie.getName() + ":" + cookie.getValue() );
            }
            return stringBuilder.toString();
        }
        retu

在这里插入图片描述

Spring MVC 是基于Servlet API 构建的原始web框架,是在Servlet 的基础上实现的,而 HttpServletRequest ,HttpServletResponse 是Servlet 实现的两个类,所以,是 SpringMVC的方法的内置对象,需要使用时,直接在方法中添加声明即可;

HttpServletRequest 对象代表客户端的请求,当客户通过Http协议进行访问时,HTTP请求头中所有的信息都被封装到了这个对象中,通过这个对象提供的方法,即可获得请求头中的信息;

HttpServletResponse 对象代表了服务端的响应,Http 响应的信息都被封装到了这个对象中,通过这个对象提供的方法,即可获取到对应得信息,例如:状态码

2.简洁方式获取Cookie

使用 @CookieValue 注解

 @RequestMapping("/getCookie2")
    public String getCookie2(@CookieValue("cookie1") String cookie) {
        return "cookie:" + cookie;
    }

在这里插入图片描述

这两种方式的不同点在于,使用传统方式,可以获取到所有的Cookie 内容,使用注解的方式,只能获取到指定的Cookie;

获取 Session

在获取Session之前,需要先设置Session

 //设置session
    @RequestMapping("/setSession")
    public String setSession(HttpServletRequest request) {
        HttpSession session = request.getSession();
        if(session != null) {

            session.setAttribute("userName", "张三");
        }
        return "session 设置成功";
    }
  1. 传统方式获取Session
    //传统方式获取session
    @RequestMapping("/getSession1")
    public String getSession1(HttpServletRequest request) {
        HttpSession session = request.getSession();
        if(session != null) {
            String userName = (String)session.getAttribute("userName");
            return "userName:" + userName;
        }
        return "Session为空";
    }

在这里插入图片描述

HttpServletRequest 提供两个获取Session的方法:

  • getSession(boolean flag)
  • getSession()

getSession(boolean flag),当flag为true时,服务器就算没有Session,该方法也会自动创建一个空的Session,不会发生Session为null的情况;当flag为false时,如果服务器没有Session,该方法不会自动创建Session,会返回一个null。

getSession() 默认情况下为 true

  1. 简介方式(1)获取Session
  //简介方式(1)获取session
    @RequestMapping("/getSession2")
    public String getSession2(HttpSession session) {
        if(session != null) {
            String userName = (String)session.getAttribute("userName");
            return "userName:"+userName;
        }
        return "没有指定的session值";
    }

直接使用内置对象 HttpSession,默认情况也是 true

  1. 简介方式(2)获取Session
    @RequestMapping("/getSession3")
    public String getSession3(@SessionAttribute(value = "userName", required = false) String userName) {
        if(userName == null) {
            return "Session为空";
        }
        return "userName:" + userName;
    }

这是使用注解的方式,value值代表了要获取的Session,,required 值代表了在没有Session的情况下,是否要自动创建;

获取 Header

1.传统获取 Header

获取 Header 也是从 HttpServletRequest 中获取,代码如下:

    //获取header值
    @RequestMapping("/getHeader1")
    public String getHeader(HttpServletRequest request) {
        String header = request.getHeader("user-Agent");
        return "user-Agent:" + header;
    }

getHeader() 方法中的参数值代表的是请求头中的键值对中的“key”。

下图通过 Fiddler 抓包可以看到,使用浏览器发送请求时,请求头中的“user-Agent”值,正是我们通过代码获取到的。

在这里插入图片描述

2.简洁方式@RequestHeader

    @RequestMapping("/getHeader2")
    public String getHeader(@RequestHeader("user-Agent") String header) {
        return "user-Agent:" + header;
    }

注解中的参数表示的是请求头中的“key”

处理响应

在上面的代码中,我们演示了针对请求的处理以及请求头的设置,并且响应的都是我们设置的数据,而响应不仅仅可以是数据,也可以是静态页面,也可以针对响应设置响应码,响应头等

返回静态页面

1.先创建出一个静态页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Index⻚⾯</title>
</head>
<body>
Hello,Spring MVC,我是Index⻚⾯.
</body>
</html>

在这里插入图片描述

在这里插入图片描述

静态页面代码或者是前端代码,需要保存在static中

接下来通过代码获取静态页面:

@RestController
@RequestMapping("/main2")
public class Main2 {
    @RequestMapping("/getIndex")
    public String getIndex() {
        return "/index.html";
    }
}

在这里插入图片描述

通过响应可以看出来,我们想要的是一个静态页面,但是它给我们返回的却是一个数据,那怎么样才能让MVC给我们返回一个页面呢?

解决方法:将 @RestContrlller 修改成 @Controller

@Controller
@RequestMapping("/main2")
public class Main2 {
    @RequestMapping("/getIndex")
    public String getIndex() {
        return "/index.html";
    }
}

在这里插入图片描述

@RestController 和 Controller 有什么联系呢?

随着互联网的发展,前后端分离的开发方法方式成为主流,后端人员不需要再关注前端代码,只需要将后端处理过的数据返回即可;

@RestController 表示的就是返回一个数据

@RestController = @Controller + @RequestBody

@Controller 表示定义一个控制器,在项目启动时,将@Controller修饰的对象交给Spring管理

@ResponseBody 定义返回的数据为非视图,而是数据

以下是 @RestController 的源码:;

可以看到,RestController 是被 @Controller 和 @ResponseBody 修饰的,想要返回页面,去掉 @ResponseBody 即可,也就是@Controller

在这里插入图片描述

@ResponseBody

@ResponseBody 即是类注解,也是方法注解,当@ResponseBody 修饰类时,表示该类所有的方法返回的都是数据,修饰单个方法时,表示该方法返回的是数据。所以,使用@RestController 修饰时,表示所有的方法都加上了@ResponseBody ,所以返回的都是数据,如果在一个类中,既有返回页面和数据的,就可以使用@Controller 修饰类,在需要返回数据的方法上使用 @ResponseBody 进行修饰即可;

响应中 body 的类型

如果代码中含有 html 片段,在返回时,返回的数据类型也自动设置成 html 类型

@RestController
@RequestMapping("/main2")
public class Main2 {
    @RequestMapping("/getHtml")
    public String getHtml() {
        return "<h1>Hello,HTML~</h1>";
    }
}

在这里插入图片描述

响应中的Content-type 类型可以根据响应的数据类型,自动进行设置,响应中的 Content-Type 的类型主要分为以下几种:‘

如果请求的是html文件,body数据格式就是 html,上面已经演示过

如果请求的是 js 文件,那么响应中 body 的数据类型就是 application/JavaScript

如果请求的是 css 文件,那么响应中 body 的数据类型就是 application/css

@Controller
@RequestMapping("/main2")
public class Main2 {
    
    @RequestMapping("/getCss")
    public String getCss() {
        return "/b.css";
    }

}

在这里插入图片描述

在上面的传递json标题中,已经讲解了如何使用 ObjectMapper 类 将java对象转成json格式数据,这只是转json的一种方法,如果返回的数据是 哈希表,body 也是 json 格式,如下代码:

    @ResponseBody
    @RequestMapping("/getMap")
    public Map<String,Integer> getMap() {
        Map<String, Integer> map = new HashMap<>();
        map.put("张三", 10);
        map.put("李四", 11);
        map.put("王五", 12);
        return map;
    }

在这里插入图片描述

设置状态码

使用MVC中内置的 HttpServletResponse对象提供的方法对响应中的状态码进行设置,代码如下:

    @RequestMapping("setStatus")
    public String setStatus(HttpServletResponse response) {
        response.setStatus(404);
        return "/index.html";
    }

在这里插入图片描述

有人可能就会有疑问了,状态码不是已经设置成了 404 吗,为什么还能够访问到页面,这里需要注意,返回的页面和404是没有任何关系的,就比如我们发起请求后,在后端找不到对应的代码,就会返回一个404页面,还有,例如在哔哩哔哩上,我们发起一个错误的请求,它就会给我们返回一个哔哩哔哩的404页面,如下图:
在这里插入图片描述

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

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

相关文章

JRT1.6发布

经过51的三天努力&#xff0c;完成基于JRT的质控核心部分。框架部分已经达到了第一个可生产版本。 可生产包括以下部分&#xff1a; 1.Web开发基础和发布运维基础 2.Linux和WIndows客户端浏览器 3.Linux和WIndows客户端打印导出程序 4.Linux和WIndows初始化程序 5.Linux和WInd…

调用第三方接口——支付宝付款

沙箱环境是支付宝开放平台为开发者提供的用于接口开发及主要功能联调的模拟环境。 参考 登录 - 支付宝 在沙箱环境下&#xff0c;已经分配好了用于模拟测试的应用信息、商家信息、买家信息等 小程序文档 - 支付宝文档中心 内网穿透&#xff08;支付宝付款需要在公网进行检查…

谁能取代迈巴赫,征服互联网安全大佬周鸿祎?

‍作者 |老缅 编辑 |德新 4月18日&#xff0c;「周鸿祎卖车」登上了微博热搜。这位360创始人、董事长发微博称&#xff1a;自己做了一个艰难的决定&#xff0c;将把陪伴9年的迈巴赫600给卖掉。 随后&#xff0c;他解释道&#xff1a;「这是因为我需要体验新一代车的感觉。古人…

从零开始学RSA: [WUSTCTF2020]情书等5题

1 [WUSTCTF2020]情书 题目 Premise: Enumerate the alphabet by 0、1、2、..... 、25 Using the RSA system Encryption:0156 0821 1616 0041 0140 2130 1616 0793 Public Key:2537 and 13 Private Key:2537 and 937flag: wctf2020{Decryption}解题 前提&#xff1a;用0、…

C++初阶学习第五弹——类与对象(下)——类与对象的收官战

类与对象&#xff08;上&#xff09;&#xff1a;C初阶学习第三弹——类与对象&#xff08;上&#xff09;——初始类与对象-CSDN博客 类与对象&#xff08;中&#xff09;&#xff1a;C初阶学习第四弹——类与对象&#xff08;中&#xff09;——刨析类与对象的核心点-CSDN博…

Linux环境下的事件驱动力量:探索Libevent的高性能I/O架构

hello &#xff01;大家好呀&#xff01; 欢迎大家来到我的Linux高性能服务器编程系列之《Linux环境下的事件驱动力量&#xff1a;探索Libevent的高性能I/O架构》&#xff0c;在这篇文章中&#xff0c;你将会学习到Libevent的高性能I/O原理以及应用&#xff0c;并且我会给出源码…

攻防世界-xff-referer

题目信息 分析过程 显示ip必须为123.123.123.123&#xff0c;则进行伪造 解题过程 打开repeator 提示必须来自https://www.google.com&#xff0c;则再次构造Referer 相关知识 x-forwarded-for 和 referer的区别: x-forwarded-for 用来证明ip的像是“127.0.0.1”这种&a…

为什么感觉没有效果

以前在辅导小儿作业的时候&#xff0c;我会在常用的搜索引擎里去寻找答案&#xff0c;一般情况下都能解决问题。 但是最近一段时间&#xff0c;我发现&#xff0c;搜索引擎搜出来的结果还没有利用短视频搜出来的答案更全面&#xff0c;短视频软件不仅可以显示AI整理出来的答案…

“先锋”西凤

执笔 | 文 清 编辑 | 古利特 制曲是酿酒的第一道工序&#xff0c;也是中国酿酒史上的一大创新&#xff0c;对白酒风味的影响至关重要。西凤酿酒人坚信“曲是酒之骨”&#xff0c;“曲”的品质决定酒的“骨气”&#xff0c;“酒曲”是酒体形成主题风味的基本定型元素和催化剂…

5分钟学会掼蛋

一、基本规则 1、用牌&#xff1a;总计108张&#xff0c;每人发牌27张。 2、牌型&#xff1a;八炸弹、七炸弹、六炸弹、五炸弹、四炸弹、天王炸、同花顺、顺子、钢板、三同张、三带二、单牌、对牌、三连对&#xff0c;注意掼蛋没有三带一的牌型。3、牌型大小&#xff1a;天王炸…

跟TED演讲学英文:What moral decisions should driverless cars make by Iyad Rahwan

What moral decisions should driverless cars make? Link: https://www.ted.com/talks/iyad_rahwan_what_moral_decisions_should_driverless_cars_make Speaker: Iyad Rahwan Date: September 2016 文章目录 What moral decisions should driverless cars make?Introduct…

electron 通信总结

默认开启上下文隔离的情况下 渲染进程调用主进程方法&#xff1a; 主进程 在 main.js 中&#xff0c; 使用 ipcMain.handle&#xff0c;添加要处理的主进程方法 const { ipcMain } require("electron"); 在 electron 中创建 preload.ts 文件&#xff0c;从 ele…

LangChain框架学习总结

目录 一、简介 二、概念 三、组件具体介绍 3.1 Models 3.1.1 LLMs 3.1.2 Chat Models 3.1.3 Text Embedding Modesl 3.1.4 总结 3.2 Prompts 3.2.1 LLM Prompt Template 3.2.1.1 自定义PromptTemplate 3.2.1.2 partial PromptTemplate 3.2.1.3 序列化PromptTemplat…

Python使用割圆法求π值

三国时期刘徽提出的割圆法有多牛掰&#xff0c;看这个&#xff1a;刘徽割圆术到底做了什么&#xff1f; - 知乎 用Python实现的该算法代码如下&#xff1a; #!/usr/bin/env python """使用割圆法计算π值Usage::$ python calc_circle_pi.py 20 # 参数20是迭代…

【Kubernetes系统与CKA(D)考试经验】

文章目录 应用程序部署模式的发展历程传统部署模式虚拟化部署模式容器部署模式容器部署模式的好处容器部署的弊端 容器编排Kubernetes网址Kubernetes架构互联网架构体系云原生&#xff08;微服务容器化Devops不可变基础设施&#xff09;Kubernetes架构Kubernetes组件 Kubernete…

【Docker】★★★

docker 的网络模式 ●host模式&#xff1a;使用 --nethost 指定 容器与宿主机共享网络命名空间、ip和端口 ●container模式&#xff1a;使用 --netcontainer:NAME_or_ID 指定 新建的容器共享已有容器的网络命名空间、ip和端口 ●none模式&#xff1a;使用 --netnone 指定 不进行…

数据结构——链表专题2

文章目录 一、返回倒数第k 个节点二、链表的回文结构三、相交链表 一、返回倒数第k 个节点 原题链接&#xff1a;返回倒数第k 个节点 利用快慢指针的方法&#xff1a;先让fast走k步&#xff0c;然后fast和slow一起走&#xff0c;直到fast为空&#xff0c;最后slow指向的结点就…

如何利用现货黄金避险功能来交易?

黄金自古以来就是投资者青睐的具有规避风险功能的投资品种&#xff0c;现货黄金作为以黄金为投资标的物的品种&#xff0c;自然也具备了规避风险的功能。如果出现了风险事件&#xff0c;避险情绪会为现货黄金带来颇为可观的行情&#xff0c;所以我们需要懂得如何利用现货黄金的…

智能AI摄像头项目

项目概要 硬件说明&#xff1a;易百纳rv1126 38板&#xff0c;易百纳GC2053摄像头&#xff0c;拓展版&#xff08;自绘&#xff09;&#xff0c;屏幕驱动板&#xff08;自绘&#xff09;&#xff0c;3.1inch mipi屏&#xff0c;FT5316触摸屏 开发环境 硬件分析 开发环境及sd…

代码随想录训练营31day-动态规划4

一、完全背包&#xff08;参考博客&#xff09; 和01背包区别在于物品可以无限次放入背包。完全背包和01背包问题唯一不同的地方就是&#xff0c;每种物品有无限件。 因此在需要在遍历顺序上进行区别&#xff0c;参考代码随想录&#xff1a; 二、518.零钱兑换II 题目求的是组…