十一、SpringMVC--处理JSON数据:使用 HttpMessageConverter

处理 JSON

  1. 加入jar包
    在这里插入图片描述
  2. 编写目标方法,使其返回JSON对应的对象或集合。
  3. 在方法上添加@ResponseBody注解
    index.jsp:
<script>
        $(function(){
            $("#testJson").click(function (){
                $.post("testJson",{},function (data){
                    console.log(data);
                });
            });
        });
    </script>
 <button id="testJson">Test JSON</button>

Controller层代码:

 @ResponseBody
    @RequestMapping("/testJson")
    public List<User> testJson(){
        List<User> users = new ArrayList<>();
        users.add(new User("Lucy","11111","2345@qq.com",18));
        users.add(new User("Tom","222222","2345@qq.com",28));
        users.add(new User("Bob","333333","2345@qq.com",48));
        users.add(new User("Green","444444","2345@qq.com",38));
        return users;
    }

HttpMessageConverter

  • HttpMessageConverter 是 Spring3.0 新添加的一个接口,负责将请求信息转换为一个对象(类型为 T),将对象(类型为 T)输出为响应信息。
  • HttpMessageConverter 接口定义的方法:
    – Boolean canRead(Class<?> clazz,MediaType mediaType): 指定转换器
    可以读取的对象类型,即转换器是否可将请求信息转换为 clazz 类型的对
    象,同时指定支持 MIME 类型(text/html,applaiction/json等)
    – Boolean canWrite(Class<?> clazz,MediaType mediaType):指定转换器
    是否可将 clazz 类型的对象写到响应流中,响应流支持的媒体类型
    在MediaType 中定义。
    – LIst getSupportMediaTypes():该转换器支持的媒体类
    型。
    – T read(Class<? extends T> clazz,HttpInputMessage inputMessage):
    将请求信息流转换为 T 类型的对象。
    – void write(T t,MediaType contnetType,HttpOutputMessgae
    outputMessage):将T类型的对象写到响应流中,同时指定相应的媒体类
    型为 contentType。
    在这里插入图片描述

HttpMessageConverter 的实现类

在这里插入图片描述
DispatcherServlet 默认装配RequestMappingHandlerAdapter ,而RequestMappingHandlerAdapter 默认装配如下
HttpMessageConverter:
在这里插入图片描述
加入 jackson jar 包后, RequestMappingHandlerAdapter装配的 HttpMessageConverter 如下:

使用 HttpMessageConverter

  • 使用 HttpMessageConverter 将请求信息转化并绑定到处理方法的入参中或将响应结果转为对应类型的响应信息,Spring 提供了两种途径:
    – 使用 @RequestBody / @ResponseBody 对处理方法进行标。
    – 使用 HttpEntity / ResponseEntity 作为处理方法的入参或返回值。
  • 当控制器处理方法使用到 @RequestBody/@ResponseBody 或HttpEntity/ResponseEntity 时, Spring 首先根据请求头或响应头的Accept 属性选择匹配的 HttpMessageConverter, 进而根据参数类型或泛型类型的过滤得到匹配的 HttpMessageConverter, 若找不到可用的HttpMessageConverter 将报错。
  • @RequestBody 和 @ResponseBody 不需要成对出现

示例

 @ResponseBody
    @RequestMapping("/testHttpMessageConvert")
    public String testHttpMessageConvert(@RequestBody String body ){
        System.out.println(body);
        return "Hello World"+new Date();
    }
<form action="testHttpMessageConvert" method="post">
    File:<input type="file" name="file">
    desc:<input type="test" name="desc">
    <input type="submit" value="Submit">
  </form>

使用 HttpEntity<T> / ResponseEntity<T>实现下载

controller:

@RequestMapping("/testResponseEntity")
    public ResponseEntity<byte[]> testResponseEntity(HttpSession session) throws IOException {
        byte[] body = null;
        ServletContext servletContext = session.getServletContext();
        InputStream in = servletContext.getResourceAsStream("/files/123.txt");
        body = new byte[in.available()];
        in.read(body);

        HttpHeaders headers = new HttpHeaders();
        headers.add("Content-Disposition","attachment;filename=123.txt");

        HttpStatus statusCode = HttpStatus.OK;
        ResponseEntity<byte[]> response = new ResponseEntity<>(body,headers,statusCode);
        return  response;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值