注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

无线时代辐射无穷

抓紧生宝宝,小心辐射

 
 
 

日志

 
 

springmvc Spring3 MVC @ResponseBody返回,jquery ajax调用中文乱码问题解决  

2011-04-24 02:21:55|  分类: spring |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
Spring3.0 MVC @ResponseBody 的作用是把返回值直接写到HTTP response body里。具体实现AnnotationMethodHandlerAdapter类handleResponseBody方法,具体实现代码:

结果输出乱码:???????

有人跟踪@ResponseBody 的实现类发现其默认的编码是 iso-8859-1,

解决办法,在spring mvc的配置文件中手工配置bean:
<!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->    
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" >  
<property name="messageConverters">   
         <list>   
             <bean class = "org.springframework.http.converter.StringHttpMessageConverter">   
                <property name = "supportedMediaTypes">
                      <list>
                          <value>text/html;charset=UTF-8</value>   
                     </list>   
                </property>   
             </bean>   
         </list>   
   </property>  
</bean>  

这样通过配置AnnotationMethodHandlerAdapter类messageConverters属性来指定编码。
记住,需要把bean部分加入到<context:component-scan base-package="com.zlscw.mvc" />前面,这样就可以在jquery中直接调用而不出现乱码了。

以上方法,在浏览器中表现不一,搜狗浏览器和IE正常,在火狐和遨游中乱码。
终极解决办法,参考如下:

 <!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
  <property name="messageConverters">
   <list>
    <bean class="com.test.interceptor.UTF8StringHttpMessageConverter" >
        <property name="supportedMediaTypes"> 
            <list> 
                <value>text/html;charset=UTF-8</value> 
            </list> 
        </property> 
    </bean>
   </list>
  </property>
 </bean>

UTF8StringHttpMessageConverter.java源代码:
public class UTF8StringHttpMessageConverter extends AbstractHttpMessageConverter<String>
{
 public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
 private final List<Charset> availableCharsets;

 public UTF8StringHttpMessageConverter()
 {
  this(DEFAULT_CHARSET);
 }

 public UTF8StringHttpMessageConverter(Charset defaultCharset)
 {
  super(new MediaType("text", "plain", defaultCharset), MediaType.ALL);
  this.availableCharsets = new ArrayList<Charset>(Charset.availableCharsets().values());
 }

 @Override
 protected boolean supports(Class<?> clazz)
 {
  return String.class.equals(clazz);
 }

 @Override
 protected String readInternal(Class<? extends String> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException
 {
  MediaType contentType = inputMessage.getHeaders().getContentType();
  Charset charset = contentType.getCharSet() != null ? contentType.getCharSet() : DEFAULT_CHARSET;
  return FileCopyUtils.copyToString(new InputStreamReader(inputMessage.getBody(), charset));
 }

 @Override
 protected void writeInternal(String t, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException
 {
  MediaType contentType = outputMessage.getHeaders().getContentType();
  Charset charset = contentType.getCharSet() != null ? contentType.getCharSet() : DEFAULT_CHARSET;
  FileCopyUtils.copy(t, new OutputStreamWriter(outputMessage.getBody(), charset));
 }

 protected List<Charset> getAcceptedCharsets()
 {
  return this.availableCharsets;
 }

 @Override
 protected Long getContentLength(String s, MediaType contentType)
 {
  if (contentType != null && contentType.getCharSet() != null)
  {
   Charset charset = contentType.getCharSet();
   try
   {
    return (long) s.getBytes(charset.name()).length;
   }
   catch (UnsupportedEncodingException ex)
   {
    throw new InternalError(ex.getMessage());
   }
  }
  else
  {
   return null;
  }
 }
}

  评论这张
 
阅读(7428)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017