利用 Spring Boot 來制作 Web 應用,就必定會涉及到前端與后台之間互相傳遞參數。下面演示 Controller 如何接收以 GET 方式傳遞過來的參數。
一、參數直接在路徑中
(1)假設請求地址是如下這種 RESTful 風格,hangge 這個參數值直接放在路徑里面:
http://localhost:8080/helloworld/張三
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloWorldController { @GetMapping("/helloworld/{name}") public String helloworld(@PathVariable("name") String name) { return "獲取到的name是:" + name; } }

二、參數跟在 ? 號后面
1,獲取參數的基本方法
(1)假設請求地址是如下這種傳統方式,參數跟在問號后面:
http:
//localhost:8080/helloworld1?name=張三
(2)Controller 可以這么獲取該參數:
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.GetMapping; @RestController public class HelloController { @GetMapping("/helloworld1") public String helloworld1(@RequestParam("name") String name) { return "獲取到的name是:" + name; } }

2,參數沒有傳遞的情況
(1)如果沒有傳遞參數 Controller 將會報錯,我們可以使用 required = false 標注參數是非必須的。import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.GetMapping; @RestController public class HelloController { @GetMapping("/helloworld2") public String helloworld2(@RequestParam(name = "name", required = false) String name) { return "獲取到的name是:" + name; } }

(2)或者可以指定個默認值,當沒有傳遞參數時自動使用默認值:
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.GetMapping; @RestController public class HelloController { @GetMapping("/helloworld3") public String helloworld3(@RequestParam(name = "name", defaultValue = "xxx") String name) { return "獲取到的name是:" + name; } }

3,使用 map 來接收參數
(1)Controller 還可以直接使用 map 來接收所有的請求參數:
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.GetMapping; import java.util.Map; @RestController public class HelloController { @GetMapping("/helloworld4") public String helloworld4(@RequestParam Map<String, Object> params) { return "name:" + params.get("name") + "<br>age:" + params.get("age"); } }
(2)下面是一個簡單的測試樣例:

4,接收一個數組
(1)假設請求地址是如下這種,有多個同名參數:
http://localhost:8080/helloworld5?name=zhangsan&name=lisi
(2)我們可以定義一個數組類型的參數來接收:
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.GetMapping; @RestController public class HelloController { @GetMapping("/helloworld5") public String helloworld5(@RequestParam("name") String[] names) { String result = ""; for(String name:names){ result += name + "<br>"; } return result; } }

附:使用對象來接收參數
1,基本用法
(1)如果一個 get 請求的參數太多,我們構造一個對象來簡化參數的接收方式:
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.GetMapping; @RestController public class HelloController { @GetMapping("/helloworld6") public String helloworld6(User user) { return "name:" + user.getName() + "<br> age:" + user.getAge(); } }
(2)User 類的定義如下,到時可以直接將多個參數通過 getter、setter 方法注入到對象中去:
public class User { private String name; private Integer age; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
(3)下面是一個簡單的測試樣例:

(4)如果傳遞的參數有前綴,且前綴與接收實體類的名稱相同,那么參數也是可以正常傳遞的:
2,指定參數前綴
(1)如果傳遞的參數有前綴,且前綴與接收實體類的名稱不同相,那么參數無法正常傳遞:

(2)我們可以結合 @InitBinder 解決這個問題,通過參數預處理來指定使用的前綴為 u.
除了在 Controller 里單獨定義預處理方法外,我們還可以通過 @ControllerAdvice 結合 @InitBinder 來定義全局的參數預處理方法,方便各個 Controller 使用。具體做法參考我之前的文章:
- SpringBoot - @ControllerAdvice的使用詳解3(請求參數預處理 @InitBinder)
import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.*; @RestController public class HelloController { @GetMapping("/helloworld7") public String helloworld7(@ModelAttribute("u") User user) { return "name:" + user.getName() + "<br> age:" + user.getAge(); } @InitBinder("u") private void initBinder(WebDataBinder binder) { binder.setFieldDefaultPrefix("u."); } }
(3)重啟程序可以看到參數以及成功接收了:

3,構造多個對象來接收參數
(1)如果一個 get 請求的參數分屬不同的對象,也可以使用多個對象來接收參數:
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.GetMapping; @RestController public class HelloController { @GetMapping("/helloworld8") public String helloworld8(User user, Phone phone) { return "name:" + user.getName() + "<br> age:" + user.getAge() + "<br> number:" + phone.getNumber(); } }
(2)新增的 Phone 類定義如下:
public class Phone { private String number; public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } }
(3)下面是一個簡單的測試樣例:

