在與前端交互的開發過程中,出現過幾次無法取到參數的情況,費了些時間去排查問題,下面就簡單總結一下。
注解詳解
我們所要獲取的前端傳遞參數大概可以分為以下四類:
- 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
問題修改:
application/json


使用時機
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 |