您的位置:首页 > 编程语言 > Java开发

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

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

@RequestMapping(value = "/query", method = RequestMethod.GET)
public void queryFoodsByName(
4000
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前面)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: