Ajax Json交互分为两个方向:
- 前端到后台:前端ajax发送json格式字符串,后台直接接收为pojo参数,后台使用@RequstBody;
- 后台到前端:后台直接返回pojo对象,前端接收未json对象或者字符串,后台使用注解@ResponseBody;
@ResponseBody注解
@ResponseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换成指定格式后,写入到response对象的body区,通常用来返回JSON数据或者XML数据。注意:在使用此注解之后不会在走视图解析器,而是直接将数据写入到输入流中,它的效果等同于通过response对象输出指定格式的数据。
Spring MVC 使用JSON交互
引入json相关jar包
Spring MVC想要使用JSON进行数据交互,需要引入基础的JSON依赖包
<!--json数据交互所需jar,start-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>
<!--json数据交互所需jar,end-->
代码事例
- 前端页面及js代码
-
引入jquery.min.js
将ajax需要使用到的jquery.min.js放置到WEB-INF目录中
- Spring MVC 处理静态资源
修改springmvc.xml文件,添加 mvc:resources 标签,让SpringMVC框架自己处理静态资源,否则前端ajax的js无法使用jquery.min.js
<!--静态资源配置,方案二,SpringMVC框架自己处理静态资源
mapping:约定的静态资源的url规则
location:指定的静态资源的存放位置-->
<mvc:resources location="/WEB-INF/js/" mapping="/js/**"/>
- jsp页面代码
<div>
<h2>Ajax json交互</h2>
<fieldset>
<input type="button" id="ajaxBtn" value="ajax提交"/>
</fieldset>
</div>
- ajax js请求代码
<head>
<title>SpringMVC 测试页</title>
<script type="text/javascript" src="/js/jquery.min.js"></script>
<script>
$(function () {
$("#ajaxBtn").bind("click",function () {
// 发送ajax请求
$.ajax({
url: '/demo/handle07',
type: 'POST',
data: '{"id":"1","name":"李四"}',
contentType: 'application/json;charset=utf-8',
dataType: 'json',
success: function (data) {
alert(data.name);
}
})
})
})
</script>
<style>
div{
padding:10px 10px 0 10px;
}
</style>
</head>
- 后台Handler代码
前端通过ajax向后台发送请求,将user对象转换成JSON字符串请求到后台的Handler。后台的Handler收到JSON数据后,通过@RequestBody注解将JSON字符串转换成User对象,后台Handler修改User对象后,通过@ResponseBody注解将user对象转换成JSON字符串,响应到页面。
/**
* 添加@ResponseBody之后,不再走视图解析器那个流程,
* 而是等同于response直接输出 数据
*/
@RequestMapping("/handle07")
public @ResponseBody User handle07(@RequestBody User user) {
System.out.println(user);
// 业务逻辑处理,修改name为张三丰
user.setName("张三丰");
return user;
}