1. 程式人生 > >常用註解之@PathVariable與@RequestParam詳解

常用註解之@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

形式,分別表示引數名字和引數值。在這個例子中,我們輸入不同的搜尋關鍵詞,在搜尋結果頁面的URL的q引數是不同的,也就是說,HTTP引數實際上可以認為是一種使用者的輸入,根據不同的使用者輸入,伺服器經過處理後返回不同的輸出(例如搜尋spring和搜尋java,顯示結果是不一樣的。)

 

@RequestParam:

@RequestParam 和 @PathVariable 註解是用於從request中接收請求的,兩個都可以接收引數,關鍵點不同的是@RequestParam 是從request裡面拿取值,而 @PathVariable 是從一個URI模板裡面來填充

@RequestParam
看下面一段程式碼:

http://localhost:8080/springmvc/hello/101?param1=10&param2=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&param2=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/引數值

 

後臺接收方式如下:

  1.   @RequestMapping(value="/user",method = RequestMethod.GET) 
  2.   @ResponseBody   
  3.    public User printUser(@RequestParam(value = "id", required = false, defaultValue = "0")  int id) {  
  4.     User user = new User();  
  5.        user = userService.getUserById(id);  
  6.        return user;  
  7.    }  
  8.      
  9. @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