zoukankan      html  css  js  c++  java
  • SpringMVC JSON数据交互

    在SpringMVC中使用json,需要添加Jackson的3个jar包:

    •  jackson-core.jar    jackson的核心包
    • jackson-datebind.jar   jackson数据绑定需要的包
    • jackson-annotations.jar   使用jackson注解需要的包

      

    Jackson  jar包的下载

    使用maven是最简单的,jar包只能到maven仓库下载:

    https://mvnrepository.com/search?q=jackson

    前三个分别对应Jackson的3个jar包,需要分别下载。


    使用流程

    以根据学号查询学生信息为例。

    (1)添加jackson的3个jar包

    (2)在web下新建文件夹js,把jquery.min.js放进去

    (注意是web文件夹下,不是WEB-INF下)

    (2)com.chy.model.Student

    @Component
    @Scope("prototype")
    public class Student {
        private int id;
        private String name;
        private int age;
        private float score;
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public float getScore() {
            return score;
        }
    
        public void setScore(float score) {
            this.score = score;
        }
    }

    每个学生都不相同,设计为多例。

    这个bean作为数据传输对象,持久层(dao)用Student对象来封装查询结果,传回给业务层(controller),业务层将Student对象作为响应传给视图层。


    (4)前端使用ajax发起请求

      <body>
    
      <form>
        <%--使用的是jq的id选择器$("#xx"),所以只能用id,不能用name--%>
        学号:<input type="text" id="id"><br />
        <button type="button" id="btn">查询学生信息</button>
      </form>
      <p id="show"></p>
      
      <%-- <script src="${pageContext.request.contextPath}/js/jquery-3.4.1.min.js"></script> --%>
      <script src="js/jquery-3.4.1.min.js"></script>
      <script>
        $("#btn").click(function () {
          $.ajax({
            //开头不能加/,但可以加 ${pageContext.request.contextPath}/
            url:"studentController/queryStudent",
            type:"post",
            // 传给后台的数据类型、使用的字符集。可以缺省,因为data:{},看到{}就会自动作为json处理
            // contentType:"application/json;charset=utf-8",
            //传给后台的数据,json形式,key是String类型,value可以是多种类型,键值对之间逗号分隔
            data:{"id":$("#id").val()},
            //期待的返回值类型(回调函数的参数类型)
            dataType:"json",
            error:function () {
              console.log("ajax请求数据失败!");
            },
            success: function (data) {
              //浏览器把接受到的json数据作为js对象,可通过.调用属性
              var info = "姓名:" + data.name + ",年龄:" + data.age + ",成绩:" + data.score;
              $("#show").text(info);
            }
          })
        });
      </script>
    
      </body>

    如果要请求纯文本(字符串),将dateType的值改为text。


    (4)后台使用controller处理ajax请求

    @org.springframework.stereotype.Controller
    @RequestMapping("studentController")
    public class StudentController{
        private Student student;
    
        @Autowired
        public void setStudent(Student student) {
            this.student = student;
        }
    
        @RequestMapping("/queryStudent")
        @ResponseBody
        public Student queryStudent(int id) {
            System.out.println(id);
            //此处省略连接数据库查询
            student.setName("chy");
            student.setAge(20);
            student.setScore(100);
            return student;
        }
    
    }

    可以用简单数据类型接收前端传来的数据,也可以使用Bean来接收(会赋给同名的属性)。

    很多教程说要在业务方法的参数前面加@RequestBody,才能将ajax传来的数据转换为需要的类型;

    事实上,随着版本更替,高版本SpringMC内建的转换器已经可以将ajax传来的数据转换需要的类型,加@RequestBody反而会出错。

    需要在业务方法上添加注解@ResponseBody,此处解会自动将返回值添加到响应体中,来响应ajax请求。

    不管请求的是text、还是json,都需要使用@ResponseBody。

    如果请求的是text,将返回值类型写成String;

    如果请求的是json,返回值可以写成bean(返回json对象,比如请求一个学生的信息),也可以写成List(返回json数组,比如请求多个学生的信息)。


    (5)springmvc的配置

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:mvc="http://www.springframework.org/schema/mvc"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    
        <!--配置包扫描-->
        <context:component-scan base-package="com.chy.controller,com.chy.model" />
    
        <!--注解驱动,会自动使用jackson的json转换器,并自动注册HandlerMapping、HandlerAdapter,所以我们不必再配置HandlerMapping、HandlerAdapter-->
        <mvc:annotation-driven />
    
        <!--配置资源映射,配置过的文件会被DispatcherServlet放行(不交给controller处理)-->
        <mvc:resources mapping="/js/" location="/js/" />
    
        <!--配置视图解析器-->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <!--前缀-->
            <property name="prefix" value="/WEB-INF/jsp/" />
            <!--后缀-->
            <property name="suffix" value=".jsp" />
        </bean>
    
    </beans>

    踩过的坑

    一看到这种以mvc开头的元素:

    <mvc:annotation-driven />
    
    <mvc:resources mapping="/js/" location="/js/" />

    就知道IDEA又要导错约束:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:mvc="http://www.springframework.org/schema/cahce"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/mvc/spring-cache.xsd">

    将cache改为mvc,xsi中对应的2处也要改。

     

    json转换器的2种配置方式

    我们在controller中使用了@ResponseBody、@RequestBody2个注解来进行json——java类型之间的转换,这2个注解需要jackson提供的类型转换器的支持。

    配置方式一:

        <!--配置HandlerMapping-->
        <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />
    
        <!--配置HandlerAdapter-->
        <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
            <!--使用list注入要使用的messageConverters-->
            <property name="messageConverters">
                <list>
                    <!--Jackson的json转换器-->
                    <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" />
                </list>
            </property>
        </bean>

    配置方式二:

    <mvc:annotation-driven />

    与方式一的配置等价。

    ps:

    json,即Jackson的缩写,官方在github上的项目名不是json,而是fastxml,更快的xml。

    json可以看做是xml的变种,早些年基本都是用xml做数据交互,近些年随着json的兴起,都使用json代替xml了。

    jackson的jar包中不仅提供了json转换器,也提供了xml转换器。


    静态资源配置

    参考:https://www.cnblogs.com/chy18883701161/p/12249175.html

  • 相关阅读:
    centos安装字体
    【C++ Primer | 15】访问控制与继承、继承中的类作用域
    树与二叉树 | 哈夫曼树
    【C++ Primer | 10】泛型算法
    【APUE | 03】文件I/O
    二叉树
    图论算法
    【深度探索C++对象模型 | 02】构造函数语意学
    【APUE | 08】进程控制
    c++重点理解
  • 原文地址:https://www.cnblogs.com/chy18883701161/p/12246952.html
Copyright © 2011-2022 走看看