zoukankan      html  css  js  c++  java
  • 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转换就是一个转换器,两个注解

  • 相关阅读:
    oracle中scott/tiger、sys、SYSDBA、system都是什么用
    选择ORACLE数据库字符集
    如何给oracle账户解锁
    nodejs_100个实例(3)_文件读取
    nodejs+express+mongodb简单实现注册登录
    ECharts之类型map(省级,地级市)附(世界地图、中国、省份、地级市地图Json文件)
    nodejs_100个实例(2)
    nodejs_100个实例(1)
    nodejs学习过程2之相关网站2
    nodejs学习过程2之相关网站
  • 原文地址:https://www.cnblogs.com/sonng/p/6652059.html
Copyright © 2011-2022 走看看