搞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 ){ //………… }
有了这个,实现一下代码生成器不难了。