- 浏览: 1042502 次
- 性别:
- 来自: 南京
文章分类
- 全部博客 (501)
- dwr (6)
- javascript (84)
- oracle (66)
- jsp/servlet (18)
- ant (3)
- 基础知识 (12)
- EXT (10)
- My SQL (10)
- java (71)
- spring (37)
- 学习的对象 (2)
- Linux (24)
- 面试 (1)
- HTML/CSS (11)
- tomcat (11)
- 收藏夹 (2)
- Power Designer (2)
- struts.xml配置文件 (1)
- sturts2 (3)
- myeclipse (8)
- eclipse (7)
- Maven (34)
- SVN (3)
- SAP JCO (2)
- JBOSS (11)
- webservice (8)
- word (1)
- 敏捷开发 (1)
- sybase (4)
- Nexus (3)
- EhCache (3)
- log4j (3)
- Cookie (4)
- Session (4)
- CXF (7)
- AXIS (2)
- SSO (1)
- LDAP (1)
- velocity (2)
- Jquery (5)
- redis (2)
- http (4)
- dojo (1)
- Linux资源监控软件mnon的安装与运用 (1)
- notepad++ (1)
- EA (1)
- UML (1)
- JasperReports (1)
- 权限 (0)
- freemarker (4)
- Spring MVC (1)
- JMS (1)
- activeMQ (1)
- hession (3)
- 安全 (1)
- ibatis (2)
- log (1)
- nginx (1)
最新评论
-
winhbb:
我刚好遇到了一个问题(在可以依赖注入的场合有效):有两个模块A ...
解决Maven项目相互依赖/循环依赖/双向依赖的问题 -
nanjiwubing123:
long3ok 写道你好 XmlOutputFormatter ...
用XStream转换复杂XML -
zhoujianboy:
另外一个方法实现eclipse tomcat 热部署:http ...
eclipse下实现maven项目在tomcat容器热部署方法 -
long3ok:
你好 XmlOutputFormatter 请问这个类是在什么 ...
用XStream转换复杂XML -
ganbo:
总结的好,文章给力。
解决Maven项目相互依赖/循环依赖/双向依赖的问题
Spring3.0 MVC @ResponseBody 的作用是把返回值直接写到HTTP response body里。
Spring使用AnnotationMethodHandlerAdapter的handleResponseBody方 法, AnnotationMethodHandlerAdapter使用request header中"Accept"的值和messageConverter支持的MediaType进行匹配,然后会用"Accept"的第一个值写入 response的"Content-Type"。
一般的请求都是通过浏览器进行的,request header中"Accept"的值由浏览器生成。
有人跟踪@ResponseBody 的实现类发现其默认的编码是 iso-8859-1 ,
解决办法,在spring mvc的配置文件中手工配置bean:
<!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->
这样通过配置AnnotationMethodHandlerAdapter 类messageConverters 属性来指定编码。
记住,需要把bean部分加入到<context:component-scan base-package="com.zlscw.mvc" />前面,
这样就可以在jquery中直接调用而不出现乱码了。
-------------------------------------------这篇文章说的很到位
近日用Spring3的MVC写东西,深感其之于Webwork/Struts2的便利,但是在通过@ResponseBody这个 annotation输出一个json字符串的时候,发现页面上获得的json字符串中文字符出现了乱码的现象。通过firefox观察返回的字符串,中 文部分全部变成了???????的形式,初步判定是返回时,spring处理@ResponseBody使用了错误的编码。
因为我在web.xml中已经配置了Spring的CharacterEncodingFilter,并且强制将request和response的编码都指定为utf-8,所以出现乱码的原因肯定是在Spring内部某处的逻辑了。
把log4j中关于spring的输出级别调为debug,通过访问出问题的地址,发现Spring在处理@ResponseBody这个 annotation的时 候,org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter 使用了org.springframework.http.converter.StringHttpMessageConverter进行处理,于是打 开了Spring的源码,看看这个类究竟做了哪些事情。
不看不要紧,一看吓一跳,里面竟然是这样定义其默认编码的:
1 public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1" );
顿时心生N种不爽:堂堂Spring,竟然还在其中用西欧字符集作为其默认编码,坑爹啊!(很多spring的类中,涉及编码的已经都是utf-8 了,比如负责JSON视图的MappingJacksonHttpMessageConverter,就是默认使用UTF-8)。本来想直接修改 spring的源码重新打包一个jar出来,后来看spring的java doc发现,其父类org.springframework.http.converter.AbstractHttpMessageConverter 中的getDefaultContentType方法是可以重写的:
By default, this returns the first element of the supportedMediaTypes property, if any. Can be overridden in subclasses.
心想这下就简单了,你的DEFAULT_CHARSET不是final么?那我自己继承一个出来,按照我的需求定义为utf-8不就得了?代码如下:
01
然后,在spring的配置文件中添加如下bean声明,用自己写的类替换掉原有的StringHttpMessageConverter:
1
再看通过@ResponseBody返回的json字符串,终于中文都可以正常显示了。
-------------------------------------------下面有一些解释
但我们一般会在标注@ResponseBody的方法上返回String或byte[]类型的结果,期望的"Content-Type"的值应为"text/plain"或"application/octet-stream"。
这样导致了浏览器不能正确处理返回的内容。
实际上Spring在用HttpMessageConverter处理的过程中首先会判断response header中有没有写入"Content-Type",如果没有写入的话才会使用request header中"Accept"的第一个值。
但是由于Spring对HttpServletResponse进行了封装,实际上使用的是ServletServerHttpResponse,这个类有一个对真正的HttpServletResponse的引用。
判断response header的过程中使用的是ServletServerHttpResponse的getHeaders()方法,但该方法并没有返回真正的HttpServletResponse中的header。(这应该有问题吧?)
所以我们虽然可以在Controller的方法中加入对HttpServletResponse的引用,然后设置"Content-Type"的值,但是并不会起作用。
来处理@ResponseBody,该类再使用一些HttpMessageConverter来具体处理信息。
Chrome生成的值为application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
IE8 生成的值为application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
所以最后写入response中"Content-Type"的值为"application/xml"或"application/x-ms-application"。
-------------------------------------------------其实这个注解完全可以不用, 直接使用response往输出流里面写。
Spring使用AnnotationMethodHandlerAdapter的handleResponseBody方 法, AnnotationMethodHandlerAdapter使用request header中"Accept"的值和messageConverter支持的MediaType进行匹配,然后会用"Accept"的第一个值写入 response的"Content-Type"。
一般的请求都是通过浏览器进行的,request header中"Accept"的值由浏览器生成。
有人跟踪@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中直接调用而不出现乱码了。
-------------------------------------------这篇文章说的很到位
近日用Spring3的MVC写东西,深感其之于Webwork/Struts2的便利,但是在通过@ResponseBody这个 annotation输出一个json字符串的时候,发现页面上获得的json字符串中文字符出现了乱码的现象。通过firefox观察返回的字符串,中 文部分全部变成了???????的形式,初步判定是返回时,spring处理@ResponseBody使用了错误的编码。
因为我在web.xml中已经配置了Spring的CharacterEncodingFilter,并且强制将request和response的编码都指定为utf-8,所以出现乱码的原因肯定是在Spring内部某处的逻辑了。
把log4j中关于spring的输出级别调为debug,通过访问出问题的地址,发现Spring在处理@ResponseBody这个 annotation的时 候,org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter 使用了org.springframework.http.converter.StringHttpMessageConverter进行处理,于是打 开了Spring的源码,看看这个类究竟做了哪些事情。
不看不要紧,一看吓一跳,里面竟然是这样定义其默认编码的:
1 public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1" );
顿时心生N种不爽:堂堂Spring,竟然还在其中用西欧字符集作为其默认编码,坑爹啊!(很多spring的类中,涉及编码的已经都是utf-8 了,比如负责JSON视图的MappingJacksonHttpMessageConverter,就是默认使用UTF-8)。本来想直接修改 spring的源码重新打包一个jar出来,后来看spring的java doc发现,其父类org.springframework.http.converter.AbstractHttpMessageConverter 中的getDefaultContentType方法是可以重写的:
By default, this returns the first element of the supportedMediaTypes property, if any. Can be overridden in subclasses.
心想这下就简单了,你的DEFAULT_CHARSET不是final么?那我自己继承一个出来,按照我的需求定义为utf-8不就得了?代码如下:
01
public class UTF8StringHttpMessageConverter extends StringHttpMessageConverter { 02 03 private static final MediaType utf8 = new MediaType("text" , "plain" , 04 Charset.forName("UTF-8" )); 05 private boolean writeAcceptCharset = true ; 06 07 @Override 08 protected MediaType getDefaultContentType(String dumy) { 09 return utf8; 10 } 11 12 protected List<Charset> getAcceptedCharsets() { 13 return Arrays.asList(utf8.getCharSet()); 14 } 15 16 protected void writeInternal(String s, HttpOutputMessage outputMessage) 17 throws IOException { 18 if (this .writeAcceptCharset) { 19 outputMessage.getHeaders().setAcceptCharset(getAcceptedCharsets()); 20 } 21 Charset charset = utf8.getCharSet(); 22 FileCopyUtils.copy(s, new OutputStreamWriter(outputMessage.getBody(), 23 charset)); 24 } 25 26 public boolean isWriteAcceptCharset() { 27 return writeAcceptCharset; 28 } 29 30 public void setWriteAcceptCharset(boolean writeAcceptCharset) { 31 this .writeAcceptCharset = writeAcceptCharset; 32 } 33 34 }
然后,在spring的配置文件中添加如下bean声明,用自己写的类替换掉原有的StringHttpMessageConverter:
1
<bean class ="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" > 2 <property name ="messageConverters" > 3 <list > 4 <bean id ="utf8StringHttpMessageConverter" class ="xxx.xxx.UTF8StringHttpMessageConverter" /> 5 </list > 6 </property > 7 </bean >
再看通过@ResponseBody返回的json字符串,终于中文都可以正常显示了。
-------------------------------------------下面有一些解释
但我们一般会在标注@ResponseBody的方法上返回String或byte[]类型的结果,期望的"Content-Type"的值应为"text/plain"或"application/octet-stream"。
这样导致了浏览器不能正确处理返回的内容。
实际上Spring在用HttpMessageConverter处理的过程中首先会判断response header中有没有写入"Content-Type",如果没有写入的话才会使用request header中"Accept"的第一个值。
但是由于Spring对HttpServletResponse进行了封装,实际上使用的是ServletServerHttpResponse,这个类有一个对真正的HttpServletResponse的引用。
判断response header的过程中使用的是ServletServerHttpResponse的getHeaders()方法,但该方法并没有返回真正的HttpServletResponse中的header。(这应该有问题吧?)
所以我们虽然可以在Controller的方法中加入对HttpServletResponse的引用,然后设置"Content-Type"的值,但是并不会起作用。
来处理@ResponseBody,该类再使用一些HttpMessageConverter来具体处理信息。
Chrome生成的值为application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
IE8 生成的值为application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
所以最后写入response中"Content-Type"的值为"application/xml"或"application/x-ms-application"。
-------------------------------------------------其实这个注解完全可以不用, 直接使用response往输出流里面写。
使用jQuery ajax调用的返回json,中文乱码问题 Jquery : $.ajax({ url: '/test/testAction.do?method=test', type: 'POST', dataType: 'json', timeout: 5000, async: false, error: function(){ alert('获取数据失败!'); }, success: function(json){ jsObject = eval(json); } }); return jsObject; JSONArray json = JSONArray.fromObject(SysList);//SysList是一个List // 设置response的ContentType解决中文乱码 response.setContentType("text/html;charset=UTF-8"); response.getWriter().print(json.toString()); return null;
发表评论
-
Spring MVC 3.1新特性 生产者、消费者请求限定
2015-06-15 07:42 675参考地址: http://www.iteye.com/to ... -
CSRF TOKEN
2015-02-14 18:02 1111package com.uncle5.pubrub.web.c ... -
Spring MVC Controller单例陷阱
2014-06-27 08:51 645Spring MVC Controller默认是 ... -
[Spring] Hessian权限认证,加密前面
2014-03-06 09:52 1573Hessian的一些基本简介已经在上一节已经全部介绍了,上一节 ... -
FieldRetrievingFactoryBean 和 MethodInvokingFactoryBean
2014-01-09 18:36 986spring提供了filed的值注入和method的返回值注入 ... -
Spring中ApplicationContext的事件机制(二 内定事件)
2014-01-09 11:08 12288在Spring中已经定义了五个标准事件,分别介绍如下: 1) ... -
当spring 容器初始化完成后执行某个方法 .
2014-01-08 17:40 1403在某些应用中,我们希望,当spring 容器将所有的bea ... -
spring学习之springMVC 返回类型选择 以及 SpringMVC中model,modelMap.request,session取值顺序
2013-09-12 10:43 1174spring mvc处理方法支持如下的返回方式:ModelA ... -
JSR-303
2013-09-12 00:22 897JSR-303 是JAVA EE 6 中的一项子规范,叫做Be ... -
EHCACHE分布式缓存
2013-09-06 17:26 1274从1.2版本开始,Ehcache可 ... -
springMVC+freemarker整合
2013-09-06 16:39 1389springMVC整合大家都比较熟悉了吧主要有以下几个步骤: ... -
Spring MVC 学习笔记 Viewresol和View
2013-09-06 15:34 897Spring MVC使用ViewResolver来根据cont ... -
Spring的PropertyPlaceholderConfigurer应用
2013-09-06 15:04 3178Spring 利用PropertyPlaceholderCon ... -
SpringSecurity3_Logout
2013-08-22 16:07 2543Logout¶•退出登录的链接 <a href=&quo ... -
spring的default-lazy-init参数 .
2013-04-23 20:08 952spring在启动的时候,会默认加载会默认加载整个对象实例图, ... -
Spring MVC 如何防止XSS、SQL注入攻击
2013-04-16 15:40 1640在Web项目中,通常需要处理XSS,SQL注入攻击,解决这个问 ... -
Spring JMS
2013-01-08 10:48 923http://blog.csdn.net/shiqiang12 ... -
给spring jdbctemplate加上一层“绮丽外衣”-动态SQL&&SQL语句以文件存放
2013-01-07 16:00 3276给spring jdbctemplate加上一层“华丽外衣”- ... -
使用Spring的NamedParameterJdbcTemplate完成DAO操作 .
2013-01-07 14:54 1145NamedParameterJdbcTemplate内部包含了 ... -
cron表达式(quartz中时间表达式)
2012-12-20 15:54 916http://sosuny.iteye.com/blog/46 ...
相关推荐
SpringMVC使用@ResponseBody.rar
--处理 @ResponseBody 中文乱码问题 --> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="messageConverters"> <list> <!-- Support...
Spring MVC下彻底解决@ResponseBody转义html特殊字符问题,解决包括尖角号(),单引号('),双引号("),按位与(&),反斜杠(\)。
主要介绍了Springmvc 4.x利用@ResponseBody返回Json数据的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
springmvc接收ajax请求注意事项
主要介绍了SpringMVC中解决@ResponseBody注解返回中文乱码问题, 小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
NULL 博文链接:https://bijian1013.iteye.com/blog/2310240
springmvc关于@requestMapping和@requestParam的使用,详细代码,独立可用无需修改。
springmvc+国际化i18N+springmvc验证+jetbrick-template使用+@responsebody+谷歌guava: 1)围绕springmvc做的国际化 2)围绕springmvc做的验证 3)使用的jetbrick-template模板引擎 ……
NULL 博文链接:https://bijian1013.iteye.com/blog/2310236
springmvc之@RequestMapping的简单demo
本篇文章主要介绍了SpringMVC使用@Valid注解进行数据验证的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
使用Ajax从页面向控制层请求数据,并将提交的数据再次返回,国外网站下载代码,很有参考意义。请使用Eclipse工具
springMVC返回json数据需要的两个架包,加入springMVC使用@ResponseBody才不会报错。
一个实用了spring mvc和ajax异步请求的例子
本篇文章主要介绍了详解SpringMVC注解@initbinder解决类型转换问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
SpringMVC(八)处理AJAX请求
如果传输的是多层嵌套json对象,这个时候会就会出现数据丢失问题 @ResponseBody很好的解决了这个问题,它会把前台传输过来的json转化为后台对应的对象
本篇文章主要介绍了springMvc注解之@ResponseBody和@RequestBody详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
1)spring MVC 中@ResponseBody需要的所有JAR包 2)性能还不错的模板引擎jetbrick-template-2.x 2.x的所需的所有jar包 3)日志jar包:slf4j和logback 所有 4)阿里 druid 连接池jar包 5)mysql数据库链接驱动jar包 6...