SpringMVC中RequestBody注解的List參數(shù)傳遞方式
RequestBody注解的List參數(shù)傳遞
Controller方法參數(shù):@RequestBody List<Long> ids
前端傳的json數(shù)據(jù):
[ ? ? 1010, ? ? 1011 ]
Controller方法參數(shù):@RequestBody User user
把List集合封裝在一個實體類型中,用該實體類型作為Controller的方法參數(shù)
User為實體類型,里面有個List<Long>類型的參數(shù)(假設(shè)名為userIds,且有對應(yīng)的getter、setter方法)
前端傳的json數(shù)據(jù):
{ ? ? "userIds": [ 1, 2 ] }
@RequestBody注解分析
get和post
GET可以擁有請求體,RFC 文檔中從來就沒有說過 GET 沒有請求體.RFC 只是說GET 意味著通過 URI 來識別資源。所以GET請求體中的數(shù)據(jù)一般都是不做處理的,有些 http 的 lib 里不讓甚至直接不提供 GET 方法追加請求體的操作。
POST請求擁有請求體,并且請求數(shù)據(jù)一般都是放在請求體當(dāng)中的。所以在處理POST請求時,通常都是從請求體中獲取數(shù)據(jù)。
1.@RequestBody
1.1用途:
用于接收前端傳遞給后端的json字符串中的數(shù)據(jù)。(處理json格式的數(shù)據(jù))
@RequestBody用來接收前端傳遞給后端的json字符串中的數(shù)據(jù),GET方式的請求一般通過URL中攜帶key-value參數(shù),而@RequestBody接收的是請求體中的數(shù)據(jù)(json格式的數(shù)據(jù),只有請求體中能保存json),所以使用@RequestBody接收數(shù)據(jù)的時候必須是POST方式等方式。
@RequestBody與@RequestParam()可以同時使用,但@RequestBody最多只能有一個,而@RequestParam()可以多個。
1.2語法:
(@RequestBody Map map) (@RequestBody Object object)
(@RequestBody Map map)
先對簡單,將json解析成Map形式的key-value對,直接通過map.get(“KeyName”)就能拿到值了(@RequestBody Object object)
通過json字符串中的key來匹配對應(yīng)實體類的屬性如果匹配一致且json中的該key對應(yīng)的值符合實體類的對應(yīng)屬性的類型要求時,會調(diào)用實體類的setter方法將值注入到該屬性。
如:
public Result deleteBookById(@RequestBody HashMap<String, String> map) { ? ? ? ? this.bookService.deleteBookById(Long.parseLong(map.get("id"))); ? ? ? ? return Result.createWithSuccessMessage(); ? ? } public Result updateBookById(@RequestBody Book book){ ? ? ? ? Book record = this.bookService.updateBookById(book); ? ? ? ? return Result.createWithModel(record); ? ? }
注意:
在(@RequestBody Object object)中,前端POST過來的數(shù)據(jù)會通過反序列數(shù)據(jù)到實體類中,并且在反序列的過程中會進行類型的轉(zhuǎn)換。
在json中應(yīng)該用null來代表空值,如果是""(空字符串)會判斷為空串,如果實體類屬性是String類型的,那么接受到的就是"",如果實現(xiàn)類屬性類型是Integer、Double等類型,那么接收到的就是null。
{ ?? ?name:"", ?? ?age:null }
(@RequestBody Object object)內(nèi)部是通過傳遞過來的數(shù)據(jù)中的Key尋找setter方法,有則調(diào)用,無則不作任何操作(其實可以設(shè)計)。
如果通過Key匹配到setter方法,但是Value無法轉(zhuǎn)換為對應(yīng)的實例類屬性的類型時,拋出異常。
2.@RequestParam
2.1 用途:
@RequestParam用來處理 Content-Type 為 application/x-www-form-urlencoded 編碼的內(nèi)容,Content-Type默認(rèn)為該屬性。
可以用于接收URL中的參數(shù)并捆綁到方法的參數(shù)中,也可以接受post請求體中的Content-Type 為 application/x-www-form-urlencoded的數(shù)據(jù)。(post比較常用的是json格式數(shù)據(jù))
語法:
@RequestParam(value=”參數(shù)名”,required=”true/false”,defaultValue=””)
value
:參數(shù)的keyrequired
:是否為必須,請求中必須包含該參數(shù),如果不包含就報錯。defaultValue
:代替的默認(rèn)參數(shù)值,設(shè)置后required將自動置false
如:
public ModelAndView getUserByName(@RequestParam("name")String name){ ? ? ? ? ModelAndView mv = new ModelAndView(); ? ? ? ? log.info(name); ? ? ? ? return mv; } //必須攜帶name參數(shù) public ModelAndView getUserByName2(@RequestParam("name",required="true")String name){ ? ? ? ? ModelAndView mv = new ModelAndView(); ? ? ? ? log.info(name); ? ? ? ? return mv; }
3.兩者混合使用
@RequestBody與@RequestParam()可以同時使用,但@RequestBody最多只能有一個,而@RequestParam()可以多個。 public Result deleteBookById(@RequestBody HashMap<String, String> map,@RequestParam("name")String name) { ? ? ? ? System.out.println(map.get("id")); ? ? ? ? System.out.println(name); ? ? ? ? return Result.createWithSuccessMessage(); }
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
一篇文章帶你理解Java Spring三級緩存和循環(huán)依賴
這篇文章主要介紹了淺談Spring 解決循環(huán)依賴必須要三級緩存嗎,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-09-09SpringBoot ResponseEntity標(biāo)識Http響應(yīng)方式
這篇文章主要介紹了SpringBoot ResponseEntity標(biāo)識Http響應(yīng)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07Mapstruct對象插入數(shù)據(jù)庫某個字段總是為空的bug詳解
這篇文章主要為大家介紹了在一次需求開發(fā)Mapstruct中對象插入數(shù)據(jù)庫某個字段總是為空的bug問題詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-07-07Swagger-boostrap-ui如何配置用戶名密碼訪問
這篇文章主要介紹了Swagger-boostrap-ui如何配置用戶名密碼訪問,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05java 使用線程監(jiān)控文件目錄變化的實現(xiàn)方法
這篇文章主要介紹了java 使用線程監(jiān)控文件目錄變化的實現(xiàn)方法的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下2017-10-10