首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

velocity中文乱码终极解决方案[转]

2012-08-31 
velocity中文乱码最终解决方案[转]前言:最近在用velocity开发个东西,但其vm页面的输出总是会乱码,在网上找

velocity中文乱码最终解决方案[转]
前言:最近在用velocity开发个东西,但其vm页面的输出总是会乱码,在网上找了很多资料,还是不能解决,最终在一篇网上的文章的启发下,http://www.iteye.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" 。

热点排行