Freemarker2.3.19简单用法总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34446485/article/details/79972275

模板 + 数据模型 = 输出  

${user}

注:用最新的数据内容替换模板中${…}的部分,每级之间用点来分隔。

数据模型可以被看做是树状结构的。

标量存储单一的值,这种类型的值可以是字符串,数字,日期/时间或者是布尔值。

哈希表是存储变量和与其相关且有唯一标识名称变量的容器。

序列是存储有序变量的容器。存储的变量可以通过数字索引来检索,索引通常从零

${…}:FreeMarker 将会输出真实的值来替换花括号内的表达式,这样的表达式被称为interpolations 插值

FTL tags 标签(FreeMarker 模板的语言标签):FTL 标签和 HTML 标签有一点相似,但是它们是 FreeMarker 的指令而且是不会直接输出出来的东西。

这些标签的使用一般以符号#开头。(用户自定义的 FTL 标签使用@符号来代替#,但这是更高级的主题内容了)
Comments 注释:FreeMarker 的注释和 HTML 的注释相似,但是它用<#--和-->来分隔的。

任何介于这两个分隔符(包含分隔符本身)之间内容会被 FreeMarker 忽略,就不会输出出来了。
其他任何不是 FTL 标签,插值或注释的内容将被视为静态文本,这些东西就不会被
FreeMarker 所解析,会被按照原样输出出来。
directives 指令:就是所指的 FTL 标签。这些指令在 HTML 的标签(如<table>和
</table>)和 HTML 元素(如 table 元素)中的关系是相同的。(如果现在你还不能区
分它们,那么把“FTL 标签”和“指令”看做是同义词即可。)

条件指令

<#if condition>和</#if>

同时还可以用<#else>

如:

<#list>

<#if >

<#else>
</#if>
 </#list>

存在于<#list …>和</#list>标签之间。

循环指令

<#list animals as being>

list 指令的一般格式为:

<#list sequence as loopVariable>repeatThis</#list>repeatThis 部分将会在给定的 sequence 遍历时在每项中重复,从第一项开始,一个接着一个。在所有的重复中,loopVariable 将持有当前项的值。这个循环变量仅

include 指令:使用 include 指令,我们可以在当前的模板中插入其他文件的内容

<#include "xxr.html">

联合使用指令

 <#list animals as being>
 <tr>
 <td>
 <#if being.size == "large"><font size="+1"></#if>
 ${being.name}
 <#if being.size == "large"></font></#if>
 <td>${being.price} Euros
 </#list>


默认值

不论在哪里引用变量,都可以指定一个默认值来避免变量丢失这种情况,通过在变量名
后面跟着一个!和默认值。就像下面的例子,当 user 从数据模型中丢失时,模板将会将
user 的值表示为字符串”Anonymous”。(若 user 并没有丢失,那么模板就会表现
出”Anonymous”不存在一样):<h1>Welcome ${user!"Anonymous"}!</h

在变量名后面通过放置??来询问 FreeMarker 一个变量是否存在。将它和 if
指令合并,那么如果 user 变量不存在的话将会忽略整个代码段

<#if user??><h1>Welcome ${user}!</h1></#if>

对于多级访问的变量码(animals.python.price)!0 需要加括号才能避免animals或python不存在带来的解析错误

标量

添加引号,直接输出 比如”green mouse”或者’green mouse’。

整数

整数和非整数是不区分的,只有单一的数字类型。比如
使用了计算器,计算 3/2 的结果是 1.5 而不是 1。

布尔

<#if loggedIn>…</#if>
或者<#if price==0>…</#if>,后面这个 price==0 部分的结果就是布
尔值。
在模板中可以使用保留字 true 和 false 来指定布尔值

日期:日期变量可以存储和日期/时间相关的数据。一共有三种变化。
1、 精确到天的日期(通常指的是“日期”),比如 April 4, 2003
2、 每天的时间(不包括日期部分),比如 10:19:18 PM。时间的存储精确到毫秒。
3、 日期-时间(也称作“时间戳”),比如 April 4, 2003 10:19:18 PM。时间部分的
存储精确到毫秒 注:实际不能由freemarker来决定

自定义指令

box,它的值是用户自定义的指令,用来打印一些特定的 HTML 信息,
这个指令定义了一个标题和其中的信息。

The average of 3 and 5 is: ${avg(3, 5)}
The average of 6 and 10 and 20 is: ${avg(6, 10, 20)}
The average of the price of a python and an elephant is:
${avg(animals.python.price, animals.elephant.price)}
The average of 3 and 5 is: 4
The average of 6 and 10 and 20 is: 12
The average of the price of a python and an elephant is:
4999.5
<@box title="Attention!">
 Too much copy-pasting may leads to
 maintenance headaches.
</@box>

模板

