velocity模板乱码的问题

velocity出现乱码总结:

      一.首先要确保开发工具(如eclipse),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" 。

如果开发环境编码一致,却依然乱码,请继续往下看。

二.找到项目中使用的velocity jar包中velocity-1.5.jar\org\apache\velocity\runtime\defaults下面的velocity.properties文件,修改如下:

 将input.encoding和output.encoding默认的编码ISO-8859-1改为UTF-8,保存即可。

希望到此大家的问题都已解决。

 

猜你喜欢

转载自201207163953.iteye.com/blog/2155070