1. 概述
在本快速教程中,我們將探討 Spring 框架中 @RequestParam 和 @PathVariable 註解之間的差異。
@RequestParam 和 @PathVariable 都可以用於從請求 URI 中提取值,但它們之間存在一些差異。
2. 查詢參數與 URI 路徑
雖然 @RequestParam 從查詢字符串中提取值,但 @PathVariable 從 URI 路徑中提取值。
@GetMapping("/foos/{id}")
@ResponseBody
public String getFooById(@PathVariable String id) {
return "ID: " + id;
}然後我們可以根據路徑進行映射:
http://localhost:8080/spring-mvc-basics/foos/abc
----
ID: abc對於 @RequestParam,它將會是:
@GetMapping("/foos")
@ResponseBody
public String getFooByIdUsingQueryParam(@RequestParam String id) {
return "ID: " + id;
}這將給我們相同的響應,只是 URI 不同:
http://localhost:8080/spring-mvc-basics/foos?id=abc
----
ID: abc3. 編碼值與精確值
因為 @PathVariable 從 URI 路徑中提取值,因此它不會進行編碼。另一方面,@RequestParam 會進行編碼。
使用前面的示例,ab+c 將會直接返回:
http://localhost:8080/spring-mvc-basics/foos/ab+c
----
ID: ab+c但是對於一個使用 @RequestParam 參數的請求,參數將被 URL 解碼。
http://localhost:8080/spring-mvc-basics/foos?id=ab+c
----
ID: ab c4. 可選值
@RequestParam 和 @PathVariable 都可以設置為可選。
通過在 Spring 4.3.3 及更高版本中使用 屬性,可以使 @PathVariable 設置為可選。
@GetMapping({"/myfoos/optional", "/myfoos/optional/{id}"})
@ResponseBody
public String getFooByOptionalId(@PathVariable(required = false) String id){
return "ID: " + id;
}然後我們可以選擇以下方式:
http://localhost:8080/spring-mvc-basics/myfoos/optional/abc
----
ID: abc
或:
http://localhost:8080/spring-mvc-basics/myfoos/optional
----
ID: null對於 @RequestParam,我們也可以使用 required 屬性。
請注意,在設置 @PathVariable 為可選時,應謹慎,以避免路徑衝突。
結論
在本文中,我們學習了 @RequestParam 與 @PathVariable 的區別。