Spring MVC 獲取前端參數的注解


 

在與前端交互的開發過程中,出現過幾次無法取到參數的情況,費了些時間去排查問題,下面就簡單總結一下。

注解詳解

我們所要獲取的前端傳遞參數大概可以分為以下四類:

  • requet uri 部分的注解:@PathVariable
  • request header部分的注解:@RequestHeader, @CookieValue
  • request body部分的注解:@RequestParam,  @RequestBody
  • attribute 類型是注解: @SessionAttributes, @ModelAttribute

@PathVariable

注解 把URI template 中變量 的值,綁定到方法的參數上。若方法參數名稱和需要綁定的uri template中變量名稱不一致,需要在@PathVariable("name")指定uri template中的名稱。

代碼示例:

如果看不到圖,換個瀏覽器試試

GET模式下,使用@PathVariable綁定輸入參數,非常適合Restful風格。因為隱藏了參數與路徑的關系,可以提升網站的安全性,靜態化頁面,降低惡意攻擊風險;

POST模式下,沒什么必要用這個方式,畢竟參數都暴露在url上面了。

@RequestHeader

注解 可以把Request請求header部分的值綁定到方法的參數上,如果,@RequestHeader綁定的參數,在請求頭部並沒有的話,會報錯,比如Cookie。

@CookieValue

可以把Request header中關於cookie的值綁定到方法的參數上。我並沒有實際使用過~

@RequestParam

  •  常用來處理簡單類型的綁定, 通過 Request.getParameter() 獲取的String可直接轉換為簡單類型的情況( String--> 簡單類型的轉換操作由ConversionService配置的轉換器來完成);因為使用request.getParameter()方式獲取參數,所 以可以處理get 方式中queryString的值,也可以處理post方式中 body data的值;
  • 處理Content-Type: 為 application/x-www-form-urlencoded編碼的內容,提交方式GET、POST,兩者並沒有什么不同;
  • 該注解有兩個屬性: 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-form-urlencoded的內容,處理完的結果放在一個MultiValueMap<String, String>里,這種情況在某些特殊需求下使用,詳情查看FormHttpMessageConverter api;

使用時機

A) GET、POST方式提時, 根據request header Content-Type的值來判斷:

  •     application/x-www-form-urlencoded, 可選(即非必須,因為這種情況的數據@RequestParam, @ModelAttribute也可以處理,當然@RequestBody也能處理);
  •     multipart/form-data, 不能處理(即使用@RequestBody不能處理這種格式的數據);
  •     其他格式, 必須(其他格式包括application/json, application/xml等。這些格式的數據,必須使用@RequestBody來處理);

B) PUT方式提交時, 根據request header Content-Type的值來判斷:

  •     application/x-www-form-urlencoded, 必須;
  •     multipart/form-data, 不能處理;
  •     其他格式, 必須;

說明:request的body部分的數據編碼格式由header部分的Content-Type指定; 

示例代碼:

 

@SessionAttributes  (沒用過~~)

@ModelAttribute

 

問題修改:

前端ajax請求,post方式,請求頭 :Content-Type: application/json
后台獲取方式:
 
這個時候后台取不到參數,因為前端不是使用Form提交的,parameter里面是沒有參數值的
修改為:
 
使用@RequestBody 注解,將參數轉為對象,直接取對象值
前端ajax請求,get方式,能取到

使用時機

  application/x-www-form-urlencoded application/json ,application/xml multipart/form-data 單個參數 對象
@PathVariable GET、POST(並沒有什么意義) GET、POST(並沒有什么意義) GET、POST(並沒有什么意義)    
@RequestHeader GET、POST GET、POST GET、POST    
@CookieValue GET、POST GET、POST GET、POST    
@RequestParam GET、POST       ——        ——

    √

    ——
@RequestBody GET、POST GET、POST        ——   ——

 

@ModelAttribute GET、POST       ——        ——

  ——

 √

@SessionAttributes          


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM