SpringMVC学习笔记——处理JSON

如何处理JSON

  1. 编写一个请求,并显示,使用JS的方式:
<script type="text/javascript" src="scripts/jquery-1.9.1.min.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 lastName = data[i].lastName;

                    alert(id+": " + lastName);
                }
            });
            return false;
        });
    })
</script>
<body>
    <a href="testJson" id="testJson">Test Json</a>
    <br>
</body>

这里用JS的方式进行请求和回显。
2. 导入支持JSON的Jar包,这里是Jackson,使用Maven去管理,在pom.xml中加入:

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.9.5</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.5</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.9.5</version>
        </dependency>

这里采用的是295版本(看使用的人比较多,嘿嘿嘿)。
3. 编写Handler方法,在test包下的SpringMVCTest类中加入方法:

    @ResponseBody
    @RequestMapping(value = "/testJson", method = RequestMethod.POST)
    public Collection<Employee> testJson() {
        return emlpoyeeDao.getAll();
    }

其中有两个点需要注意:
(1)以往目标方法都是都是返回一个String类型的字符串,通过视图解析器解析成一个视图呈献给用户,但是我们需要返回一个Json串,如何处理呢?
直接将集合类型返回,SpringMVC会自动帮我们进行转换,转换成Json并返回,也就是说返回值是集合类型即可,或者返回JSON对应的对象
(2)该目标方法需要使用@ResponseBody进行修饰,表示返回值是一个ResponseBody,通过HttpMessageconverter进行转换。


HttpMessageConverter

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

流程图

总体流程:
这里写图片描述
HttpInputMessage:
这里写图片描述
请求信息转成输入流。
HttpOutputMessage:
这里写图片描述
响应信息转成输出流。

MessageConverters

在我们的目标方法打一个断点,查看
DispatcherServlet.handlerAdapters[RequestMappingHandlerAdapter].messageConverters
这里写图片描述
在未加入Jackson的Jar包时,这里的messageConverters默认有6个;在加入Jackson的Jar包后,SpringMVC自动为我们加载了MappingJackson2HttpMessageConverter

@RequestBody、@ResponseBody

其中@RequestBody只能修饰PARAMETER(入参)上,用来把请求的body转换成Java对象。
@ResponseBody只能修饰TYPE和METHOD(返回类型、方法),用来把Java对象转换成响应的body。
下面用文件上传举例:

    <form action="testHttpMessageConverter" method="POST" enctype="multipart/form-data">
        File:
        <input type="file" name="file" />
        <br>
        Desc:
        <input type="text" name="Desc" />
        <br>
        <input type="submit" value="Submit">
    </form>

这是一个文件上传的表单。

    @ResponseBody
    @RequestMapping(value = "/testHttpMessageConverter")
    public String testHttpMessageConverter(@RequestBody String body) {
        System.out.println(body);
        return "helloworld! " + new Date();
    }

这是一个目标方法,其中用@ResponseBody修饰方法,用@RequestBody修饰入参,则SpringMVC会将HttpInputMessage转换成Java对象(String类型),SpringMVC也会将String类型的返回值转换成HttpOutputMessage放入Response的Body中。

HttpEmtity<T>、ResponseEntity<T>

拿文件下载举例:

    @RequestMapping(value = "/testResponseEntity")
    public ResponseEntity<byte[]> testResponseEntity(HttpSession session) throws IOException {
        byte[] body = null;
        ServletContext servletContext = session.getServletContext();
        InputStream in = servletContext.getResourceAsStream("/files/abc.txt");
        body = new byte[in.available()];
        in.read(body);
        HttpHeaders headers = new HttpHeaders();
        headers.add("Content-Disposition", "attachment;filename=abc.txt");
        HttpStatus status = HttpStatus.OK;
        ResponseEntity<byte[]> response = new ResponseEntity<>(body, headers, status);
        return response;
    }

其中,返回值为ResponseEntity<byte[]>,带了一个入参类型为HttpSession,SpringMVC会自动为我们进行数据的绑定(Servlet相关的入参)。
其中,ResponseEntity的构造器有三个参数。
其中的body是我们的数据体,根据泛型来确定其类型,这里是byte[]数组,我们利用ServletContext来获取一个服务器本地文件的流,读入到body中;
HttpHeaders就是标明该响应的头信息,这里表示它是一个文件下载类型;
HttpStatus就是表示返回状态,返回该ResponseEntity即可。 Spring 首先根据·请求头或响应头的Accept 属性选择匹配的 HttpMessageConverter,进而根据参数类型或泛型类型的过滤得到匹配的 HttpMessageConverter,若找不到可用的HttpMessageConverter 将报错。

以上两对不需要成对出现,可单独使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值