@RequestBody和@RequestParam的使用
@RequestBody
@RequestBody主要用來接收前端傳遞給后端的json字符串中的數據的(請求體中的數據的);GET方式無請求體,所以使用@RequestBody接收數據時,前端不能使用GET方式提交數據,而是用POST方式進行提交。在后端的同一個接收方法里,@RequestBody與@RequestParam()可以同時使用,@RequestBody最多只能有一個,而@RequestParam()可以有多個。
@RequestBody接收的參數是來自requestBody中,即請求體。一般用於處理非 Content-Type: application/x-www-form-urlencoded
編碼格式的數據,比如:application/json
、application/xml
等類型的數據。
GET請求中,因為沒有HttpEntity,所以@RequestBody並不適用。
POST請求中,通過HttpEntity傳遞的參數,必須要在請求頭中聲明數據的類型Content-Type,SpringMVC通過使用HandlerAdapter 配置來解析HttpEntity中的數據,然后綁定到相應的bean上。
如果前端向后端傳遞的是非實體類對象,后台也可以使用@RequestBody注解,那就用List<Map<String, String>>來接收
@RequestParam
用來處理Content-Type: 為 application/x-www-form-urlencoded編碼的內容。(Http協議中,如果不指定Content-Type,則默認傳遞的參數就是application/x-www-form-urlencoded類型)
POST類型和GET類型都可以使用@RequestParam注解來接收參數
@RequestParam注解有三個參數
-
required
表示是否必須,默認為true
,必須。 -
defaultValue
可設置請求參數的默認值,如果設置了該值,required=true將失效,自動為false,如果沒有傳該參數,就使用默認值。 -
value
為接收url的參數名(相當於key值)。
舉例:
//一下兩種寫法效果一模一樣
@RequestParam("") 或 @RequestParam(value="")
//當配置多個屬性的時候
@RequestParam(value="", required=true, defaultValue="")
//如果使用下面這種方式接值,那么前台穿過來的參數名稱就要和inputStr一樣,這里才能接收到
@RequestParam String inputStr
//但是如果加上value屬性的話,那么前台傳過來的參數名稱就要和value屬性中的一致才能接收到
@RequestParam(value="aa") String inputStr
//如果加上required屬性,當required=true就是必須要傳參值過來, 當required=false表示不傳的話,會給參數賦值為null
@RequestParam(value="aa", required=true)
//有一種特殊情況是參數為int類型時,設置required=false后參數不傳值得話會給int類型參數賦值為null,而int是基本數據類型不能賦值為null,所以會報錯,此時要將int類型改為Integer類型
@RequestParam(value="inputInt", required=false) int inputInt
@RequestParam接收對象類型
這里舉個栗子
實體類是People屬性如下
private String name; //姓名
private int age; //年齡
private String sex; //性別
前台代碼(拿JSP舉例)
<input type="text" value="黑黑" name="name">
<input type="text" value="18" name="age">
<input type="text" value="男" name="sex">
后台代碼
int addPeople(@RequestParam People people) {}
//這時候使用@RequestParam注解修飾參數 只要前台傳的參數名稱和people類中的屬性名一致就可以自動封裝進People實體類
這里我又想到一個問題,加和不加@RequestParam參數有什么區別呢?
其實不加@RequestParam參數也沒問題(此時的參數名稱要和前台傳過來的參數名稱保持一致),也可以接收到前台傳過來的參數,當前台沒有傳值時接收到的為null,只不過使用@RequestParam是為了用它里面的一些屬性,比如默認值或required屬性。
總結
- Post請求接收@RequestBody修飾的參數和@RequestParam修飾的參數,而Get請求則只能接收@RequestParam修飾的參數。
- 如果前端傳的是Json類型的對象,后台就要使用@RequestBody修飾的實體類接收,如果是單個屬性就使用@RequestParam修飾的變量或實體類接收