• 第一节:SpringMVC 处理 JSON


    一、JSON

      1、JSON 简介

            JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。
           JSON 是采用完全独立于编程语言的文本格式来存储和表示数据,JSON 数据格式,易于阅读和编写,也易于机器解析和生成,并有效地提上了网络传输效率。

      2、JSON 语法

        JSON 是一个序列化的对象或数组。
        对象由花括号括起来的逗号分割的成员构成,成员是字符串键和值由逗号分割的键值对组成。
        值 可以是 对象、数组、数字、字符串或者三个字面值(false、true、null)中的一个,值的字面值中的英文必须使用小写。
    {"name": "John Doe", "age": 18, "address": {"country" : "china", "zip-code": "10000"}}
    

      

      3、JSON 与 JS 对象的关系

        JSON 是 JS 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。

    var obj = {a: 'Hello', b: 'World'}; //这是一个对象,注意键名也是可以使用引号包裹的
    
    var json = '{"a": "Hello", "b": "World"}'; //这是一个 JSON 字符串,本质是一个字符串
    

      

      4、JSON 和 JS 对象互转

        要实现从 JSON 字符串转换到 JS 对象,使用 JSON.parse() 方法

    var obj = JSON.parse('{"a": "Hello", "b": "World"}'); //结果是 {a: 'Hello', b: 'World'}
    

      

        要实现从 JS 对象转换到 JSON 字符串,使用 JSON.stringify() 方法

    var json = JSON.stringify({a: 'Hello', b: 'World'}); //结果是 '{"a": "Hello", "b": "World"}'
    

      

      5、JSON 的常用类型

            (1)JSON 对象
        对象:对象在 JS 中使用花括号包裹 {} 起来的内容,数据结构为{key1:value1, key2:value2,...} 的键值对结构。
        key 为对象的属性,value 为对应的值。键名可以使用整数和字符串来表示,值的类型可以是任意类型。
     
            (2)JSON 数组
                    数组:数组在 JS 中是方括号[] 包裹起来的内容,数据结构为 ["value1","value2"...] 的索引结构。
                    在 JS 中,数组是一种比较特殊的数据类型,它也可以像对象那样使用键值对,但还是索引使用得多。同样,值的类型可以是任意类型。

      6、与 Java 对象转换

            (1)JavaBean 和 Map 对象转换成 JSON 对象;
            (2) List 对象转换成 json 数组。

     

    二、SpringMVC支持Ajax

      1、处理 JSON 格式数据

        (1)导入jar 包

          常用的 JSON 解析器:Gson、fastJson、JackSon、JsonLib(依赖于其它的四个 jar 包)
          SpringMVC 中是使用 JackSon 来解析 json 的。所以导入 jackson 的 jar 包就行了。
     
                下载地址: http://wiki.fasterxml.com/JacksonDownload/
                导入的 jar 包:
    jackson-annotations-2.1.5.jar
    jackson-core-2.1.5.jar
    jackson-databind-2.1.5.jar
           Maven 方式:
                <dependency>
                    <groupId>com.fasterxml.jackson.core</groupId>
                    <artifactId>jackson-core</artifactId>
                    <version>2.9.8</version>
                </dependency>
                <dependency>
                    <groupId>com.fasterxml.jackson.core</groupId>
                    <artifactId>jackson-annotations</artifactId>
                    <version>2.9.8</version>
                </dependency>
                <dependency>
                    <groupId>com.fasterxml.jackson.core</groupId>
                    <artifactId>jackson-databind</artifactId>
                    <version>2.9.8</version>
                </dependency>

        (2)配置文件

          在 SpringMVC 配置文件中加入 MVC 驱动标签

    <!-- mvc驱动 -->
    <mvc:annotation-driven />

      2、使用@ResponseBody注解

        在处理请求的方法上加上 注解 @ResponseBody,将要转换为 JSON 且响应到客户端的数据,直接作为该方法的返回值返回。

        /**
          * springMVC处理json的四个条件:
          * 1、导入jackson的jar
          * 2、在 springMVC 的配置文件中开启 MVC 驱动  <mvc:annotation-driven />
          * 3、在处理 ajax 请求的方法上加上注解  @ResponseBody  (springMVC 对 JSON 的支持)
          * 4、将要转换为 json 且响应到客户端的数据,直接作为该方法的返回值返回
          * @return
          */
         @RequestMapping(value="/getAllEmps")
         @ResponseBody()
         public Collection<Employee> ajaxGetAll() {
             Collection<Employee> emps =  employeeDao.getAll();
             return emps;
         }

      3、案例

        从页面发起 Ajax 请求:

    <a id="getEmps" href="${ctp}/getAllEmps">Ajax获取员工信息</a>
    <div id="content"></div>
    
    <script>
        $("#getEmps").click(function () {
            //发送ajax请求
            $.ajax({
                url : "${ctp}/getAllEmps",
                contentType : "text/json",
                type : "GET",
                success : function (data) {
                    console.log(data);
                    $("#content").empty();
                    $.each(data, function() {
                        var empInfo = this.lastName + "-->" + this.birth + "-->" + this.gender;
                        $("#content").append(empInfo + "<br/>");
                    });
                },
                error : function (data) {
                    console.log("请求出错");
                }
            });
    
            //禁用默认行为
            return false;
        });
    
    </script>

        控制器返回 JSON 数据:

        @ResponseBody
        @RequestMapping(value = "/getAllEmps")
        public Collection<Employee> ajaxGetAll() {
            Collection<Employee> emps = employeeDao.getAll();
            return emps;
        }

      4、使用 Jackson 的相关注解

        Jackson 的 包中同时提供了一些相关注解,可以做更多的操作:

        

         可以使用 @JsonIgnore 来忽略某一个属性,使用 @JsonFormat 来格式化属性,直接加载 JavaBean 的相关属性上面就可以了。

        示例:

        @JsonFormat(pattern = "yyyy-MM-dd")
        private Date birth = new Date();
    
        @JsonIgnore
        private Department department;

    三、@RequestBody 与 @ResponseBody

      1、@RequestBody

        @RequestBody 用于获取请求体中的内容

        示例:

        表单提交:

    <form action="${ctp}/testRequestBody" method="post" enctype="multipart/form-data">
        <input name="username" value="tomcat" />
        <input name="password" value="123456" />
        <input name="file" type="file">
        <input type="submit" />
    </form>

        获取请求体内容:

        /**
         * @RequestBody:请求体,获取一个请求的请求体
         * @RequestParam:从请求中获取请求参数的值
         * @return
         */
        @RequestMapping(value = "/testRequestBody")
        public String testRequestBody(@RequestBody String body) {
            System.out.println("请求体:" + body);
            return "success";
        }

        注意:POST 方式的提交才会有请求体,GET 方式的提交参数都在地址栏。

      2、@ResponseBody

        @ResponseBody:将返回的数据放在响应体中。

      3、Ajax 发送 JSON 数据

        可以通过 Ajax 向服务器发送 JSON 数据:

        页面提交:

    <a id="saveEmp" href="${ctp}/testRequestBodyEmp">发送Emp的JSON数据</a>
    
    <script type="text/javascript">
        $("#saveEmp").click(function () {
            var emp = {
                lastName : "Tom",
                email : "Tom@126.com",
                gender : "1",
                birth : new Date(),
                salary : "3000"
            };
    
            var empStr = JSON.stringify(emp);
            alert(empStr);
            alert(typeof empStr);
    
            //发送 ajax 请求,请求带的数据是 json
            $.ajax({
                url : "${ctp}/testRequestBodyEmp",
                type : "POST",
                data : JSON.stringify(emp),
                contentType : "application/json",
                success : function (data) {
                    alert(data);
                },
                error : function (data) {
                    alert("请求出错");
                }
            });
    
            return false;
        });
    </script>

        控制器方法:

        /**
         * @ResponseBody 可以把对象转为json数据,返回给浏览器
         *
         * @RequestBody  接收 json 数据,封装为入参对象
         *
         * @param emp
         * @return
         */
        @RequestMapping(value = "/testRequestBodyEmp")
        public String testRequestBodyEmp(@RequestBody Employee emp) {
            System.out.println("请求体= " + emp);
            return "success";
        }

        使用了 @RequestBody 会把提交的 JSON 数据封装为入参对象。

    四、总结

        1、导入 Jackson 的 jar 包;
        2、在 springMVC 的配置文件中开启 MVC 驱动 <mvc:annotation-driven />
        3、在处理ajax请求的方法上加上注解@ResponseBody
        4、将要转换为json且响应到客户端的数据,直接作为该方法的返回值返回

    五、扩展

            常见错误:
             400:客户端发送请求和数据,服务器端无法接受参数,无法做出处理;
             406:服务器给客户端发送的数据,客户端无法处理
             405:客户端与服务器端请求方式和接受方式不一致,不匹配
             404:请求资源路径错误或资源不存在
     
     
  • 相关阅读:
    SQL 存储过程入门(五)
    QT程序崩溃原因示例和分析
    全志(allwinner)编译过程问题与解决方法汇总
    rust Linux环境下开发环境安装 和 IDE工具 EMACS配置
    DMZ
    什么是浮动IP
    PLMN和PSTN
    人生 -- 有感于近期的一个事件
    职场四原则
    Fatal error compiling: java.lang.NoSuc hFieldError??
  • 原文地址:https://www.cnblogs.com/niujifei/p/15640454.html
Copyright © 2020-2023  润新知