Spring中的PathVariable註釋解析
Spring的PathVariable註釋
就像@RequestParam一樣,@PathVariable批註用於從HTTP request中提取數據。但是,它們略有不同。區別在於@RequestParam從URL獲取參數,而@PathVariable隻是從URI中提取參數。
例子
讓我們假設你有一個以下 URL 的網站:
http://www.yourwebsite.net/employee/1
上面 URL 中的1表示雇員的 ID。 到目前為止一切ok。 但是現在,從 Spring 控制器看,路徑看起來是這樣的(取決於您給 id 的名稱) :
/employee/{id}
上面的 URL 路徑對我們有什麼幫助? 因為這個{}語法(碰巧被稱為 URI 模板) ,你現在可以把它傳遞給一個使用@pathvariable 的方法,你的方法和註釋看起來如下所示:
@RequestMapping(value="/employee/{id}", method=RequestMethod.GET) <Access Modifier> <Return Type> <Method Name> (@PathVariable <Type> id) { <body> }
從上面的代碼片段可以看到,現在“ id”將從路徑中引用{ id }。 讓我們用一個真實的例子來嘗試:
@Controller @SpringBootApplication public class EmployeeManager { @RequestMapping(value=" /employee/{id}") public String pathVariableDemo(Model model, @PathVariable int id) { model.addAttribute("id", id); return "demo"; } }
現在,Spring查看輸出id參數,並將其與模板變量“ id”進行匹配。
請記住,如果我的代碼使用“ id”(參數)命名為其他名稱,那麼它將無法工作。 然而,如果你不想對參數和模板變量使用相同的名字,你可以像這樣命名 PathVariable 註釋的名字:
@Controller @SpringBootApplication public class EmployeeManager { @RequestMapping(value=" /employee/{id}") public String pathVariableDemo(Model model, @PathVariable("id") int someRandomName) { model.addAttribute("id", someRandomName); return "demo"; } }
從上面的示例中可以看到,我將參數的名稱更改為 _someRandomName,_但還添加瞭@PathVariable (“ id”),它再次指定瞭我們要引用的模板變量。
最終您有兩個選擇:
- 1.為方法參數使用相同的名稱
- 2.在@PathVariable批註中指定模板變量的名稱
多個@PathVariable批註
如果你可以有多個@pathvariable 會怎麼樣? 我們能做到嗎? 是的,我們可以! 事實上,這和添加一個@pathvariable 非常相似。
我們來演示一下:
@Controller @SpringBootApplication public class EmployeeManager { @RequestMapping(value="/{company}/employee/{id}", method=RequestMethod.GET) public String pathVariableDemo(@PathVariable("company") String companyName, @PathVariable("id") int employeeId) { // handle the code return "demo"; } }
從上面的代碼片段中可以看到,我們有兩個模板變量:
company
id
然後,我們提取每個模板變量,然後通過指定方法參數所引用的臨時變量將它們“分配”給方法參數。
@PathVariable vs @RequestParam結論
盡管@PathVariable和@RequestParam都用於從URL提取值,但是可以根據URL的設計使用它們。
通常,@PathVariable通常用於RESTful Web服務中,而@RequestParam用於從查詢參數中提取數據。
使用@PathVariable的坑
發現問題
前端路徑拼接用戶名,因為用戶名中是帶’.‘這個字符的。類似’Oliver.wang’。前端瀏覽器F12,發現路徑正常拼接’xxxxxx/Oliver.wang?xxx=xxx’,後端代碼發現,controller層的參數,接收到隻有’Oliver’。
解決過程
在方法中多加瞭一個參數(xxx,HttpServletRequest request){},輸出request.ServletPath(),發現路徑正常’/xxx/xxx/Oliver.wang’。
解決方案
- 第一種:加上 {:.+} ,比如 @getMapping(“xxx/{name:.+}”)
- 第二種:UrlEncode
- 第三種:request.ServletPath() 拿到路徑截取字符串
- 第四種:不拼接路徑,改成’xxxxx?name=Oliver.wang’ 請求參數
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- 基於spring mvc請求controller訪問方式
- 如何讓Spring Rest 接口中路徑參數可選
- spring mvc中@PathVariable / 帶斜杠方式獲取
- 關於動態參數使用@PathVariable的解析
- Spring Boot 控制層之參數傳遞方法詳解