最近在项目重构中,把原来项目中的Struts2换成了spring3.0的MVC,个人感觉Spring3 mvc比struts2开发方便多了。尤其它的RESTFUL URL。更多关于Spring3 mvc的资料网上也是一大堆,这里就不一一介绍了。
写此文的目的是记录一下自己解决Spring3.0 MVC @ResponseBody中文乱码问题。
Spring3.0 MVC @ResponseBody 的作用是把返回值直接写到HTTP response body里。具体实现AnnotationMethodHandlerAdapter类handleResponseBody方法,具体实现代码:
OK,了解了@ResponseBody 的实现,我们回到乱码问题上。
根据Spring3 MVC的最小配置:
客户端使用JQuery AJAX方法发起请求:
结果输出乱码:???????
debug 跟踪@ResponseBody 的实现类发现其默认的编码是 iso-8859-1,见图片黄色部分
了解了其乱码原理我们来解决它。
springMVC 配置文件更改为:
这样通过配置AnnotationMethodHandlerAdapter类messageConverters属性来指定编码。
貌似可以解决问题了,但其实不然。运行发现,AJAX都没有数据返回。拿谷歌浏览器调试发现:
Failed to load resource: the server responded with a status of 406 (Not Acceptable)
继续Debug发现handleResponseBody方法抛出的此异常。由于客户端请求的MediaType类型默认是:*/*
所以只要我们在客户端设置MIME类型,问题就可以解决。
解决方法利用JQuery AJAX提供的beforeSend方法,设置其请求接受的类型,如下:
这样问题就解决了。
这是小弟的解决方法,不知大侠们有没有好的解决方法,欢迎赐教。