几个 jar 中的 freemarker 模板

发布于 2024-11-27 02:06:10 字数 1190 浏览 0 评论 0原文

如何配置 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

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)?

How can I configure freemarker to search templates in several jars? With spring.

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

One war file (to deploy), and jar file (in dependencies).

One.war

/freemarker/simple.ftl

Two.jar

/freemarker/test.ftl

Work.

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

Do not work. Can't find test.ftl

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

If settings is:

<property name="templateLoaderPaths" value="classpath:/freemarker/,classpath:/freemarker2/" />

One.war

/freemarker/simple.ftl

Two.jar

/freemarker2/test.ftl

Work.

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

Work.

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

And question! How configure freemarker to search in several jars(wars) in same path (classpath:/freemarker/)?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

青瓷清茶倾城歌 2024-12-04 02:06: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>

公共无效setPreferFileSystemAccess(布尔preferFileSystemAccess)

设置是否优先访问文件系统来加载模板。文件系统访问支持模板更改的热检测。

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

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

I found solution! Turn off preferFileSystemAccess to always load via 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)

Set whether to prefer file system access for template loading. File system access enables hot detection of template changes.

If this is enabled, FreeMarkerConfigurationFactory will try to resolve the specified "templateLoaderPath" as file system resource (which will work for expanded class path resources and ServletContext resources too).

Default is "true". Turn this off to always load via SpringTemplateLoader (i.e. as stream, without hot detection of template changes), which might be necessary if some of your templates reside in an expanded classes directory while others reside in jar files.

自在安然 2024-12-04 02:06:10

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

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}}。
Number 2 设置子包“templates”的第二个搜索路径。

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

希望有帮助。

Once I did a similar thing programmatically :

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 is a base class for my real servlets.

Number 1 sets the search path for templates to {{WEB-INF/templates}} in the current servlet context.
Number 2 sets a second search path to the subpackage "templates".

You may add more template paths.

Hope it helps.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文