SpringMVC(2)传入请求参数

SpringMVC(2)传入请求参数

文章目录

  • SpringMVC(2)传入请求参数
  • [1. 传递一个参数](#1. 传递一个参数)
    • [传递参数名 与 变量名,要相同](#传递参数名 与 变量名,要相同)
  • [2. 传递两个参数](#2. 传递两个参数)
  • [3. 传递 Integer 类型](#3. 传递 Integer 类型)
  • [4. 传递一个对象(本质是传递多个参数)](#4. 传递一个对象(本质是传递多个参数))
    • [将 Integer 改成 int(处于类的成员变量)](#将 Integer 改成 int(处于类的成员变量))
  • [5. 后端参数重命名(后端参数映射)@RequestParam()注解](#5. 后端参数重命名(后端参数映射)@RequestParam()注解)
    • @RequestParam()注解
    • [使用 @RequestParam(),取消必填限制](#使用 @RequestParam(),取消必填限制)
  • [6. 传递一维数组](#6. 传递一维数组)
  • [7. 传递集合(List为例)](#7. 传递集合(List为例))
  • [8. 完整代码](#8. 完整代码)
  • [9. 总结](#9. 总结)

这里使用 postman 来作为前端的示例。
使用 postman 发送请求和 客户端发送请求,对于后端而言,都是一样的
就像 外卖和堂食,对于厨师而言,是一样的

所以,我们使用 postman 和使用浏览器,对于后端来说,都是一样的。

由于没有学响应,不知道返回的是什么,以下的讲述,返回值都统一为 String

前言:解释为什么要传递参数

一个后端程序,是为了客户端而服务的,客户端发送请求过来,也就是传递了一个参数过来。

我们服务器端,必须要根据请求,计算响应,并返回数据

就像我们在京东商城,我们搜索:"手机" ,这个关键词,我们就是向京东商城的服务器发送了一个请求,也就是传递了一个参数,数据

京东商城的服务器就会根据你传入的参数,到数据库里面,检索数据,计算响应,最后返回响应。

响应就是你看到的搜索结果,给你展示了一堆的手机信息。

下面,我们就看看,通过 客户端(postman为例)传递参数(数据),服务器端(也就是我们的代码)来接收参数

注意(接收参数,使用 POST):

特别注意:传递参数,Postman上使用的请求方式是 POST

使用 GET 的请求方式,接收不了参数。

1. 传递一个参数


传递参数名 与 变量名,要相同

注意:这里postman传递的参数,必须是和源代码相同的变量名字,否则会传递失败

源代码:keyword

postman:keyword

图中 postman 使用的是 key作为变量名,与源代码中的 keyword 变量名不同。

参数传递失败。

2. 传递两个参数

假如是一个登录注册功能,用书输入了两个参数:账号和密码

代码:

运行结果:

注意:传递的参数名,必须要和变量名相同,否则赋值不成功,会为 null

注意:String 会有默认值,而 基础数据类型不初始化,没有默认值(后面讲解)

postman的两种传参模式

第一种传参模式,你可以看到,路径会有敏感信息,我们想要屏蔽它,用另一种传参模式

第二种传参模式:

再次传入参数:

切换传参模式之前,需关闭另一个

切换传参模式之前,需要提前关闭之前的传参模式,不然会有干扰。

Params关闭:

Body关闭:

3. 传递 Integer 类型

传递一个 Integer 类型:

传递 包装类型(Integer) 和 基本类型(int)的区别:

一个传递 Integer 类型,一个传递 int类型:

这两个方法,传递正常的整数,都能够接收。

但是,如果不传入参数的话,

Integer这边不会报错:

传递 int 类型的那边会报错:

错误原因:int类型 ,不初始化之前,是没有默认值的。

Integer ,不初始化之前,默认值为:null

这里就是因为默认值的问题出错的,当你不传入参数的时候,系统会尝试将传入的值,传递一个 null,但是 int 类型,是没有 null 这样的默认值的,所以就报错了。

总结

使用 int类型作为 传递参数的类型的时候,传递参数,必须要填写值,不能够不填。

使用 Integer 这种包装类型,作为 传递参数的类型的时候,可以不填写值,会使用默认值 null,进行传递。

疑问:同一个资源路径,方法能否是进行重载?

能否重载?如同这样:

运行程序:

答案

答案:不可以。

总结

资源路径 + 请求方式 要 唯一!!!

如:资源路径为 /request/r1

/request/r1 + @GetMapping(Get请求)是可以的。

/request/r1 + @PostMapping(Post请求)是可以的。

以上,虽然资源路径相同,但是请求方式不同资源路径 + 请求方式 是唯一的!!!

可以根据请求方式调用不同的方法。

但是:

/request/r1 + @RequestMapping

/request/r1 + @RequestMapping

以上是不可以 的,因为 @RequestMapping 包含了所有的请求方式,导致了资源路径 + 请求方式 不唯一!!!

4. 传递一个对象(本质是传递多个参数)

首先,先创建一个对象 User:

传递对象:

传入的参数,必须要和对象有的属性相一致。

不传入任何参数的话,由于对象的属性都是使用 包装类型和引用类型修饰的,所有会有默认值 null。

将 Integer 改成 int(处于类的成员变量)

将 Integer 改成 int,修饰成员变量的类型,此时还要不要必须传值?

答:不需要传值了,因为 是 成员变量,会有默认值,为 0 。

传递的参数名字要和类中的成员变量是相同的:

5. 后端参数重命名(后端参数映射)@RequestParam()注解

这里涉及的注解:@RequestParam()

什么情况下会需要这个注解?

答:前端加密 url,后端需要对应前端的加密字符,但是,后端的代码是有规范的,不能随便定义变量名,所以,要用 @RequestParam 这个注解,对应前端的加密字符,同时,后端的参数不用变。

@RequestParam()注解

例如下面:从前端接收参数 q,赋值给 keyword

@RequestParam("q") : 前端的加密字符

String keyword:后端接收数据的变量

使用 postman 发送请求的时候,发送的参数名字,要和 @RequestParam("q") 这个注解中的 字符一样,也就是 q;

其实,使用 @RequestParam()这个注解,也叫做参数绑定

就是把 q 这个字符,绑定给 keyword 这个变量

如果是不相同的,会报错:

如果不传参数,也会报错:

所以,一旦加上 @RequestParam()这个注解,表示这个变量是一个必填项了。

那么,有没有什么方式,能取消这个 必填 的限制吗?

使用 @RequestParam(),取消必填限制


6. 传递一维数组

注意:这里数组的类型,必须是 String[ ]。

原因:请求参数都是字符串形式传递的(无论是 URL 中的查询参数,还是请求体中的表单参数)。

比如,你通过 URL 传递数组参数:http://localhost:8080/r7?arr=1&arr=2&arr=3,这里的 arr=1arr=2arr=3 本质上都是字符串

代码:

运行结果:

第一种:多次传递单个元素,自动组装成数组

第二种:一次传递多个元素,使用 ' , '进行分割

7. 传递集合(List为例)

代码:

发送请求:

解决报错问题:

上述请求操作,其实是传递数组的方式,

解决办法:

使用 @RequestParam()这个注解,绑定参数。

java 复制代码
@RequestParam List<Integer> list

客户端传递多个相同类型数据(多个 String类型 的数据),客户端(前端)会将这些数据,整理成一个数组,返回给服务器(后端)的。

@RequestParam ,这个注解,就是把 数组,绑定给 集合list 了

代码:

这两个代码是一样的效果。

为什么需要加 @RequestParam 注解

@RequestParam 注解主要用于将请求参数绑定到方法的参数上。

原因:

  1. @RequestParam 注解明确告诉 Spring MVC,这个方法参数的值是来自 HTTP 请求的参数
  2. 对于集合类型的参数,Spring MVC 需要知道如何将请求中的多个同名参数(比如 list=1&list=2&list=3)收集到一个集合中。@RequestParam 注解可以触发 Spring MVC 的参数解析逻辑 ,将多个同名的请求参数值封装到对应的集合(如 List)中。
  3. 对于简单类型的参数(如 Stringint 等),Spring MVC 有时可以通过参数名自动匹配请求参数(基于 Java 的反射机制,方法参数名和请求参数名一致时),但这种自动匹配对于集合类型并不稳定,尤其是在存在编译期参数名丢失(比如没有开启 -parameters 编译选项)的情况下,必须通过 @RequestParam 显式指定参数的来源和绑定规则

也就是说:从前端输入多个同名参数,需要收集到一个集合当中,否则,Spring MVC 可能无法自动进行这种 "多值到集合" 的转换。

数组 :可以直接收集,因为从HTTP请求中的 Query String,本质上都是字符串。

集合 :集合是可以存放多种类型的数据 的,但是,Spring MVC无法自动匹配 Query String 中数据的类型 ,需要通过 @RequestParam 显式指定参数的来源和绑定规则

运行结果:

总结

学到目前为止,只要传递 集合 的时候,就需要在集合前加上一个 @RequestParam() 注解

8. 完整代码

java 复制代码
import org.springframework.web.bind.annotation.*;

import java.util.Arrays;
import java.util.List;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * Date: 2025-10-10
 * Time: 下午6:50
 */


@RequestMapping("request")
@RestController
public class RequestController {

//    客户端传递一个参数,服务器接收一个参数(字符串)
    @RequestMapping("/r1")
    public String r1(String keyword) {
        return "接收参数:" + keyword;
    }

//    客户端传递两个参数,服务器接收两个参数
    @RequestMapping("/r2")
    public String r2(String username,String password) {
        System.out.println("用户名" + username);
        System.out.println("密码:" + password);
        return "用户名:" + username  + "密码:" + password;
    }

//    客户端传递 Integer 参数
    @PostMapping("/r3")
    public String r3(Integer number) {
        return "接收参数:" + number;
    }

//    客户端传递 int类型 的变量
    @PostMapping("/r4")
    public String r4(int number) {
        return "接收参数:" + number;
    }

//    客户端传递一个 对象(多个变量)
    @RequestMapping("/r5")
    public String r5(User user) {
        return "接收一个 user对象:" + user.toString();
    }

//    @RequestMapping("r6")
////    前端传递 q 给后端,后端使用不同名字的参数接收(@RequestParam)
////    使用 @RequestParam 之后,这个参数,是必传参数(一定要传参数),不然会报错
//    public String r6(@RequestParam("q") String keyword) {
//        return "接收参数:" + keyword;
//        // q 是前端的参数,后端不用(输入的时候,参数是 q)
//        // 后端使用 keyword 来接收前端的参数 q 的值,后续使用 keyword 作为变量,进行操作
//    }

    @RequestMapping("r6")
//    手动设置,取消必传限制
    public String r6(@RequestParam(value = "q",required = false) String keyword) {
        return "接收参数:" + keyword;
        // q 是前端的参数,后端不用(输入的时候,参数是 q)
        // 后端使用 keyword 来接收前端的参数 q 的值,后续使用 keyword 作为变量,进行操作
    }

    //    客户端传递一个 数组
    @RequestMapping("/r7")
    public String r7(String[] arr) {
        return "接收参数的数组 arr:" + Arrays.toString(arr);
    }

    @RequestMapping("/r8")
    public String r8(@RequestParam List<Integer> list) {
        return "接收一个集合数据:" + list;

    }


    
}

9. 总结

学习了一个注解:
@RequestParam()

参数重命名,也叫做参数绑定 ,把前端的参数,绑定给后端的某一个参数,并赋值了。

后面不补充 fasle,那么,这个参数是一个必填参数。

如果某一个参数,是要求必须传递的,可以使用 @RequestParam() 注解来达到这个效果

使用情景:

  1. 前端加密 url,后端需要对应前端的加密字符,但是,后端的代码是有规范的,不能随便定义变量名,所以,要用 @RequestParam 这个注解,对应前端的加密字符,同时,后端的参数不用变。
  2. 传递 集合 的时候,就需要在集合前加上一个 @RequestParam() 注解。

最后,如果这篇博客能帮到你的,请你点点赞,有写错了,写的不好的,欢迎评论指出,谢谢!

下一篇博客:SpringMVC(3)传递 json

相关推荐
树码小子2 小时前
SpringMVC(1)初识MVC
spring·mvc
Remember_9933 小时前
Spring 中 REST API 调用工具对比:RestTemplate vs OpenFeign
java·网络·后端·算法·spring·php
阿杰 AJie3 小时前
使用Iterator迭代器在遍历中安全删除元素
java·spring
雨中飘荡的记忆16 小时前
Spring AI Gateway:从入门到实战,打造智能AI服务网关
人工智能·spring·gateway
a程序小傲17 小时前
得物Java面试被问:RocketMQ的消息轨迹追踪实现
java·linux·spring·面试·职场和发展·rocketmq·java-rocketmq
青春男大17 小时前
Redis和RedisTemplate快速上手
java·数据库·redis·后端·spring·缓存
风景的人生18 小时前
请求参数相关注解
spring·mvc
不吃香菜学java19 小时前
springboot左脚踩右脚螺旋升天系列-整合开发
java·spring boot·后端·spring·ssm
科威舟的代码笔记21 小时前
SpringBoot配置文件加载顺序:一场配置界的权力游戏
java·spring boot·后端·spring