zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    【题解】P3796【模板】AC自动机(加强版)
    【模板】P3806点分治1
    【题解】P2602[JZOI2010]数字计数
    【题解】P2444 病毒
    【题解】[P3557 POI2013]GRA-Tower Defense Game
    【题解】DZY Loves Chinese
    【题解】[Ghd]
    【题解】CF264B Good Sequences
    【题解】P3162CQOI2012组装
    【题解】P2279消防局的设立
  • 原文地址:https://www.cnblogs.com/realshijing/p/8179519.html
Copyright © 2011-2022 走看看