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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Cortex-A7 常用汇编指令

一、处理器内部数据传输指令 使用处理器做的最多事情就是在处理器内部来回的传递数据&#xff0c;常见的操作有&#xff1a; ①、将数据从一个寄存器传递到另外一个寄存器。 ②、将数据从一个寄存器传递到特殊寄存器&#xff0c;如 CPSR 和 SPSR 寄存器。 ③、将立即数传递到寄…

暴力破解pdf文档密码

首先安装pdfcrack工具包 apt install pdfcrack 默认密码字典存储在/usr/share/wordlists里&#xff0c;是gz文件&#xff0c;将它解压并copy到pdf目录 然后使用pdfcrack破解 密码在最后一行user-password的单引号里

深入理解计算机系统 家庭作业 2.62

#include <stdio.h> int int_shifts_are_arithmetic(); int main(void) { printf("%d",int_shifts_are_arithmetic()); } int int_shifts_are_arithmetic() { return!(~(-1>>(sizeof(int)))); }

黄金票据制作-新手向

黄金票据制作 文章目录 黄金票据制作0x01 前言0x02 黄金票据的制作一、靶场搭建二、收集制作信息获取域名称获取域SID值获取域用户krbtgt密码hash值 二、制作票据 0x03 验证票据有效性 0x01 前言 最近&#xff0c;我学习了内网渗透的相关知识&#xff0c;其中包括了黄金票据的…

Django详细教程(一) - 基本操作

文章目录 前言一、安装Django二、创建项目1.终端创建项目2.Pycharm创建项目&#xff08;专业版才可以&#xff09;3.默认文件介绍 三、创建app1.app介绍2.默认文件介绍 四、快速上手1.写一个网页步骤1&#xff1a;注册app 【settings.py】步骤2&#xff1a;编写URL和视图函数对…

阿里云2核4G云服务器支持多少人同时在线?并发数计算?

阿里云2核4G服务器多少钱一年&#xff1f;2核4G配置1个月多少钱&#xff1f;2核4G服务器30元3个月、轻量应用服务器2核4G4M带宽165元一年、企业用户2核4G5M带宽199元一年。可以在阿里云CLUB中心查看 aliyun.club 当前最新2核4G服务器精准报价、优惠券和活动信息。 阿里云官方2…

【隐私计算实训营006隐语PIR介绍及开发实践】

1. 隐语实现PIR总体介绍 隐匿查询&#xff08;Private Information Retrieval PIR&#xff09;定义 按服务器数量分类 单服务器方案&#xff08;Single Server&#xff09;多服务器方案&#xff08;Multi-Server&#xff09; 按查询类型分类 Index PIRKeyword PIR 隐语目前…

Chrome浏览器 安装Vue插件vue-devtools

前言 vue-devtools 是一个为 Vue.js 开发者设计的 Chrome 插件。它可以让你更轻松地审查和调试 Vue 应用程序。与普通的浏览器控制台工具不同&#xff0c;Vue.js devtools 专为 Vue 的响应性数据和组件结构量身定做。 1. 功能介绍 组件树浏览&#xff1a;这个功能可以让你查…

Map和List输入的两种不同json格式

一、List to json格式 [{"type":"top.lovemom.pojo.ESP8266","devicePosition":"家里的阳台","deviceRemark":"我的设备1","publicIp":"127.0.0.1","userEmail":"123bggb.to…

CCF-CSP认证考试 202212-3 JPEG 解码 100分题解

更多 CSP 认证考试题目题解可以前往&#xff1a;CSP-CCF 认证考试真题题解 原题链接&#xff1a; 202212-3 JPEG 解码 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 512.0MB 问题背景 四年一度的世界杯即将画上尾声。在本次的世界杯比赛中&#xff0c;视频助理裁判&…

【跟小嘉学 Linux 系统架构与开发】一、学习环境的准备与Linux系统概述

系列文章目录 【跟小嘉学 Linux 系统架构与开发】一、学习环境的准备与Linux系统介绍 文章目录 系列文章目录[TOC](文章目录) 前言一、Linux 概述1.1、GNU 与自由软件1.2、Linux是什么1.3、Linux 特色1.4、Linux的优缺点1.4.1、Linux 优点1.4.2、Linux 缺点 二、虚拟机介绍2.1…

SRS OBS利用RTMP协议实现音视频推拉流;WebRTC 屏幕直播分享工具

一、SRS OBS利用RTMP协议实现音视频推拉流 参考&#xff1a;https://ossrs.net/lts/zh-cn/docs/v5/doc/getting-started 1&#xff09;docker直接运行SRS服务&#xff1a; docker run --rm -it -p 1935:1935 -p 1985:1985 -p 8080:8080 registry.cn-hangzhou.aliyuncs.co…

【字节二面】SpringBoot可以同时处理多少请求

目录 一、示例代码二、那么springboot可以处理多少请求&#xff1f;三、maxConnections、maxThreads、acceptCount的关系 一、示例代码 RestController Slf4j public class RequestController {GetMapping("/test")public String test(HttpServletRequest request) …

科技团队治理能力成长路线图

点击&#x1f446;蓝字 关注我们 本文观点&#xff5c;吴穹 主笔&#xff5c;AI小助手 温馨提示&#xff1a;干货长文&#xff0c;建议收藏阅读喔&#xff5e; 引言 2024年3月20日&#xff0c;吴穹博士于上海交通大学上海高级金融学院同一众信托行业金融科技管理者进行了《金融…

【JVM】关于JVM垃圾回收

文章目录 &#x1f334;死亡对象的判断算法&#x1f338;引用计数算法&#x1f338;可达性分析算法 &#x1f333;垃圾回收算法&#x1f338;标记-清除算法&#x1f338;复制算法&#x1f338;标记-整理算法&#x1f338;分代算法&#x1f338;哪些对象会进入新生代&#xff1f…

算法学习——LeetCode力扣动态规划篇8

算法学习——LeetCode力扣动态规划篇8 300. 最长递增子序列 300. 最长递增子序列 - 力扣&#xff08;LeetCode&#xff09; 描述 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删…

nuxt学习

一、遇到的问题 1、nuxt初始化失败问题解决方案 使用npm和pnpm初始化都失败 原因&#xff1a;主机连不上DNS服务器 解决方案 Step1: 打开文件夹 Windows:路径&#xff1a;C:\Windows\System32\drivers\etc Mac: 路径&#xff1a;/etc/hosts Step2: 使用记事本方式打开 …

游戏领域AI智能视频剪辑解决方案

游戏行业作为文化创意产业的重要组成部分&#xff0c;其发展和创新速度令人瞩目。然而&#xff0c;随着游戏内容的日益丰富和直播文化的兴起&#xff0c;传统的视频剪辑方式已难以满足玩家和观众日益增长的需求。美摄科技&#xff0c;凭借其在AI智能视频剪辑领域的深厚积累和创…

【JavaSE】内部类

目录 前言 内部类 内部类的种类 1. 实例内部类 2 静态内部类 3 匿名内部类 4 局部内部类 结语 前言 内部类是我们前面学习遗留下来的知识点&#xff0c;在学完接口后才能更好的理解它&#xff0c;因此等到现在才讲 内部类 在Java中&#xff0c;我们可以将A类定义在B…

人工智能(pytorch)搭建模型25-基于pytorch搭建FPN特征金字塔网络的应用场景,模型结构介绍

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能(pytorch)搭建模型25-基于pytorch搭建FPN特征金字塔网络的应用场景&#xff0c;模型结构介绍。特征金字塔网络&#xff08;FPN&#xff09;是一种深度学习模型结构&#xff0c;主要应用于目标检测任务中&am…