我想创建一个其他所有视图页面都将继承的主模板。
所以主模板将具有:
HEADER
--CONTENT--
FOOTER
标题将可选地显示(如果用户已登录)、用户名和其他用户对象属性。
--CONTENT-- 是其他“继承”视图页面将注入其内容的占位符。
所以我的问题是,这可能与 freemarker 吗?如果是这样,有什么指导吗?
我如何将用户对象从我的控制器操作传递到标题?理想情况下,该对象将被传递到每个视图页面之外的某个地方(以避免必须在每个视图页面上维护此代码)。
我想创建一个其他所有视图页面都将继承的主模板。
所以主模板将具有:
HEADER
--CONTENT--
FOOTER
标题将可选地显示(如果用户已登录)、用户名和其他用户对象属性。
--CONTENT-- 是其他“继承”视图页面将注入其内容的占位符。
所以我的问题是,这可能与 freemarker 吗?如果是这样,有什么指导吗?
我如何将用户对象从我的控制器操作传递到标题?理想情况下,该对象将被传递到每个视图页面之外的某个地方(以避免必须在每个视图页面上维护此代码)。
是的,这是可能的。在我们的应用程序中,诸如用户对象之类的东西存在于会话范围内,但这可能是 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>
我做了 Freemarker 模板继承 - https://github.com/kwon37xi/freemarker-template-inheritance 我认为这就是你想要的。它在 freemarker 2.3.19 上进行了测试。
在较新的 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>
我实现了这样的事情:
基础.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