---------------------------------------
在这里我不得支持一下SpringMVC是一个不错的框架,用了springmvc这么长时间 我犯了个错误,说来惭愧.
在项目中编码格式是UTF-8 在使用Ajax 请求 在SpringMVC中返回Json 数据 我用到了@ResponseBody 注解 将表示该方法的返回结果直接写入HTTP response body中。
然后再数据库中取出的中文通过Spring的response返回结果中文乱码.
方法一
原因:
response在响应的时候 生成的response中"Content-Type"的值不正确。(默认的是ISO-8859-1)
然后使用Spring使用AnnotationMethodHandlerAdapter来处理@ResponseBody,该类再使用一些HttpMessageConverter来具体处理信息。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<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>
<context:component-scan base-package="com.zdkj.limp.controller"></context:component-scan>
<mvc:annotation-driven />
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/" />
<property name="suffix" value=".jsp"></property>
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
</bean>
</beans>
以上是我就纠正回来的正确代码 以免误导大家 我贴出了正确的代码
下面那段是错误的代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<context:component-scan base-package="com.zdkj.limp.controller"></context:component-scan>
<mvc:annotation-driven />
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/" />
<property name="suffix" value=".jsp"></property>
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
</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/html;charset=UTF-8</value>
</list>
</property>
</bean>
</list>
</property>
</bean>
</beans>
大家看看有什么区别
我找了半天都没找出原因 后来发现顺序不对
程序执行的时候先注解扫描包 没发现 org.springframework.http.converter.StringHttpMessageConverter
最后才执行org.springframework.http.converter.StringHttpMessageConverter当执行的时就不再去扫描了
所以最终结果是顺序放错了
----------------------------------------------------------------------------
附加的一个案例如果大家再碰到这种乱码问题 没办法 使用以下代码
方法 二
使用java中的urlEncoding 对字符进行编码 然后再到客户端js中进行urlDecoding进行解码 也可以解决乱码问题 但我不建议使用这种方法 治标不治本
服务器端 java代码如下:
// URL编码
protected String urlEncode(String src) {
try {
return URLEncoder.encode(src, "UTF-8");
} catch (Exception ex) {
return src;
}
}
客户端 js中 代码如下:
<script type="text/javascript">
if (!misc) {
var misc = {};
}
if (!misc.utils) {
misc.utils = {};
}
misc.utils.urlencode2Utf8 = function(ptr) {
for ( var x in ptr) {
if (typeof (ptr[x]) == 'object') {
misc.utils.urlencode2Utf8(ptr[x]);
} else if (typeof (ptr[x]) == 'string') {
try {
ptr[x] = decodeURIComponent(ptr[x]);
} catch (e) {
}
}
}
};
</script>

本文介绍了解决SpringMVC框架中使用@ResponseBody返回JSON数据时出现中文乱码的问题,提供了一种通过调整配置文件中消息转换器顺序的方法,并附带提供了一种使用URL编码作为备选方案。
467

被折叠的 条评论
为什么被折叠?



