SpringMVC JSON数据交互

2020-02-01 16:01:33来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

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>
  
  <%-- 开头不能加/,但可以加 ${pageContext.request.contextPath}/ --%>
  <%-- <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

 


原文链接:https://www.cnblogs.com/chy18883701161/p/12246952.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:初学者学Java常遇到的问题,我都给你回答了!

下一篇:@RequestParam,@PathParam,@PathVariable等注解区别