groovy:groovyservlet 乱码问题,解决

配置好groovyservlet就可以开始用groovy脚本写网站程序了. 真的很方便,边写边调试, 性能也挺好, 比PHP强多了. 不足的就是 java比较消耗内存.

可是有一个问题不爽,好在我已经解决了:

groovy脚本里写了中文, 就会出现乱码.(容器是Tomcat 6.1.6)

如果把文件保存为UTF-8不代BOT 貌似有时可以正常;

如果把文件保存为UTF-8带BOT,直接就不能运行了;

如果把文件保存为GBK,首次访问时会乱码, 修改一次后被scriptEngine发现后, 居然就不乱码了!

(另外,如果把容器换成resin 4, UTF-8带BOT是可以正常运行的,看来问题与tomcat还是有些关系;不过 ,resin不熟悉 ,貌似必须安装成系统服务,而且控制台也不知道在哪里)

几经调试, 我已经解决了这个问题:

修改这个文件

D:\repo\groovy\groovy-1.7.2\src\main\groovy\util\GroovyScriptEngine.java

(D:\repo\groovy\groovy-1.7.2是groovy 1.7.2的源代码)

的如下部分:

public Class loadScriptByName(String scriptName) throws ResourceException, ScriptException {
		URLConnection conn = rc.getResourceConnection(scriptName);
        String path = conn.getURL().getPath();
        ScriptCacheEntry entry = scriptCache.get(path);
        Class clazz = null;
        if (entry!=null) clazz=entry.scriptClass;
        if (isSourceNewer(entry)) {
            try {
                String encoding = conn.getContentEncoding() != null ? conn.getContentEncoding() : "UTF-8";
                //clazz = groovyLoader.parseClass(DefaultGroovyMethods.getText(conn.getInputStream(), encoding), conn.getURL().getPath());
				clazz = groovyLoader.parseClass(DefaultGroovyMethods.getText(conn.getInputStream()), conn.getURL().getPath());
				System.out.println(String.format("GroovyScriptEngine:(%s)脚本有更新,重新装载...",scriptName));
            } catch (IOException e) {
                throw new ResourceException(e);
            }
        }
        return clazz;
    }

System.out.println(String.format("GroovyScriptEngine:(%s)脚本有更新,重新装载...",scriptName)); 

这一行,是我加进去的,起个调试的作用.

上一行就是修改过的;

再上一行就是原来的.

很简单,就是把encoding参数去掉就行了. 因为getText默认就是按系统本地编码来做的.

外国佬本来是想把它做成兼容双字节的, 可惜估计他们自己也没去测试, 或者根本不知道怎么输入汉字来测试,结果反而不能很好地支持汉字. 我这一改, 省事了

相关推荐