@RequestBody和@RequestParam用法總結


@RequestBody和@RequestParam的使用

@RequestBody

@RequestBody主要用來接收前端傳遞給后端的json字符串中的數據的(請求體中的數據的);GET方式無請求體,所以使用@RequestBody接收數據時,前端不能使用GET方式提交數據,而是用POST方式進行提交。在后端的同一個接收方法里,@RequestBody與@RequestParam()可以同時使用,@RequestBody最多只能有一個,而@RequestParam()可以有多個。

@RequestBody接收的參數是來自requestBody中,即請求體。一般用於處理非 Content-Type: application/x-www-form-urlencoded編碼格式的數據,比如:application/jsonapplication/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屬性。

總結

  1. Post請求接收@RequestBody修飾的參數和@RequestParam修飾的參數,而Get請求則只能接收@RequestParam修飾的參數。
  2. 如果前端傳的是Json類型的對象,后台就要使用@RequestBody修飾的實體類接收,如果是單個屬性就使用@RequestParam修飾的變量或實體類接收


免責聲明!

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



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