SpringMVC 请求参数接收

news2024/11/16 13:19:34

目录

请求

传递单个参数

基本类型参数传递

未传递参数

 传递参数类型不匹配

传递多个参数

传递对象

后端参数重命名

传递数组

传递集合

传递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;
    }

    @Override
    public 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 {
    @Autowired
    private ObjectMapper objectMapper;
    @Test
    public 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.coloradmin.cn/o/1868134.html

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

相关文章

互联网信息服务算法备案流程与要求

一、备案申请的办理流程 企业通过网信办的互联网信息服务算法备案系统&#xff08;https://beian.cac.gov.cn/#/index&#xff09;提交算法备案申请。填报信息包括三部分&#xff0c;分别是算法主体信息、产品及功能信息、算法信息。备案中比较重要的文件包括主体信息中的《落…

anaconda卸载过程中出现fail to run pre-unistall报错

问题&#xff1a; 在使用Uninstall-Anaconda3.exe卸载程序时&#xff0c;出现报错&#xff1a; 解决方案&#xff1a; 把文件夹移动到C盘用户文件夹后再运行卸载程序。即可正常运行程序。

精彩回顾 | 2024高通边缘智能创新应用大赛系列公开课

5月29日-6月6日&#xff0c;我们陆续开展了四场精彩绝伦的2024高通边缘智能创新应用大赛直播公开课。高通、阿加犀、广翼智联以及美格智能的业务领袖和行业大咖齐聚一堂&#xff0c;聚焦边缘智能&#xff0c;分享前沿技术、探讨创新应用&#xff0c;抢先揭秘比赛设备的核心特性…

<sa8650>QCX Usecase 使用详解— Spectra Studio-新建usecase

<sa8650>QCX Usecase 使用详解— Spectra Studio-新建usecase 一 前言二 创建usecaseTEST2.1 打开工程2.2 新建sa8650的usecaseTEST2.2.1 步骤1 添加Usecase2.2.2 步骤2 输入参数(参考UsecaseFFC)2.2.3 步骤3 创建 Pipeline2.2.4 步骤4 转换到本地2.2.5 添加usecaseID号三 使…

Web应用和Tomcat的集成鉴权2-Form Authentication

作者:私语茶馆 1.相关章节 1) Web应用和Tomcat的集成鉴权1-BasicAuthentication-CSDN博客 2) Web应用和Tomcat的集成鉴权2-Form Authentication-CSDN博客 集成鉴权+定制化登录 2.前言 上章讲述了Tomcat的Basic Authentication鉴权模式,可以让Web应用和Tomcat的鉴权集成起来…

成都欣丰洪泰文化传媒有限公司开网店正规吗?

在如今电商风起云涌的时代&#xff0c;成都欣丰洪泰文化传媒有限公司如同一颗璀璨的明星&#xff0c;在电商服务的领域中熠熠生辉。这家公司凭借其专业的团队、丰富的经验和创新的思维&#xff0c;成为电商行业中的一股不可忽视的力量。 电商服务的领航者 成都欣丰洪泰文化传媒…

8.12 矢量图层面要素单一符号使用八(形状炸裂填充)

文章目录 前言形状炸裂填充&#xff08;Shapeburst fill&#xff09;QGis设置面符号为形状炸裂填充&#xff08;Shapeburst fill&#xff09;二次开发代码实现形状炸裂填充&#xff08;Shapeburst fill&#xff09; 总结 前言 本章介绍矢量图层线要素单一符号中使用形状炸裂填…

四川赤橙宏海商务信息咨询有限公司好不好?

在当今数字化浪潮下&#xff0c;电商行业正以前所未有的速度发展&#xff0c;而抖音作为短视频领域的佼佼者&#xff0c;其电商服务更是成为了众多品牌争相布局的热门领域。四川赤橙宏海商务信息咨询有限公司&#xff0c;正是这样一家专注于抖音电商服务的领军企业&#xff0c;…

跨境电商新趋势:海外盲盒小程序的市场机遇

随着全球经济的深度融合和消费者需求的日益多元化&#xff0c;跨境电商作为一种新型的国际贸易模式&#xff0c;正在以前所未有的速度发展。而在这一浪潮中&#xff0c;海外盲盒小程序凭借其独特的商业模式和强大的市场潜力&#xff0c;正逐渐成为跨境电商领域的新宠。本文将探…

