0059 Spring MVC與瀏覽器間的JSON數據轉換--@RequestBody--@ResponseBody--MappingJacson2HttpMessageConverter


瀏覽器與服務器之間的數據交換有很多類型,不只是表單提交數據這一種,比如ajax技術就大量使用json、xml等,這時候就涉及到瀏覽器端和服務器端數據格式轉換的問題,服務器端都是Java對象,需要把請求信息轉為Java對象,或者把Java對象轉換為響應信息,Spring提供了很重要的接口HttpMessageConverter。

這個接口有很多實現類完成信息轉換,比如:
----StringHttpMessageConverter----將請求信息轉為字符串
----ByteArrayHttpMessageConverter----讀寫二進制數據
----SourceHttpMessageConverter----讀寫javax.xml.transform.Source類型的數據
----XmlAwareFormHttpMessageConverter----轉換部分表單數據是xml的數據
----MappingJackson2HttpMessageConverter----用Jackson開源類包讀寫JSON數據
----Jaxb2RootElementHttpMessageConverter----通過JAXB2讀寫XML數據
。。。。。。還有很多

DispatcerServlet默認裝配了RequestMappingHandlerAdapter,而后者默認裝配了上面前4個HttpMessageConverter

其實json跟Java對象的轉換就三個要素:一個轉換器,兩個注解(@RequestBody、@ResponseBody)

MappingJackson2HttpMessageConverter轉換json數據

這是Spring MVC默認的json轉換器,雖然是默認,但還得自己導入jar包。也可以用別的轉換器,后面再說

因為Spring MVC默認使用該轉換器,因此applicationContext.xml中只需要配置<mvc:annotation-driven />即可

用GET或者POST提交數據的時候,HTTP請求頭的Content-Type大概有以下三種:
----application/x-www-form-urlencoded:@RequestParam、@ModelAttribute、@RequestBody都可以處理
----multipart/form-data:@RequestBody沒法處理
----application/json、application/xml:必須用@RequestBody處理

@RequestBody將請求信息中的json轉為Java對象
@ResonseBody將處理方法返回的Java對象轉為json

還以上傳書籍信息為例,用ajax將書籍信息以json的格式上傳,后端修改數據后轉換為json傳給瀏覽器,再顯示出來

先寫index.html

<!DOCTYPE html>
<html>
<head>
    <title>瀏覽器與服務器間用json傳遞數據</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <script type="text/javascript" src="resources/jquery-3.1.0.js"></script>
    <script type="text/javascript" src="resources/json2.js"></script><!-- 下面的JSON.stringify()即由此js提供 -->
    <script type="text/javascript">
        
        function sendRequest(){
            var bookname=$("#bookname").val();
            var author=$("#author").val();
            var press=$("#press").val();
            var isbn=$("#isbn").val();
            var douban=$("#douban").val();
            $.ajax({       /*用jQuery發送ajax請求*/
                url:"addbook",
                type:"POST", /*注意下面的data數據部分,JSON.stringify()的作用是把json對象轉為json字符串,不能少*/
                data:JSON.stringify({"bookname":bookname,"author":author,"press":press,"isbn":isbn,"douban":douban}),
                contentType:"application/json", /*將HTTP請求的Content-Type設置為“application/json”*/
                dataType:"json",
                success:function(result){
                    alert(result.bookname);
                    $("#b").html(result.bookname);
                    $("#a").html(result.author);
                    $("#p").html(result.press);
                    $("#i").html(result.isbn);
                    $("#d").html(result.douban);
                }
            });
        }
        $(function(){  /*頁面載入完畢后執行這個函數*/
            $("#submit").click(sendRequest); /*為“提交”按鈕綁定單擊事件*/
        });
    </script>
</head>
<body>
    <div>
        書名:<input name="bookname" id="bookname" /><br>
        作者:<input name="author" id="author" /><br>
        出版社:<input name="press" id="press" /><br>
        ISBN:<input name="isbn" id="isbn"/><br>
        豆瓣評分:<input name="douban" id="douban"/><br>
        <button type="button" id="submit">提交</button>
    </div>
        <h3 style="color:red;">下面是服務器返回的信息</h3>
        <p>書名:<span id="b" style="color:red"></span></p>
        <p>作者:<span id="a" style="color:red"></span></p>
        <p>出版社:<span id="p" style="color:red"></span></p>
        <p>ISBN:<span id="i" style="color:red"></span></p>
        <p>豆瓣評分:<span id="d" style="color:red"></span></p>
</body>
</html>

寫Controller

package net.sonng.mvcdemo.controller;

import javax.servlet.http.HttpServletResponse;

import net.sonng.mvcdemo.entity.Book;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class BookJSONController {
    @ResponseBody  //該注解將處理方法的返回值轉換為json
    @RequestMapping("/addbook") //下面的@RequestBody可以將請求內容中的json轉為Java對象
    public Book editBookInfo(@RequestBody Book book ){
        book.setBookname(book.getBookname()+"----處理方法修改了數據");
        book.setAuthor(book.getAuthor()+"----處理方法修改了數據");
        book.setPress(book.getPress()+"----處理方法修改了數據");
        book.setIsbn(book.getIsbn()+"----處理方法修改了數據");
        return book;
    }
}

瀏覽器訪問localhost:8888/mvcdemo/index.html 輸入信息后提交,下方即將服務器返回的信息列處理了

自定義JSON的HttpMessaageConverter轉換器

用alibaba的fastjson:下載或者用maven引入http://maven.aliyun.com/nexus/#nexus-search;quick~fastjson
主要就是改下applicationContext.xml配置:

<mvc:annotation-driven>
    <mvc:message-converters register-defaults="false"> <!-- 不使用默認配置 -->
        <bean class="org.springframework.http.converter.StringHttpMessageConverter" />
        <bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter" />
        <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter" />
        <bean class="org.springframework.http.converter.BufferedImageHttpMessageConverter" />
        <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter" >
            <property name="supportedMediaTypes"> <!-- 支持的媒體類型 -->
                <list>
                    <value>text/html;charset=UTF-8</value><!-- 順序不要寫反了,否則IE會出現下載提示 -->
                    <value>application/json;charset=UTF-8</value>
                </list>
            </property>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

總的說:json轉換就是一個轉換器,兩個注解


免責聲明!

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



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