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.ftl
、contactUs.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);
根据 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.ftl
、contactUs.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);