关于 freemarker 模板的建议,想要创建一个主模板

发布于 2024-09-10 04:30:09 字数 354 浏览 8 评论 0原文

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

因此主模板将具有:

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

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

    --CONTENT--

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

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

I want to create a master template that every other view page will inherit.

So the master template will have:

HEADER
--CONTENT--
FOOTER
  1. the header will optionally show (if the user is logged in), the username and other user object properties.

  2. the --CONTENT-- is a placeholder that other 'inheriting' view pages will inject their content into.

So my questions are, is this possible with freemarker? If so, any guidance?

How would I pass the user object to the header from my controller actions? ideally the object would be passed in somewhere OTHER than each and every view page (to avoid having to maintain this code on each and every view page).

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

梦在深巷 2024-09-17 04:30:09

是的,这是可能的。在我们的应用程序中,诸如用户对象之类的东西存在于会话范围中,但这可以是 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>

Yes, it's possible. In our applications things like the user object exist in session scope, but this could be any scope freemarker has access to:

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

You can omit the Session. and Freemarker will search the various scopes for the given variable name.

To inject the content, include this at the point in the master template where you'd like the view page to put its content:

<#nested>

The view pages then declare their use of the master template as follows:

<#import "/WEB-INF/ftl/path/to/template/master.ftl" as com>
<@com.template>
    View page content
</@com.template>
何止钟意 2024-09-17 04:30:09

I made Freemarker template inheritance - https://github.com/kwon37xi/freemarker-template-inheritance
I think it's what you want. It is tested on freemarker 2.3.19.

千秋岁 2024-09-17 04:30:09

我实现了这样的东西:

base.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-模板继承.html

I implemented something like this:

base.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>

then index.ftl will inherit the boilerplate templates as:

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

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

this site was helpful for the above code reference
https://nickfun.github.io/posts/2014/freemarker-template-inheritance.html

酒几许 2024-09-17 04:30:09

在较新的 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>

In newer Freemarker versions, the <#nested> element is extremely useful:

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>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文