使用 freemarker(或任何其他模板引擎)处理多个嵌套模板

Posted

技术标签:

【中文标题】使用 freemarker(或任何其他模板引擎)处理多个嵌套模板【英文标题】:Processing multiple nested templates using freemarker(or any other template engine) 【发布时间】:2011-11-24 05:15:57 【问题描述】:

我正在尝试使用 FreeMarker 使用 servlet 编写复杂的网页。

页面有 3 个基本组件:顶部的导航栏、左侧的广告栏和中间的主要内容部分。我有一个单独的 servlet 来绘制其中的每一个。每个 servlet 只生成一个 html5 部分,可能使用也可能不使用 freemarker。

以上所有内容当然都在使用 freemarker 模板化的主网页中。

问题是这样的。 主页的模板看起来像这样(为简单起见,条纹很多):

<html>
  <body>
     <!--lots of stuff in between-->

     <section-nav> <!--this should be filled by output of NavServlet.respond -->

     <!--lots of stuff in between-->

     <section-content> <!-- this comes from arbitrary servlet for actual content -->

     <section-advertise> <!--this should be filled by output of AdvertiseServlet --> 

   </body>
</html

如何使用 FreeMarker 处理上述结构? 如果我为主页执行 template.process() ,它将同时编写 html 开始和结束标记,但我想要的是让其他 servlet(导航、广告等)有机会在 html 结束标记之前生成内容。

如果我们不能为此使用 FreeMarker,我也可以使用其他模板解决方案。

【问题讨论】:

【参考方案1】:

您应该实现 TemplateDirectiveModel 以在 Java 中创建自定义指令(与 FTL 相对,即使用 #macro)。当从模板(类似于&lt;@my.embed source="thisAndThatServlet" /&gt;)调用时,它将收到Writer,然后您可以在其中写入任何您想要的内容。因此,当然,您可以包含其他 servlet,或者做任何在 Java 中可行的事情。 (支持嵌套Template.process调用。)以freemarker.ext.servlet.IncludePage的源代码为例。

【讨论】:

以上是关于使用 freemarker(或任何其他模板引擎)处理多个嵌套模板的主要内容,如果未能解决你的问题,请参考以下文章

为啥要使用 Velocity/Freemarker/Thymeleaf 等模板引擎进行数据编织

将对象列表传递给Freemarker然后循环

Thymeleaf模板引擎学习

Java模板引擎 FreeMarker

Freemarker 模板引擎和 Maven

FreeMarker:Java模板引擎