您的位置:首页 > 其它

velocity中文乱码最终解决方案

2012-05-25 16:47 190 查看
前言:最近在用velocity开发个东西,但其vm页面的输出总是会乱码,在网上找了很多资料,还是不能解决,最终在一篇网上的文章的启发下,http://www.javaeye.com/post/540300,终于搞定了这个问题。

好,废话少说,下面是解决办法。

在这里,我的配置是全部采用GBK这种编码,若要采用其他编码,是同理的。我的开发环境是windows XP,MYEclipse6.0,MyEclipse自带的Tomcat,MySql数据库,项目用到 的技术是Velocity+servlet+javaBean。

1.首先要确保开发工具(如MyEclipse),WEB服务器(如Tomcat),数据库 (如 MySql)采用的是同一种编码。

1.1 MyElcipse的配置:

对着工程项目按右键,点属性-->资源,在text file encoding里选GBK。

1.2 MyEclipse自带的Tomcat的配置:

强烈建议先装一个Apache Tomcat6.0,再把安装目录下的conf文件夹复制,放到MYEclipse的工程文件里的.data下的.plugins下的 com.genuitec.eclipse.easie.tomcat.myeclipse下的tomcat,把Tomca下的conf覆盖掉。

注:这是解决MyEclipse自带的Tomcat乱码问题最有效的解决办法。

然后修改conf文件下的server.xml文件,在server.xml里的

<Connector port="8080" .... />字段后

增加对GET方法获取数据时的编码设置参数 URIEncoding="GBK"

增加对Post方法获取数据时的编码设置参数 useBodyEncodingForURI="true" 即<Connector port="8080" ... URIEncoding="GBK" useBodyEncodingForURI="true"/>

若是用Apache Tomcat去运行Web程序,同理也是像上面一样修改。

1.3 修改MySql的编码:

建议下一个MySql Gui工具,打开MySql adminstrator ,在startup variables

项里的advanced下的Def.char Set里写进GBk。

2.设置velocity的编码设置

2.1 这里有两种方法,网上的文章一般是讲这些。

方法一:修改Veloicity.properties配置文件,加入以下信息

input.encoding=GBK

output.encoding=GBk

方法二:写到这里,顺便把velocity经常找不到vm文件的解决方法也加进去了

在关键servelt类里定义一个私有对象

private VelocityEngine velo; //velocity引擎对象

再在servelt类里的init()方法里加入以下语句去加入一些属性设置

velo = new VelocityEngine();

//设置vm模板的装载路径

Properties prop = new Properties();

String path = this.getServletContext().getRealPath("/");

//"template/" 是指定你的vm文件放在WEBROOT下的template,根据

// 你工程的vm文件位置的不同而作相应的变化

prop.setProperty(Velocity.FILE_RESOURCE_LOADER_PATH, path + "template/");

//设置velocity的编码

prop.setProperty(Velocity.ENCODING_DEFAULT, "GBK");

prop.setProperty(Velocity.INPUT_ENCODING, "GBK");

prop.setProperty(Velocity.OUTPUT_ENCODING, "GBK");

try {

//初始化设置,下面用到getTemplate("*.vm")输出时

//一定要调用velo对象去做,即velo.getTemplate("*.vm")

velo.init(prop);

} catch (Exception e1) {

e1.printStackTrace();

}

2.2 接着,就是整个问题解决的关键之处了,在doGet()和doPost()方法的最初加入两条语句

request.setCharacterEncoding("GBK");

response.setContentType("text/html;charset=GBK");

为什么要加入这两句呢?因为Velocity源码中根本就没这两个参数,加入以后,无论是请求或回应,都会按GBK的编码去传递了。

3.当然,在所有的vm文件和JSP文件里也要加入 pageEncoding="GBK" 。

文章出处:飞诺网(www.diybl.com):http://www.diybl.com/course/3_program/java/javajs/200897/139882.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: