海哥 发表于 2025-3-24 16:22:53

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
https://i-blog.csdnimg.cn/blog_migrate/b4bc428da1758d218c1603d7d510b18e.png
后端程序正确拿到 name 参数的值
Spring MVC 会根据方法的参数名,找到对应的参数,赋值给方法
https://i-blog.csdnimg.cn/blog_migrate/e7deb14eb57643cbb7edb1cb5151444e.png
当参数名称不同等时,获取不到参数:
https://i-blog.csdnimg.cn/blog_migrate/6074abb7cc91001c6c6ec8ca2798dee6.png
当未传递参数时:
https://i-blog.csdnimg.cn/blog_migrate/2c94280c000fd1ebec36f6711ce7309f.png
基本范例参数传递

我们测试利用基本范例来接收参数时:
@RequestMapping("/test")
@RestController
public class TestController {
    @RequestMapping("/getInt")
    public String getInt(int age) {
      return "接收到参数age: " + age;
    }
}
https://i-blog.csdnimg.cn/blog_migrate/dfc33d32f91781f6413a42653a72dcf3.png
未传递参数

https://i-blog.csdnimg.cn/blog_migrate/3627067076466e9995d8a0a0a4bc700a.png
报了 500 错误
   500 错误码是指**“Internal Server Error**”(服务器内部错误),是表示服务器在处理请求时遇到了未知的错误或异常情况。这种错误通常是由服务器端代码出现问题引起的,而不是客户端请求的问题。
我们查看日志信息:
https://i-blog.csdnimg.cn/blog_migrate/8ea35315337c401d3f3c48568ef4ba7c.png
int 范例的参数 age 虽然是可选的,但是由于被声明为基本范例而不能转换为空值。思量将其声明为对应基本范例的包装范例
我们利用包装范例 Integer 来接收参数:
    @RequestMapping("/getInteger")
    public String getInt(Integer age) {
      return "接收到参数age: " + age;
    }
https://i-blog.csdnimg.cn/blog_migrate/f1d33ceb41ce24dbfb04dd9e15dfa314.png
当未传递对应参数时,接收到的数据为 null
在利用基本范例来接收参数时,参数必须传(除了 boolean 范例)
当利用 boolean 范例接收时:
    @RequestMapping("/getBoolean")
    public String getBoolean(boolean b) {
      return "接收到参数b: " + b;
    }
未传递参数时,默认值为 false:
https://i-blog.csdnimg.cn/blog_migrate/eee66f5cf5ec266b77af0ee9be2cce49.png
因此,对于参数大概为空的数据,发起利用包装范例接收
传递参数范例不匹配

https://i-blog.csdnimg.cn/blog_migrate/604a09ac02da3b54608fd6533c8b3ee8.png
此时报了 400 错误
   400 错误码是指"Bad Request"(错误请求),表示服务器无法理解客户端发送的请求,由于请求语法有误、请求参数无效大概请求消息体格式错误等。
我们观察后端日志:
https://i-blog.csdnimg.cn/blog_migrate/097f70b0703986a5e1f371b3809f7eba.png
范例转换失败
传递多个参数

与接收单个参数一样,直接利用方法的参数接收即可:
    @RequestMapping(value = "/login")
    public String login(String name, String password) {
      return "接收到用户名: " + name + " 接收到密码: " + password;
    }
https://i-blog.csdnimg.cn/blog_migrate/a49ca03fc1ff33740ede51b30cd5cd93.png
后端程序正确拿到了 name 和 password 参数的值
当有多个参数时,前后端进行参数匹配时,是以参数的名称进行匹配的,因此参数的位置不影响后端数据获取参数的结果
https://i-blog.csdnimg.cn/blog_migrate/fdf74426ce7e0ed00989f4335f6b5cf8.png
传递对象

当参数比力多时,就必要很多形参,而且每增长一个参数,就必要修改方法的声明,此时,我们可以将这些参数封装为一个对象
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;
    }
