一篇文章搞定SpringMVC引數繫結

java_lover發表於2019-02-13

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);
    }

Postman傳送請求截圖:

輸出結果:

通過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);
    }

Postman傳送請求截圖:

輸出結果:

通過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);
    }

Postman傳送請求截圖:

輸出結果:

通過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);
    }

Postman傳送請求截圖:

輸出結果:

通過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);
    }

Postman傳送請求截圖:

程式碼執行結果:

通過RequestBody獲取的引數bodyStr=這是body的內容


限時領取免費Java相關資料,涵蓋了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo/Kafka、Hadoop、Hbase、Flink等高併發分散式、大資料、機器學習等技術。

資料傳送門https://mp.weixin.qq.com/s/u2b_NVNuMuAPE0w4lc45fw

 

關注下方公眾號即可免費領取:

Java碎碎念公眾號

 

相關文章