FreeMarker-TemplateLoader


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();


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM