本文主要阐述:
SpringMVC json数据交互的过程及其细节
json结合RESTful支持开发小案例
json数据交互
数据交互流程
由上述流程交互主要分为两种情况
- 客户端请求的是json串,输出的是json串;
- 客户端请求的是key/value,输出的是json串。
测试环境搭建
jar包
springmvc用Jackson包下的@requestBody和@responseBody注解转换json
js链接
提供前端页面转换json串的ajax模板
测试结构搭建
在WebRoot下创建js文件夹:引入jquery-1.4.4.min.js
在WebRoot下创建测试jsp页面:JsonTest.jsp
在cn.ssm.xhchen.controller下创建JsonController.java
配置json转换器和解析静态资源
转换器
<!-- 注解配置处理器适配器 -->
<!-- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
json解析
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean>
</list>
</property>
</bean> -->
注意:如果适配器交给mvc自动注册就不需要配置转换器
<mvc:annotation-driven ></mvc:annotation-driven>
解析静态资源
<!-- 解析静态资源 -->
<mvc:resources location="/js/" mapping="/js/**"/>
测试输入json,输出json
编写JsonTest.jsp页面
引入js文件
<script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery-1.4.4.min.js"></script>
设置测试按钮
<input type="button" onclick="requestJson()" value="输入json串,输出json串">
ajxa转换json
函数requestJson(),请求为json串需要指定contentType(application/json);数据格式为json数据。
// 输入json串,输出json串
function requestJson() {
$.ajax({
type:'post',
url:'${pageContext.request.contextPath }/json/requestJson.action',
contentType:'application/json;charset=utf-8',
// json串数据格式
data:'{"items_name":"手机","items_price":"998","items_detail":"双摄16G 4G"}',
success:function(date){
alert(date.items_price);
}
});
}
创建JsonController.java
@requestBody 将json串转换为java对象
@responseBody 将java对象转换为json串输出
// @RequestBody 把请求商品信息的json串转换为ItemsCustomer对象
// @ResponseBody 将ItemsCustomer对象转换为json串输出
@RequestMapping("/requestJson")
public @ResponseBody ItemsCustomer requestJson(@RequestBody ItemsCustomer itemsCustomer) {
// 一系列数据操作...
return itemsCustomer;
}
测试结果
请求头信息
content-Type:application/json;charsetset=utf-8
响应头信息
content-Type:application/json;charsetset=utf-8
请求json的串
响应的json数据
测试输入key/value,输出json
编写JsonTest.jsp页面
设置测试按钮
<input type="button" onclick="responseJson()" value="输入key/value,输出json串">
ajxa转换json
函数responseJson(),请求为key/value不需要指定contentType,因为默认为key/value类型;数据格式为key/value。
// 输入key/value,输出json串
function responseJson() {
$.ajax({
type:'post',
url:'${pageContext.request.contextPath }/json/responseJson.action',
/* contentType:'application/json;charset=utf-8', */
// key/value数据格式
data:'items_name=手机&items_price=998&items_detail=双摄16G 4G',
success:function(date){
alert(date);
}
});
}
创建JsonController.java
不需要@requestBody将json串转为java对象
@responseBody 将java对象转换为json串输出
@RequestMapping("/responseJson")
public @ResponseBody ItemsCustomer responseJson(ItemsCustomer itemsCustomer) {
// 一系列数据操作...
return itemsCustomer;
}
测试结果
请求头信息
content-Type:application/x-www-from-urlencoded(key/value)
响应头信息
content-Type:application/json;charsetset=utf-8
请求json的串
响应的json数据
综上可知,请求json,输出json需要在前端进行json转换,不方便,所以不常用;请求key/value,输出json则与其相反,较为常用。
json结合RESTful
在案例开始前先了解一下什么是RESTful支持?
RESTful架构,就是目前最流行的一种互联网软件架构,一个开发理念,是对http很好的诠释。它结构清晰、符合标准、易于理解、扩展方便,得到越来越多网站的采用。
主要包括以下3个功能:
1、对url进行规范,写RESTful格式的url
非REST的url:http://...../queryItems.action?id=001&type=T01
REST的url:http://..../items/001 url简洁,将参数通过url传到服务端
2、http的方法规范
不管是删除、添加、更新等使用url是一致的,如果进行删除,需要设置http的方法为delete,同理添设置。后台controller方法:判断http方法,如果是delete方法执行删除,同理处理。
3、对http的contentType规范
请求时指定contentType,要json数据,设置成json格式的type。
案例需求
查询商品信息,返回json数据。
编写controller
url映射使用RESTful风格的url,将查询商品信息的id传入controller。通过@ReeponseBody把java对象输出json。
// /itemsView/{id} {xxx}占位符
// @PathVariable 获取占位符中的参数,把模板变量映射到方法的形参中
// @PathVariable("id") 指定占位符与形参一致,如果名字一致可以不用指定
@RequestMapping("/itemsView/{id}")
public @ResponseBody ItemsCustomer itemsView(@PathVariable("id") Integer id) throws Exception {
// 调用itemsService方法查询
ItemsCustomer itemsCustomer = itemsService.findItemsById(id);
return itemsCustomer;
}
/itemsView/{id} {xxx}占位符。
@PathVariable 获取占位符中的参数,把模板变量映射到方法的形参中。
@PathVariable("id") 指定占位符与形参一致,如果@RequestMapping中占位名字和形参一致可以不用指定。
前端控制器配置
Web.xml下配置RESTful的前端控制器
<!-- 配置RESTful前端控制器 -->
<servlet>
<servlet-name>spring_rest</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- contextConfigLocation配置springmvc加载的配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>spring_rest</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
测试案例一
http://localhost:8080/ssm/json/itemsView/1
请求的json数据
响应json数据
测试案例二
编写JsonTest.jsp页面
设置测试按钮
<input type="button" onclick="itemsView()" value="根据id查询商品">
ajxa转换json
函数itemsView (),请求为json串需要指定contentType(application/json;charset=utf-8);数据格式为json数据。
// 根据id查询商品
function itemsView() {
$.ajax({
type:'post',
url:'${pageContext.request.contextPath}/json/itemsView/1.action',
contentType:'application/json;charset=utf-8',
success:function(date){
alert(date.items_price);
}
});
}
测试结果
请求头信息
响应头信息
请求的json数据
响应的json数据