最近使用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)
}
主要由两个函数完成,第一个过滤,第二个匹配.