FreeMarker 布局以减少模板冗余?

FreeMarker layouts to reduce template redundancy?

根据 FreeMarker include statement docs,您可以像这样制作页眉和页脚感知模板:

<#include "/header.ftl">
<!-- Content of my this page -->
<#include "/footer.ftl">

但如果我的网络应用程序有数百个 pages/views,这就是大量冗余的复制意大利面。如果 FreeMarker 中有类似“layout”的概念,那就太好了,我可以在其中说“嘿,这是一个布局:”。 =16=]

<#include "/header.ftl">
<@import_FTL_Somehow>
<#include "/footer.ftl">

然后为每个 view/page(index.ftlcontactUs.ftl 等)创建单独的模板,然后告诉 FreeMarkers 哪些 FTL 文件 "use" 布局。这样我就不必在每个模板文件中都指定 header/footer 包含。

FreeMarker 支持这种概念吗?

它不会,但如果您只需要页脚或页眉,可以通过一些 TemplateLoader hack 来解决(TemplateLoader 插入页眉和页脚片段,就好像在那里在模板文件中)。但是 FreeMarker 中通常的解决方案是从每个模板显式调用布局代码,但不是直接使用两个 #include-s,而是像:

<@my.page>
  <!-- Content of my this page -->
</@my.page>

其中 my 是自动导入(参见 Configuration.addAutoImport)。

更新:另一种方法是你有一个 layout.ftl 比如:

Heading stuff here...
<#include bodyTemplate>
Footer stuff here...

然后从 Java 你总是调用 layout.ftl,但也使用 bodyTemplate 变量传入正文模板名称:

dataModel.put("bodyTemplate", "/foo.ftl");
cfg.getTemplate("layout.ftl").process(dataModel, out);