从简单类型到JSON:Spring MVC参数传递技巧

Spring MVC 参数传递详解:从基础到实战

在 Spring MVC 中,参数传递是前后端交互的关键环节。通过掌握不同类型的参数传递方式,开发者可以更高效地构建功能完善的 Web 应用。本文将详细介绍 Spring MVC 中的参数传递方法,包括查询参数、路径变量、请求体、数组、集合以及 JSON 数据的互换。


一、查询参数(Query Parameters)

查询参数通过 URL 的查询字符串传递,通常用于 GET 请求。

1. 通过postman传递单个参数

less 复制代码
@RequestMapping("/Requst")
@RestController
public class RequstController {
    @RequestMapping("r1")
    public String r1(String keyword){
        return "接收参数"+keyword;
    }
}

12345678



2.通过postman传递多个参数

typescript 复制代码
@RequestMapping("/Requst")
@RestController
public class RequstController {
 @RequestMapping("r2")
    public String r2(String Username,String password){
        return "用户名Username:"+Username+"密码password:"+password;
    }
}

12345678

通过postman传递多个参数。

3. 通过 @RequestParam 进行重命名

less 复制代码
@RequestMapping("/Requst")
@RestController
public class RequstController {
@RequestMapping("r4")
    public String r4(@RequestParam(value = "q",required = false) String keyword){
        return "接收参数:"+keyword;
    }
}

12345678

通过postman观察:

4.可选参数

required 的默认值为true, 表⽰含义就是: 该注解修饰的参数默认为必传

既然如此, 我们可以通过设置 @RequestParam 中的 required=false 来避免不传递时报错.

less 复制代码
@GetMapping("/users")
public List<User> getUsers(@RequestParam(name = "age", required = false) int age) {
    return userService.getUsers(age);
}

1234

二、路径参数(Path Variables)

路径参数将参数嵌入到 URL 路径中,适用于资源标识。

1. 通过 @PathVariable 接收参数

less 复制代码
@RequestMapping("/Requst")
@RestController
public class RequstController {
 //从url当中获取参数
    @RequestMapping("/artic/{type}/{articID}")//必传参数
    public  String r8(@PathVariable String type,@PathVariable Integer articID){
            return "文章类型:"+type+"获取文章ID:"+articID;
    }
}

123456789

通过postman测试:


如果不传这个参数通过postman测试:

得到验证:可以看到这个参数是必须传的。



2. 参数重命名

less 复制代码
@RequestMapping("/Requst")
@RestController
public class RequstController {
//从url当中获取参数(对articID重命名)
   @RequestMapping("/artic/{type}/{articID}")//必传参数
    public  String r9(@PathVariable String type,@PathVariable("articID") Integer articalID){
        return "文章类型:"+type+"获取文章ID:"+articalID;
    }
}

123456789

三、对象

传递对象

先创建一个类UserInfo:

typescript 复制代码
import lombok.Data;
@Data
public class UserInfo {
    private String name;
    private String gender;
    private Integer age;
}


12345678

引入lombok依赖:

xml 复制代码
<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<version>1.18.30</version>
		</dependency>

12345

解释: 引入lombok依赖,然后通过@Data注解,可以自动生成构造方法等等。

less 复制代码
@RequestMapping("/Requst")
@RestController
public class RequstController {
 @RequestMapping("r3")
    public String r3(UserInfo userInfo){
        return "UserInfo="+userInfo.toString();
    }
}

12345678

通过postman进行传递对象的参数:


四、数组(Arrays)

用于传递一组相同类型的数据。

1. 传递数组

less 复制代码
@RequestMapping("/Requst")
@RestController
public class RequstController {
  //传递数组
    @RequestMapping("r5")
    public String r5(String[] arr){
        return "接收参数:arr="+ Arrays.toString(arr);
    }
}

123456789

通过postman进行观察:


五、集合(Collections)

传递一组对象或复杂数据类型。

1. 通过 @RequestBody 传递集合

less 复制代码
@RequestMapping("/Requst")
@RestController
public class RequstController {
 //传递集合
    @RequestMapping("r6")
    public String r6(@RequestParam List<Integer> list){
        return "接收参数:List="+ list;
    }
}

123456789

postman 传参测试

六、JOSN

1.JSON概念

JSON:JavaScript Object Notation 【JavaScript 对象表示法】

JSON是⼀种轻量级的数据交互格式. 它基于 ECMAScript (欧洲计算机协会制定的js规范)的⼀个子集,采用完全独立于编程语言的文本格式来存储和表示数据。