后端程序正确接收到各个属性的值
https://i-blog.csdnimg.cn/blog_migrate/ac5cc0a4b17ae186c9ca165345e18693.png
Spring 会根据参数名称自动绑定到对象的各个属性
https://i-blog.csdnimg.cn/blog_migrate/fadae1c9229429253776ebed94c72fee.png
当某个属性未传递时,则赋值为null,基本范例则赋值为默认初始值
https://i-blog.csdnimg.cn/blog_migrate/8586db8322c47bab3bc39924cd2a2373.png
后端参数重命名

前端传递的参数 key 和 后端接收到的 key 可以不同等,比方前端传递参数 name 给后端,而后端利用 userName 来接收,这种请求下,我们可以利用注解 @RequestParam 来重命名前后端的参数值
@RequestMapping("/user")
@RestController
public class UserController {
    @RequestMapping("/login")
    public String login(@RequestParam("name") String userName) {
      return "接收到用户名: " + userName;
    }
}
https://i-blog.csdnimg.cn/blog_migrate/214e8c8727ca89da9d4838b8327a8433.png
传递的参数 name 正确绑定到后端参数 userName 上
https://i-blog.csdnimg.cn/blog_migrate/2bf8aa346e97de839f55b0d627f992d2.png
而此时,若利用 userName 进行传参:
https://i-blog.csdnimg.cn/blog_migrate/9aa9e380ef7db53e4d123aac2b448123.png观察打印的错误日志:
https://i-blog.csdnimg.cn/blog_migrate/51fcb7d249b42f680961589284ceb22e.png
请求参数 name 不存在
我们可以发现:
   1. 在利用 @RequestParam 进行重命名时,请求参数只能与 @RequestParam 声明的名称同等,才气进行参数绑定和赋值
2. 在利用 @RequestParam 进行重命名时,参数就变成了必传参数
    在利用 @RequestParam 时,若前端参数是一个非必传参数,此时该怎样解决呢?
我们查看 @RequestParam 注解的实现细节:
https://i-blog.csdnimg.cn/blog_migrate/87a86f82d3a06206d0e956e7741afcfb.png
我们可以看到, 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);
    }
}
发送请求并传参:
https://i-blog.csdnimg.cn/blog_migrate/888bfe32bd2140ab5012b63f9cf11c61.png
中心分割的 , 必须为英文的逗号
也可利用:
https://i-blog.csdnimg.cn/blog_migrate/5859491fd7cde47c293d307b4e51a7d5.png
请求参数名与形参数组名称类似且请求参数多个,后端界说数组范例形参即可接收参数
传递聚集

聚集参数与数组类似,同一个请求参数名有多个,且必要利用 @RequestParam 绑定参数关系
   默认情况下,请求中参数名类似的多个值,是封装到数组中的,若必要封装到聚集中,必要利用 @RequestParam 绑定参数关系
    @RequestMapping("/getList")
    public String getList(@RequestParam List<String> list) {
      return "接收到参数list" + list;
    }
同样的,有两种方式进行传参:
https://i-blog.csdnimg.cn/blog_migrate/b69f2160ab1d19148a959698ff68b661.png
https://i-blog.csdnimg.cn/blog_migrate/0f99c86975faca59ae8e5cde4060d273.png
传递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:**将字符串转换为对象
运行结果:
https://i-blog.csdnimg.cn/blog_migrate/a22c2425d916908dd22d54fb5f880c73.png
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请求参数:
https://i-blog.csdnimg.cn/blog_migrate/86dca436e970349ca6a2b46faf269e6b.png
后端成功接收
获取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测试:
https://i-blog.csdnimg.cn/blog_migrate/015b57e638c5b225667f8fd444a2cae7.png
后端正确获取到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;
    }
https://i-blog.csdnimg.cn/blog_migrate/d0801e427f712d7afd0d478dffd3bf0f.png
文件上传

在传输文件时,我们必要利用 @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发送请求:
https://i-blog.csdnimg.cn/blog_migrate/e052c31231528bb88d121efccba36a66.png
同时查看文件是否上传成功:
https://i-blog.csdnimg.cn/blog_migrate/df28c87cb2d778ff0f1c3b5089695c7e.png

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: SpringMVC 请求参数接收