- 浏览: 1171843 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (411)
- ASP (6)
- ASP.NET (2)
- CSS (4)
- HTML (11)
- Javascript (34)
- Java (100)
- PHP (1)
- XML (2)
- Flash/Flex/AS (1)
- 编程理论 (6)
- 操作系统 (23)
- 架构与搭建 (13)
- 软件应用 (39)
- 移动开发及应用 (4)
- UI设计 (2)
- 数据库 (23)
- 围棋 (1)
- 闲语茶楼 (6)
- 金融 (1)
- 其他 (3)
- Linux/Unix (38)
- 项目管理 (3)
- cmd (2)
- ssh (3)
- SVN (1)
- 移动开发 (1)
- HTML5 (1)
- jquery (1)
- redis (1)
- nginx (2)
- webservice (1)
- vmware (1)
- ssl (1)
- eclipse (1)
- sqlite (1)
- spring (2)
最新评论
-
cnhome:
Java 8 下:// 编码String asB64 = Ba ...
不要使用sun.misc.BASE64Encoder -
请叫我翠西狗:
那如果我要用this.getServletContext() ...
JSP/Servlet使用代理或路由器映射时获取服务器地址为内网地址 -
nomblouder:
按照别的博客,别名一直是p4merge,导致一直报错comma ...
win与linux下git配置p4merge为合并比较工具的方法 -
linuxzhang:
请问我按你的方法修改了sts-3.7.3.RELEASE中的o ...
Eclipse中setter/getter方法自动添加属性注释 -
yzh__:
求解答。。。
Struts2定义默认拦截器时需要注意
SpringMVC的@ResponseBody注解可以将请求方法返回的对象直接转换成JSON对象,但是当返回值是String的时候,中文会乱码
原因是因为其中字符串转换和对象转换用的是两个转换器,而String的转换器中固定了转换编码为"ISO-8859-1"
网上也很多种解决方法,有通过配置Bean编码的,也有自己重写转换器的,我这里多次尝试未果,只能自己解决。
有两种解决办法:
1.返回字符串时,将字符串结果转换
return new String("你好".getBytes(), "ISO-8859-1");
2.添加@RequestMapping注解,配置produces的值
@RequestMapping(value = "/add", produces = {"application/json;charset=UTF-8"})
由于我是为了使用JSONP协议,需要连同callback一起返回,所以我定义的是
@RequestMapping(value = "/add", params = {"callback"}, produces = {"text/javascript;charset=UTF-8"})
以上提供的方法虽然需要额外配置,但相对灵活,喜欢一次性永久搞定的,还是应该考虑网上的方法,修改源码,或者替换默认的字符串转换器。
但是在使用<mvc:annotation-driven />配置的前提下,貌似网上的方法都不可靠,可能跟版本或者配置有关系
这边提供一种修改方法,我这边使用的是3.1的mvc
1.参考网上将默认的StringHttpMessageConverter重写一遍,将其中的编码改为UTF-8
import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.List; import org.springframework.http.HttpInputMessage; import org.springframework.http.HttpOutputMessage; import org.springframework.http.MediaType; import org.springframework.http.converter.AbstractHttpMessageConverter; import org.springframework.util.FileCopyUtils; public class UTF8StringHttpMessageConverter extends AbstractHttpMessageConverter<String> { public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8"); private final List<Charset> availableCharsets; private boolean writeAcceptCharset = true; public UTF8StringHttpMessageConverter() { super(new MediaType("text", "plain", DEFAULT_CHARSET), MediaType.ALL); this.availableCharsets = new ArrayList<Charset>(Charset.availableCharsets().values()); } /** * Indicates whether the {@code Accept-Charset} should be written to any outgoing request. * <p>Default is {@code true}. */ public void setWriteAcceptCharset(boolean writeAcceptCharset) { this.writeAcceptCharset = writeAcceptCharset; } @Override public boolean supports(Class<?> clazz) { return String.class.equals(clazz); } @Override protected String readInternal(Class clazz, HttpInputMessage inputMessage) throws IOException { Charset charset = getContentTypeCharset(inputMessage.getHeaders().getContentType()); return FileCopyUtils.copyToString(new InputStreamReader(inputMessage.getBody(), charset)); } @Override protected Long getContentLength(String s, MediaType contentType) { Charset charset = getContentTypeCharset(contentType); try { return (long) s.getBytes(charset.name()).length; } catch (UnsupportedEncodingException ex) { // should not occur throw new InternalError(ex.getMessage()); } } @Override protected void writeInternal(String s, HttpOutputMessage outputMessage) throws IOException { if (writeAcceptCharset) { outputMessage.getHeaders().setAcceptCharset(getAcceptedCharsets()); } Charset charset = getContentTypeCharset(outputMessage.getHeaders().getContentType()); FileCopyUtils.copy(s, new OutputStreamWriter(outputMessage.getBody(), charset)); } /** * Return the list of supported {@link Charset}. * * <p>By default, returns {@link Charset#availableCharsets()}. Can be overridden in subclasses. * * @return the list of accepted charsets */ protected List<Charset> getAcceptedCharsets() { return this.availableCharsets; } private Charset getContentTypeCharset(MediaType contentType) { if (contentType != null && contentType.getCharSet() != null) { return contentType.getCharSet(); } else { return DEFAULT_CHARSET; } } }
2.context配置
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd"> <mvc:annotation-driven> <mvc:message-converters> <bean class="yourpackage.UTF8StringHttpMessageConverter" /> </mvc:message-converters> </mvc:annotation-driven> ...... </beans>
评论
5 楼
云端月影
2015-06-17
感谢
4 楼
欣水寓言
2014-04-21
tw_wangzhengquan 写道
这样就可以了
相信做spring框架的不会连这都想不到,还要你重写?
<mvc:annotation-driven> <mvc:message-converters> <bean class="org.springframework.http.converter.StringHttpMessageConverter" > <property name = "supportedMediaTypes"> <list> <value>text/plain;charset=UTF-8</value> </list> </property> </bean> <bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>applicaton/json;charset=UTF-8</value> </list> </property> </bean> </mvc:message-converters> <mvc:argument-resolvers> <!-- 处理pageable的实例化,避免出现无法实例化接口的问题,并使得能够使用PageableDefault注解提供默认初始值 --> <bean class="org.springframework.data.web.PageableArgumentResolver"></bean> </mvc:argument-resolvers> </mvc:annotation-driven>
相信做spring框架的不会连这都想不到,还要你重写?
你用的是什么版本的?spring3这样配置是没有用的,源码里面是写死了编码的,无法这么配置
3 楼
tw_wangzhengquan
2014-03-06
这样就可以了
相信做spring框架的不会连这都想不到,还要你重写?
<mvc:annotation-driven> <mvc:message-converters> <bean class="org.springframework.http.converter.StringHttpMessageConverter" > <property name = "supportedMediaTypes"> <list> <value>text/plain;charset=UTF-8</value> </list> </property> </bean> <bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>applicaton/json;charset=UTF-8</value> </list> </property> </bean> </mvc:message-converters> <mvc:argument-resolvers> <!-- 处理pageable的实例化,避免出现无法实例化接口的问题,并使得能够使用PageableDefault注解提供默认初始值 --> <bean class="org.springframework.data.web.PageableArgumentResolver"></bean> </mvc:argument-resolvers> </mvc:annotation-driven>
相信做spring框架的不会连这都想不到,还要你重写?
2 楼
欣水寓言
2012-07-05
yingzhor 写道
用<mvc:annotation-driven />配置的前提下,替换掉默认的字符转换期挺靠谱的呀。
默认你的spring-mvc.xml配置文件的schema版本过低?
默认你的spring-mvc.xml配置文件的schema版本过低?
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:c="http://www.springframework.org/schema/c" xmlns:util="http://www.springframework.org/schema/util" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd"> <mvc:annotation-driven conversion-service="conversion-service" validator="validator"> <mvc:message-converters> <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter" /> <bean class="org.springframework.http.converter.FormHttpMessageConverter" /> <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter" /> <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" /> <bean class="com.mycompany.UTF8StringHttpMessageConverter" /> </mvc:message-converters> </mvc:annotation-driven> </beans>
我参考了你的文章,改了下,现在能用了,但你的配置我用后会报错,我简化了下,已经可以用了,谢谢啦
1 楼
yingzhor
2012-07-05
用<mvc:annotation-driven />配置的前提下,替换掉默认的字符转换期挺靠谱的呀。
默认你的spring-mvc.xml配置文件的schema版本过低?
默认你的spring-mvc.xml配置文件的schema版本过低?
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:c="http://www.springframework.org/schema/c" xmlns:util="http://www.springframework.org/schema/util" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd"> <mvc:annotation-driven conversion-service="conversion-service" validator="validator"> <mvc:message-converters> <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter" /> <bean class="org.springframework.http.converter.FormHttpMessageConverter" /> <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter" /> <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" /> <bean class="com.mycompany.UTF8StringHttpMessageConverter" /> </mvc:message-converters> </mvc:annotation-driven> </beans>
发表评论
-
Maven使用mvn命令时跳过test的参数
2015-05-28 11:24 1729方法有两种: 方法1: mvn install -Dsk ... -
Spring中Propagation类的事务属性区别
2014-12-08 14:50 1939PROPAGATION_REQUIRED:支持当前事务,如果 ... -
Spring AOP中pointcut expression表达式解析
2014-08-27 15:39 3422Pointcut 是指那些方法需要被执行"AOP& ... -
用正则表达式替换手机号为星号*的写法
2014-08-11 15:43 10042现在网络越来越关注一些隐私,比如手机号隐藏当中的若干位数字 ... -
java使用相对路径连接sqlite
2014-08-01 15:48 6918在sqlite的连接源码中,可以看到 :resource: ... -
Eclipse中setter/getter方法自动添加属性注释
2014-08-01 12:11 16584这篇文章以前在公司内网发的,到现在也一直有用,发上来分享给有 ... -
memcached-session-manager配置
2014-07-09 18:01 954声明:本篇文章是根据memcach ... -
使用java原生url连接传输protobuf
2014-06-26 18:16 1463protobuf已经出来好多年了,原谅我最近才了解到goo ... -
Tomcat内存、连接数等性能参数设置
2014-02-20 14:37 17111、修改启动时内存参数、并指定JVM时区 (在windows ... -
使用JSP列出所有运行中的线程
2013-07-29 10:06 1044<html> <head> &l ... -
JVM系列五:JVM监测&工具[整理中]
2013-05-10 10:34 1130前几篇篇文章介绍了介绍了JVM的参数设置并给 ... -
JVM系列四:生产环境参数实例及分析【生产环境实例增加中】
2013-05-10 10:32 1255java application项目(非web项目) 改进 ... -
JVM系列三:JVM参数设置、分析
2013-05-10 10:30 1021不管是YGC还是Full GC,GC过程中都 ... -
JVM系列二:GC策略&内存申请、对象衰老
2013-05-10 10:19 1032JVM里的GC(Garbage Collec ... -
JVM系列一:JVM内存组成及分配
2013-05-10 10:14 1094java内存组成介绍:堆(Heap)和非堆(Non-h ... -
jenkins配置权限不对导致无法登陆的重置方法
2013-04-20 20:43 25387找到.jenkins/config.xml文件: 替换为: ... -
Spring3中替换默认拦截器的方法BeanFactoryPostProcessor
2012-08-14 16:51 4053由于Spring默认的静态资源处理器不能满足需求,需要做一些自 ... -
Hessian 权限认证
2012-08-07 11:23 1524Hessian 权限认证 Hessian的一些基本简介已经在上 ... -
利用java 6.0的脚本引擎执行字符串表达式运算
2012-08-06 23:09 1451例子都在这里了:http://www.java2s.com/C ... -
在spring、tomcat中使用多数据源并支持分布式事务管理
2012-08-06 22:10 2625原文:http://zxlaiye.iteye.c ...
相关推荐
本文将详细介绍如何解决SpringMVC中`@ResponseBody`注解返回中文乱码的问题。 首先,我们可以尝试使用`@RequestMapping`注解的`produces`属性来指定响应内容的MIME类型和字符集。例如: ```java @RequestMapping...
然而,在使用SpringMVC时,可能会遇到乱码问题,例如在使用@ResponseBody注解时返回的数据出现乱码。在本文中,我们将讨论解决SpringMVC乱码问题的两种方法。 方法一:配置AnnotationMethodHandlerAdapter 在...
在Spring MVC中,开发Web应用时,经常需要处理XML和JSON这两种常见...避免一些错误尝试,如直接返回XML字符串或未序列化的对象,这可能会导致乱码或解析问题。通过合理的配置和优化,可以提高数据交换的效率和正确性。
具体问题出现在使用了SpringMVC框架的开发场景中,在Controller层使用了@ResponseBody注解来直接返回JSON数据。该注解使得Spring MVC框架会将返回的对象自动转换为JSON格式的字符串。然而,默认情况下,Spring框架...
当涉及到非英文字符,如中文,时,字符编码问题可能会导致乱码。这是因为Spring MVC默认使用ISO-8859-1字符集,而中文字符不在这个字符集中。 在处理字符编码问题时,有几种常见的解决方案: 1. **不使用`@...
- `${}`:字符串替换,可能存在SQL注入风险。 **问题七:当实体类中的属性名和表中的字段名不一样,怎么办?** - 使用`<resultMap>`标签进行映射。 **问题八:模糊查询like语句该怎么写?** - 使用`<if>`标签条件...
3. 文件上传:SpringMVC 支持传统方式和跨服务器方式的文件上传,需要配置 Filter 解决中文乱码问题,并考虑 Tomcat 对某些操作的限制。 4. 异常处理:通过 @ExceptionHandler 注解定义全局异常处理器,实现统一的...
- **重定向**:在控制器方法中返回一个字符串"redirect:/url"。 - **转发**:返回一个视图名称,SpringMVC会自动进行转发处理。 ##### 3.3 SpringMVC怎么和AJAX相互调用的? SpringMVC支持通过AJAX进行异步请求处理...
当返回的字符串包含中文字符时,可能会出现乱码问题。为了解决这个问题,我们有两种解决方案: 1. 修改`@RequestMapping`注解,指定响应的字符集,如上面`Ajax1`方法所示。 2. 在Spring MVC配置中,通过`...
如何解决POST请求中文乱码问题,GET的又如何处理呢? - 对于POST请求,可以在web.xml中配置字符编码过滤器,确保所有请求都使用统一的字符编码: ```xml <filter-name>characterEncodingFilter <filter-class>...
// 如果此方法直接返回String对象,会出现中文乱码问题。 Map, String> result = new HashMap(); String detext = ""; try { detext = new String(Base64.getUrlDecoder().decode(textcomment), CHARSET); } ...