最近使用groovy寫了一個程序生成器,因為公司原來的生成程序太原始了,直接是JSP調我們自已的業務中間件的,新生成后的程序采用了spring的框架,用到的技術主要是groovy+Template,寫的過程中也碰到了一些問題,解決后希望與大家共享.具體關于如何使用groovy以及用groovy進行模板編程,請查看IBM上的實戰groovy系列的文章.
1.在模板文件中是不能使用閉包的,使用后可能會造成分析器的混亂.
2.正則表達式用法之大小寫.
一般我們使用java時都這么寫
Pattern?pattern?
=
?Pattern.compile(
????????????
"
Y\\s*E\\s*C\\s*X\\s*
"
,?Pattern.CASE_INSENSITIVE);
以第二參數來指明不區分大小寫,在使用groovy我發現,這招不靈了,因為在groovy中正則表達式是在語言中的
def pattern = ~/(?i)(.*)/這樣就得到了一個pattern,如果要指定不區分大小寫,與perl,ruby語言有些不同,查jdk官方方檔得知,如上代碼加(?i)就OK了.
注意:在groovy中可以這樣寫
def
?matcher
=
?
"
string
"
?
=~
?pattern
此時的pattern為串,而不能是正則表達式.
3.java中的匿名類與groovy中的閉包
生成程序難免要碰到與目錄相關的操作程序,一般在java中文件過濾都這么寫
String?regex?
=
?
"
.*查詢.*\\.ini
"
;
????????
final
?Pattern?pattern2?
=
?Pattern.compile(regex,Pattern.CASE_INSENSITIVE);????
????????
????????File?path?
=
?
new
?File(
"
C:\\mydir
"
);

????????String[]?list?
=
?path.list(
new
?FilenameFilter()?
{

????????????
public
?
boolean
?accept(File?dir,?String?name)?
{
????????????????
return
?pattern2.matcher(
new
?File(name).getName()).matches();
????????????}
????????}
?);
查遍所有groovy文檔發現并沒有直接使用閉包來完成以上程序,在groovy中用閉包代替內部類的只能用在swing類中那些listener的接口,具體細節查看官方文檔.http://groovy.codehaus.org/Groovy+Beans
要用groovy來完成上面的程序有兩種方法,第一就是用java完成后,提供給groovy來調用,第二下直接用groovy實現,其實很簡單,代碼如下:
def
?filter(
def
?filelist){
?????????
def
?col
=
[]
????????filelist.each{
????????????
if
(it
=~
"
.*\\.ini
"
)
????????????????col
<<
it
????????}
????????
return
?col
????}

def
?filterfile(
def
?filedir,
def
?fileName){
????????
def
?ffile?
=
?new?File(filedir,fileName)
????????????????
def
?fileNames?
=
?filter(ffile.list())
????????
if
((?fileName?
=~
'
\\d{3}
'
).matches())
????????????fileName?
=
?
"
I${fileName}
"
????????createSrc(fileNames,ffile,fileName)
????}
主要由兩個函數完成,第一個過濾,第二個匹配.