先說一下我的經歷,以及解決問題的而過程。
在使用SpringMVC的時候,最開始的時候在配置文件中使用<mvc:annotation-driven />去自動注冊DefaultAnnotationHandlerMapping與AnnotationMethodHandlerAdapter 兩個bean,這是spring MVC為@Controllers分發請求所必須的。再后來,Ajax請求需要返回字符串,遂在控制器上使用@ResponseBody注解來實現,這時候遇到的一個問題是,返回中文字符的時候會亂碼,關於中文亂碼的解決辦法倒時有很多。SpringMVC的@ResponseBody注解使用的處理類為Spring的org.springframework.http.converter.StringHttpMessageConverter類,返回中文亂碼的原因是其默認處理的字符集是ISO-8859-1。So...
解決辦法1:
在控制器上加上@RequestMapping(value="/checkLogin",method=RequestMethod.POST,produces="text/html;charset=UTF-8")字符編碼的注解,加上注解之后,中文亂碼的問題的到了解決,但是之后又有了為HandlerMapping添加攔截器的需求,在這里為了精准的添加攔截器,所以放棄使用<mvc:annotation-driven />這句話去自動注冊DefaultAnnotationHandlerMapping與AnnotationMethodHandlerAdapter 兩個bean,而改為手動注冊。等修改了之后,發現中文亂碼的問題又來了,遂采用了另外一種辦法。
解決辦法2:
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> <property name="interceptors"> <list> <bean class="cn.ciss.interceptor.LoginInterceptor"></bean> </list> </property> </bean> <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/plain;charset=UTF-8</value> --> <value>text/html;charset=UTF-8</value> </list> </property> </bean> <bean class="org.springframework.http.converter.ResourceHttpMessageConverter"></bean> <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"></bean> <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"></bean> <bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter"></bean> <bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"></bean> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean> </list> </property> </bean>
這是自動注冊DefaultAnnotationHandlerMapping與AnnotationMethodHandlerAdapter的代碼,之所以自己去注冊,是為了增加對SpringMVC的控制能力,比如你想為某個特定的HandleMapping注冊一個攔截器之類的。看以上貼出的代碼可以看到,在注冊org.springframework.http.converter.StringHttpMessageConverter的時候明確了其編碼格式為UTF-8。這種解決辦法也是我比較喜歡的,因為不用再每一個返回中文字符串上的控制器都加一個@RequestMapping(value="/checkLogin",method=RequestMethod.POST,produces="text/html;charset=UTF-8")這樣的注解了。