SpringMVC——请求
目录
传递参数与后端接收
1.传递单个参数
2.传递多个参数
3.传递对象
4.传递数组
5.传递集合
6.传递JSON数据
7.获取URL的参数
8.上传文件
传递参数与后端接收
访问不同的路径, 就是发送不同的请求。在发送请求时, 可能会带⼀些参数, 所以学习Spring的请求, 主要是学习如何传递参数到后端以及后端如何接收.
Spring MVC 会根据方法的参数名, 找到对应的参数, 赋值给方法,所以后端程序和浏览器的参数的名字需要一样。
1.传递单个参数
浏览器:http://127.0.0.1:8080/param/m1?name=spring
后端程序:import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;@RestController @RequestMapping("/param") public class ParamController {@RequestMapping("/m1")public String method1(String name){return "接收到参数name:"+ name; }
深入理解
2.传递多个参数
当有多个参数时,前后端进行参数匹配时,是以参数的名称进行匹配的,因此参数的位置是不影响后端获取参数的结果。
浏览器:http://127.0.0.1:8080/param/m2?name=zhangsan&password=123456
后端程序:@RequestMapping("/m2") public Object method2(String name, String password) {return "接收到参数name:" + name + ", password:" + password; }
url的参数名和后端函数的参数名要相同,但是当两个名称不相同时,需要进行重命名:@RequestParam(前端参数名),使用了这个参数前端必须传这个参数,不然后端返回的信息是报错信息,除非把required的值改为false返回的不是报错信息而是null。
@RequestMapping("/p7") // 表示从前端参数里面找到userName,把它的值绑给name public String p7(@RequestParam("userName") String name){return "接收到参数,name" + name; }
@RequestMapping("/p7") // 将required改为false则表明不是必传参数,在这种情况下后端返回的是null public String p7(@RequestParam(value = "userName",required = false) String name){return "接收到参数,name" + name; }
所以使用了@RequestParam注解后,前端的参数必须和注解里的值(value)相同
3.传递对象
如果参数比较多时, 方法声明就需要有很多形参。并且后续每次新增⼀个参数, 也需要修改方法声明。不妨把这些参数封装为⼀个对象。传参方法可以和传多个参数一样。需要保证前端的参数名和后端类的对象名要相同,否则需要重命名。如果前端传的值和对象里属性个数不匹配,不会报错,没传的默认为0/null等(成员变量默认值为0)。
浏览器:http://127.0.0.1:8080/param/m3?id=5&name=zhangsan&password=123456
后端程序:
@RequestMapping("/m3") public Object method3(Person p){return p.toString(); }
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;}@Overridepublic String toString() {return "Person{" +"id=" + id +", name='" + name + '\'' +", password='" + password + '\'' +'}';} }
注意:要有set方法才能传参
4.传递数组
Spring MVC 可以⾃动绑定数组参数的赋值
数组参数:请求参数名与形参数组名称相同且请求参数为多个, 后端定义数组类型形参即可接收参数浏览器传参:
http://127.0.0.1:8080/param/m4?arrayParam=zhangsan&arrayParam=lisi&arrayParam=wangwu或者使⽤ http://127.0.0.1:8080/param/m4?arrayParam=zhangsan,lisi,wangwu
后端接收代码:
@RequestMapping("/m4") public String method4(String[] arrayParam) {return Arrays.toString(arrayParam); }
5.传递集合
和数组类似, 同⼀个请求参数名有多个值, 但同时需要使⽤ @RequestParam 绑定参数关系。
- 默认情况下,请求中参数名相同的多个值,是封装到数组. 如果要封装到集合,要使⽤@RequestParam 绑定参数关系
浏览器传参:
http://127.0.0.1:8080/param/m5?list=zhangsan&list=lisi&list=wangwu
或者 http://127.0.0.1:8080/param/m5?list=zhangsan,lisi,wangwu后端接收代码:
@RequestMapping("/m5") public String method5(@RequestParam List<String> list){return "list:"+list }
如果value的值和后端相同,则可以省略value的内容。
6.传递JSON数据
简单来说,JSON就是一种数据格式,有自己的格式和语法,使用文本表示一个对象或数组的信息,因此JSON本质是字符串,主要负责在不同的语言中或者相同的语言不同的系统中数据传递和交换。
JSON的语法:
- 数据在键值对(Key/Value) 中
- 数据由逗号 , 分隔
- 对象⽤ {} 表⽰
- 数组⽤ [] 表⽰
- 值可以为对象, 也可以为数组, 数组中可以包含多个对象
JSON的两种结构
- 对象: ⼤括号 {} 保存的对象是⼀个⽆序的键值对 集合. ⼀个对象以左括号 { 开始, 右括号}结束。每个"键"后跟⼀个冒号 : ,键值对使⽤逗号 , 分隔
- 数组: 中括号 [] 保存的数组是值(value)的有序集合. ⼀个数组以左中括号 [ 开始, 右中括号 ] 结束,值之间使⽤逗号 , 分隔。
JSON字符串和Java对象互转
Spring MVC框架也集成了JSON的转换工具, 可以直接使用, 来完成JSON字符串和Java对象的互转。本质上是jackson-databind提供的功能, Spring MVC框架中已经把该工具包引入了进来, 直接使用即可, 如果脱离Spring MVC使用, 需要引入相关依赖。
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.13.5</version> </dependency>
传递JSON数据:
前端
后端使用@RequestBody修饰,表示从请求的正文中获取数据
@RequestMapping("/p6") public String method6(User user){return "user:"+user; }
@RequestMapping("/p10") public String method10(@RequestBody User user){return "user:"+user; }
Spring默认只能从表单参数或URL参数中提取值
@RequestBody
的作用是告诉 Spring Boot:请将请求体中的 JSON 数据反序列化为 Java 对象,Spring 会使用 Jackson 等 JSON 解析器把这个 JSON 直接转为目标对象。否则 Spring 不会自动去解析请求体里的内容。
类型 请求方式 请求头 请求体 后端参数写法 表单提交 POST application/x-www-form-urlencoded
name=Java&desc=入门
Course course
(不用@RequestBody
)JSON 提交 POST application/json
{ "name": "Java", "desc": "入门" }
@RequestBody Course course
7.获取URL的参数
使用@PathVariable(表示从URL中获得参数 )
path variable: 路径变量
这个注解主要作⽤在请求URL路径上的数据绑定。默认传递参数写在URL上,SpringMVC就可以获取到。
// 前端:http://127.0.0.0.1:8080/param/article/1// 单个参数 // 如果URL的参数(value的值)和后端参数相同,则@PathVariable之后不用使用“()”,类似@RequstParam @RequestMapping("/article/{articleId}") public String method7(@PathVariable String articleId){return "articleId:"+articleId; }
@RequestMapping("/article/{articleId}") // 如果URL的参数(value的值)和后端参数不相同,则可以不能省略value的内容。 public String p11(@PathVariable("articleId") String id){return "articleId:"+id; }
// 前端:http://127.0.0.1:8080/param/article/1/zhangsan// 多个参数 // 必须都得传,且前端的url参数要和后端的参数顺序一致 @RequestMapping("/article/{articleId}/{name}") public String method7(@PathVariable("articleId") String id,@PathVariable String name){return "articleId:"+id+",name:"+name; }
注:不能企图通过将requierd的值改为false从而少传参数,路径有哪些参数就必须都传。
8.上传文件
使用 MultipartFile file,上传视频、图片等二进制内容
前端
@RequestMapping("/m8") public String method8(MultipartFile file){System.out.println(file.getOriginalFilename());return "文件名称:"+file.getOriginalFilename(); }
如果前后端参数名称不同,使用@RequestPart()
@RequestMapping("/m9") public String method9(@RequestPart("fileName") MultipartFile file){System.out.println(file.getOriginalFilename());return "文件名称:"+file.getOriginalFilename(); }
跨域:域名 端口号 进程改变