文章目录
1、数据交互方式的改变
在传统的企业级应用中,多个系统之间的交互经常使用WebService来实现,这种模式可以跳出不同系统之间编程语言、操作系统等硬件条件的限制,实现不同系统之间的弹性交互。WebService的实现模式就是,所有系统的数据传输都遵循一种固定的格式,拼接需要交互的数据。解析时也按照约定的解析规则解析。
现如今由于移动互联网的兴起,简介的JSON格式成为很多系统之间进行交互的主要格式。移动端的前台系统(Android或IOS)与后台交互时,普通使用HTTP协议进行JSON格式信息的传输,以实现移动系统前后端之间的信息交互。还有一些网页异步加载功能,也是利用JavaScript语言或相关插件(JQuery等前端脚本框架)实现Ajax异步数据请求,与后台进行JSON格式的HTTP信息交互。
2、JSON数据格式
JSON的数据格式规则十分简洁,书写格式为“数据名称:值”,组合中的名称写在前面(在双引号中),值对写在后面(同样在双引号中),中间用冒号隔开,最外层添加一对花括号即可:
{"username":"Jack"}
当有多个参数时,使用英文逗号隔开。JSON中的值可以有多种类型,每种类型有不同的表现形式,如下表所示:
格式 | JSON格式 |
---|---|
数字(整数或浮点数) | {“age”:23,“height”:172.45} |
字符串(在双引号中) | {“name”:“张三”} |
逻辑值(true或false) | {“isEmpty”:true} |
数组(在方括号中) | {“people”:[{“firstName”:“Brett”,“lastName”:“Mclaughlin”,“email”:“aaa”},{“firstName”:“Jason”,“lastName”:“Hunter”,“email”:“bbb”},{“firstName”:“Elliotte”,“lastName”:“Harold”,“email”:“ccc”}]} |
对象(在花括号中) | {“people”:{“firstName”:“Brett”,“lastName”:“Mclaughlin”,“email”:“aaa”}} |
空(null) | {“tellphonenumber”:null} |
3、Spring MVC对JSON格式数据的处理
早期JSON的组装和解析都是通过手动编写代码实现的,种方式效率不高,所以后来有许多的关于组装和解析JSON格式信息的工具类出现,如json-lib、org-json、fast-json及jackson等,可以解决JSON交互的开发效率。
Spring MVC同样为开发者提供了一种简洁的实现不同数据格式交互的机制(JSON、XML以及其他数据格式),其会将前台传来的JSON/XML等格式信息自动转换为相应的包装类,或者将输出的信息转换为JSON/XML等格式的数据。
Spring MVC主要利用类型转换器(messageConverters)将前台信息转换成开发者需要的格式。然后在相应的Controller方法接收参数前添加@RequestBody注解,进行数据转换,或在方法的返回值类型处添加@ResponseBody注解,将返回信息转换成相关格式的数据。
4、实现前后端JSON交互
4.1 演示项目需求
这里为了演示前后端实现JSON数据的交互,需求为:如果客户端请求的是JSON信息,服务器端就将JSON格式信息转换成相关的包装类型参数,在返回信息时,统一使用JSON格式输出。
4.2 导入依赖的jar包
Spring MVC对于JSON的解析和组装时基于开源工具类“jackson”的,所以要使用Spring MVC进行JSON数据交互,必须引入jackson的两个依赖jar包“jackson-core-asl.jar”和“jackson-mapper-asl.jar”,将它们放置在演示项目工程的lib下并加载到编译环境,如下所示:
4.2 配置类型转换器
4.2.1 基于配置文件的开发
在导入了依赖的jar包后,需要在类加载配置文件springmvc.xml中,为处理器适配器HandlerAdapter配置类型转换器列表messageConverters,并在其中添加需要的类型转换器。这样当请求到达处理器适配器层时,配置的@RequestBody和@ResponseBody注解就会利用具体的类型转换器messageConverter将请求信息转换为指定的格式。具体配置如下:
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" />
</list>
</property>
</bean>
由上面的配置可以看到,为类型转换器列表messageConverters的list配置一个JSON类型的转换器MappingJackson2HttpMessageConverter,这样只要请求到达Controller方法,标注@RequestBody和@ResponseBody注解的参数都会自动执行类型转换,目标类型就是配置的具体的类型转换器,这里是JSON格式的转换器。
4.2.2 基于注解的开发(演示项目采用的方式)
在基于注解的开发配置中,由于已经配置了“<mvc:annotation-driven />”,其中Spring MVC已经帮助配置了注解的处理器适配器和映射器,即DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter两个bean,同时为注解的处理器适配器配置类型转换器,这里为AnnotationMethodHandlerAdapter初始化7个类型转换器,如下表所示:
转换器类 | 作用 |
---|---|
ByteArrayHttpMessageConverter | 负责读取和写入二进制格式的数据 |
StringHttpMessageConverter | 负责读取和写入字符串格式的数据 |
ResourceHttpMessageConverter | 负责读取和写入资源文件数据 |
SourceHttpMessageConverter | 负责读取和写入xml中javax.xml.transform.Source定义的数据 |
XmlAwareFormHttpMessageConverter | 负责读取和写入基本的xml格式数据 |
Jaxb2RootElementHttpMessageConverter | 通过Jaxb2读写xml信息,将请求消息转换到标注XmlRootElement和XmlType注解的类中 |
MappingJacksonHttpMessageConverter | 负责读取和写入JSON格式的数据 |
其中就有需要的JSON类型转换器,所以如果已经配置了“<mvc:annotation-driven />”,就无须再单独配置了。因此,在日常开发中,如果没有特殊要求,使用自动注解配置,可以提高开发效率。
4.3 创建前端测试页面
在“WEB-INF/jsp”下创建名为“json”的文件夹,该文件夹用于存放该测试案例页面。在该文件夹下创建名为“json.jsp”的JSP页面,用于显示前端测试页面。在该野蛮上设置一个textarea输入框,在其中可以编写相关的JSON字符串信息,然后单击下方的“发送“按钮,可以将JSON格式信息发送到后台。具体代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>Json Test</title>
</head>
<body>
<textarea id="jsonMsg" cols="30" rows=