1、
json
数据格式在接口调用、html
页面中比较常用,json
格式比较简单,解析还比较方便。这里我们看springmvc
进行json
交互。-
2、
json
数据交互有两种情况:
说明:1、请求json
、输出json
,要求请求的是json
串,所以在前端页面中需要将请求的内容转换成json
串,不太方便;2、请求的是key/value
、输出json
,此方法比较常用。
- 3、环境准备
在试验时我们需要两个用于解析json
数据的jar
包:
jackson-core-asl-1.9.11.jar
jackson-mapper-asl-1.9.1.jar
- 4、配置
json
转换器(工程springmvc-mybatis08
)
在springmvc.xml
在注解适配器中加入messageConverters
<!--注解适配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean>
</list>
</property>
</bean>
说明:这里我们是在适配器中进行配置,也就是说适配器和映射器是分开配置的,但是如果使用<mvc:annotation-driven />
配置适配器和映射器,那么上面的json
转换器就无需配置了。
- 5、
json
交互的测试:输入的是json
串
相关的前台页面WebRoot/jsonTest.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"
isELIgnored="false"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>json交互测试</title>
<script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery-1.4.4.min.js"></script>
<script type="text/javascript">
//请求json响应json
function requestJson(){
$.ajax({
type:"post",
url:"${pageContext.request.contextPath }/requestJson.action",
contentType:"application/json;charset=utf-8",
data:'{"name":"测试商品","price":99.9}',
success:function(data){
alert(data);
}
});
}
//请求key/value响应json
function responseJson(){
$.ajax({
type:"post",
url:"${pageContext.request.contextPath }/responseJson.action",
data:'name=手机&price=99.9',/*不需要指定contentType,因为默认就是key/value类型*/
success:function(data){
alert(data);
}
});
}
</script>
</head>
<body>
<input type="button" onclick="requestJson()" value="请求json响应json" />
<input type="button" onclick="responseJson()" value="请求key/value响应json" />
</body>
</html>
说明:这里我们先看第一种情况,这种情况是请求的是json
,而相应的也是json
。Controller
如下:
JsonTest.java
package cn.itcast.ssm.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import cn.itcast.ssm.pojo.Items;
import cn.itcast.ssm.pojo.ItemsCustom;
//json交互测试
@Controller
public class JsonTest {
//请求json(商品信息),输出json(商品信息)
/*
* @RequestBody将请求的商品信息的json串转换成java对象
* @ResponseBody将java对象转换成json输出
* */
@RequestMapping("/requestJson")
public @ResponseBody ItemsCustom requestJson(@RequestBody ItemsCustom itemsCustom){
return itemsCustom;
}
}
说明:这个方法中,@RequestBody
将请求的商品信息的json
串转换成java
对象,而@ResponseBody
将java
对象转换成json
输出。下面我们使用地址http://localhost:8080/springmvc-mybatis08/jsonTest.jsp
进行访问,点击第一个按钮。但是这里总是出现一个错误:
org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/json;charset=UTF-8' not supported
在网上找了半天,没找到答案。
- 6、请求
key/value
,返回json
这种情况下,我们在前台页面中不需要设置contentType
,因为默认就是发送key/value
,下面给出Controller
方法:
@RequestMapping("/responseJson")
public @ResponseBody ItemsCustom responseJson(ItemsCustom itemsCustom){
return itemsCustom;
}
说明:在测试此种数据交互的时候也出现错误,暂时还未解决。
- 7、问题解决
之后我怀疑是jar
出现错误,于是将之前的jar
包使用下面的包进行了替换:
jackson-annotations-2.8.0.jar
jackson-core-2.8.0.jar
jackson-databind-2.8.0.jar
然后进行试验,就没问题了,第一种情况下试验结果为
第二种情况的试验结果为:
说明:在我打开之前的jar
包和后面的jar
进行查看的时候发现目录结构都不一样,这表示网址也不一样,一个是org
结尾,一个是com
结尾,因为这是初次学习这个工具,不知道这前后jar
包有什么区别,留待以后再研究。