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

相关推荐
AskHarries20 分钟前
Spring Boot对接twilio发送邮件信息
后端
李长渊哦35 分钟前
引入其他 YML 配置源 —— Spring Boot 中的 `import` 功能
数据库·spring boot·后端
高建伟-joe35 分钟前
Spring Boot Tomcat 漏洞修复
java·spring boot·后端·网络安全·tomcat
小钊(求职中)41 分钟前
RabbitMQ从入门到实战-知识详情总结
java·服务器·spring boot·分布式·spring·面试·rabbitmq
uhakadotcom1 小时前
Python 缓存利器:`cachetools`
后端·面试·github
tan180°1 小时前
版本控制器Git(4)
linux·c++·git·后端·vim
龙雨LongYu122 小时前
Go执行当前package下的所有方法
开发语言·后端·golang
程序员小刚2 小时前
基于springboot + vue 的实验室(预约)管理系统
vue.js·spring boot·后端
程序员小刚2 小时前
基于SpringBoot + Vue 的校园论坛系统
vue.js·spring boot·后端
Hamm2 小时前
MCP 很火,来看看我们直接给后台管理系统上一个 MCP?
后端·llm·mcp