chengbinbbs 2010-07-02
配置好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默认就是按系统本地编码来做的.
外国佬本来是想把它做成兼容双字节的, 可惜估计他们自己也没去测试, 或者根本不知道怎么输入汉字来测试,结果反而不能很好地支持汉字. 我这一改, 省事了