【SpringMVC】详解参数传递与实战指南
目录
1.前言
2.正文
2.1基础参数传递
2.1.1单参数
2.1.2多参数
2.2对象参数绑定
2.2.1自动封装对象
2.2.2参数别名处理
2.3集合类型处理
2.3.1数组接收
2.3.2List集合接收
2.4JSON参数处理
2.4.1介绍JSON
2.4.2传递JSON参数
2.5RESTful风格参数
2.6文件上传处理
2.7完整调试代码
3.小结
1.前言
哈喽大家好吖,在SpringMVC开发中,参数传递是开发者每天都要面对的核心问题。不同的业务场景需要采用不同的参数接收方式,合理的参数处理能大幅提升开发效率和代码质量。本文将通过一个完整的RequestController
案例,详解10种常见参数传递方式,助你彻底掌握SpringMVC参数传递技巧。
2.正文
官方文档:Spring Framework Documentation :: Spring Frameworkhttps://docs.spring.io/spring-framework/reference/
2.1基础参数传递
2.1.1单参数
@RequestMapping("/r1")
public String r1(String keyword){return "接收参数:" + keyword;
}
调用示例:
/request/r1?keyword=spring
特点:
参数名与方法参数名严格匹配
自动完成基本类型转换(String→int等)
若参数不存在会注入
null
2.1.2多参数
@RequestMapping("r2")
public String r2(String name, int id){return "receive:" + name + id;
}
调用示例:
/request/r2?name=Alice&id=1001
注意事项:
基本类型参数不能为null(如int)
推荐使用包装类型
Integer
避免空指针异常
避免空指针:
@RequestMapping("r3")public String r3(Integer number){return "receive" + number;}
2.2对象参数绑定
2.2.1自动封装对象
@RequestMapping("r4")
public String r4(student s1){return "receive" + s1.toString();
}
调用示例:
/request/r4?id=1002&name=Bob
实现机制:
Spring自动创建Student实例
通过setter方法进行属性注入
支持嵌套对象属性绑定
2.2.2参数别名处理
@RequestMapping("/r5")
public String r5(@RequestParam(value = "n", required = false)String name){return "receive" + name;
}
注解说明:
value
:指定参数别名
required
:是否必须参数(默认true)
defaultValue
:默认值设置
2.3集合类型处理
2.3.1数组接收
@RequestMapping("/r6")
public String r6(String[] array){return "receive" + Arrays.toString(array);
}
调用方式:
/request/r6?array=1&array=2
/request/r6?array=1,2,3
2.3.2List集合接收
@RequestMapping("/r7")
public String r7(@RequestParam List<Integer> list){return "receive:" + list;
}
特别注意:
必须使用
@RequestParam
注解禁止使用ArrayList等具体实现类
推荐使用包装类型避免转型异常
2.4JSON参数处理
2.4.1介绍JSON
JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。它基于纯文本,使用Unicode编码,具有广泛的兼容性和灵活性,常用于网络应用之间的数据传输。
JSON格式以键值对的形式组织数据,支持两种主要的数据结构:
对象(Object)
一个无序的键值对集合,用大括号“{}”括起来。
键(Key)必须是字符串类型,值(Value)可以是字符串、数值、布尔值、数组、对象或
null
。键与值之间用英文冒号“:”分隔,键值对之间用英文逗号“,”分隔。
例如:
{"name": "Kimi","age": 25,"isStudent": false,"hobbies": ["reading", "traveling"],"address": {"city": "Beijing","country": "China"} }
数组(Array)
一个有序的值集合,用方括号“[]”括起来。
数组中的值可以是任意类型,包括字符串、数值、布尔值、对象、数组或
null
。数组中的值之间用英文逗号“,”分隔。
例如:
["apple",123,true,null,{"key": "value"},[1, 2, 3] ]
在SpringMVC中,JSON参数的自动转换依赖于HttpMessageConverter体系。当检测到请求的Content-Type
为application/json
时,框架会使用MappingJackson2HttpMessageConverter
进行数据绑定。
处理流程:
前端发送JSON格式请求体
DispatcherServlet选择匹配的消息转换器
Jackson库将JSON反序列化为Java对象
通过
@RequestBody
注入方法参数
2.4.2传递JSON参数
@RequestMapping("/r8")
public String r8(@RequestBody student student1){return student1.toString();
}
请求要求:
Content-Type必须为
application/json
需要Jackson依赖支持
支持嵌套复杂对象解析
请求示例:
{"id": 1003, "name": "Carol"}
2.5RESTful风格参数
@RequestMapping("/path/{pathid}")
public String r9(@PathVariable Integer pathid){return "获取路径id" + pathid;
}
调用示例:
/request/path/1004
最佳实践:
适合资源定位场景
支持正则表达式校验
可配合
@GetMapping
等注解使用
2.6文件上传处理
@RequestMapping("/r10")
public String r10(MultipartFile file) throws IOException {file.transferTo(new File("D:\\桌面\\" + file.getOriginalFilename()));return "文件上传成功";
}
表单需设置
enctype="multipart/form-data"
支持多文件同时上传
注意文件存储路径权限问题
2.7完整调试代码
package com.example.demo;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.IOException;
import java.util.List;class student{int id;String name;public student() {}public student(int id, String name) {this.id = id;this.name = name;}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;}@Overridepublic String toString() {return super.toString();}
}@RequestMapping("/request")
@Controller
@ResponseBody
public class RequestController {@RequestMapping("/r1")public String r1(String keyword){return "接收参数:" + keyword;}@RequestMapping("r2")public String r2(String name, int id){return "receive:" + name + id;}@RequestMapping("r3")public String r3(Integer number){return "receive" + number;}@RequestMapping("r4")public String r4(student s1){return "receive" + s1.toString();}//从前端接受参数n,赋值给name@RequestMapping("/r5")public String r5(@RequestParam(value = "n", required = false)String name){return "receive" + name;}//传递数组@RequestMapping("/r6")public String r6(String[] array){return "receive" + array.toString();}//传递集合@RequestMapping("/r7")public String r7(@RequestParam List<Integer> list){return "receive:" + list;}//传递json@RequestMapping("/r8")public String r8(@RequestBody student student1){return student1.toString();}//从URL中获取参数@RequestMapping("/path/{pathid}")public String r9(@PathVariable Integer pathid){return "获取路径id" + pathid;}//上传文件@RequestMapping("/r10")public String r10(MultipartFile file) throws IOException {System.out.println(file.getOriginalFilename());file.transferTo(new File("D:\\桌面\\" + file.getOriginalFilename()));return "文件上传成功";}}
3.小结
今天的分享到这里就结束了,喜欢的小伙伴点点赞点点关注,你的支持就是对我最大的鼓励,大家加油!