家用洗地机有什么推荐的吗?洗地机性价比高的是哪一款?

洗地机因其强大的性能&#xff0c;给人们带来了舒适的清洁体验&#xff0c;提高了人们日常生活的质量&#xff0c;但市场上的洗地机质量参差不齐&#xff0c;所以洗地机品牌的选择就非常重要。因此&#xff0c;我作为一名专业的测评博主&#xff0c;今天就来向大家推荐几款值得…

以算筑基,以智赋能 | Gooxi受邀出席2024中国智算中心全栈技术大会

6月25日&#xff0c;2024中国智算中心全栈技术大会暨展览会、第5届中国数据中心绿色能源大会暨第10届中国&#xff08;上海&#xff09;国际数据中心产业展览会在上海新国际博览中心隆重召开。Gooxi受邀参与并携最新服务器产品以及解决方案亮相展会&#xff0c;吸引众多行业领袖…

微信小程序毕业设计-校园报修系统项目开发实战(附源码+论文)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;微信小程序毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计…

unity VR Interaction Framework 创建新手势

提示&#xff1a;文章有错误的地方&#xff0c;还望诸位大神不吝指教&#xff01; 文章目录 前言一、新建物体&#xff0c;并添加必要组件二、添加抓取点三、查看手势的可视化样式四、制作新的手势1.点击编辑2.根据需求调节手指关节3.保存手势4. 使用创建的手势5.运行 总结 前言…

如何找到正确的网络钓鱼目标

在深入研究联系人收集之前&#xff0c;我们希望确保对可用的攻击面有一个清晰的了解。我见过许多渗透测试者只获取客户端提供的主域&#xff0c;通过 theHarvester、linkedInt、maltego 等运行它&#xff0c;并将输出称为目标列表。在这样做的过程中&#xff0c;这些渗透测试机…

C语⾔数据类型和变量

C语⾔数据类型和变量 1.数据类型介绍1.1 字符型1.2 整型1.3 浮点型1.4 布尔类型1.5 各种数据类型的长度1.5.1 sizeof操作符1.5.2 数据类型长度1.5.3 sizeof中表达式不计算 2. signed 和 unsigned3. 数据类型的取值范围4. 变量4.1 变量的创建4.2 变量的分类 5. 算术操作符&#…

JOSEF约瑟 JOLP(ROS-2D)型两级跑偏开关 精度高,耐振动

​ 品牌 :JOSEF约瑟 型号名称 :JOLP(ROS-2D)型两级跑偏开关 触点容量 :AC380V 10A 触点数量 :常开:2常闭:2 极限角度 :70 复位方式 :自动 动作力 :3kg 防护等级 :IP66 结构特点 1.通用的安装设计可使跑偏检测装置随意安装在输送机纵梁顶!顶部或底部位置 2.封闭、防腐、坚固的铸…

算力时代,算能(SOPHGO)的算力芯片/智算板卡/服务器选型

数字经济时代&#xff0c;算力成为支撑经济社会发展新的关键生产力&#xff0c;全球主要经济体都在加快推进算力战略布局。随着大模型持续选代&#xff0c;模型能力不断增强&#xff0c;带来算力需求持续增长。算力对数字经济和GDP的提高有显著的带动作用&#xff0c;根据IDC、…

智驾未来,一触即达——探索全新加油App的无限可能

一、引言 随着科技的飞速发展&#xff0c;智能出行已成为现代生活的重要组成部分。为了满足广大驾驶者的需求&#xff0c;我们倾力打造了一款全新的加油App&#xff0c;旨在为您的驾驶旅程提供前所未有的便捷与智能体验。 二、产品概述 我们的加油App不仅是一款导航工具&…

Linux下vi文件的时候替换指定的内容

需要将nginx.conf中的192.168.222.188&#xff0c;替换为178.21.120.225 操作步骤&#xff1a; 1、vi 文件 vi nginx.conf2、输入 :%s/192.168.222.188/178.21.120.225/g3、最后保存 :wq

华为OD机试 - 石头剪刀布游戏(Java 2024 D卷 200分)

华为OD机试 2024D卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;D卷C卷A卷B卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测…