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

/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处于同一级别,是什么导致Freemarker能够从一个文件夹加载模板而导致另一个文件夹失败(我尝试使用结尾的“ /”,但没有它,并且没有区别,行为是相同)。

另一个问题:

以下行返回错误:不建议使用构造函数Configuration()

Configuration cfg = new Configuration();


我看到的所有文档和示例都具有这样的含义。还有其他方法吗?

预先感谢您的所有帮助。

最佳答案

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

弃用:弃用不是错误。弃用消息显示:“改为使用Configuration(Version)”。 FreeMarker文档中的情况也是如此,应将其用作FreeMarker相关信息的主要来源。

关于java - Freemarker:从不同位置加载模板,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35603520/

10-11 20:18