Spring Boot 控制层之参数传递方法详解
作者:CN-Dust
当然,您自己创建一个项目也是可以的。
bean包下的Student.java
package com.example.demo.bean; public class Student { private Integer id; //学号 private String name; //姓名 public Student() { } public Student(Integer id, String name) { this.id = id; this.name = name; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
无注解获取参数
- 直接把 HTTP 请求的参数写在后台方法的形参中,允许参数为空。
- HTTP 请求的参数值(字符串)将自动转换为方法形参的类型。
- 要求:方法的参数名称要和 HTTP 请求的参数名称保持一致。
- 适用于 GET 和 POST 请求方式。
后台代码:
@RestController public class TestController { @RequestMapping("/test1") public Student test1(Integer id, String name) { Student s=new Student(); s.setId(id); s.setName(name); return s; } }
前端代码:
<body> <p th:inline = "none" >hello, [[${msg}]]</p> <p th:inline = "none" >hello, [(${msg})]</p> </body>
用postman尝试:
前端请求:http://localhost:8080/test1?id=2019001&name=小明
参数是 key=value 形式
value 默认都是字符串类型
参数和请求之间用?连接
参数之间用&连接
为空值的情况:
使用HttpServletRequest对象
方法的参数中添加 HttpServletRequest 对象。
通过该对象 getParameter(“xxx”) 获取请求的 “xxx” 参数值(字符串值)。
适用于 GET 和 POST 请求方式。
后台代码:
@RequestMapping("/test2") public Student test2( HttpServletRequest request ) { Integer id = Integer.parseInt( request.getParameter("id") ); String name = request.getParameter("name"); Student s=new Student(id,name); return s; }
postman测试:
使用实体类封装 ★
直接使用实体类做为控制器参数,Spring Boot会自动创建这个类的对象,并用 HTTP 参数装配它。
要求:实体类属性名称要和 HTTP 请求的参数名称保持一致。
适用于 GET 和 POST 请求方式。
后台代码:
@RequestMapping("/test3") public Student test3( Student s ) { return s; }
要求:实体类属性名称要和 HTTP 请求的参数名称保持一致
postman测试:
一般情况:
多的参数不接收:
为空:
名称不一致:
使用 @RequestParam 获取参数
在无注解的情况下,要求 HTTP 参数名与控制器参数名称保持一致,然
而现在在前后台分离的趋势下,前端的命名规则可能与后端的不一样。
使用 @RequestParam 注解来确定前后端参数名称的映射关系。
适用于 GET 和 POST 请求方式。
@RequestParam 有三个配置参数:
value 为接收 HTTP 请求的参数名。
required 表示是否必须,默认为 true,表示参数必填。
defaultValue 可设置请求参数的默认值。
后台代码:
@RequestMapping("/test4") public Student test4( @RequestParam(value="stu_id") Integer id, @RequestParam(value="stu_name") String name) { Student s=new Student(); s.setId(id); s.setName(name); return s; }
postman测试:
报错:stu_name参数默认必填
添加默认值
@RequestMapping("/test4") public Student test4(@RequestParam(value="stu_id", required = true, defaultValue = "2019000") Integer id, @RequestParam(value="stu_name", required = false) String name) { Student s=new Student(); s.setId(id); s.setName(name); return s; }
postman测试:
全为空:
使用 @PathVariable 获取参数
REST风格请求,例如:http://localhost:8080/test4/2019001/小明(数据直接放在请求路径上,并用"/“连接)
后台请求映射:
@RequestMapping(”/test4/{id}/{name}")
参数绑定:
@PathVariable(“xxx”) 将占位符参数"xxx"绑定到控制器方法的形参中。
注意:
(1)路径上必须有参数(required=true),且不能设置默认值。
(2)适用于 GET 和 POST 请求方式。
后台代码:
@RequestMapping("/test5/{id}/{name}") public Student test5( @PathVariable("id") Integer id,//这里有两种写法 @PathVariable(value = "name") String name) { Student s=new Student(); s.setId(id); s.setName(name); return s; }
前端请求:(这次不用postman测试了,用也可以,都一样)
错误的前端请求:
@PathVariable与@RequestParam的区别
使用 @RequestBody 获取参数
@RequestBody 主要用来接收前端传递的 json 数据。
注意:
(1)使用 @RequestBody 接收数据时,前端必须 POST 方式提交;
(2)且必须与 contentType = “application/json” 配合使用。
不设置时使用的是默认值:application/x-www-form-urlencoded
后台代码
@PostMapping("/test6") public Student test6(@RequestBody Student s) { return s; }
postman测试:
前端传递对象数组
后台代码
@PostMapping("/test6") public List<Student> test6(@RequestBody List<Student> list) { Iterator it = list.iterator(); while (it.hasNext()){ Student s=(Student)it.next(); System.out.println(s.getId()+":"+s.getName()); } return list; }
postman测试:
控制器代码完整版:
TestController.java
package com.example.demo.controller; import com.example.demo.bean.Student; import org.springframework.boot.web.servlet.ServletComponentScan; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import java.util.*; @RestController @ServletComponentScan public class TestController { @RequestMapping("/test1") public Student test1(Integer id, String name) { Student s=new Student(); s.setId(id); s.setName(name); return s; } @RequestMapping("/test2") public Student test2( HttpServletRequest request ) { Integer id = Integer.parseInt( request.getParameter("id") ); // 转换一下(没有判断空串或null) String name = request.getParameter("name"); Student s=new Student(id,name); return s; } @RequestMapping("/test3") public Student test3( Student s ) { return s; } @RequestMapping("/test4") public Student test4(@RequestParam(value="stu_id", required = true, defaultValue = "2019000") Integer id, @RequestParam(value="stu_name", required = false) String name) { Student s=new Student(); s.setId(id); s.setName(name); return s; } @RequestMapping("/test5/{id}/{name}") public Student test5( @PathVariable("id") Integer id,//这里有两种写法 @PathVariable(value = "name") String name) { Student s=new Student(); s.setId(id); s.setName(name); return s; } @PostMapping("/test6") public List<Student> test6(@RequestBody List<Student> list) { Iterator it = list.iterator(); while (it.hasNext()){ Student s=(Student)it.next(); System.out.println(s.getId()+":"+s.getName()); } return list; } }
到此这篇关于Spring Boot 控制层之参数传递方法详解的文章就介绍到这了,更多相关Spring Boot 参数传递内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!