几个 jar 中的 freemarker 模板

Posted

技术标签:

【中文标题】几个 jar 中的 freemarker 模板【英文标题】:freemarker templates in several jars 【发布时间】:2011-10-15 19:00:33 【问题描述】:

如何配置 freemarker 以在多个 jar 中搜索模板?带弹簧。

<!-- 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

两个.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

两个.jar

/freemarker2/test.ftl

工作。

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

工作。

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

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

【问题讨论】:

嗯,这是我自己从来没有做过的事情。有兴趣回复。另外,我的.ftl 文件在/WEB-INF/freemarker/ 文件不那么重要的地方。 问得好,对你的接受率感到羞耻。 【参考方案1】:

我找到了解决方案!关闭 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 资源)。

默认为“真”。将其关闭以始终通过 SpringTemplateLoader 加载(即作为流,不热检测模板更改),如果您的一些模板位于扩展的类目录中而其他模板位于 jar 文件中,这可能是必要的。

【讨论】:

【参考方案2】:

一旦我以编程方式做了类似的事情:

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 设置子包“模板”的第二个搜索路径。

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

希望对你有帮助。

【讨论】:

以上是关于几个 jar 中的 freemarker 模板的主要内容,如果未能解决你的问题,请参考以下文章

使用邮件模板(freemarker.jar)发送邮件

FreeMarker学习

支持FreeMarker需要哪些JAR包?

Freemarker 在 maven 生成的 jar 中加载模板的位置

放置freemarker模板文件的最佳做法是啥

springboot模板引擎使用之freemarker