本文共 4119 字,大约阅读时间需要 13 分钟。
一款模板引擎。即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。
在模板中,你可以专注于如何展现数据, 而在模板之外可以专注于要展示什么数据,体现就是:模板+ 数据模型 = 输出。
org.springframework.boot spring-boot-starter-freemarker
spring: freemarker: settings: classic_compatible: true #处理空值 datetime_format: yyy-MM-dd HH:mm number_format: 0.## suffix: .ftl template-loader-path: - classpath:/templates
.ftl
文件,意为freemarker templates layer
。@Controllerpublic class TestController{ @GetMapping("test") public String test(HttpServletRequest request){ Listusers = new LinkedList<>(); for(int i = 0; i < 10; i ++){ User user = new User(); user.setId((long)i); user.setUsername("name = " + i); users.add(user); } request.setAttribute("users",users); return "test"; }}
<#list users>Users:
no users!
${...}
: FreeMarker将会输出真实的值来替换大括号内的表达式,被称为插值表达式。
<#../>
:FTL标签,以#开头,自定义标签则以@开头。
<#if animals.python.price < animals.elephant.price> Pythons are cheaper than elephants today.<#elseif animals.elephant.price < animals.python.price> Elephants are cheaper than pythons today.<#else> Elephants and pythons cost the same today.
list
指令的一般格式为: <#list sequence as loopVariable> repeatThis
。 repeatThis
部分将会在给定的 sequence
遍历时在每一项中重复, 从第一项开始,一个接着一个。在所有的重复中, loopVariable
将持有当前遍历项的值。 这个变量仅存在于 <#list ...>
和 <#list>
标签内。
We have these animals:
${animal.name} | ${animal.price} Euros |
sequence
可以是任意表达式, 比如我们可以列表显示示例数据模型中的水果,就像这样:
上面示例中的一个问题是如果我们有0个水果,它仍然会输出一个空的 <ul></ul>
,而不是什么都没有。 要避免这样的情况,可以这么来使用 list
:
<#list misc.fruits>Fruits:
We have no fruits.
使用 include
指令, 我们可以在模板中插入其他文件的内容。
如果需要在每个页面的下方都显示版权信息,可以将版权信息单独放在页面文件 copyright_footer.html
中:
Copyright (c) 2000 Acmee Inc,All Rights Reserved.
使用时,用include引入该文件即可:
Test page Test page
Blah blah... <#include "/copyright_footer.html">
内建函数很像子变量(如果了解Java术语的话,也可以说像方法), 它们并不是数据模型中的东西,是 FreeMarker 在数值上添加的。 为了清晰子变量是哪部分,使用 ?
(问号)代替 .
(点)来访问它们。
所有内建函数参考:
一个不存在的变量和一个是null
值的变量, 对于FreeMarker来说是一样的。
不论在哪里引用变量,都可以指定一个默认值来避免变量丢失这种情况, 通过在变量名后面跟着一个 !
(叹号,译者注)和默认值。 就像下面的这个例子,当 user
不存在于数据模型时, 模板将会将 user
的值表示为字符串 "visitor"
。(当 user
存在时, 模板就会表现出 ${user}
的值):
Welcome ${user!"visitor"}!
也可以在变量名后面通过放置 ??
来询问一个变量是否存在。将它和 if
指令合并, 那么如果 user
变量不存在的话将会忽略整个问候的代码段:
<#if user??>Welcome ${user}!
<#macro greet> Hello Joe! <#--未带参数宏调用--> <@greet>
<#macro greet_2 person> Hello ${person}! <#--带参数宏调用--> <@greet_2 person="天乔巴夏"/>
<#macro nest_test> <#nested > <#--嵌套调用--> <@nest_test> hyh
这部分可以参考我发在码云上的代码:
@Override public void execute(DirectiveHandler handler) throws Exception { // 获取参数 String username = handler.getString("username"); String city = handler.getString("city"); // 处理参数 String template = "{}来自{}."; String format = StrUtil.format(template, username, city); // 传回去 handler.put("result",format).render(); }
@Configurationpublic class FreeMarkerConfig { @Autowired StringTemplate stringTemplate; @Autowired private freemarker.template.Configuration configuration; @PostConstruct public void setUp() { configuration.setSharedVariable("timeAgo", new TimeAgoMethod()); configuration.setSharedVariable("strstr", stringTemplate); }}
<@strstr username="hyh" city="杭州"> ${result}
本文内容均为对优秀博客及官方文档总结而得,原文地址均已在文中参考阅读处标注。最后,文中的代码样例已经全部上传至Gitee:
转载地址:http://icofz.baihongyu.com/