Spring请求传递参数的解决方案
作者:遇事问春风乄
🎍序言
访问不同的路径,就是发送不同的请求.在发送请求时,可能会带⼀些参数,所以我们在学习Spring的请求时,主要是学习如何传递参数到后端以及后端如何接收.
下面博主会对传递参数进行一个详解,咱们主要是使⽤浏览器和Postman来模拟
🌴传递单个参数
比如博主写了以下程序
@RequestMapping("pt") @RestController public class Test_1_12 { @RequestMapping("test1") public String test1(String name) { return "接收到的参数名为:" + name; } }
当我们运行后,用浏览器进行访问
http://127.0.0.1:8080/pt/test1?name=遇事问春风
访问结果如下:
注意:
如果参数名不一致,获取不到参数,默认没有传参,默认值为null
@RequestMapping("test2") public String test2(Integer year) { return "接收到的参数名为:" + year; }
如果参数类型不⼀致,是会进行报错的
@RequestMapping("test3") public String test3(int year) { return "接收到的参数名为:" + year; }
如果使⽤基本类型来接收参数时,参数必须传(除boolean类型),否则会报500错误
@RequestMapping("test4") public String test4(String name,Integer year) { return "接收到的参数名为:" + name + " " + year; }
日志中也会进行报错。
建议使用包装类!!!
🍀传递多个参数
与传递单个参数一样
不同的是当有多个参数时,前后端进⾏参数匹配时,是以参数的名称进⾏匹配的,因此参数的位置是不影响后端获取参数的结果
@RequestMapping("test4") public String test4(String name,Integer year) { return "接收到的参数名为:" + name + " " + year; }
🎄传递对象
如果参数⽐较多时,⽅法声明就需要有很多形参.并且后续每次新增⼀个参数,也需要修改⽅法声明.
我们不妨把这些参数封装为⼀个对象.
Spring MVC也可以⾃动实现对象参数的赋值,⽐如Person对象
public class Person { private int id; private String name; private String password; 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 String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "Person{" + "id=" + id + ", name='" + name + '\'' + ", password='" + password + '\'' + '}'; } }
@RequestMapping("test5") public String test5(Person person) { return "接收到的参数名为:" + person.toString(); }
注意:
Spring会根据参数名称⾃动绑定到对象的各个属性上,如果某个属性未传递,则赋值为null(基本类型则赋值为默认初识值,⽐如int类型的属性,会被赋值为0)
🌳后端参数重命名(后端参数映射)
某些特殊的情况下,前端传递的参数key和我们后端接收的key可以不⼀致,⽐如前端传递了⼀个time给后端,⽽后端是使⽤createtime字段来接收的,这样就会出现参数接收不到的情况,如果出现这种情况,我们就可以使⽤ @RequestParam 来重命名前后端的参数值.
@RequestMapping("test6") public String test6(@RequestParam("time") String createtime) { return "接收到的参数名为:" + createtime; }
注意:
使⽤ @RequestParam 进⾏参数重命名时,请求参数只能和@RequestParam 声明的名称⼀致,才能进⾏参数绑定和赋值.
使⽤ @RequestParam 进⾏参数重命名时,参数就变成了必传参数
如果我们不想让他变成必传参数,我们可以通过设置@RequestParam 中的 required=false (默认为true,必传)来避免不传递时报错
@RequestMapping("test6") public String test6(@RequestParam(value = "time",required = false) String createtime) { return "接收到的参数名为:" + createtime; }
🌲传递数组
Spring MVC 可以⾃动绑定数组参数的赋值
@RequestMapping("test7") public String test7(String[] names) { return "接收到的参数名为:" + Arrays.toString(names); }
数组传参时,有以下几种:
1:http://127.0.0.1:8080/pt/test7?names=张三&names=李四
2:http://127.0.0.1:8080/pt/test7?names=张三%2c李四
3:http://127.0.0.1:8080/pt/test7?names=张三,李四
🎍传递集合
集合参数:和数组类似,同⼀个请求参数名有为多个
不同的时需要使⽤ @RequestParam 绑定参数关系
传参方式与上述数组传参三种方式一样
@RequestMapping("/m6") public String method6(@RequestParam List<String> listParam){ return "size:"+listParam.size() + ",listParam:"+listParam; }
🌴传递JSON数据
🚩JSON概念
JSON:JavaScript Object Notation【JavaScript对象表⽰法】
JSON是⼀种轻量级的数据交互格式.它基于ECMAScript(欧洲计算机协会制定的js规范)的⼀个⼦集,采⽤完全独⽴于编程语⾔的⽂本格式来存储和表⽰数据。
简单来说:JSON就是⼀种数据格式,有⾃⼰的格式和语法,使⽤⽂本表⽰⼀个对象或数组的信息,因此JSON本质是字符串.
主要负责在不同的语⾔中数据传递和交换
🚩JSON的语法
数据在 键值对(Key/Value) 中
数据由逗号 , 分隔
对象⽤ {} 表⽰
数组⽤ [] 表⽰
值可以为对象,也可以为数组,数组中可以包含多个对象
🚩JSON的两种结构
- 对象:⼤括号 {} 保存的对象是⼀个⽆序的 键值对 集合.⼀个对象以左括号 { 开始,右括号 }结束。每个"键"后跟⼀个冒号 : ,键值对使⽤逗号 , 分隔
- 数组: 中括号 [ ] 保存的数组是值(value)的有序集合.⼀个数组以左中括号 [ 开始,右中括号 ] 结束,值之间使⽤逗号 , 分隔。
🚩JSON字符串和Java对象互转
JSON本质上是⼀个字符串,通过⽂本来存储和描述数据
Spring MVC框架也集成了JSON的转换⼯具,我们可以直接使⽤,来完成JSON字符串和Java对象的互转
🚩JSON的优点
- 简单易⽤:语法简单,易于理解和编写,可以快速地进⾏数据交换
- 跨平台⽀持:JSON可以被多种编程语⾔解析和⽣成,可以在不同的平台和语⾔之间进⾏数据交换和传输
- 轻量级:相较于XML格式,JSON数据格式更加轻量级,传输数据时占⽤带宽较⼩,可以提⾼数据传输速度
- 易于扩展:JSON的数据结构灵活,⽀持嵌套对象和数组等复杂的数据结构,便于扩展和使⽤
- 安全性:JSON数据格式是⼀种纯⽂本格式,不包含可执⾏代码,不会执⾏恶意代码,因此具有较⾼的安全性
基于以上特点,JSON在Web应⽤程序中被⼴泛使⽤,如前后端数据交互、API接⼝数据传输等
🚩传递JSON对象
接收JSON对象,需要使⽤ @RequestBody 注解
RequestBody:请求正⽂,意思是这个注解作⽤在请求正⽂的数据绑定,请求参数必须在写在请求正⽂中
@RequestMapping("test9") public String test9(@RequestBody Person person) { return "接收到的参数名为:" + person.toString(); }
我们使用使⽤Postman来发送json请求参数
🎋获取URL中参数@PathVariable
path variable:路径变量
和字⾯表达的意思⼀样,这个注解主要作⽤在请求URL路径上的数据绑定
@RequestMapping("/test10/{id}/{name}") public String test10(@PathVariable Integer id, @PathVariable("name") String userName){ return "解析参数id:"+id+",name:"+userName; }
注意:
- 如果⽅法参数名称和需要绑定的URL中的变量名称⼀致时,可以简写,不⽤给@PathVariable的属性赋值,如上述例⼦中的id变量
- 如果⽅法参数名称和需要绑定的URL中的变量名称不⼀致时,需要@PathVariable的属性value赋值,如上述例⼦中的userName变量
🍃上传⽂件@RequestPart
代码实现如下:
@RequestMapping("/test11") public String getfile(@RequestPart("file") MultipartFile file) throws IOException { //获取⽂件名称 String fileName = file.getOriginalFilename(); //⽂件上传到指定路径 file.transferTo(new File("D:/temp/" + file.getOriginalFilename())); return "接收到⽂件名称为: "+fileName; }
我们这里使用Postman发送请求
我们到相应路径进行查看是否上穿成功
🎄获取Cooki/Session
由于这部分内容较多,博主单独写了出来。链接如下:
🍀获取Header
获取Header也分为两种方式
🚩传统获取 header
@RequestMapping("/test17") public String test17(HttpServletRequest request, HttpServletResponse response) { String userAgent = request.getHeader("User-Agent"); return "userAgent:"+userAgent; }
🚩简洁获取header
@RequestMapping("/test18") public String test18(@RequestHeader("User-Agent") String userAgent) { return "userAgent:"+userAgent; }
🚩结果展示
传统获取
简洁获取
⭕总结
到此这篇关于 Spring请求如何传递参数详解的文章就介绍到这了,更多相关 Spring请求传递参数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!