首頁 >Java >java教程 >SpringMVC接收和回應json資料的方法介紹(附代碼)

SpringMVC接收和回應json資料的方法介紹(附代碼)

不言
不言轉載
2019-03-12 15:41:284761瀏覽

這篇文章帶給大家的內容是關於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


如果Controller中的所有方法都需要傳回json格式數據,可以使用@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,配置的視圖解析器也不會運作。

二、以map方式接收

背景:前台向後台發送ajax請求並且攜帶很多參數,而後台並沒有對應的實體類別進行接收又該如何處理呢?最常見的就是表單,這裡可以考慮使用map來解決。因為map的資料結構為key-value形式,所以我們可以遍歷搜尋框表單,將表單的name作為map的key,表單的value作為map的value。

客戶端:

<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

三、以list方式接收(以json陣列形式傳遞)

客戶端:

<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中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除