java中不乏优秀的模板引擎,Velocity,mvel,FreeMarker等。在构建框架的时候,通常可以拿来即用,但我们需要控制它。最近需要一个数据准备的框架,便选择了FreeMarker,FreeMarker使用起来很简单,data+template=out.今天主要写一下其中template加载组件TemplateLoader
TemplateLoader的实现作为一个模板文件加载的抽象,自然不能限制模板来自何方,在FreeMarker中由几个主要的实现类来体现,这些TemplateLoader是可以独立使用的,Webapp需要Servlet环境。当然你可以实现自己的TemplateLoader.
刚开始总觉得StringTemplateLoader简单,其实挺麻烦,而且也无大用。
@Testpublic void testStringTL() throws IOException {StringTemplateLoader stl = new StringTemplateLoader();String template = "${key}";stl.putTemplate("hello", template);Object source = stl.findTemplateSource("hello");Reader reader = stl.getReader(source, "utf-8");String dest = IOUtils.toString(reader);Assert.assertEquals(template, dest);}
MultiTemplateLoaderTemplateLoader是可以多种类型,同种类型组合起来使用的,查询顺序按照数组的顺序优先。
@Testpublic void testMultiTL() throws IOException {TemplateLoader ctl = new ClassTemplateLoader(TemplateLoaderTest.class,"/");TemplateLoader ftl1 = new FileTemplateLoader(new File(System.getPRoperty("user.dir")));MultiTemplateLoader mtl = new MultiTemplateLoader(new TemplateLoader[] {ftl1,ctl });Object source = mtl.findTemplateSource("test.ftl");Reader reader = mtl.getReader(source, "utf-8");String dest = IOUtils.toString(reader);Assert.assertEquals("${hello}", dest);}
通常在Configuration中使用,才能方便的处理FreeMarker的表达式@Testpublic void testInConfiguration() throws IOException {Configuration configuration = new Configuration(Configuration.VERSION_2_3_21);configuration.setDefaultEncoding("utf-8");TemplateLoader ctl = new ClassTemplateLoader(TemplateLoaderTest.class,"/");TemplateLoader ftl1 = new FileTemplateLoader(new File(System.getProperty("user.dir")));MultiTemplateLoader mtl = new MultiTemplateLoader(new TemplateLoader[] {ftl1,ctl });configuration.setTemplateLoader(mtl);//configuration.getTemplate("test.ftl").process(data, out);}
其它缓存模板加载通常是耗费资源的,默认是开启缓存的,缓存的实现,是否使用缓存取决于你
configuration.setCacheStorage(new freemarker.cache.NullCacheStorage());configuration.clearTemplateCache();
新闻热点
疑难解答