Freemarker模板加载

3
在我的应用程序中,所有的Freemarker模板都在/templates/ftl/目录下。因此,在应用程序部署期间,我加载了一个名为“one class”的类,它继承了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/)的模板。
在这种特定情况下,如何声明第二个目录用于模板加载,同时不破坏所有调用旧路径的现有代码?我是否可以同时拥有两个不同的模板加载起点?
谢谢。

也许只需创建一个不带特定目录的单独(或临时)配置? - Ivan Borisov
我不明白如何实例化两个配置,因为我的类需要继承FreemarkerManager,而在那里我需要扩展createConfiguration方法,我已经第一次完成了这个。里面,我得到了Configuration conf = super.createConfiguration(servletContext);但是我不明白如何能够得到同一个servletContext的第二个配置。 - gospodin
2个回答

12
您可以使用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 手册


0

另一种更优雅的方法(在我看来)是在配置XML文件中实现:

<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
  <property name="templateLoaderPaths">
        <value>/path1/ , /path2/</value>
  </property>
</bean>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接