简单来说:JSON就是⼀种数据格式, 有自己的格式和语法, 使用文本表示⼀个对象或数组的信息, 因此JSON本质是字符串. 主要负责在不同的语言中数据传递和交换


类似于:

• 国际通用语言-英语

• 中国56个民族不同地区的通用语言-普通话

有自己的语法, 其他语言也认识。


2.JSON语法

JSON 是⼀个字符串,其格式非常类似于 JavaScript 对象字面量的格式。

我们先来看⼀段JSON数据:

json 复制代码
{
  "name": "John",
  "age": 30,
  "city": "New York"
}

12345

也可以压缩表示:

json 复制代码
{"name": "John","age": 30,"city": "New York"}

1

语法

  1. 数据在 键值对(Key/Value) 中
  2. 数据由逗号 , 分隔
  3. 对象用 {} 表示
  4. 数组用 [] 表示
  5. 值可以为对象, 也可以为数组, 数组中可以包含多个对象
    JSON的两种结构
  6. 对象: 大括号 {} 保存的对象是⼀个无序的 键值对 集合. 一个对象以左括号 { 开始, 右括号 }结束。每个"键"后跟⼀个冒号 : ,键值对使用逗号 , 分隔。
  7. 数组: 中括号 [] 保存的数组是值(value)的有序集合. ⼀个数组以左中括号 [ 开始, 右中括号 ] 结束。

以下都是合法的JOSN数据:

css 复制代码
{"name":"admin","age":18}
["hello", 3.1415, "json"]
[{"name":"admin","age":18},{"name":"root","age":16},{"name":"张三","age":20}]
1

1234

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

xml 复制代码
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.18.0</version>
</dependency>


123456

3.传递JOSN对象

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

less 复制代码
@RequestMapping("/Requst")
@RestController
public class RequstController {
  //传递Joson
    @RequestMapping("r7")
    public String r7(@RequestBody UserInfo userInfo){
        return userInfo.toString();
    }
}

123456789

通过postman测试:


不用@RequstBody注解看看:


七、文件请求

1.获取文件

less 复制代码
@RequestMapping("/Requst")
@RestController
public class RequstController {
  @RequestMapping("r10")
    public String r10(MultipartFile file){
        System.out.println(file.getOriginalFilename());
        return "获取文件成功!";
    }
}

123456789

通过postman测试:

2.上传文件

less 复制代码
@RequestMapping("/Requst")
@RestController
public class RequstController {
    @RequestMapping("r11")
    //@RequestPart("file1") 对file进行重命名为file1
    public String r11(@RequestPart("file1") MultipartFile file) throws IOException {
        System.out.println(file.getOriginalFilename());
        //文件上传
        file.transferTo(new File("D:\temp\"+file.getOriginalFilename()));
        return "获取文件成功!";
    }
}

123456789101112

通过postman测试:

可以看到上传成功了!!!


八、注意事项与最佳实践

  1. 参数校验

    • 使用 @Valid 注解对参数进行校验。
    less 复制代码
    @PostMapping("/users")
    public User createUser(@RequestBody @Valid User user) {
        return userService.createUser(user);
    }
    
    1234
  2. 参数命名

    • 保持前后端参数名称一致,减少重命名的复杂性。
  3. 解决常见问题

    • 避免通过 GET 请求传递敏感数据。
    • 使用 POSTPUT 请求传递大数据或敏感信息。

九、总结

通过本文,你已经掌握了如何在 Spring MVC 中传递各种类型的参数,包括简单类型、对象、数组、集合、JSON 数据等。合理运用这些参数传递方式,可以开发出功能强大且易于维护的 Web 应用。

希望这篇详解能够帮助你更好地理解 Spring MVC 的请求处理机制,提升你的开发技能!

相关推荐
有你有我OK10 分钟前
springboot Admin 服务端 客户端配置
spring boot·后端·elasticsearch
xiaoopin2 小时前
简单的分布式锁 SpringBoot Redisson‌
spring boot·分布式·后端
你的人类朋友7 小时前
设计模式有哪几类?
前端·后端·设计模式
Yeats_Liao7 小时前
Go Web 编程快速入门 10 - 数据库集成与ORM:连接池、查询优化与事务管理
前端·数据库·后端·golang
你的人类朋友8 小时前
适配器模式:适配就完事了bro!
前端·后端·设计模式
间彧9 小时前
SpringBoot集成RocketMQ事务消息
后端
جيون داد ناالام ميづ9 小时前
Spring AOP核心原理分析
java·数据库·spring
间彧9 小时前
RocketMQ消息幂等控制:借助数据库唯一约束实现
后端
间彧9 小时前
RocketMQ消息幂等控制:借助Redis实现
后端