SpringMVC处理JSON数据的具体实现代码下载地址:http://download.csdn.net/download/bingbeichen/9797439。
1. 具体实现
①. 添加jackson所需要的jar包
②. 编写目标方法,使其直接返回JSON对应的对象或集合,并在方法上添加@ResponseBody注解
@ResponseBody
@RequestMapping("/testJson")
public Collection<Employee> testJson() {
System.out.println("testJson...");
return employeeDao.getEmployees();
}
③. 使用jQuery发送Ajax请求,并获取返回的JSON数据
<!-- 注意:在加入jQuery后,需要对静态资源进行特殊处理 -->
<script type="text/javascript" src="scripts/jquery-1.7.2.js"></script>
<script type="text/javascript">
$(function(){
$("#testJson").click(function(){
var url = this.href;
var args = {};
$.post(url, args, function(data){
for(var i = 0; i < data.length; i++) {
var id = data[i].id;
var name = data[i].name;
var email = data[i].email;
alert("Employee [id=" + id + ", name=" + name + ", email=" + email + "]");
}
});
return false;
});
})
</script>
<body>
<a href="testJson" id="testJson">Test JSON</a>
</body>
2. 基本原理
SpringMVC在处理JSON数据时,需要使用HttpMessageConverter接口,其是Spring3.0新添加的接口,主要负责将请求信息转换为一个Java对象(类型为 T),或将Java对象(类型为 T)输出为响应信息。
HttpMessageConverter的基本流程如下图所示:
HttpMessageConverter的实现类主要有:
DispatcherServlet默认装配有ReuqestMappingHandlerAdapter,而ReuqestMappingHandlerAdapter默认装配的HttpMessageConverter如下:
加入Jackson所需要的jar包后,RequestMappingHandlerAdapter装配的HttpMessageConverter如下:
由此可见,在加入Jackson所需要的jar包后,SpringMVC会自动将MappingJackson2HttpMessageConverter装配上,以实现对JSON数据的处理。
3. 使用HttpMessageConverter
使用HttpMessageConverter<T>
将请求信息转化并绑定到处理方法的入参中或将响应结果转化为对应类型的响应信息,SpringMVC提供了两种途径:
①. 使用@RequestBody标注处理方法的入参或使用@ResponseBody标注处理方法;
②. 使用HttpEntity<T>
作为处理方法的入参或使用ResponseEntity<T>
作为处理方法的返回值。
当控制器的处理方法使用到@RequestBody/@ResponseBody或HttpEntity<T>/ResponseEntity<T>
时,Spring首先根据请求头或响应头的Accept属性选择匹配的HttpMessageConverter,进而根据参数类型或泛型类型过滤得到匹配的HttpMessageConverter,若找不到则报错。其具体匹配原理如下图所示:
3.1 使用@RequestBody与@ResponseBody实现文件上传
<!-- index.jsp页面 -->
<body>
<form action="testHttpMessageConverter" method="post" enctype="multipart/form-data">
File:<input type="file" name="file" />
Desc:<input type="text" name="desc" />
<input type="submit" value="submit" />
</form>
<br><br>
</body>
public class TestJSON {
@ResponseBody
@RequestMapping("/testHttpMessageConverter")
public String testHttpMessageConverter(@RequestBody String body) {
// 将在控制台输出文件内容
System.out.println(body);
// 将在页面显示如下字符串信息
return "helloworld : " + new Date();
}
}
3.2 使用HttpEntity<T>
实现文件下载操作
public class TestJSON {
@RequestMapping("/testResponseEntity")
public ResponseEntity<byte[]> testResponseEntity(HttpSession session) throws Exception {
byte[] body = null;
ServletContext servletContext = session.getServletContext();
InputStream inputStream = servletContext.getResourceAsStream("/files/test.txt");
body = new byte[inputStream.available()];
inputStream.read(body);
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Disposition", "attachment;filename=test.txt");
HttpStatus statusCode = HttpStatus.OK;
ResponseEntity<byte[]> response = new ResponseEntity<byte[]>(body, headers, statusCode);
return response;
}
}