FTL 标签不可以在其他 FTL 标签和插值中使用。下面这样写就是错的:
<#if <#include 'foo'>='bar'>...</#if>
注释可以放在 FTL 标签和插值中间。比如 <h1>Welcome ${user <#-- The name of user -->}!</h1>

。对于用户自定义的指令使用
@来代替#,比如<@mydirective parameters>...</@mydirective>。更深
的区别在于如果指令没有嵌套内容,那么必须这么使用 <@mydirective 
parameters /> 即必须闭合 且不能在<,</和指令名中间插入空白标记

注意:
通过配置,FreeMarker 可以在 FTL 标签和 FTL 注释中,使用[和]来代替<和>,就像[#if 
user == "Big Joe"]...[/#if]。
注意:
通过配置,FreeMarker 可以不需要#来理解预定义指令(比如<if user == "Big 
Joe">...</if>)。而我们不建议这样来使用。要获取更多信息,请参考:参考文档部
分,废弃的 FTL 结构/老式 FTL 语法。

为了表明字符串是原生字符串,在开始的引号或单引号之前放置字
母 r,例如:
将会打印:

It's "quoted" and
this is a backslash: \
It's "quoted" and
this is a backslash: \
${r"${foo}"}
${r"C:\foo\bar"}
${foo}
C:\foo\bar

从hash表中获取数据

下面这些示例它们含义都是相等的:
book.author.name, book["author"].name, book.author.["name"], 
book["author"]["name"]
从序列中检索数据

这和从哈希表中检索是相同的,但是你只能使用方括号语法形式来进行,而且方括号内
的表达式最终必须是一个数字而不是字符串。在第一章的数据模型示例中,为了获取第一个
动物的名字(记住第一项数字索引是 0 而不是 1)可以这么来写:animals[0].name。

插值(或连接)

如果要在字符串中插入表达式的值,可以在字符串的文字中使用${…}(#{…})。
${...}的作用和在文本区的是相同的。假设用户是”Big Joe”,看下面的代码:

${"Hello ${user}!"}
${"${user}${user}${user}${user}"}

打印

Hello Big Joe!
Big JoeBig JoeBig JoeBig Joe
另外,也可以使用+号来达到类似的效果,这是比较老的方法,也叫做字符串连接。示
例如下:


${"Hello " + user + "!"}
${user + user + user + user}

序列切分

使 用 [firstindex..lastindex] 可 以 获 取 序 列 中的一部分 ,这里的
firstindex 和lastindex 表达式的结果是数字。如果seq 存储序列"a", "b", "c", 
"d", "e", "f",那么表达式 seq[1..4]将会是含有"b", "c", "d", "e"的序列(索
引为 1 的项是"b",索引为 4 的项是"e")。
lastindex 可以被省略,那么这样将会读取到序列的末尾。如果 seq 存储序列"a", 
"b", "c", "d", "e", "f",那么 seq[3..]将是含有"d", "e", "f"的序列。
注意:
从 FreeMarker 2.3.3 版本以后 lastindex 才能省略。
如果试图访问一个序列首变量之前的项或末变量之后的项将会引起错误,模板的执行也
会中断
链接hash表

像连接字符串那样,也可以使用+号的方式来连接哈希表。如果两个哈希表含有键相同
的项,那么在+号右侧的哈希表中的项目优先。例如:

<#assign ages = {"Joe":23, "Fred":25} + {"Joe":30, "Julia":18}>
- Joe is ${ages.Joe}
- Fred is ${ages.Fred}
- Julia is ${ages.Julia}

将会打印出

- Joe is 30
- Fred is 25
- Julia is 18

比较

=或!=两边的表达式的结果都必须是标量,而且两个标量都必须是相同类型(也就是说字符串只能和字符串来比较,数字只能和数字来比较等)。否则将会出错,模板执行中断。

使用>=和>的时候有一点小问题。FreeMarker 解释>的时候可以把它当作 FTL 标签的结束符。为了避免这种问题,不得不将表达式放到括号内:<#if (x > y)>,或者可以在比较关系处使用&gt;和&lt;:<#if x &gt; y>。

逻辑操作:

逻辑操作符仅仅在布尔值之间有效,若用在其他类型将会产生错误导致模板执行中止。例如:

<#if x < 12 && color = "green">
 We have less than 12 things, and they are green.
</#if>

内建函数

1、字符串使用的内建函数:

html: 字符串中所有的特殊 HTML 字符都需要用实体引用来代替(比如<代
替&lt;)。
cap_first:字符串的第一个字母变为大写形式
lower_case:字符串的小写形式
upper_case:字符串的大写形式
trim:去掉字符串首尾的空格

2、序列
 size:序列中元素的个数
3、数字使用的内建函数:
int:数字的整数部分(比如-1.9?int 就是-1) 注:可以连用内建函数


阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页