从简单类型到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 的请求处理机制,提升你的开发技能!

相关推荐
Piper蛋窝1 小时前
深入 Go 语言垃圾回收:从原理到内建类型 Slice、Map 的陷阱以及为何需要 strings.Builder
后端·go
Bug退退退1232 小时前
RabbitMQ 高级特性之死信队列
java·分布式·spring·rabbitmq
六毛的毛3 小时前
Springboot开发常见注解一览
java·spring boot·后端
AntBlack3 小时前
拖了五个月 ,不当韭菜体验版算是正式发布了
前端·后端·python
31535669133 小时前
一个简单的脚本,让pdf开启夜间模式
前端·后端
uzong4 小时前
curl案例讲解
后端
一只叫煤球的猫5 小时前
真实事故复盘:Redis分布式锁居然失效了?公司十年老程序员踩的坑
java·redis·后端
大鸡腿同学5 小时前
身弱武修法:玄之又玄,奇妙之门
后端
轻语呢喃7 小时前
JavaScript :字符串模板——优雅编程的基石
前端·javascript·后端
MikeWe7 小时前
Paddle张量操作全解析:从基础创建到高级应用
后端