2

在我的应用程序中,所有 freemarker 模板都在 /templates/ftl/ 中,因此在应用程序部署期间,我加载了一个类,我调用了一个扩展 FreemarkerManager 并具有方法的类

Configuration configuration = super.createConfiguration(servletContext);
configuration.setDirectoryForTemplateLoading(new File("/templates/ftl/"));

这样,当我需要加载模板文件时,我可以简单地这样做:

    ServletContext servletContext = ServletActionContext.getServletContext();
    Configuration configFreemarker = (Configuration) servletContext
                    .getAttribute("freemarker.Configuration");
    Template template = configFreemarker.getTemplate("pathToMyTemplate");

仅在一种特定情况下,我需要获取来自完全不同路径(而不是 /templates/ftl/)的模板。

如何在这个特定的时刻声明用于模板加载的第二个目录而不破坏所有调用旧路径的现有代码?我可以同时有 2 个不同的模板加载起点吗?

谢谢

4

2 回答 2

10

您可以使用MultipleTemplateLoader.

import freemarker.cache.*; // template loaders live in this package

...

FileTemplateLoader ftl1 = new FileTemplateLoader(new File("/tmp/templates"));
FileTemplateLoader ftl2 = new FileTemplateLoader(new File("/usr/data/templates"));
ClassTemplateLoader ctl = new ClassTemplateLoader(getClass(), "");
TemplateLoader[] loaders = new TemplateLoader[] { ftl1, ftl2, ctl };
MultiTemplateLoader mtl = new MultiTemplateLoader(loaders);

cfg.setTemplateLoader(mtl);

资料来源:Freemarker 手册

于 2013-03-28T14:29:34.550 回答
0

另一种更优雅的方式(在我看来)是在配置 xml 中:

<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
  <property name="templateLoaderPaths">
        <value>/path1/ , /path2/</value>
  </property>
</bean>
于 2014-08-26T20:18:58.033 回答