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

相关推荐
云烟成雨TD18 小时前
Spring AI Alibaba 1.x 系列【6】ReactAgent 同步执行 & 流式执行
java·人工智能·spring
Java成神之路-19 小时前
SpringMVC 响应实战指南:页面、文本、JSON 返回全流程(Spring系列13)
java·spring·json
砍材农夫19 小时前
spring-ai 第六模型介绍-聊天模型
java·人工智能·spring
云烟成雨TD20 小时前
Spring AI Alibaba 1.x 系列【5】ReactAgent 构建器深度源码解析
java·人工智能·spring
Flittly21 小时前
【SpringAIAlibaba新手村系列】(15)MCP Client 调用本地服务
java·笔记·spring·ai·springboot
Flittly21 小时前
【SpringAIAlibaba新手村系列】(14)MCP 本地服务与工具集成
java·spring boot·笔记·spring·ai
mfxcyh1 天前
基于xml、注解、JavaConfig实现spring的ioc
xml·java·spring
Flittly1 天前
【SpringAIAlibaba新手村系列】(13)Tool Calling 函数工具调用技术
java·spring boot·spring·ai
xdscode1 天前
Spring 依赖注入方式全景解析
java·后端·spring