Leo's Blog

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  13 随笔 :: 3 文章 :: 18 评论 :: 0 Trackbacks

昨天在整合Spring MVC和Velocity,Sitemesh时,又碰到了久违的中文问题。唉,JSP, mysql, struts,每次都会碰到这样的问题,总是以为这种以后不会碰到这种看似初级的问题了,结果还是躲不过。网上没查到相关资料,于是开始动手跟踪Spring和Velocity的源码,弄了一天终于搞定。后来一个同学告诉我这个问题在Spring中文论坛里有精华贴,跟我最后的解决方案一样的,气死我也。不过跟踪Spring的源代码收获还是不错的,现在又对Spring的MVC framework有了更深的认识。这里把以前碰到的中文问题大概列一下,方便以后参考。

1、JSP页面显示的中文问题
这是最初级的东西,网上到处都有,不过还是列一下吧:
Page的第一行改成:<%@ page contentType="text/html; charset=gb2312" %>
Head里加:
2、页面Form 内容提交的中文问题
在web.xml里加入:

CharacterEncodingFilter
Character Encoding Filter
no description
org.springframework.web.filter.CharacterEncodingFilter

encoding
GB2312


forceEncoding
true



CharacterEncodingFilter
/*

呵呵,这是个简单得要命的filter,如果不用Spring的话,完全可以自己写一个。其实任何的interceptor机制都可以处理这个的,不管用Webwork还是Spring的interceptor,甚至用AOP,只要在取参数前加那么一句:request.setCharacterEncoding("GB2312");就行了。以前我用struts就是在它的RequestProcessor的populate之前加了这么一行。
3、request 的parameter里要传中文参数的问题
这个问题跟Web Container有关系,记得以前我同学用WebLogic时好象没出现这样的问题。(我一般不传中文参数,呵呵)。
Tomcat里的解决方案是在server.xml里Connector port="8080"的attribute里加URIEncoding="GB2312"
当然还有最土的解决方案,虽然不太会用到,不过还是列出来,以备最无奈的时候使用:
String encodeStr=new String(fieldValue.getBytes("8859_1"), "gb2312");
4、mysql的中文问题
首先要修改mysql配置文件的encoding为GB2312,这部分的操作不记得了,毕竟好久没用mysql了。不过据说新版的mysql里有wizard可以设的。然后把jdbc connection改成如下:
jdbc:mysql://localhost:3306/bsfbookstore?useUnicode=true;characterEncoding=GB2312
另外在写程序成尽量用PrepareStatement,少用Statement,好象jdbc驱动在解析statement里的SQL包含中文时会有问题。(用PrepareStatement也是好习惯, hibernate里全用PrepareStatement的,哈哈)
5、Spring与Veclocity结合的中文问题
第一步:
在"velocityConfig"里配置velocity.propeties文件,加下面一行:
/WEB-INF/velocity.properties
呵呵,也可以在config里直接用Map把参数写进去,这样就不用properties文件,这个Spring的文档里都有。
然后在velocity.properties里写:
input.encoding=GB2312
output.encoding=GB2312
default.contentType=text/html; charset=GB2312(ms这一行没有用处,Spring有个地方读进这个参数,不过后来又覆盖掉了)
第二步:
接下来就是我昨天调了半天的那个地方,最后的解决方案很简单,在viewResolver配置里加一行:
text/html; charset=GB2312
呵呵,就这么一行害我debug了好久,跟踪了Velocity的Context设置,甚至改了Spring的源码,用了Filter,Spring的Handler interceptor来设置reponse的contentType就是没效果,结果发现Spring在Velocity View的render里加了这么一行:
response.setContentType(getContentType());
呵呵,原先设好的contentType都被冲掉了,因为render的时机是在postHandler之后,呵呵。
这个参数对jsp是没有用的,因为jsp会根据自己页面的contentType设定的,所以每个JSP必须设置自己的contentType,Velocity就不用啦。难怪以前用JSP的时候没碰到这个问题。

posted on 2005-09-14 10:37 Leo 阅读(1076) 评论(3)  编辑  收藏 所属分类: 技术随文

评论

# re: Spring MVC与Veclocity结合中文问题及常用中文问题总结 2005-12-03 14:02 csand
thx  回复  更多评论
  

# re: Spring MVC与Veclocity结合中文问题及常用中文问题总结 2005-12-14 22:03 rlj
该方案不完整,非终极解决方案  回复  更多评论
  

# re: Spring MVC与Veclocity结合中文问题及常用中文问题总结 2006-01-07 11:56 nickey's home
为什么那么喜欢gb2312? getTemplate的时候用getTemplate(xxx,"utf-8")加载模版不行吗?  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: