這篇文章帶給大家的內容是關於SpringMVC接收和回應json資料的方法介紹(附程式碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
前後端的資料交互,除了透過form表單進行提交外,也可以透過ajax向後端傳遞和接收json格式資料(這種方式可以實現請求資料和頁面分離)。本文將總結在Spring MVC中接收和回應json資料的幾種方式。
準備步驟:
1.導入json相關框架的依賴(例如jackson)。
2.spring mvc的controller方法正常寫,如果需要回應json,增加@responsebody註解。
3.在接受json對應的輸入參數前,加上@RequestBody註解。
服務端接收json資料還原為java對象,稱為反序列化,反之,將java物件作為回應轉換為json資料傳回給客戶端,稱為序列化。
注意:因為要使用ajax,所有一定要引入jQuery,切記!
jackson maven依賴:
<!-- jackson依赖 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.7.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.7.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.7.0</version> </dependency>
背景:當ajax傳遞的參數較多時,採用參數名稱匹配的方法較不方便。如果後台有對應的實體類,這時可以選擇在客戶端將資料封裝為json格式傳遞給後台,後台用對應的實體類別進行接收。
客戶端:
<button onclick="clickMe()">点我</button> <script> function clickMe() { $.ajax({ type : 'POST', url : "acceptJsonByEntity", contentType : "application/json;charset=utf-8", // 如果想以json格式把数据提交到后台的话,JSON.stringify()必须有,否则只会当做表单提交 data : JSON.stringify({ "bookId" : 1, "author" : "Jack" }), // 期待返回的数据类型 dataType : "json", success : function(data) { var bookId = data.bookId; var author = data.author; alert("success:" + bookId+','+author); }, error : function(data) { alert("error" + data); } }); </script>
@responseBody註解是將controller的方法傳回的物件透過適當的轉換器轉換為指定的格式之後,寫入到response物件的body區,通常用來返回JSON資料或者是XML。@RequestBody註解常用來處理content-type不是預設的application/x-www-form-urlcoded編碼的內容。一般情況下來說常用其來處理application/json類型。
Controller:
@Controller public class PassJsonParam { @RequestMapping(value="acceptJsonByEntity",method = RequestMethod.POST) @ResponseBody public Book acceptJsonByEntity(@RequestBody Book book, HttpServletRequest request){ System.out.println("当前http请求方式为:"+request.getMethod()); System.out.println("bookId="+book.getBookId()+", author="+book.getAuthor()); return book; } }
控制台輸出:目前http要求方式為:POST bookId=1, author=Jack
客戶端(彈窗):success :1,Jack
@RestController
註解。 @RestController = @Controller @ResponseBody
Controller(上面的Controller可以用下面的替換):
@RestController public class PassJsonParam { @RequestMapping(value="acceptJsonByEntity",method = RequestMethod.POST) public Book acceptJsonByEntity(@RequestBody Book book, HttpServletRequest request){ System.out.println("当前http请求方式为:"+request.getMethod()); System.out.println("bookId="+book.getBookId()+", author="+book.getAuthor()); return book; } }
注意:使用了@RestController
註解後,Controller的方法無法再回到jsp頁面或html,配置的視圖解析器也不會運作。
客戶端:
<form id="bookForm"> <input type="text" name="bookName" id="bookName"> <input type="text" name="author" id="author" > <button onclick="submitForm(event)">提交</button> </form> <script> function submitForm(event) { //阻止form默认事件 event.preventDefault(); //得到搜索框数据 var map = new Map(); $("#bookForm input").each(function () { var value = $(this).val(); //input 值 var name = $(this).attr('name'); map.set(name,value); }) //Map转为Json的方法 var obj= Object.create(null); for (var [k,v] of map) { obj[k] = v; } $.ajax({ type: 'POST', contentType:'application/json', url: "acceptJsonByMap", data: JSON.stringify(obj), dataType: 'json', success: function (data) { var bookName = data.bookName; var author = data.author; alert("bookName ="+bookName+"; author="+author); }, error: function (data) { alert("失败啦"); } }); } </script>
Controller:
@RequestMapping(value="acceptJsonByMap") @ResponseBody public Map<String,Object> acceptJsonByMap(@RequestBody Map<String,Object> paramsMap, HttpServletRequest request){ System.out.println("当前http请求方式为:"+request.getMethod()); System.out.println(paramsMap); return paramsMap; }
控制台輸出:目前http要求方式為:POST {bookName=Love, author=Frank}
客戶端(彈跳窗):bookName =Love; author=Frank
客戶端:
<button onclick="clickHere()">clickHere</button> <script> function clickHere() { var params1 = { "bookId":"123", "author":"Rose" }; var params2 = { "bookId":"321", "author":"Jack" }; var list = []; list.push(params1); list.push(params2); $.ajax({ type: 'POST', contentType:'application/json', url: "acceptJsonByList", data: JSON.stringify(list), dataType: 'json', success: function (data) { for (let i = 0; i < data.length; i++) { var bookId = data[i].bookId; var author = data[i].author; alert("bookId ="+bookId+"; author="+author); } }, error: function (data) { alert("失败啦"); } }); } </script>
####################################注意:傳遞到後端時,list應為[ { key1 : value1}{ key2 : value2} ]的json格式數據,否則可能會出現Json parse error錯誤。 #########Controller:###
@RequestMapping(value="acceptJsonByList") @ResponseBody public List<Book> acceptJsonByList(@RequestBody List<Book> book, HttpServletRequest request){ System.out.println("当前http请求方式为:"+request.getMethod()); System.out.println(book); return book; }###注意:這裡需要Book實體類別來接收。 ######控制台輸出:目前http請求方式為:POST [entity.Book@1138a75c, entity.Book@22d1cbcf]#######客戶端(彈跳視窗):bookId =123; author=Rose bookId =321; author=Jack##########
以上是SpringMVC接收和回應json資料的方法介紹(附代碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!