Java中不乏優秀的模板引擎,Velocity,mvel,FreeMarker等。在構建框架的時候,通常可以拿來即用,但我們需要控制它。最近需要一個數據准備的框架,便選擇了FreeMarker,FreeMarker使用起來很簡單,data+template=out.今天主要寫一下其中template加載組件TemplateLoader
TemplateLoader的實現
作為一個模板文件加載的抽象,自然不能限制模板來自何方,在FreeMarker中由幾個主要的實現類來體現,這些TemplateLoader是可以獨立使用的,Webapp需要Servlet環境。當然你可以實現自己的TemplateLoader.
- StringTemplateLoader 直接將內存中的String對象放入並使用
- FileTemplateLoader 本地文件目錄
- ClassTemplateLoader ClassPath 加載
- WebappTemplateLoader ServletContext
- MultiTemplateLoader 多個TemplateLoader的疊加,順序按照數組的順序優先加載
StringTemplateLoader
剛開始總覺得StringTemplateLoader簡單,其實挺麻煩,而且也無大用。
@Test
public 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);
}
MultiTemplateLoader
TemplateLoader是可以多種類型,同種類型組合起來使用的,查詢順序按照數組的順序優先。
@Test
public 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的表達式
@Test
public 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();
