SpringMVC——处理 JSON:使用 HttpMessageConverter

一、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
原文地址:https://www.cnblogs.com/realshijing/p/8179519.html