Spring MVC -- @Responsebody注解、消息转换器

众所周知SpringMVC的Controller方法一般返回的是个字符串类型的路径,或者ModelAndView对象,但如果是AJAX请求,只需要一个JSON,并不需要跳转时,一般做法可以是这样:

        @RequestMapping(value = "/query", method = RequestMethod.GET)
        public void queryFoodsByName(String foodName, OutputStream os)
                        throws UnsupportedEncodingException, IOException {
                String JSONString = service.queryFoodsByName(foodName);
                os.write(JSONString.getBytes("UTF-8"));
        }

通过参数自动填充机制,获取response的输出流,使用输出流返回给页面。这种玩法是没问题,不过声明一个流再自己调用write方法,还是有那么麻烦,不妨试试下面这种:

        @ResponseBod
        @RequestMapping(value = "/queryFood", method = RequestMethod.GET)
        public byte[] queryFoodsByName_jsonStr(String foodName) 
                throws UnsupportedEncodingException{
                String JSONString = service.queryFoodsByName(foodName);
                return JSONString.getBytes("UTF-8");
        }
关于消息转换器这里不展开说明,直接上配置:

通过 @ResponseBody 注解实现。这个注解的作用是 使该方法的返回值直接写入HTTP Response Body(响应体)中,不会被解析为跳转路径。Ajax异步请求的绝配。对比一下两种方式:
    一:直接对浏览器输出未经处理的字节数组,无响应头信息,如果有中文会出现乱码。
    二:SpringMVC会将字节数组加以处理,会自动添加包含编码格式、字符集等信息的响应头,支持中文。

  所以怎么看都是第二种好用,如果是ajax请求,推荐第二种。

第三种:直接返回List<Map>集合。
这种方式的就比第二种还要精简!精简到过分,直接把SQL语句的查询结果返回。不过这种方法也是要加上 Responsebody 注解。不仅如此,还要配置消息转换器。

ResonseBody注解和消息转换器是相关的,SpringMVC默认会有一个支持字节数组的消息转换器,所以第二种方法能够直接返回byte数组也是这个原因。不过要支持别的类型,就需要配置消息转换器。

关于消息转换器这里不展开说明,直接上配置:

<mvc:annotation-driven>
                <mvc:message-converters>
                        <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                                <property name="supportedMediaTypes">
                                        <list>
                                                <!-- 配置响应支持的类型 -->
                                                <value>text/html</value>
                                                
                                                <!-- 设置请求体支持的类型 -->
                                                <value>application/x-www-form-urlencoded</value>
                                        </list>
                                </property>
                        </bean>
                </mvc:message-converters>
        </mvc:annotation-driven>

Spring版本不低于3.x即可使用该配置。

测试方法:
        @ResponseBody
        @RequestMapping(value = "/queryFoodList", method = RequestMethod.GET)
        public List<Food> queryFoodsList(String foodName) throws UnsupportedEncodingException{
                List<Food> list = service.queryFoodsList(foodName);
                return list;
        }

注意:如果在converters标签中之配置了一个消息转换器,那么返回值类型也只能用那一种转换器对应的类型噢。意思就是现在配置List<T>转Json字符串的转换器,返回Byte数组的方法就用不了了(它会把字节数组转成Json),需要再配一个:
<bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter">
                                <property name="supportedMediaTypes">
                                        <list>
                                                <!-- 配置响应支持的类型 -->
                                                <value>text/html</value>

                                                <!-- 设置请求体支持的类型 -->
                                                <value>application/x-www-form-urlencoded</value>
                                        </list>
                                </property>
                        </bean>

SpringMVC能够根据返回类型自动选择对应的转换器,这下两种都可以了(把ByteArray的配置放到JSON前面)。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值