众所周知,在java WEB开发中springMVC作为一个开源的MVC框架被广大开发者所喜爱。但是对于刚刚入门的人来说,在使用控制器的时侯,只知道怎么返回页面,只是简单的配置了视图解析器以及使用Jackson2的包做json的返回。
那么当我们做文件处理的时候却只能手动将数据写到相应中去。那么如何利用返回值优雅地做字节数据的处理呢。
作为强迫症患者的我最近也是一直纠结这个问题。在看来spring源码的情况下终于找到的解决办法。利用@ResponseBody注解告诉spring MVC该返回值是放到响应体中的,然后这将不再调用试图解析做返回值的处理而是使用转换器转换数据,并将数据放到响应体中。那么了解之后是不是就有解决办法了。 下面我们来看一个json转换器的实现
public abstract class AbstractJackson2HttpMessageConverter extends AbstractGenericHttpMessageConverter<Object> {
public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
private static final MediaType TEXT_EVENT_STREAM = new MediaType("text", "event-stream");
可以看到它继承了AbstractGenericHttpMessageConverter<Object> 的一个抽象类,继续向上看,我们就能明白所有的转换器都实现了HttpMessageConverter<T>这个接口,如果我们想把返回的数据做定制化的处理是不是写一个自己的类去实现这个接口就好了。不过spring 的开发已经为我们写好了几个转换器,利用这些转化器基本可以实现我们的需求。
下面我就来介绍这些转换器的配置
<!-- 启用注解驱动 -->
<mvc:annotation-driven >
<mvc:message-converters>
<ref bean="BufferedImageHttpMessageConverter"/>
<ref bean="ResourceHttpMessageConverter"/>
<ref bean="ByteArrayHttpMessageConverter"/>
</mvc:message-converters>
</mvc:annotation-driven>
<!-- 转换器 -->
<bean id="ByteArrayHttpMessageConverter" class="org.springframework.http.converter.ByteArrayHttpMessageConverter" >
</bean> <!-- 这个转换器是处理控制器返回的字节数组的-->
<bean id="BufferedImageHttpMessageConverter" class="org.springframework.http.converter.BufferedImageHttpMessageConverter" />
<!-- 这个转换器是处理控制器返回的缓存图片的-->
<bean id="ResourceHttpMessageConverter" class="org.springframework.http.converter.ResourceHttpMessageConverter" >
<property name="defaultCharset" value="UTF-8"></property>
</bean>
<!-- 这个转换器是处理控制器返回的Resource的对象的,这是spring的一个内部类-->
通过这些配置我们就可以实现字节流的优雅返回了
//输出验证码
@RequestMapping(value = "/Pubverify-code/{id}",produces={"image/png"})
@ResponseBody
public BufferedImage verify(HttpSession session) {
String text = kaptcha.createText();
BufferedImage image = kaptcha.createImage(text);
session.setAttribute(kaptcha.getConfig().getSessionKey(), text);
session.setAttribute(kaptcha.getConfig().getSessionDate(), new Date());
return image;
}
这是一个返回验证码的控制器,配置如上。
我们从浏览器访问该路径,下面是它的效果图