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>

 

 


 

 

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转换器。

 

 


 

 

静态资源的配置

我们在web.xml中使用DispatcherServlet拦截所有请求,所有的请求都转交给controller处理。

就是说,前端页面的<img />要加载图片、<script src=””>要加载js脚本、<link />要加载的样式表,这些请求都会被DispatcherServlet拦截,

而DispatcherServlet又找不到对应的controller来处理这些请求,即使路径是对的,在浏览器中f12->Network,看到状态码是404、或者400(由于找不到静态资源而引起的错误)。

 

我们需要配置一下静态资源,让DispatcherServlet放行静态资源的请求。有3种配置方式。

 

 

配置方式一:配置静态资源映射(最常用)

    <mvc:resources mapping="/js/" location="/js/**" />
    <mvc:resources mapping="/css/" location="/css/**" />
    <mvc:resources mapping="/image/" location="/image/**" />

location是实际地址,mapping是映射地址(我们在<img>、<script>、<link>中使用的地址)。

**表示任何文件名、任何扩展名,即该文件夹下的所有文件。

一般我们不改路径,只是让DispatcherServlet放行。

 

 

 

配置方式二:配置默认的ServletHandler

<mvc:default-servlet-handler default-servlet-name="default" />

配置web服务器默认的ServletHandler,DIspatcher拦截到静态资源后,找不到对应的controller来处理,会交给web服务器默认的ServletHandler来处理。

默认的ServletHandler会调用web服务器的默认Serlvet来处理,web服务器的默认Servlet的处理方式都是直接放行(返回该资源作为响应)。

但不同的web服务器,默认Servlet的name是不同的:

  • Tomcat、Jetty、Jboss、GlassFish的默认Servlet的name是default
  • Resin的是resin-file
  • WebLogic的是FileServlet
  • WebSphere的是SimpleFileServlet

更换web服务器时,需要修改default-servlt-name,配置简单但项目移植性差。

 

 

 

配置方式三:在web.xml中配置默认Servlet的映射

    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.js</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.css</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.jpg</url-pattern>
    </servlet-mapping>

使用多个<filter-mapping>,不能一个<filter-mapping>里配置多个<url-pattern>,也不能在一个<url-pattern>里配置多个规则。

麻烦且移植性差。

 

 

方式一、三更灵活,可以指定要加载的静态资源,方式二是加载项目中所有的静态资源。

 

方式二、三响应静态资源更快,因为web服务器启动时就会创建默认Servlet的实例,就会加载静态资源,静态资源一直在内存中,响应快、但吃服务器内存。

方式一是请求这个静态资源时才加载,用完就释放,速度慢、但内存占用少。

 

https://www.cnblogs.com/chy18883701161/p/12246952.html

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论