Spring Boot 控制層之參數傳遞方法詳解
當然,您自己創建一個項目也是可以的。
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 參數傳遞內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 關於postman傳參的幾種格式 list,map 等
- 聊聊@RequestParam,@PathParam,@PathVariable等註解的區別
- springboot RESTful以及參數註解的使用方式
- 基於params、@PathVariabl和@RequestParam的用法與區別說明
- 關於@RequestParam註解的使用(簡單易懂)