8

我想创建一个其他所有视图页面都将继承的主模板。

所以主模板将具有:

HEADER
--CONTENT--
FOOTER
  1. 标题将可选地显示(如果用户已登录)、用户名和其他用户对象属性。

  2. --CONTENT-- 是其他“继承”视图页面将注入其内容的占位符。

所以我的问题是,这可能与 freemarker 吗?如果是这样,有什么指导吗?

我如何将用户对象从我的控制器操作传递到标题?理想情况下,该对象将被传递到每个视图页面之外的某个地方(以避免必须在每个视图页面上维护此代码)。

4

4 回答 4

3

是的,这是可能的。在我们的应用程序中,诸如用户对象之类的东西存在于会话范围内,但这可能是 freemarker 可以访问的任何范围:

<#if Session.the_user?? && Session.the_user.loggedIn>
    <#-- header code -->
</#if> 

您可以省略Session.并且 Freemarker 将搜索给定变量名称的各种范围。

要注入内容,请将其包含在主模板中您希望查看页面放置其内容的位置:

<#nested>

然后,视图页面声明它们对主模板的使用如下:

<#import "/WEB-INF/ftl/path/to/template/master.ftl" as com>
<@com.template>
    View page content
</@com.template>
于 2010-07-19T14:58:43.720 回答
2

我做了 Freemarker 模板继承 - https://github.com/kwon37xi/freemarker-template-inheritance 我认为这就是你想要的。它在 freemarker 2.3.19 上进行了测试。

于 2013-07-21T16:00:54.620 回答
0

在较新的 Freemarker 版本中,<#nested>元素非常有用:

base.ftl:

<#macro layout>
    <html>
    <body>
    <p>OptaPlanner AI</p>
    <#nested>
    </body>
    </html>
</#macro>

baseWithDownloadButton.ftl:

<#import "base.ftl" as base>

<@base.layout>
    ${content.body}<#-- Only applicable for jbake -->
    <p>Download button</p>
</@base.layout>
于 2021-05-07T15:27:21.107 回答
0

我实现了这样的事情:

基础.ftl

<#macro page_head>
  <title>Page title!</title>
</#macro>

<#macro page_body></#macro>

<#macro display_page>
  <!DOCTYPE html>
  <html lang="en">
  <head>
    <@page_head/>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
  </head>
  <body>
    <@page_body/>
  </body>
  </html>
</#macro>

然后 index.ftl 将继承样板模板:

<#include "base.ftl">
<#macro page_head>
  <title>Welcome studs!</title>
</#macro>

<#macro page_body>
    <h1> Welcome user</h1>
</#macro>
<@display_page/>

该站点对上述代码参考很有帮助 https://nickfun.github.io/posts/2014/freemarker-template-inheritance.html

于 2019-03-21T11:31:10.367 回答