代码生成器,想想看
搞web服务器端的被三层害死了,整天调来调去的,写的一样的代码,什么时候才能简单点。
从前有codesmith的日子,很和谐, 很幸福,选个数据源,点个执行,刷的代码就出来了,爽歪歪啊。
codesmith支持.net,用的c#语法,能导出cs文件,靠,什么时候能导下java文件,不过总算能导出txt文件,弥补下。
最重要的是要等crack……
自从公司无聊的奶茶项目完结了,还没写过什么东西,不想搞虚的,什么web网站,什么blog,太飘渺,网上一大把。
还是写个代码生成器实用。
于是,收集资料,看了freemaker的代码,我被NPE深深地打败了,要是少初始化个变量,日志直接打爆。
还是回归我比较熟悉的velocity,看了下源码,首先想到的是把template作为切入点,如果template能直接取到绝对路径的话,那么就不用考虑很多的文件读取方式了。
看了下代码:
protected Resource loadResource(String resourceName, int resourceType, String encoding)
throws ResourceNotFoundException,
ParseErrorException,
Exception
{
Resource resource = createResource(resourceName, resourceType);
resource.setRuntimeServices(rsvc);
resource.setName(resourceName);
resource.setEncoding(encoding);
//…………
for (Iterator it = resourceLoaders.iterator(); it.hasNext();)
{
//…………
try
{
if (resource.process())
{
//………………
}
}
catch (ResourceNotFoundException rnfe)
{
/*
* that's ok - it's possible to fail in
* multi-loader environment
*/
}
}
//…………
return resource;
}
最重要的还是在这句上
resource.process()
跟踪进入template的代码
try
{
is = resourceLoader.getResourceStream(name);
}
velocity的resourceLoader支持了多种文件读取方式,具体的见我以前写的文章。
默认的FileResourceLoader,我试了下竟然不支持绝对路径的读取。。。我很懒,所以我懒得重写resourceLoader。
如果切入点不能放在template上,貌似还有另一种方式,可以通过字符串直接代替模板的方式。
最简单的就是:
String s = "你好We are using $project $name to render this.";
w = new StringWriter();
Velocity.evaluate( context, w, "mystring", s );
不过用string不可能,最好能直接操纵流来解析。
后来发现evaluate还有重载的函数,可以直接对字节流进行处理,相当的nice,入口找到了。。省了很多功夫。
public static boolean evaluate( Context context, Writer writer,
String logTag, InputStream instream ){
//…………
}
有了这个,实现一下代码生成器不难了。
浙公网安备 33010602011771号