1. 程式人生 > >springmvc 引數繫結註解詳解

springmvc 引數繫結註解詳解

簡介

  Handler method引數繫結常用的註解,我們根據它們處理request的不同內容部分來看主要分為四類:

  A. 處理requesr uri部分的註解,@PathVariable

  B. 處理 request header部分的註解,@RequestHeader,@CookieValue

  C. 處理 request body部分的註解,@RequestParam,@RequestBody

  D.   處理 attribute型別的註解,@SessionAttributes,@ModelAttribute

@PathVariable

  當使用@RequestMapping URI template樣式(即someUrl/{paramId})對映的時候,可以通過此註解繫結它傳過來的值到方法的引數上。

 

  PS:若方法的引數名 和 PathVariable中繫結的引數名不一致的時候,需要在@PathVariable(“name”)中指定繫結的引數名,用法如上圖所示。

 

@RequestHeader/@CookieValues

@RequestHeaders

@RequestHeader 註解 可以把 request請求中header中的值繫結到 方法的引數上

Header的 示例 如下:


在程式碼中的應用別無二致,附一張程式碼圖:


@CoookieValue

  @CookieValue可以把header中 的關於cookie的值繫結到方法的引數上,cookie是瀏覽器自動傳送的,例如使用者登入之後,開啟一個session,登入請求響應的時候會把session  的值自動傳送到瀏覽器端,下次瀏覽器再次訪問的時候會自動攜帶 cookie的值,也就是之前傳遞過來的session的值。

  有cookie的header示例:


程式碼中的使用方法和 之前別無二致,不再上圖了。

@RequestParam/@RequestBody

以chrome瀏覽器 解析的post請求:


@RequestParam

A.     常用來處理簡單型別的資料繫結,通過request.getParamter()獲取到的string可以直接轉換為簡單型別 的值(轉換的過程是ConversionService配置的轉換器來完成的)

B.      用來處理Content-Type為 application/x-www-form-urlencoded 編碼的內容,提交方式 可以為 GET\POST

C.      該註解有兩個屬性,value、required;其中 value用來指定要傳入值的id名稱,required用來指定引數是否 必須繫結。

示例程式碼不再上圖.

@RequestBody

  該註解通常用來處理Content-Type不是 application/x-www-form-urlencoded 的編碼內容,例如application/json、application/xml等

  它是通過HandlerAdapter 配置的HttpMessageConverters來解析 post data body的,然後繫結到響應的bean上的。

  因為配置有FormHttpMessageConverter,所以也可以用來處理application/x-www-urlencoded 的內容的,處理完的結果 放在 一個 MultiValueMap<String,String>,這種情況在  某些 特殊情況下使用,詳情請檢視FormHttpMessageConverterapi。

@SessionAttributes/@ModelAttribute

@SessionAttributes

   該註解 用來繫結HttpSession中 的 Attribute 物件的值,便於在 方法中 的引數裡 使用,該註解有 value 和 types兩個屬性 ,可以通過名字 和 型別 指定要使用 的attribute 物件。

@ModelAttribute

  該註解有兩個用法,一個是 加在 方法上,一個 是 加在 引數 上。

  用於方法 上的時候,通常用來處理 @RequestMapping之前,為請求繫結需要 從後臺查詢的model。

  用於引數上的時候,用來通過名稱的對應,把相應名稱的值 繫結到註解的引數bean上,而要繫結 的 值來源於 :

  1.      @SessionAttributes啟用 的 attribute物件 上

  2.      @ModelAttribute 用於方法 上的時候 指定的model的物件

  3.      上述兩種情況都沒有  的時候,new 一個 需要繫結的物件,然後把request中按名稱對應的方式 把值繫結到 bean中。

PS :這種方式 實際 上的效果 就是 在呼叫 @RequestMapping 的方法 之前,為request物件的model裡put(“account”:Accout)

---------------------------------------------------END--------------------------------------------------------