聊聊@RequestParam,@PathParam,@PathVariable等註解的區別
@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){ ... }
@RequestParam 支持下面四種參數
defaultValue 如果本次請求沒有攜帶這個參數,或者參數為空,那麼就會啟用默認值
name 綁定本次參數的名稱,要跟URL上面的一樣
required 這個參數是不是必須的
value 跟name一樣的作用,是name屬性的一個別名
@PathVariable
這個註解能夠識別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){ ....... }
區別很明顯瞭
@PathParam
這個註解是和spring的pathVariable是一樣的,也是基於模板的,但是這個是jboss包下面的一個實現,上面的是spring的一個實現,都要導包
@QueryParam
@QueryParam 是 JAX-RS 本來就提供的,和Spring的RequestParam作用一致
@ResponseBody
responseBody表示服務器返回的時候以一種什麼樣的方式進行返回, 將內容或對象作為 HTTP 響應正文返回,值有很多,一般設定為json
@RequestBody
一般是post請求的時候才會使用這個請求,把參數丟在requestbody裡面
補充:@pathvariable參數_SpringMVC 五種註解參數綁定
@pathvariable參數_SpringMVC 五種註解參數綁定
SpringMVC參數綁定,簡單來說就是將客戶端請求的key/value數據綁定到controller方法的形參上,然後就可以在controller中使用該參數瞭
下面通過5個常用的註解演示下如何進行參數綁定:
1. @PathVariable註解
@PathVariable 是用來獲得請求url中的動態參數的,可以將URL中的變量映射到功能處理方法的參數上,其中URL 中的 {xxx} 占位符可以通過@PathVariable(“xxx“) 綁定到操作方法的入參中。
示例代碼:
@ResponseBody @RequestMapping("/testUrlPathParam/{param1}/{param2}")public void testUrlPathParam(HttpServletRequest request, @PathVariable String param1, @PathVariable String param2) { System.out.println("通過PathVariable獲取的參數param1=" + param1); System.out.println("通過PathVariable獲取的參數param2=" + param2); }
輸出結果:
通過PathVariable獲取的參數param1=1
通過PathVariable獲取的參數param2=2
2.@RequestHeader註解
@RequestHeader 註解,可以把Request請求header部分的值綁定到方法的參數上。
示例代碼:
@ResponseBody @RequestMapping("/testHeaderParam")public void testHeaderParam(HttpServletRequest request, @RequestHeader String param1) { System.out.println("通過RequestHeader獲取的參數param1=" + param1); }
輸出結果:
通過RequestHeader獲取的參數param1=abc
3.@CookieValue註解
@CookieValue 可以把Request header中關於cookie的值綁定到方法的參數上。
示例代碼:
@ResponseBody @RequestMapping("/testCookieParam")public void testCookieParam(HttpServletRequest request, HttpServletResponse response, @CookieValue String sessionid) { System.out.println("通過CookieValue獲取的參數sessionid=" + sessionid); }
輸出結果:
通過CookieValue獲取的參數sessionid=ebef978eef6c46f8a95cc0990d2d360a
4.@RequestParam註解
@RequestParam註解用來處理Content-Type: 為 application/x-www-form-urlencoded編碼的內容。提交方式為get或post。(Http協議中,form的enctype屬性為編碼方式,常用有兩種:application/x-www-form-urlencoded和multipart/form-data,默認為application/x-www-form-urlencoded);
@RequestParam註解實質是將Request.getParameter() 中的Key-Value參數Map利用Spring的轉化機制ConversionService配置,轉化成參數接收對象或字段,
get方式中queryString的值,和post方式中body data的值都會被Servlet接受到並轉化到Request.getParameter()參數集中,所以@RequestParam可以獲取的到;
該註解有三個屬性:value、required、defaultValue;value用來指定要傳入值的id名稱,required用來指示參數是否必錄,defaultValue表示參數不傳時候的默認值。
示例代碼:
@ResponseBody @RequestMapping("/testRequestParam")public void testRequestParam(HttpServletRequest request, @RequestParam(value = "num", required = true, defaultValue = "0") int num) { System.out.println("通過RequestParam獲取的參數num=" + num); }
輸出結果:
通過RequestParam獲取的參數num=10
5.@RequestBody註解
@RequestBody註解用來處理HttpEntity(請求體)傳遞過來的數據,一般用來處理非Content-Type: application/x-www-form-urlencoded編碼格式的數據;
GET請求中,因為沒有HttpEntity,所以@RequestBody並不適用;
POST請求中,通過HttpEntity傳遞的參數,必須要在請求頭中聲明數據的類型Content-Type,SpringMVC通過使用HandlerAdapter配置的HttpMessageConverters來解析HttpEntity中的數據,然後綁定到相應的bean上。
示例代碼:
@ResponseBody @RequestMapping("/testRequestBody")public void testRequestBody(HttpServletRequest request, @RequestBody String bodyStr){ System.out.println("通過RequestBody獲取的參數bodyStr=" + bodyStr); }
代碼運行結果:
通過RequestBody獲取的參數bodyStr=這是body的內容
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。
推薦閱讀:
- SpringMVC中請求參數的獲取方式
- SpringBoot接收參數使用的註解實例講解
- SpringBoot多種場景傳參模式
- 基於params、@PathVariabl和@RequestParam的用法與區別說明
- 淺談@RequestParam 參數是否必須傳的問題