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即可使用该配置。
测试方法:
@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前面)。
相关文章推荐
- spring mvc3.1 @ResponseBody注解生成大量Accept-Charset
- spring MVC 3.1 注解:@ResponseBody 返回json数据
- HttpMessageConverter(消息转换器 )和@responsebody使用
- Spring mvc 通过@ResponseBody注解返回数据
- spring mvc 自定义注解ResponseEncryptBody、RequestDecryptBody统一处理加密、解密数据,供移动端使用的rest服务
- 关于spring mvc3的注解之@ResponseBody的使用
- Spring mvc 注解@ResponseBody 返回内容编码问题
- spring MVC 注解处理分析(一) @ResponseBody
- Spring mvc使用注解@ResponseBody Ajax请求返回json报406错误
- spring mvc 使用@ResponseBody注解返回json字符串
- Spring Mvc中Controller 中的@ResponseBody 注解
- HttpMessageConverter(消息转换器 )和@responsebody使用
- Spring MVC 中的 @ResponseBody 注解的使用场合
- Spring mvc 注解@ResponseBody 返回内容编码问题
- Spring MVC注解之@ResponseBody
- Spring MVC中常用注解之@ResponseBody,@RequestBody,@PathVariable详解
- spring mvc3.1 @ResponseBody注解生成大量Accept-Charset
- Spring MVC 注解@ResponseBody或流获取http请求body的json字符串
- HttpMessageConverter(消息转换器 )和@responsebody使用
- spring MVC 3.1 注解:@ResponseBody 返回json数据