SpringMVC 请求参数接收

目录

请求

传递单个参数

基本类型参数传递

未传递参数

?传递参数类型不匹配

传递多个参数

传递对象

后端参数重命名

传递数组

传递集合

传递JSON数据

JSON是什么

JSON的优点

传递JSON对象

获取URL中的参数

文件上传


在浏览器与程序进行交互时,主要分为三个阶段

**1. 建立连接:**将用户(浏览器)和 Java 程序连接起来,也就是访问一个地址能够调用到Spring程序

2. 请求:用户请求时会携带一些参数,在程序中要想办法获取到参数,因此请求这部分主要是获取参数的功能

**3. 响应:**在执行了业务逻辑之后,要将程序执行的结果返回给客户,也就是响应

在本篇文章中,我们来学习请求(获取参数)这部分内容

请求

访问不同的路径,就是发送不同的请求,在发送请求时,可能会带一些参数,因此学习 Spring 的请求,主要就是学习 如何传递参数到后端 以及 后端如何接收参数

在本篇文章中,为了更方便学习,则不采用前端传递参数,而是使用 浏览器postman 来模拟

传递单个参数

接收单个参数时,直接用方法中的参数即可:

@RequestMapping("/user")
@RestController
public class UserController {@RequestMapping(value = "/login")public String login(String name) {return "接收到用户名: " + name;}
}

使用 浏览器发送请求:127.0.0.1:8080/user/login?name=zhangsan

后端程序正确拿到 name 参数的值

Spring MVC 会根据方法的参数名,找到对应的参数,赋值给方法

当参数名称不一致时,获取不到参数:

当未传递参数时:

基本类型参数传递

我们测试使用基本类型来接收参数时:

@RequestMapping("/test")
@RestController
public class TestController {@RequestMapping("/getInt")public String getInt(int age) {return "接收到参数age: " + age;}
}

未传递参数

报了 500 错误

500 错误码是指**“Internal Server Error**”(服务器内部错误),是表示服务器在处理请求时遇到了未知的错误或异常情况。这种错误通常是由服务器端代码出现问题引起的,而不是客户端请求的问题

我们查看日志信息:

int 类型的参数 age 虽然是可选的,但是由于被声明为基本类型而不能转换为空值。考虑将其声明为对应基本类型的包装类型

我们使用包装类型 Integer 来接收参数:

    @RequestMapping("/getInteger")public String getInt(Integer age) {return "接收到参数age: " + age;}

当未传递对应参数时,接收到的数据为 null

在使用基本类型来接收参数时,参数必须传(除了 boolean 类型)

当使用 boolean 类型接收时:

    @RequestMapping("/getBoolean")public String getBoolean(boolean b) {return "接收到参数b: " + b;}

未传递参数时,默认值为 false:

因此,对于参数可能为空的数据,建议使用包装类型接收

传递参数类型不匹配

此时报了 400 错误

400 错误码是指"Bad Request"(错误请求),表示服务器无法理解客户端发送的请求,因为请求语法有误、请求参数无效或者请求消息体格式错误等。

我们观察后端日志:

类型转换失败

传递多个参数

与接收单个参数一样,直接使用方法的参数接收即可:

    @RequestMapping(value = "/login")public String login(String name, String password) {return "接收到用户名: " + name + " 接收到密码: " + password;}

后端程序正确拿到了 name 和 password 参数的值

当有多个参数时,前后端进行参数匹配时,是以参数的名称进行匹配的,因此参数的位置不影响后端数据获取参数的结果

传递对象

当参数比较多时,就需要很多形参,并且每增加一个参数,就需要修改方法的声明,此时,我们可以将这些参数封装为一个对象

public class Student {private int id;private String name;private int age;private String sex;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}@Overridepublic String toString() {return "Student{" +"id=" + id +", name='" + name + ''' +", age=" + age +", sex='" + sex + ''' +'}';}
}

传递对象:

    @RequestMapping("/getStudent")public String getStudent(Student student) {return "接收到参数student: " + student;}

后端程序正确接收到各个属性的值

Spring 会根据参数名称自动绑定到对象的各个属性

当某个属性未传递时,则赋值为null,基本类型则赋值为默认初始值

后端参数重命名

前端传递的参数 key 和 后端接收到的 key 可以不一致,例如前端传递参数 name 给后端,而后端使用 userName 来接收,这种请求下,我们可以使用注解 @RequestParam 来重命名前后端的参数值

@RequestMapping("/user")
@RestController
public class UserController {@RequestMapping("/login")public String login(@RequestParam("name") String userName) {return "接收到用户名: " + userName;}
}

传递的参数 name 正确绑定到后端参数 userName 上

而此时,若使用 userName 进行传参:

观察打印的错误日志:

请求参数 name 不存在

我们可以发现:

1. 在使用 @RequestParam 进行重命名时,请求参数只能与 @RequestParam 声明的名称一致,才能进行参数绑定和赋值

2. 在使用 @RequestParam 进行重命名时,参数就变成了必传参数

在使用 @RequestParam 时,若前端参数是一个非必传参数,此时该如何解决呢?

我们查看 @RequestParam 注解的实现细节:

我们可以看到, required 的默认值为 true,表示:该注解修饰的参数默认为必传

因此,我们可以设置 @RequestParam 中的 required = false,来避免不传递参数时报错:

    @RequestMapping("/login")public String login(@RequestParam(value = "name", required = false) String userName) {return "接收到用户名: " + userName;}

在添加 required = false后,name 前面也加上了 key,value = “name”

注解属性赋值时,若未指明 key,则默认为 value 属性

若需要有多个属性进行赋值,则需要写上 key

传递数组

Spring MVC 可以自动绑定数组参数的赋值

@RequestMapping("/test")
@RestController
public class TestController {@RequestMapping("getArray")public String getArray(String[] array) {return Arrays.toString(array);}
}

发送请求并传参:

中间分割的 , 必须为英文的逗号

也可使用:

请求参数名与形参数组名称相同且请求参数多个,后端定义数组类型形参即可接收参数

传递集合

集合参数与数组类似,同一个请求参数名有多个,且需要使用 @RequestParam 绑定参数关系

默认情况下,请求中参数名相同的多个值,是封装到数组中的,若需要封装到集合中,需要使用 @RequestParam 绑定参数关系

    @RequestMapping("/getList")public String getList(@RequestParam List<String> list) {return "接收到参数list" + list;}

同样的,有两种方式进行传参:

传递JSON数据

JSON是什么

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人类阅读和编写,也易于机器解析和生成。其就是一种数据格式,有自己的格式和语法,使用文本表示一个对象或数组的信息,因此 JSON本质是字符串,主要负责在不同的语言中数据传递和交互

我们来看一段JSON数据:

{"name": "zhangsan","age": 18,"isStudent": true,"courses": ["Math", "English", "History"]
}

也可以压缩表示:

{"name":"zhangsan","age":18,"isStudent":true,"courses":["Math","English","History"]}

与上面描述的数据是一样的,只是上面的进行了格式化,更易读

JSON的语法:

数据在 键值对(key/value)中

数据由逗号, 分割

对象用{}表示

数组用[]表示

值可以为对象,也可以为数组,数组中可以包含多个对象

JSON中的两种结构

对象:{} 保存的对象是一个 无序的键值对集合,一个对象以 { 开始,} 结束,每个键(key)后面跟一个 : ,键值对使用 , 分割

数组:[]保存的数组是值(value)的有序集合,一个数组以 [ 开始,] 结束,值之间使用 , 分割

在使用JSON时,我们可以使用在线JSON格式化工具进行校验和书写

JSON 字符串和Java对象互转

JSON 本质上是一个字符串,通过文本来存储和描述数据

Spring MVC 框架也集成了 JSON 的转换工具,我们可以直接使用,来完成 JSON 字符串和 Java对象的互转

本质是是 jackson-databind 提供的功能,Spring MVC 框架中已经将该工具包引进了,直接使用即可,若脱离 Spring MVC 使用,需要引入相关依赖

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.13.5</version>
</dependency>

JSON的转换工具包有很多,也可以使用其他的

@SpringBootTest
class JSONUtilsTest {@Autowiredprivate ObjectMapper objectMapper;@Testpublic void jsonTest() throws JsonProcessingException {Student student = new Student();student.setId(1);student.setName("zhangsan");student.setAge(13);student.setSex("男");// 将对象转换为 JSON 字符串String jsonStr = objectMapper.writeValueAsString(student);System.out.println("JSON字符串为:" + jsonStr);// 将JSON字符串转换为对象Student student1 = objectMapper.readValue(jsonStr, Student.class);System.out.println("转换的对象:" + student1);}
}

使用 ObjectMapper 对象提供的两个方法,可以完成 对象 和 JSON 字符串的互换

**writeValueAsString:**将对象转换为JSON字符串

**readValue:**将字符串转换为对象

运行结果:

JSON的优点

1. 易于理解和阅读: JSON采用了人类可读的文本格式,基本上可以直接阅读和理解,这使得开发人员和数据工程师可以轻松地查看数据内容。

2. 轻量和高效: JSON数据以文本形式存储,相比于其他二进制格式如XML,它的数据量通常更小,传输和解析速度更快,特别是在网络传输和移动设备上更为高效。

3. 跨平台和语言无关: JSON在多种编程语言中都有支持和解析库,因此可以在不同的平台和系统中使用和传输数据,无需担心兼容性问题。

4. 易于解析和生成: JSON数据格式简单明了,解析起来也比较容易。几乎所有现代编程语言都有JSON解析器和生成器,可以方便地将JSON数据转换成各种数据结构或者将数据结构转换成JSON格式

**5. 安全性较高:**JSON数据格式是一种纯文本格式,不包含可执行代码,不会执行恶意代码,因此具有较高的安全性

因此,JSON在web应用程序中被广泛使用(前后端数据交互、API接口数据传输等等)

传递JSON对象

接收JSON对象,需要使用 @RequestBody 注解

@RequestBody:RequestBody,即请求正文,表示这个注解作用在请求正文的数据绑定,请求参数必须写在请求正文中,@RequestBody 注解的作用是将HTTP请求体中的数据转换为Java对象,并作为方法的参数传入

    @RequestMapping("/getStudent")public String getStudent(@RequestBody Student student) {return "接收到参数student: " + student;}

使用postman发送JSON请求参数:

后端成功接收

获取URL中的参数

在获取URL中的参数时,我们需要使用 @PathVariable 注解

@RequestMapping("/user")
@RestController
public class UserController {@RequestMapping("/login/{id}/{name}")public String login(@PathVariable Integer id, @PathVariable String name) {return "接收到id: " + id + " 接收到name: " + name;}
}

使用postman测试:

后端正确获取到URL中的参数

当方法的参数名称和需要绑定的URL中的变量名称一致时,可以不用给 @PathVariable 的属性赋值

而当方法的参数名称和需要绑定的URL中的变量名称不一致时,需要对 @PathVariable的属性value赋值

    @RequestMapping("/login/{id}/{name}")public String login(@PathVariable Integer id, @PathVariable("name") String userName) {return "接收到id: " + id + " 接收到name: " + userName;}

文件上传

在传输文件时,我们需要使用 @RequestPart

@RequestMapping("/test")
@RestController
public class TestController {@RequestMapping("getFile")public String getFile(@RequestPart("file")MultipartFile multipartFile) throws IOException {// 获取文件名String fileName = multipartFile.getOriginalFilename();// 将文件上传到指定路径multipartFile.transferTo(new File("D:/" + multipartFile.getOriginalFilename()));return "接收到文件:" + fileName;}
}

使用postman发送请求:

同时查看文件是否上传成功:

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

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

相关文章

深度学习之图像回归(一)

前言 图像回归任务主要是理解一个最简单的深度学习相关项目的结构&#xff0c;整体的思路&#xff0c;数据集的处理&#xff0c;模型的训练过程和优化处理。 因为深度学习的项目思路是差不多的&#xff0c;主要的区别是对于数据集的处理阶段&#xff0c;之后模型训练有一些小…

23. AI-大语言模型-DeepSeek简介

文章目录 前言一、DeepSeek是什么1. 简介2. 产品版本1. 类型2. 版本3. 参数规模与模型能力 3. 特征4. 三种访问方式1. 网页端和APP2. DeepSeek API 二、DeepSeek可以做什么1. 应用场景2. 文本生成1. 文本创作2. 摘要与改写3. 结构化生成 3. 自然语言理解与分析1. 语义分析2. 文…

京东cfe滑块 分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 逆向分析 headers {"accept&qu…

什么是事务?并发事务引发的问题?什么是MVCC?

文章目录 什么是事务&#xff1f;并发事务引发的问题&#xff1f;什么是MVCC&#xff1f;1.事务的四大特性2.并发事务下产生的问题&#xff1a;脏读、不可重复读、幻读3.如何应对并发事务引发的问题&#xff1f;4.什么是MVCC&#xff1f;5.可见性规则&#xff1f;参考资料 什么…

火语言RPA--Excel插入空行

【组件功能】&#xff1a;在Excel内指定的位置插入空行 配置预览 配置说明 在第n行之前 支持T或# 填写添加插入第n行之前行号。 插入n行 支持T或# 插入多少行。 Sheet页名称 支持T或# Excel表格工作簿名称。 示例 Excel插入空行 描述 在第3行之后插入3行。 配置 输…

【算法基础】--前缀和

前缀和 一、一维前缀和示例模板[寻找数组的中心下标 ](https://leetcode.cn/problems/tvdfij/description/)除自身以外的数组乘积和可被k整除的子数组 一、一维前缀和 前缀和就是快速求出数组某一个连续区间内所有元素的和。 示例模板 已知一个数组arr&#xff0c;求前缀和 …

buuctf-[极客大挑战 2019]Knife题解

一个很简单的web题&#xff0c;进入界面 网页名还加白给的shell&#xff0c;并且给的提示也很明显&#xff0c;给了一个一句话木马再加上菜刀&#xff0c;很怀疑是一个webshell题&#xff0c;那么直接打开蚁剑测试连接拿shell 用提示的一句话木马的密码&#xff0c;测试链接发现…

基于YOLO11深度学习的半导体芯片缺陷检测系统【python源码+Pyqt5界面+数据集+训练代码】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

零食店收银pos源码

各位零食店老板&#xff0c;你是否还在为以下问题头疼&#xff1f; 连锁门店越来越多&#xff0c;管理起来力不从心&#xff1f;散装称重商品收银效率低&#xff0c;顾客排队抱怨&#xff1f;线上订单激增&#xff0c;库存混乱&#xff0c;配送跟不上&#xff1f;营销活动花样少…

DeepSeek 冲击(含本地化部署实践)

DeepSeek无疑是春节档最火爆的话题&#xff0c;上线不足一月&#xff0c;其全球累计下载量已达4000万&#xff0c;反超ChatGPT成为全球增长最快的AI应用&#xff0c;并且完全开源。那么究竟DeepSeek有什么魔力&#xff0c;能够让大家趋之若鹜&#xff0c;他又将怎样改变世界AI格…

卷积与动态特征选择:重塑YOLOv8的多尺度目标检测能力

文章目录 1. YOLOv8的网络结构概述2. 添加注意力机制2.1 为什么添加注意力机制&#xff1f;2.2 如何将注意力机制集成到YOLOv8中&#xff1f;2.3 效果分析 3. C2f模块的集成3.1 C2f模块简介3.2 如何在YOLOv8中集成C2f模块&#xff1f;3.3 效果分析 4. 卷积操作的优化4.1 卷积操…

鸿蒙-验证码输入框的几种实现方式-上

文章目录 效果图、优缺点多TextInput多 TextCanvas 绘制 多个 TextInput 拼接放置四个输入框焦点移动输入时向后移动输入完成回调删除时向前移动 防止点击总结 最近在做应用鸿蒙化&#xff0c;说白了就是把原来Android、iOS的代码重新用ArkTS写一遍&#xff0c;我负责基础建设和…

谈谈对线程的认识

面对这样的一个多核CPU时代, 实现并发编程是刚需. 多进程实现并发编程, 效果是特别理想的. 但是, 多线程编程模型有一个明显的缺点, 就是进程太重了, 效率不高. 创建一个进程, 消耗时间比较多. 销毁一个进程, 消耗时间也比较多. 调度一个进程, 消耗时间也比较多. 这里的时…

MySQL的数据类型

4. 数据类型 4.1 数据类型分类4.2 数值类型4.2.1 tinyint类型4.2.2 bit类型4.2.3 小数类型4.2.3.1 float4.2.3.2 decimal 4.3 字符串类型4.3.1 char4.3.2 varchar4.3.3 char和varchar比较 4.4 日期和时间类型enum和set 4.1 数据类型分类 4.2 数值类型 4.2.1 tinyint类型 数值越…

回不去的乌托邦

回不去的乌托邦 坐在电脑面前愣神间已至深夜&#xff0c;依然睡意不起。 相比于带着疲惫入睡&#xff0c;伏案发呆更令人惬意。想起最近在自媒体上看到的一句话“最顶级的享受变成了回不去的乌托邦”。 “这是兄弟们最后一次逛校园了&#xff0c;我拍个照”。我的记忆力总是用在…

分布式与集群,二者区别是什么?

??分布式 分布式系统是由多个独立的计算机节点组成的系统&#xff0c;这些节点通过网络协作完成任务。每个节点都有自己的独立计算能力和存储能力&#xff0c;可以独立运行。分布式系统的目标是提高系统的可靠性、可扩展性和性能。 分布式服务包含的技术和理论 负载均衡&am…

<02.21>八股文

JAVA基础 次数少了用解释性 次数多了用编译性(JIT) 操作系统

logging-operator 部署fluentd-bit日志报kubernetes链接错误

一、背景&#xff1a; 某项目使用logging-operator部署fluentd-bit进行日志采集&#xff0c;发现启动的fluentd-bit有大量的的链接kubernetes报错。 二、排查过程 1、排查fluentd容器到kubernetes api server的联通性&#xff0c;进入容器中curl kubernetes.default.svc.local:…

Redis数据结构-String字符串

1.String字符串 字符串类型是Redis中最基础的数据结构&#xff0c;关于数据结构与要特别注意的是&#xff1a;首先Redis中所有的键的类型都是字符串类型&#xff0c;而且其他集中数据结构也都是在字符串类似基础上进行构建&#xff0c;例如列表和集合的元素类型是字符串类型&a…

基于Django的购物商城平台的设计与实现(源码+lw+部署文档+讲解),源码可白嫖!

摘要 当今社会进入了科技进步、经济社会快速发展的新时代。国际信息和学术交流也不断加强&#xff0c;计算机技术对经济社会发展和人民生活改善的影响也日益突出&#xff0c;人类的生存和思考方式也产生了变化。传统购物管理采取了人工的管理方法&#xff0c;但这种管理方法存…