在spring mvc中,默认是采用view的方式来实现响应,要实现直接输出
以json为例,网上有一篇文章提到5种方式
1,使用PrintWriter直接输出
如:public void getTest(PrintWriter out)
2,使用jsp方式,定义空jsp,并输出内容
3,使用spring的MappingJacksonHttpMessageConverter来实现输出
需要在spring配置文件中配置,并将Controller加上@ResponseBody注解
springmvc选择题如:
@ResponseBody
public void getTest(PrintWriter out)
4和5都是采用自定义对象视图的方式,只是4为完全自定义,5是采用spring-json.jar
需要注意的是第1点,很多人提到采用PrintWriter输出,无法控制Content type
也有人提到,可以采用配置StringHttpMessageConverter的方式
如:
<bean
class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<bean
class="org.verter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
</list>
</property>
</bean>
这种方式确实可以控制输出的Content Type,但在输出时,会输出一大堆Accept Charset,而且要单独配置
其实主要问题在于spring在方法参数中提供的PrintWriter是经过包装的,与通过response直接得到的Writer有所不同
似乎是方法参数中提供的PrintWriter输出还要经过默认的Converter转换,而默认的Converter采用了默
认的ISO编码
而且会重置response设置的Content Type
所以如果不使用spring在方法参数中提供的PrintWriter,而是使用response,
然后通过response设置Content Type,再从response取得Writer并输出,就不会出现乱码或Content Type不受控制的情况了
这种方法的好处是不用特别配置,代码也简单,如:
public void getTest(HttpServletResponse response) {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = Writer();
out.println("hello world");
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论