2016-02-24 63 views
1

我想从2个不同的地方加载Freemarker的模板。其中FTL文件所在的文件夹是:Freemarker:从不同位置加载模板

/docroot/WEB-INF/src/charts/base 
/docroot/WEB-INF/src/charts/tmpl 

我有下面的类有2种方法:

public class TemplateLoader { 

    public Template loadChartBaseTemplate(String templateName) throws Exception { 

     String templateFile = String.format("%s.ftl", templateName); 

     Configuration cfg = new Configuration(); 
     cfg.setClassForTemplateLoading(this.getClass(), "/charts/base/"); 
     Template template = cfg.getTemplate(templateFile); 

     return template; 

    } 

    public Template loadChartTemplate(String fileName) throws Exception { 

     Configuration cfg = new Configuration(); 
     cfg.setClassForTemplateLoading(this.getClass(), "/charts/tmpl/"); 
     Template template = cfg.getTemplate(fileName); 

     return template; 

    } 

} 

第一种方法正确加载模板。第二种方法返回一个错误,指出“找不到名称的模板”。两个文件夹都处于同一级别,并且检查了我尝试加载的文件是否存在。

什么可能会导致Freemarker能够从一个文件夹中加载模板,并为另一个文件夹失败,因为它们处于同一级别(我尝试了结尾“/”,没有它,它没有区别,行为是一样的)。

一个额外的问题:

以下行返回错误:构造配置()已过时

Configuration cfg = new Configuration(); 

所有的文档和例子我见过有像这样。有没有其他的方式来做到这一点?

在此先感谢您的帮助。

回答

0

这两个目录是否来自不同的jar-s? FreeMarker需要一个类作为第一个参数的原因是它将使用该类的定义ClassLoader来加载模板。在一些设置中(特别是在OSGi下),你必须小心地选择一个来自包含模板的jar的类。如果它仍然不起作用,只是为了排除FreeMarker作为一个可能的原因,你可以尝试,如果你可以通过Class.getResourceAsStream(...)加载所需的模板。

弃用:弃用不是错误。正如弃用消息所说:“改用配置(版本)。”这也是它在FreeMarker文档中的方式,它应该被用作FreeMarker相关信息的主要来源。

+0

感谢您的帮助。我只是想知道这里发生了什么。我正在使用Liferay portlet。项目中添加了“基础”中的模板。 “tmpl”文件夹是空的,并且在那里的ftl文件是在运行时创建的。会发生什么情况是,调试器正在查找源代码文件夹(Eclipse Workspace)中的文件,其中“tmpl”文件夹为空;我在运行时创建的文件正在部署文件夹(Liferay的Apache webapps文件夹)中创建。总之,调试器正在错误的位置查找ftl文件。 – jgrodrigueza