一、SpringMVC处理JSON流程
1. 加入 jar 包:
jackson-annotations-2.1.5.jar
jackson-core-2.1.5.jar
jackson-databind-2.1.5.jar
2. 编写目标方法,使其返回 JSON 对应的对象或集合
3.在方法上添加 @ResponseBody 注解
/**@ResponseBody 输出处理(json,string)
将内容或对象作为 HTTP 响应正文返回,使用@ResponseBody将会跳过视图处理部分,而是调用适合HttpMessageConverter,将返回值写入输出流。
* 测试返回Json串 * @param map * @return */ @ResponseBody @RequestMapping("/testJson") public List<Employee> testJson(Map<String ,Object> map){ return employeeService.getAllEmps(); }
4.页面Js
<script type="text/javascript"> $(function(){ $("#testjson").click(function(){ var url = this.href; var args = {}; $.post(url,args,function(date){ for(var i=0;i<=date.length;i++){ var id = date[i].id; var lastName = date[i].lastName; alert(id+":"+lastName); } }) return false; }) }); </script>
二、HttpMessageConverter
HttpMessageConverter 是 Spring3.0 新添加的一个接 口,负责将请求信息转换为一个对象(类型为 T),将对象( 类型为 T)输出为响应信息
使用 HttpMessageConverter 将请求信息转化并绑定到处理方法的入 参中或将响应结果转为对应类型的响应信息,Spring 提供了两种途径:
- 使用 @RequestBody / @ResponseBody 对处理方法进行标注
- 使用 HttpEntity / ResponseEntity 作为处理方法的入参或返回值
/** * 测试使用ResponseEntity进行文件下载 * @param session * @return * @throws IOException */ @RequestMapping("/testResponseEntity") public ResponseEntity<byte[]> testResponseEntity(HttpSession session) throws IOException { byte [] body = null; ServletContext servletContext = session.getServletContext(); InputStream in = servletContext.getResourceAsStream("/WEB-INF/pages/list.jsp"); body = new byte[in.available()]; in.read(body); // 设置响应头 HttpHeaders headers = new HttpHeaders(); headers.add("Content-Disposition", "attachment;filename=list.jsp"); //设置响应状态码 HttpStatus statusCode = HttpStatus.OK; ResponseEntity<byte[]> response = new ResponseEntity<byte[]>(body, headers, statusCode); return response; }
当控制器处理方法使用到 @RequestBody/@ResponseBody 或 HttpEntity/ResponseEntity 时, Spring 首先根据请求头或响应头的 Accept 属性选择匹配的 HttpMessageConverter, 进而根据参数类型或 泛型类型的过滤得到匹配的 HttpMessageConverter, 若找不到可用的 HttpMessageConverter 将报错 @RequestBody 和 @ResponseBody 不需要成对出现
三、源码分析
HttpMessageConverter 的实现类
- 调试进入org.springframework.web.servlet.DispatcherServlet.class
- 查看DispathcherServlet(this)的handlerAdapters
- 查看handlerAdapters下的 messageConverters
DispatcherServlet 默认装配 RequestMappingHandlerAdapter ,加入 jackson jar 包后, RequestMappingHandlerAdapter 装配的 HttpMessageConverter 如下:
org.springframework.http.converter.json.MappingJackson2HttpMessageConverter