常用註解之@PathVariable與@RequestParam詳解
@PathVariable和@RequestParam
首先說一下Request瞭解一下請求引數是什麼
在訪問各種各樣網站時,經常會發現網站的URL的最後一部分形如:?xxxx=yyyy&zzzz=wwww。這就是HTTP協議中的Request引數,它有什麼用呢?先來看一個例子:
- 在知乎中搜索web
- 瀏覽器跳轉到新頁面後,URL變為https://www.zhihu.com/search?type=content&q=web
這裡type=content&q=web就是搜尋請求的引數,不同引數之間用&分隔,每個引數形如name=value
@RequestParam:
@RequestParam 和 @PathVariable 註解是用於從request中接收請求的,兩個都可以接收引數,關鍵點不同的是@RequestParam 是從request裡面拿取值,而 @PathVariable 是從一個URI模板裡面來填充
@RequestParam
看下面一段程式碼:
http://localhost:8080/springmvc/hello/101?param1=10¶m2=20
根據上面的這個URL,你可以用這樣的方式來進行獲取
public String getDetails(
@RequestParam(value="param1", required=true) String param1,
@RequestParam(value="param2", required=false) String param2){
...
}
Param 支援下面四種引數
defaultValue 如果本次請求沒有攜帶這個引數,或者引數為空,那麼就會啟用預設值
name 繫結本次引數的名稱,要跟URL上面的一樣
required 這個引數是不是必須的
value 跟name一樣的作用,是name屬性的一個別名
@PathVariable:
@PathVariable繫結URI模板變數值
@PathVariable是用來獲得請求url中的動態引數的
@PathVariable用於將請求URL中的模板變數對映到功能處理方法的引數上。//配置url和方法的一個關係@RequestMapping("item/{itemId}")
/* @RequestMapping 來對映請求,也就是通過它來指定控制器可以處理哪些URL請求,類似於struts的action請求
* @responsebody表示該方法的返回結果直接寫入HTTP response body中
*一般在非同步獲取資料時使用,在使用@RequestMapping後,返回值通常解析為跳轉路徑,加上@responsebody後返回結果不會被解析為跳轉路徑,而是直接寫入HTTP response *body中。
*比如非同步獲取json資料,加上@responsebody後,會直接返回json資料。*
*@Pathvariable註解繫結它傳過來的值到方法的引數上
*用於將請求URL中的模板變數對映到功能處理方法的引數上,即取出uri模板中的變數作為引數
*/
這個註解能夠識別URL裡面的一個模板,我們看下面的一個URL
http://localhost:8080/springmvc/hello/101?param1=10¶m2=20
上面的一個url你可以這樣寫:
@RequestMapping("/hello/{id}")
public String getDetails(@PathVariable(value="id") String id,
@RequestParam(value="param1", required=true) String param1,
@RequestParam(value="param2", required=false) String param2){
.......
}
Spring MVC中的Request引數
在SpringMVC框架中,現在我們已經可以通過定義@RequestMapping來處理URL請求了,和@PathVariable一樣,我們也需要再處理URL的函式中獲取URL中的引數-也就是?key=value1&key2=value2這樣的引數列表。通過註解@RequestParam可以輕鬆的將URL中的引數繫結到處理函式方法的變數中:
@RequestMapping("/user")
@ResponseBody
public String getUserBlog(@RequestParam("id") int blogId) {
return "blogId = " + blogId;
}
這樣當我們訪問/user/?id=123時,Spring MVC幫助我們將Request引數id的值繫結到了處理函式的引數blogId上。這樣就能夠輕鬆獲取使用者輸入,並根據它的值進行計算並返回了。
執行結果:
相信大家可能注意到了,@RequestParam和@PathVariable都能夠完成類似的功能——因為本質上,它們都是使用者的輸入,只不過輸入的部分不同,一個在URL路徑部分,另一個在引數部分,簡單的說就是url寫法不同,如下:
使用@RequestParam時,URL是這樣的:http://host:port/path?引數名=引數值
使用@PathVariable時,URL是這樣的:http://host:port/path/引數值
後臺接收方式如下:
- @RequestMapping(value="/user",method = RequestMethod.GET)
- @ResponseBody
- public User printUser(@RequestParam(value = "id", required = false, defaultValue = "0") int id) {
- User user = new User();
- user = userService.getUserById(id);
- return user;
- }
-
@GetMapping("/edit/{userId}") public String edit(@PathVariable("userId") Long userId, Model model) { User user = userService.selectUserById(userId); List<Role> roles = roleService.selectRolesByUserId(userId); List<Post> posts = postService.selectPostsByUserId(userId); model.addAttribute("roles", roles); model.addAttribute("posts", posts); model.addAttribute("user", user); return prefix + "/edit"; }
一旦我們在方法中定義了@RequestParam變數,如果訪問的URL中不帶有相應的引數,就會丟擲異常——這是顯然的,Spring嘗試幫我們進行繫結,然而沒有成功。但有的時候,引數確實不一定永遠都存在,這是我們可以通過定義required屬性:
@RequestParam(name="id",required=false)
當然,在引數不存在的情況下,可能希望變數有一個預設值:
@RequestParam(name="id",required=false,defaultValue="0")
在springboot中這麼用:
一個引數:
補充:
@PathParam
這個註解是和spring的pathVariable是一樣的,也是基於模板的,但是這個是jboss包下面的一個實現,上面的是spring的一個實現,都要導包
@QueryParam
@QueryParam 是 JAX-RS 本來就提供的,和Spring的RequestParam作用一致
多個引數:
參考文章:
https://blog.csdn.net/u011410529/article/details/66974974
https://www.cnblogs.com/fangpengchengbupter/p/7826565.html