目录
[1.什么是 Spring Web MVC?](#1.什么是 Spring Web MVC?)
[1.1 MVC 定义](#1.1 MVC 定义)
[1.2 什么是 Spring MVC?](#1.2 什么是 Spring MVC?)
[2.学习 Spring MVC](#2.学习 Spring MVC)
[2.1 项目准备](#2.1 项目准备)
[2.2 建立连接](#2.2 建立连接)
[2.2.1 @RequestMapping 注解介绍](#2.2.1 @RequestMapping 注解介绍)
[2.2.2 @RequestMapping 使用](#2.2.2 @RequestMapping 使用)
[2.2.3 @RequestMapping 是 GET 还是 POST 请求?](#2.2.3 @RequestMapping 是 GET 还是 POST 请求?)
[@RequestMapping 既支持 get,又支持 post](#@RequestMapping 既支持 get,又支持 post)
[2.2.4 @GetMapping 注解介绍](#2.2.4 @GetMapping 注解介绍)
[2.2.5 @PostMapping 注解介绍](#2.2.5 @PostMapping 注解介绍)
[2.3 Postman 介绍(课件内容)](#2.3 Postman 介绍(课件内容))
[2.3.1 下载安装 postman](#2.3.1 下载安装 postman)
[2.3.2 创建请求](#2.3.2 创建请求)
[2.3.3 传参介绍](#2.3.3 传参介绍)
2.form-data(完整表示为:multipart/form-data)
[2.4 请求](#2.4 请求)
[2.4.1 传递单个参数](#2.4.1 传递单个参数)
1.正常传递参数http://127.0.0.1:8080/param/m1/int?age=1
2.不传递age参数http://127.0.0.1:8080/param/m1/int浏览器响应情况:编辑
3.传递参数类型不匹配http://127.0.0.1:8080/param/m1/int?age=abc浏览器响应情况:编辑
[2.4.2 传递多个参数](#2.4.2 传递多个参数)
[2.4.3 传递对象](#2.4.3 传递对象)
[2.4.4 后端参数重命名(后端参数映射)](#2.4.4 后端参数重命名(后端参数映射))
[2.4.5 传递数组](#2.4.5 传递数组)
[2.4.6 传递集合](#2.4.6 传递集合)
本节目标
学习常见的Spring Web MVC注解
掌握使用SpringMVC来完成基础的功能开发
了解MVC和三层架构的设计模式
掌握企业开发中的一些命名规范
1.什么是 Spring Web MVC?
官方对于 Spring MVC 的描述是这样的:
Spring Web MVC is the original web framework built on the Servlet API and has been included in the Spring Framework from the very beginning. The formal name, "Spring Web MVC", comes from the name of its source module (spring-webmvc)
引用来自:Spring Web MVC :: Spring Framework
翻译为中文:
Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从一开始就包含在 Spring 框架中。它的正式名称"Spring Web MVC"来自其源模块的名称(Spring-webmvc),但它通常被称为"Spring MVC".
闲聊:提取上述关键点
①Spring Web MVC 基于 Servlet 的
②Spring Web MVC 最开始就包含在了 Spring Framework 中
③Spring Web MVC 也叫 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
然而要真正的理解什么是 Spring MVC?我们首先要搞清楚什么是 MVC?
1.1 MVC 定义
MVC stands for Model View Controller. It is a software architecture design pattern in software engineering that divides a software system into three fundamental parts: Model, View, and Controller.
• View(视图) 指在应用程序中专门用来与浏览器进行交互,展示数据的资源.
闲聊:这里的视图和 MySQL 中的视图不太一样,这里我们就可以简单暴力点理解为界面~~
• Model(模型) 是应用程序的主体部分,用来处理程序中数据逻辑的部分.
• Controller(控制器)可以理解为一个分发器,用来决定对于视图发来的请求,需要用哪一个模型来处理,以及处理完后需要跳回到哪一个视图。即用来连接视图和模型
闲聊:什么是容器??
容器在我们这里是比较抽象的概念,只要能装东西的东西都可以称之为"容器"
数据结构能装东西,所以数据结构也可以称之为容器
类似的,map、vector、list、tomcat、servlet 都可以称之为容器~~
比如去饭店吃饭
客户进店之后, 服务员来接待客户点餐, 客户点完餐之后, 把客户菜单交给前厅, 前厅根据客户菜单给后厨下达命令. 后厨负责做饭, 做完之后, 再根据菜单告诉服务员, 这是X号餐桌客人的饭.
在这个过程中
服务员就是View(视图), 负责接待客户, 帮助客户点餐, 以及给顾客端饭
前厅就是Controller(控制器), 根据用户的点餐情况, 来选择给哪个后厨下达命令.
后厨就是Model(模型), 根据前厅的要求来完成客户的用餐需求
比如去公司面试
我们到了公司之后, HR会给我们安排会议室, 根据候选人去通知不同的部门来安排面试, 面试结束后, 由HR来告诉面试结果
在这个过程中
HR就是View(视图), 负责接待候选人, 并告知候选人面试结果
不同的部门, 就是Controller(控制器), HR根据候选人来选择对应的部门来进行面试
面试官, 就是Model层, 来处理面试这个事情.
1.2 什么是 Spring MVC?
MVC 是一种架构设计模式, 也是一种思想, 而 Spring MVC 是对 MVC 思想的具体实现. 除此之外,Spring MVC还是一个Web框架.
总结来说,Spring MVC 是一个实现了 MVC 模式的 Web 框架.
闲聊:我们之前创建项目的时候其实就有 Spring MVC 👇
你学 Spring Boot 就是学 Spring Web MVC ,你学 Spring Web MVC 就是学 Spring Boot ,这两个是紧紧捆在一起的~~
所以, Spring MVC主要关注有两个点:
MVC
Web框架
Spring MVC 全称是 Spring Web MVC
其实, Spring MVC 我们在前面已经用过了, 在创建 Spring Boot 项目时,我们勾选的 Spring Web 框架其实就是 Spring MVC 框架:
可以看到,Spring Web的介绍是:
Build web, including RESTful, applications using Spring MVC. Uses Apache Tomcat as the default embedded container.
这时候可能有些学生就懵了, 前面创建的不是SpringBoot项目吗? 怎么又变成了Spring MVC项目? 他们之间到底有着什么样的关系?
SpringBoot是2014年发布的, Spring 是2004年发布的, 在2014年发布之前, 就不能用Spring实现MVC架构吗? 显然不是了.
Spring Boot 只是实现Spring MVC的其中一种方式而已.
Spring Boot 可以添加很多依赖, 借助这些依赖实现不同的功能. Spring Boot 通过添加Spring Web MVC框架, 来实现web功能.
比如: 厨房可以用来做饭, 但真实实现做饭功能的是火以及各种做饭相关的食材和工具.
厨房就好比是SpringBoot, 厨房可以装柜子, 实现收纳功能, 装燃气灶等, 实现做饭功能.闲聊:Spring Boot、Spring Framework 和 MVC之间的关系
打个比方:
Spring Boot:12306
Spring Framework:火车
MVC:代售点
12306 不仅仅是买票的一种方式,还可以买保险、打车、定旅店(外包)~~
代售点一开始是人工代售点,后来可以是电子线上代售点~~
做饭这个事, 就是MVC, 在几千年前, 有火有食材就可以实现做饭.
不过Spring在实现MVC时, 也结合自身项目的特点, 做了一些改变, 相对而言, 下面这个图或许更加合适一些.
不过核心没变
比如上面的例子中, 去饭店吃饭. 一些饭店是前厅来负责接待客户, 帮助客户点餐, 也就是Controller来负责接收用户的请求.
去公司面试, 直接由面试官来接待候选人, 省去了HR中间的交接过程.
2.学习 Spring MVC
既然是 Web 框架, 那么当用户在浏览器中输入了 url 之后,我们的 Spring MVC 项目就可以感知到用户的请求, 并给予响应.
咱们学习Spring MVC, 重点也就是学习如何通过浏览器和用户程序进行交互.
主要分以下三个方面:
1. 建立连接 :将用户(浏览器)和 Java 程序连接起来,也就是访问一个地址能够调用到我们的 Spring 程序。
2. 请求 : 用户请求的时候会带一些参数,在程序中要想办法获取到参数, 所以请求这块主要是 获取参数的功能.
3. 响应 : 执行了业务逻辑之后,要把程序执行的结果返回给用户, 也就是响应.
比如用户去银行存款
- 建立连接: 去柜台
- 请求: 带着银行卡, 身份证去存款
- 响应: 银行返回一张存折.
对于 Spring MVC 来说,掌握了以上 3 个功能就相当于掌握了 Spring MVC.
2.1 项目准备
Spring MVC 项目创建和 Spring Boot 创建项目相同,在创建的时候选择 Spring Web 就相当于创建了 Spring MVC 的项目.
Spring MVC 使用 Spring Boot 的方式创建
Spring MVC更早期的实现方式, 课程中不再讲解.
创建项目时, 勾选上 Spring Web 模块即可,如下图所示:
2.2 建立连接
@RequestMapping:URL 路由映射(既可以加载方法上,也可以加在类上)
创建一个 UserController 类,实现用户通过浏览器和程序的交互,具体实现代码如下:
javapackage com.bite.spring.demo; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; //加在类上:类路径 @RequestMapping("/user") @RestController public class UserController { //加在方法上:方法路径 @RequestMapping("/m1") public String m1(){ return "m1"; } }@RequestMapping 加在类上叫"类路径",加在方法上叫"方法路径"
资源路径=类路径+方法路径(必须唯一)
方法名和路径名称无需一致
接下来我们运行这段程序👇
接下来访问: http://127.0.0.1:8080/user/m1 ,就可以看到程序返回的数据了
闲聊:这里博主因为启动类和主类的问题也费了点心思,下面展示成品👇
主类部分一定要写上启动类所在的包的路径,否则会扫描不到,读取不到网页会显示404👇
注意:Application 不是把所有的包都扫描一遍,那样太耽误时间了,所以 Application 会去寻找 @RestController ,通过这个标签来扫描,你的类标识了这个标签,我就扫描,你要是不标,你写再多我也看不见
建议:给所有的类都加上 类路径:
①避免发生错误
②提高可读性
2.2.1 @RequestMapping 注解介绍
@RequestMapping 是 Spring Web MVC 应用程序中最常被用到的注解之一,它是用来注册接口的路由映射的.
表示服务收到请求时, 路径为 /user 的请求就会调用 user 这个方法的代码.
路由映射: 当用户访问一个 URL 时, 将用户的请求对应到程序中某个类的某个方法的过程就叫路由映射.
既然@RequestMapping 已经可以达到我们的目的了, 我们为什么还要加 @RestController
呢?
我们把@RestController 去掉, 再来访问一次:
可以看到, 程序报了404, 找不到该页面.
这就是@RestController 起到的作用.
一个项目中, 会有很多类, 每个类可能有很多的方法, Spring程序怎么知道要执行哪个方法呢?
Spring会对所有的类进行扫描, 如果类加了注解@RestController, Spring才会去看这个类里面的方法有没有加 @RequestMapping 这个注解, 当然他的作用不止这一点, 咱们先用, 后面再详细讲
2.2.2 @RequestMapping 使用
@RequestMapping 既可修饰类,也可以修饰方法 ,当修饰类和方法时,访问的地址是类路径 + 方法路径.
@RequestMapping标识一个类:设置映射请求的请求路径的初始信息
@RequestMapping标识一个方法:设置映射请求请求路径的具体信息
java@RequestMapping("/user") @RestController public class UserController { @RequestMapping("/sayHi") public String sayHi(){ return "hello,Spring MVC"; } }访问地址:http://127.0.0.1:8080/user/sayHi
注意:
@RequestMapping 的URL 路径最前面加不加 / (斜杠)都可以(规范如此~~), Spring程序启动时, 会进行判断, 如果前面没有加 / , Spring会拼接上一个 /
java@RequestMapping("user") @RestController public class UserController { @RequestMapping("sayHi") public String sayHi(){ return "hello,Spring MVC"; } }访问http://127.0.0.1:8080/user/sayHi, 依然可以正确响应.
通常情况下, 我们加上 /
@RequestMapping 的URL路径也可以是多层路径, 最终访问时, 依然是 类路径 + 方法路径
java@RequestMapping("/user/m1") @RestController public class UserController { @RequestMapping("/say/hi") public String sayHi(){ return "hello,Spring MVC"; } }
2.2.3 @RequestMapping 是 GET 还是 POST 请求?
与我们的代码无关,发起请求可以是 get 请求也可以是 post 请求,与我们有关的是我们支持 post 还是支持 get~~
发起请求,可以是 get,也可以是 post
@RequestMapping 既支持 get,又支持 post
我们启动服务👇
发送 GET 请求👇
抓包结果显示:GET 请求👇
再发 POST 请求👇
抓包结果显示:POST 请求👇
下面我们对代码做出改动,仅支持 GET 请求👇
发送 GET 请求👇
抓包结果显示:GET 请求👇
发送 POST 请求,发现方法不允许请求👇
抓包结果显示:方法不允许请求👇
类似的,只支持POST👇(就不演示了,和上面效果是一样的~~)
javapackage com.bite.spring.demo; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; @RequestMapping("/user") @RestController public class UserController { //既支持get,又支持post @RequestMapping("/m1") public String m1(){ return "m1"; } //只支持get @RequestMapping(value = "/m2",method = RequestMethod.GET) public String m2(){ return "m2"; } //只支持post @RequestMapping(value = "/m3",method = RequestMethod.POST) public String m3(){ return "m3"; } }注解
在我们没写 method 的时候,@RequestMapping 直接引号里面就写路径了,后面我们加上 method 之后,我们 m2 和 m3 前面就需要加一个 values,这就意味着,注解里面其实是又参数的,这个参数默认赋给 values 属性,如果有多个属性,就需要全标上,此时 values 就不可以省略了,而这个参数可以为 GET、HEAO、POST......👇
答疑:标识之后,顺序可以打乱吧??
当然可以~~
另外,我们观察 @RequestMapping 声明中的属性,会发现 method 中不止可以使用一个参数👇
可以发现,这个参数类型是一个枚举数组,所以可以给多个值,比如我们可以写成这种方式👇
java//参数可以跟多个 @RequestMapping(value = "/m6",method = {RequestMethod.GET,RequestMethod.POST}) public String m6(){ return "m6"; }当然,这种方式我们了解即可~~
2.2.4 @GetMapping 注解介绍
java//只支持get @GetMapping("/m4") public String m4(){ return "m4"; }程序启动后,我们依次查看 GET 和 POST 请求:
GET 请求:
POST 请求:
2.2.5 @PostMapping 注解介绍
java//只支持post @PostMapping("/m5") public String m5(){ return "m5"; }程序启动后,我们依次查看 GET 和 POST 请求:
GET 请求:
POST 请求:
类似的,同样还有 DeleteMaping、PutMaping......我们这里只演示 get 和 post 就可以了~通过以上演示,可以得出结论👇
@RequestMapping(value = "/m2",method = RequestMethod.GET)等价于GetMapping
@RequestMapping(value = "/m3",method = RequestMethod.POST)等价于PostMapping
2.3 Postman 介绍(课件内容)
学习前端的时候我们学习到如何发起一个 POST 请求:用 form 表单👇
html<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/user/m1" method="post"> </form> </body> </html>从上面的案例中, 也发现了一个新的问题, 就是我们测试后端方法时, 还需要去写前端代码. 这对我们来说, 是一件麻烦又痛苦的事情.
随着互联网的发展, 也随着项目难度的增加, 企业也按照开发的功能, 把人员拆分成了不同的团队. 界面显示交给"前端开发工程师", 业务逻辑的实现交给 "后端开发工程师".
后端开发工程师, 不要求也不需要掌握前端技能了.
那后端开发工程师, 如何测试自己的程序呢? -- 使用专业的接口测试工具
咱们课堂中使用的是Postman, 接下来我们来学习 Postman 的使用.
之前发的博客也有讲 Postman 的下载和使用👇
2.3.1 下载安装 postman
下载链接: Download Postman | Get Started for Free
安装后会提示有版本升级, 点击 Dismiss 即可(无需升级)
2.3.2 创建请求
界面介绍
2.3.3 传参介绍
这部分内容在 Java EE:7.网络原理- HTTP/HTTPS(第四弹):HTTP 响应+构造 HTTP 请求 也有介绍~~
1.普通传参,也就是通过查询字符串来传参
学习HTTP环节时, 我们通过URL来访问互联网上的某一个资源
URL的格式如下:
其中, 查询字符串就是请求的参数
2.form-data(完整表示为:multipart/form-data)
表单提交的数据, 在 form 标签中加上 enctyped="multipart/form-data" , 通常用于提交图
片/文件. 对应Content-Type: multipart/form-data
3.x-www-form-urlencoded
form表单, 对应Content-Type: application/x-www-from-urlencoded
4.raw
可以上传任意格式的文本,可以上传text、json、xml、html等
2.4 请求
使用 Postman 发送请求 和 客户端 发送请求,对于后端而言,是一样的,就像 外卖,堂食对于厨师而言,是一样的~~
访问不同的路径, 就是发送不同的请求. 在发送请求时, 可能会带一些参数, 所以学习Spring的请求, 主要是学习如何传递参数到后端以及后端如何接收.
传递参数, 咱们主要是使用浏览器和Postman来模拟.
后端开发人员无需过度关注如何传递参数, 了解即可, 实际开发中以Postman测试为主.
比如餐厅的厨师, 不关注用户是在店里下单, 还是外卖平台下单, 或者小程序下单, 只需要知道如何接收订单, 根据订单做出对应的菜肴就可以了.
2.4.1 传递单个参数
接收单个参数, 在 Spring MVC 中直接用方法中的参数就可以,比如以下代码:
javapackage com.bite.spring.demo; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * Created with IntelliJ IDEA. * Description: * User: CoderYanger * Date: 2026-10-17 * Time: 16:27 */ @RequestMapping("/request") @RestController public class RequestController { @RequestMapping("/r1") public String r1(String keyword){ return "接收参数:"+keyword; } }使用 Postman 发送请求并传参👇
使用浏览器发送请求并传参
http://127.0.0.1:8080/request/r1?keyword=手机
可以看到, 后端程序正确拿到了name参数的值.
Spring MVC 会根据方法的参数名, 找到对应的参数, 赋值给方法
如果参数不一致, 是获取不到参数的.
比如请求URL: http://127.0.0.1:8080/param/m1?name1=spring
响应结果:
后端收到这个关键词 手机之后就可以拿这个关键词去数据库中查了,拿这个当参数一层层往下传,传到数据库就可以得到结果了
注意:
1.名字必须要一摸一样才可以,如果把 keyword 改为 keyword1 ,发送后接收参数是 none,拿不到的👇
注意事项(课件内容)
使用基本类型来接收参数时, 参数必须传(除boolean类型), 否则会报500错误
类型不匹配时, 会报400错误.
java@RequestMapping("/m1/int") public Object method1GetInt(int age){ return "接收到参数age:" + age; }1.正常传递参数
http://127.0.0.1:8080/param/m1/int?age=1
浏览器响应情况:
通过Fiddler观察请求和响应, HTTP响应状态码为200, Content-Type 为 text/html
2.不传递age参数
http://127.0.0.1:8080/param/m1/int
浏览器响应情况:通过Fiddler观察请求和响应, HTTP响应状态码为500
尝试观察程序的错误日志, 并解决
一般看日志堆栈信息的首行, 报错信息显示:
int类型的参数'age',虽然为可选的, 但由于被声明为基本类型而不能转换为空值. 考虑将其声明为对应基本类型的包装类型.
按照错误信息解决错误即可
最开始学习时, 会遇到各种各样的问题, 我们要养成看错误日志的习惯, 根据错误日志来解决问题.
最开始可能会看不懂, 或者比较懵, 要耐下心来, 慢慢看, 后面课堂中也会教大家更多看日志的思路.
3.传递参数类型不匹配
http://127.0.0.1:8080/param/m1/int?age=abc
浏览器响应情况:通过Fiddler观察请求和响应, HTTP响应状态码为400
对于包装类型, 如果不传对应参数,Spring 接收到的数据则为null
所以企业开发中,对于参数可能为空的数据,建议使用包装类型
2.4.2 传递多个参数
如何接收多个参数呢?
和接收单个参数一样, 直接使用方法的参数接收即可. 使用多个形参.
javapackage com.bite.spring.demo; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RequestMapping("/request") @RestController public class RequestController { @RequestMapping("/r1") public String r1(String keyword){ return "接收参数:"+keyword; } @RequestMapping("/r2") public String r2(String userName,String password){ return "接收参数:userName:"+userName+",password:"+password; } }使用 Postman 发送请求并传参:
使用浏览器发送请求并传参:
http://127.0.0.1:8080/request/r2?userName=CoderYanger&password=123456
有人说 URL 上直接把账号密码显示出来了,不太好,那么我们接下来可以使用 Body 来发送请求👇
我们抓包来看一下,我们发现在这里就能显示了👇
如果我们改成 GET 请求的话,我们发现也是可以拿到的👇
以下为课件内容:
可以看到, 后端程序正确拿到了name和password参数的值
当有多个参数时,前后端进行参数匹配时,是以参数的名称进行匹配的,因此参数的位置是不影响后端获取参数的结果.
比如访问: http://127.0.0.1:8080/param/m2?password=123456&name=zhangsan 同样可以拿到正确的结果
那如果我们想换一种类型传怎么办呢??
java@RequestMapping("/r3") public String r3(Integer number){ return "接收参数:"+number; } @RequestMapping("/r4") public String r4(int number){ return "接收参数:"+number; }细节:不要出现两个 绿点,否则会出现一些问题~~👇
接收到了,也就是说我传 String 它就是 String,我传数字它就是数字,就看我这接收,那么问题来了,我要是传一个字符串呢??👇
此时就报错了,4开头说明是客户端异常,就是说我们发的请求有问题
r4 也是一样的👇
下面我们来看 r3 和 r4 不同的地方,当我们把 √ 取消后发送尝试👇
r3:
r4:
500 是服务端错误(没传任何参数,它得到的是一个 none)
客户端错误时候的日志是一个警告👇
服务端错误的时候的日志是一个 error,表示我们程序发生错误了👇
后面跟着的英文说的是 null 不能转换成一个基本类型,如果你想用的话,可以使用 object wrapper 也就是包装类型(非包装类型不能赋值 none)
所以 Integer 的可以为 none,而 int 的就不能为 none,这就是二者的差异~~
答疑:能不能重载呢??
不支持的👇
java@RequestMapping("/r1") public String r1(String keyword){ return "接收参数:"+keyword; } @RequestMapping("/r1") public String r1(String userName,String password){ return "接收参数:userName:"+userName+",password:"+password; }我们发现服务刚启动就报错了,资源路径必须唯一👇
但如果你是 GetMapping 和 PostMapping 是可以的,因为那两种方式是不一样的👇
java//只支持get @GetMapping("/m4") public String m4(){ return "m4"; } //只支持post @PostMapping("/m4") public String m5(){ return "m5"; }GET 请求返回 m4👇
POST 请求返回 m5👇
此时它会根据你请求方式的不同执行不同的方法~~
2.4.3 传递对象
如果参数比较多时, 方法声明就需要有很多形参. 并且后续每次新增一个参数, 也需要修改方法声明,这样太麻烦了~~
我们不妨把这些参数封装为一个对象.
Spring MVC 也可以自动实现对象参数的赋值,比如 UserInfo 对象:
javapackage com.bite.spring.demo; /** * Created with IntelliJ IDEA. * Description: * User: CoderYanger * Date: 2026-10-17 * Time: 17:42 */ public class UserInfo { private String name; private Integer gender; private Integer age; //Alt+Insert:快速生成 get 和 set 方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getGender() { return gender; } public void setGender(Integer gender) { this.gender = gender; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } //toString默认打印的是内存地址的16进制,所以我们要重写toString方法 //Alt+Insert:选择Generate快速重写toString方法 @Override public String toString() { return "UserInfo{"+ "name='"+name+'\''+ ",gender="+gender+ ",age="+age+ '}'; } }传递对象代码实现:
java//传递对象 @RequestMapping("/r5") public String r5(UserInfo userInfo){ return "接收参数:userInfo="+userInfo.toString(); }使用 Postman 发送 GET 请求并传参:
使用浏览器发送请求并传参:
http://127.0.0.1:8080/request/r5?name=CoderYanger&gender=1&age=21
使用 Postman 发送 POST 请求并传参:(要先确保左边绿点下的 √ 全取消,确保没有参数传过来):
考考大家基础语法:如果我们把对象的 gender 和 age 类型从 Integer 改为 int ,然后发送请求的时候不传值,会不会报错呢??👇
我们发现并不会,而是全初始化为了 0👇
但如果参数放在了这个位置👇那就是必须要传的了
Spring 会根据参数名称自动绑定到对象的各个属性上, 如果某个属性未传递, 则赋值为null(基本类型则赋值为默认初识值, 比如int类型的属性, 会被赋值为0)
2.4.4 后端参数重命名(后端参数映射)
我们在必应下随便搜索一个 aaaa,观察它的 URL👇
?后面是查询字符串的内容,这些都是程序员自定义的(比如 q),但是后端要是想接收这些值,参数名也要用 q,但是这个 q 是啥意思?对于我们后端很不好理解,你前端可能为了保密就故意让别人看不懂,但是我们后端代码别人本来就看不到,所以我们后端干脆不用这个烂名字了,我们要对其重命名成 keyword 来处理👇
java//从前端接收参数q,赋值给keyword @RequestMapping("/r6") public String r6(@RequestParam("q") String keyword){ return "接收参数:keyword="+keyword; }使用 Postman 发送请求并传参:
如果传的不是 q,而是 keyword 呢?👇
400 是客户端错误,那既然参数类型是 String,为什么拿不到数据不不赋值成 none,而是报 400 呢?我们看一下异常信息说了什么👇
因为使用了 @RequestParam 这个注解在后端代码参数位置后,q 就是一个必需的参数了~~
如果不加这个参数的话,那自然就是 none 了,我们在源码位置也能发现(Ctrl+鼠标左键)👇
那么我们改如何解决呢??直接把这个属性改为 false 不就 OK 了嘛~~👇
java//从前端接收参数q,赋值给keyword @RequestMapping("/r6") public String r6(@RequestParam(value = "q",required = false) String keyword){ return "接收参数:keyword="+keyword; }我们再用 Postman 发请求观察一下👇发现这个时候就变成 none 了
结论:
使用 @RequestParam 进行参数重命名时, 请求参数只能和@RequestParam 声明的名称一致, 才能进行参数绑定和赋值.
使用 @RequestParam 进行参数重命名时, 参数就变成了必传参数.
非必传参数设置:通过设置 @RequestParam 中的 required=false 来避免不传递时报错
2.4.5 传递数组
Spring MVC 可以自动绑定数组参数的赋值
后端实现代码:
java@RequestMapping("/m4") public Object method4(@RequestParam(value = "time", required = false) String createtime) { return "接收到参数createtime:" + createtime; }请求方式1:
当我们多个参数名称是一样的时候,它会给我们组装成一个数组,使用 Postman 发送请求并传参:
此时它打印的是一个哈希地址,我们把它 toString 出来👇
java//传递数组 @RequestMapping("/r7") public String r7(String[] arr){ return "接收参数:arr="+ Arrays.toString(arr); }再发送👇此时就可以获取到数组的值了
请求方式2:
一次放入多个值也可以达到同样效果👇
2.4.6 传递集合
我们试试沿用传递数组的方式能否传递集合,后端代码👇
java//传递集合 @RequestMapping("/r8") public String r8(List<Integer> list){ return "接收参数:List="+list; }用 Postman 发送请求并传参:
我们发现它报了一个 500 的错误,我们观察一下错误日志👇
它说没有找到 List 的构造方法,因为 List 是一个接口嘛,所以肯定找不着,当然这不是根本原因,那我们要怎么解决呢??
需要用参数绑定,我们上面说 @RequestParam 是参数重命名,但实际上应该叫"参数的绑定",也就是把参数 k 绑定给 keyword👇
java//从前端接收参数q,赋值给keyword @RequestMapping("/r6") public String r6(@RequestParam(value = "q",required = false) String keyword){ return "接收参数:keyword="+keyword; }既然我们这次的传参方式默认是一个数组,如果你需要把它赋值成 List,那么你给它绑定给 List 也是可以的
当然,我们也可以直接接收成 List,然后通过注解加上一个 @RequestParam 把数组这个参数绑定成 List 👇
java//传递集合 @RequestMapping("/r8") public String r8(@RequestParam List<Integer> list){ return "接收参数:List="+list; }此时再 Postman 发送一次请求,发现报错信息从 500 变成 400 了,客户端错误,原来是我们传错参数了,传 list 而不是 arr👇
修改后我们发现就正常了👇
小结
1.用注解建立连接
①@RequestMapping
既是一个类注解也是一个方法注解
加在类上表示类路径,加在方法上表示方法路径
访问的时候:类路径+方法路径
也可以通过 method 来指定请求方式是 GET 还是 POST......,这个请求方式可以是一个也可以是多个
②@GetMapping:只支持 GET 请求
③@PostMapping:只支持 POST 请求
④@RequestParam:参数绑定
类似的注解还有 PutMapping、DeleteMapping......大家了解即可,学会举一反三
2.请求传参
Spring 会帮助我们进行参数类型转换,直接传就可以,后端直接接收,需要保证该名字在前端和后端一致
String 类型接收,Spring 会帮我们转成 String,Integer 和 int 等等也类似
String 一般不报错,但是 Integer 和 int 就不一定了~~,因为 Integer 一定是个 数字,但是传个 aaaa 就接收不了,Integer 可以为 none ,但是不能是一个非数字的参数,int 是基本类型,不能为 none,所以必须要给值
一个参数写一个、两个参数写两个、多个参数可以封装成对象传输
前端传的名字后端不想要,后端可以通过 @RequestParam(参数绑定) 对其重命名,特点是必传参数,如果不想传,就把 required 改成 false
传递数组:直接传
传递集合:需要加上 @RequestParam(参数绑定)


























































以下为课件内容:































