一般在使用Velocity的时候都是指定一些模板,装载进来然后向VelocityContext中put变量名和方法,最后通过Template的merge方法输出。那天一个同事突然问我,如果提前不知道模板中会有什么变量,还能不能正常运行?这个问题我感觉很有意思,以前没想到过,不过手下还有别的工作,也没时间去看。下午那个同事和我说他已经试验出来了,经过一次merge()后,Template中的所有变量名同时会被加到VelocityContext实例中,虽然没有对应的对象值,但可以通过该VelocityContext实例的getKeys()方法获得所有的变量名,然后从中寻找你感兴趣的变量。
他为什么想到这些呢?
我们在做一个网站,希望提供静态化页面的功能,这就需要管理员根据需要指定一些模板。我们使用Velocity做静态化,所以模板对应的当然是Velocity模板了。但他不想把变量名限制死,然后通过#foreach等等来做页面输出,那样当然可以,不过可定制程度就大大下降,所以想到自己定义一些变量命名pattern,用户只要遵守这样的pattern就可以了,该输出什么由程序根据pattern来判断。但这样就存在一个问题,即是前文提到的,如何得到模板中实现不知道的变量。好在Velocity的默认实现就提供了这样的功能:)
只是有一点要注意,两次merge中只有第二次要真正输出,第一次并不需要,但merge()非需要一个Writer对象实例不可。两次实打实的I/O的代价可不小,最后我做了个NullWriter类,这个类啥也不干,就算在这次解决方案里添上我一笔了,哈哈~8-D