Freemarker:从不同位置加载模板

时间:2016-02-24 13:26:41

标签: java freemarker

我正在尝试从2个不同的地方加载Freemarker的模板。 ftl文件所在的文件夹是:

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

我有以下类有两种方法:

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

Configuration cfg = new Configuration();

我见过的所有文档和示例都是这样的。还有其他办法吗?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

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

弃用:弃用不是错误。正如弃用消息所示:“使用配置(版本)代替。”这也是FreeMarker文档中的内容,它应该用作FreeMarker相关信息的主要来源。