几个JAR包中的Freemarker模板

8
我该如何配置Freemarker以在多个JAR文件中搜索模板?使用Spring。
<!-- freemarker config -->
<bean id="freemarkerConfig"
    class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
    <property name="templateLoaderPaths" value="classpath:/freemarker/" />
</bean>

一个war文件(用于部署),和一个jar文件(在依赖项中)。

One.war

/freemarker/simple.ftl

Two.jar

/freemarker/test.ftl

工作。

ModelAndView mav = new ModelAndView();
mav.setViewName("simple");

工作失败。找不到test.ftl文件。

ModelAndView mav = new ModelAndView();
mav.setViewName("test");

如果设置如下:
<property name="templateLoaderPaths" value="classpath:/freemarker/,classpath:/freemarker2/" />

One.war

/freemarker/simple.ftl

Two.jar

/freemarker2/test.ftl

工作。

ModelAndView mav = new ModelAndView();
mav.setViewName("simple");

工作。

ModelAndView mav = new ModelAndView();
mav.setViewName("test");

还有一个问题!如何配置Freemarker在同一路径(classpath:/ freemarker /)中搜索多个JAR(WAR)?


嗯,这是我自己从未能够解决的问题。期待回复。 另外,我的.ftl文件在/WEB-INF/freemarker/目录下。 - Bart Vangeneugden
文件不是那么重要的地方。 - Alexander
1
好问题,可惜你的采纳率有点低。 - Paul McKenzie
2个回答

10

我找到了解决方案!关闭preferFileSystemAccess可以始终通过SpringTemplateLoader加载。

    <!-- freemarker config -->
<bean id="freemarkerConfig"
    class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
    <property name="templateLoaderPaths" value="classpath:/freemarker/" />
    <property name="preferFileSystemAccess" value="false" />
</bean>

public void setPreferFileSystemAccess(boolean preferFileSystemAccess)

设置是否偏好使用文件系统访问模板加载。文件系统访问可以实现模板更改的热检测。

如果启用此功能,FreeMarkerConfigurationFactory将尝试将指定的"templateLoaderPath"解析为文件系统资源(对于扩展类路径资源和ServletContext资源也有效)。

默认值为 "true"。关闭此选项以始终通过SpringTemplateLoader加载(即作为流,无法热检测模板更改),如果您的某些模板位于扩展类目录中,而其他模板位于jar文件中,则可能需要这样做。


1

我曾经以编程的方式做过类似的事情:

public class ControllerServlet extends HttpServlet {
  private Configuration cfg; 
  public void init() {
    cfg = new Configuration();
    // 1
    WebappTemplateLoader wtl = new WebappTemplateLoader(getServletContext(), "WEB-INF/templates");
    // 2
    ClassTemplateLoader ctl = new ClassTemplateLoader(ControllerServlet.class, "templates");
    MultiTemplateLoader mtl = new MultiTemplateLoader(new TemplateLoader[] {wtl, ctl});
    cfg.setTemplateLoader(mtl);
    //....
 }
}

ControllerServlet是我的真实servlet的基类。

第1个设置模板的搜索路径为当前servlet上下文中的{{WEB-INF/templates}}。 第2个设置第二个搜索路径为子包“templates”。

您可以添加更多的模板路径。

希望这有所帮助。


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