1 整体结构

模板(FTL 编程)是由例如以下部分混合而成的:


Text 文本:文本会照着原样来输出。

Interpolation 插值:这部分的输出会被计算的值来替换。插值由${和}所分隔(或者#{和}。这样的风格已经不建议再使用了)。

FTL tags 标签:FTL 标签和 HTML 标签非常相似,可是它们却是给 FreeMarker 的指示,并且不会打印在输出内容中。

Comments 凝视:FTL 的凝视和 HTML 的凝视也非常相似,但它们是由<#--和-->来分隔的。凝视会被 FreeMarker 所忽略。更不会在输出内容中显示。

2 指令

使用 FTL 标签来调用 directives 指令,比方调用 list 指令。

指令有两种类型:提前定义指令和用户自己定义指令。对于用户自己定义的指令使用@来取代#

更深的差别在于假设指令没有嵌套内容。那么必须这么使用 <@mydirective parameters />而提前定义指定则为<#directive something>

FreeMarker 能够不须要#来理解提前定义指令(比方<if user == "Big Joe">...</if>)。

而我们不建议这样来使用。

3 表达式

当须要给插值或者指令參数提供值时,能够使用变量或其它复杂的表达式。

比如。我们设 x 为 8。y 为 5,那么(x+y)/2 的值就会被处理成数字类型的值 6.5

当给插值提供值时:插值的使用方式为${expression}

当给指令參数提供值时:在入门章节我们已经看到 if 指令的使用了。

这个指令的语法是:<#if expression>...</#if>。

这里的表达式计算结果必须是布尔类型的。

高速浏览(备忘单)

直接确定值

_1 字符串

假设文本本身包括用于字符引用的引號(双引號”或单引號’)或反斜杠时。应该在它们的前面再加一个反斜杠,这就是转义。

转义同意你直接在文本中输入不论什么字符。也包括反斜杠。

以下的表格是 FreeMarker 支持的全部转义字符。

原生字符串:在原生字符串中。反斜杠和${没有特殊的含义,它们被视为普通的字符。

为了表明字符串是原生字符串,在開始的引號或单引號之前放置字母 r,比如:

${r"${foo}"}
${r"C:\foo\bar"}

将会打印:

${foo}
C:\foo\bar

_2 数字 输入不带引號的数字就能够直接指定一个数字。必须使用点作为小数的分隔符而不能是

其它的分组分隔符。

_3 布尔值 直接写 true 或 false 就表征一个布尔值了,不需使用引號。

_4 序列

指定一个文字的序列,使用逗号来分隔当中的每一个子变量,然后把整个列表放到方括号里。比如:

<#list ["winter", "spring", "summer", "autumn"] as x>
${x}
</#list>

列表中的项目是表达式,那么也能够这样做:[2 + 2, [1, 2, 3, 4], "whatnot"],当中第一个子变量是数字 4,第二个子变量是一个序列。第三个子变量是字符串”whatnot”。 也能够用 start..end 定义存储数字范围的序列,这里的 start 和 end 是处理数

字值表达式,比方 2..5 和[2, 3, 4, 5]是同样的,可是使用前者会更有效率(内存占用少并且速度快)。

能够看出前者也没有使用方括号。这样也能够用来定义递减的数字范围,比方 5..2。(此外。还能够省略 end,仅仅需 5..就可以,但这样序列默认包括 5,6,7,8

等递增量直到无穷大)



_5 哈希表

在模板中指定一个哈希表。就能够遍历用逗号分隔开的“键/值”对。把列表放到花括号内。键和值成对出现并以冒号分隔。看这个样例:{"name":"green mouse", "price":150}。注意到名字和值都是表达式。可是用来检索的名字就必须是字符串类型的。

4 检索变量

_1 顶层变量

为了訪问顶层的变量。能够简单地使用变量名。

_2 从哈希表中检索数据

假设有一个表达式的结果是哈希表,那么我们能够使用点和子变量的名字得到它的值.

以下这些演示样例它们含义都是相等的:book.author.name, book["author"].name, book.author.["name"], book["author"]["name"]

假设我们想 指 定 同一个表达式 的 子变量。那么还有第二种语法格式 :在方括号里能够给出随意长度字符串的表达式。在上面这个数据模型演示样例中你还能够这么来获取 title:book[test] :这里的test是根元素test中的值.



_3 从序列中检索数据

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

_4 特殊变量

特殊变量是由 FreeMarker 引擎本身定义的,为了使用它们,能够依照例如以下语法形式来

进行:.variable_name。

通常情况下是不需使用特殊变量,而对专业用户来说可能用到。

全部特殊变量的说明可

以參见參考手冊。

5 字符串操作

_1 插值(或连接)

能够在字符串的文字中使用${…}(#{…})。${...}的作用和在文本区的是同样的。

也能够使用+号来达到类似的效果。这是比較老的方法,也叫做字符串连接。

_2 获取一个字符

user[0]

获取一定范围内的字符,比方${user[1..4]}和${user[4..]}。然而如今这样的用法已经被废弃了,作为它的替代,能够使用内建

函数 substring。



6 序列操作

_1 连接

序列的连接能够使用+号来进行,比如:

<#list ["Joe", "Fred"] + ["Julia", "Kate"] as user>
- ${user}
</#list>
- Joe
- Fred
- Julia
- Kate

_2 序列切分

使 用 [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"的序列。




7 哈希表操作

_1 连接

像连接字符串那样。也能够使用+号的方式来连接哈希表。假设两个哈希表含有键同样的项,那么在+号右側的哈希表中的项目优先。

<#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

8 算数运算

有时我们仅仅想获取计算结果的整数部分。这能够使用内建函数 int 来解决。

${(x/2)?

int}
${1.1?int}
${1.999?int}
${-1.1? int}
${-1.999?int}

9 比較运算 

測试两个值相等使用=(或者採用 Java 和 C 语言中的==,二者是全然等同的。) 測试两个值不等使用!=。



FreeMarker 解释>的时候能够把它当作 FTL 标签的结束符。为了避免这样的问题,不得不将表达式放到括号内:<#if (x > y)>,或者能够在比較关系处使用>和<:<#if x > y>。

能够使用 lt 取代<。lte取代<=。gt 取代>,gte 取代>=。 因为历史遗留的原因,FTL 也支持\lt, \lte, \gt 和 \gte,使用他们和使用不带反斜杠的效果一样。




10 逻辑操作



11 内建函数

内建函数以?形式提供变量的不同形式或者其它信息。使用内建函数的语法和訪问哈希表子变量的语法非常像。除了使用?号来取代

点,其它的都一样。比如得到字符串的大写形式:user?upper_case。



演示样例:

${test?

html}
${test? upper_case? html}

如果字符串 test 存储”Tom & Jerry”,那么输出为:

Tom & Jerry
TOM & JERRY

12 方法调用

${repeat("What", 3)}

将会打印出:

WhatWhatWhat 

13 处理不存在的值

_1 默认值 

使用形式 概 览 : unsafe_expr!default_expr 或 unsafe_expr! 或(unsafe_expr)!default_expr 或(unsafe_expr)!


这个操作符同意你为可能不存在的变量指定一个默认值。

比如,如果以下展示的代码中没有名为 mouse 的变量:

${mouse!"No mouse."}
<#assign mouse="Jerry">
${mouse!"No mouse."}

将会输出

No mouse.
Jerry

默认值能够是不论什么类型的表达式,也能够不必是字符串。

你也能够这么写:hits!0或 colors!["red", "green", "blue"]。

默认值表达式的复杂程度没有严格限制。你还能够这么来写:cargo.weight!(item.weight * itemCount + 10) 。



_2 检測不存在的值

使用形式概览:unsafe_expr?

?或(unsafe_expr)??

这个操作符告诉我们一个值是否存在。

基于这样的情况。结果是 true 或 false。

示比例如以下,如果并没有名为 mouse 的变量:

<#if mouse?

?>
Mouse found
<#else>
No mouse found
</#if>
Creating mouse...
<#assign mouse = "Jerry">
<#if mouse?? >
Mouse found
<#else>
No mouse found
</#if>
No mouse found
Creating mouse...
Mouse found

14 括号

括号能够用来给表达式分组。示比例如以下:

 <#-- 输出是: -->
${3 * 2 + 2} <#-- 8 -->
${3 * (2 + 2)} <#-- 12 -->
${3 * ((2 + 2) * (1 / 2))} <#-- 6 -->
${"green " + "mouse"?upper_case} <#-- green MOUSE -->
${("green " + "mouse")?upper_case} <#-- GREEN MOUSE -->
<#if !( color = "red" || color = "green")>
The color is nor red nor green
</#if>

15 表达式中的空格

FTL 忽略表达式中的多余空格



16 操作符的优先级

插值

插值的使用语法是:${expression}。expression 能够是全部种类的表达式(比方${100 + x})。

插值是用来给插入详细值然后转换为文本(字符串)。插值只能够在两种位置使用:

文本区(如<h1>Hello ${name}!</h1> )和字符串表达式(如<#include "/footer/${company}.html">)中。

假设插值在文本区(也就是说。不再字符串表达式中)。假设 escapse 指令起作用了,即将被插入的字符串会被自己主动转义。

<#escape x as x?html>
...
<p>Title: ${book.title}</p>
<p>Description:
<#noescape>${book.description}</#noescape></p>
<h2>Comments:</h2>
<#list comments as comment>
<div class="comment">
${comment}
</div>
</#list>
...
</#escape>


freemarker 模板的更多相关文章

  1. Spring 4 使用Freemarker模板发送邮件&添加附件

    前言 Spring对Java的邮件发送提供了很好的支持,提供了超级简单的API,大大简化了Java邮件发送功能的开发. Spring对Email的支持是基于JavaMail API开发的,所以,我们在 ...

  2. FreeMarker模板开发指南知识点梳理

    freemarker是什么? 有什么用? 怎么用? (问得好,这些都是我想知道的问题) freemarker是什么? FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生 ...

  3. Spring MVC 学习总结(七)——FreeMarker模板引擎与动态页面静态化

    模板引擎可以让程序实现界面与数据分离,业务代码与逻辑代码的分离,这就提升了开发效率,良好的设计也使得代码复用变得更加容易.一般的模板引擎都包含一个模板解析器和一套标记语言,好的模板引擎有简洁的语法规则 ...

  4. 161213、Maven资源替换和Freemarker模板

    先介绍一下本文的两位主角: Apache Maven - 正当红的项目管理工具 FreeMarker - 老牌的模板引擎 两者貌似互不相干,何来冲突呢? 原来Maven有一个内置的资源替换机制, 可以 ...

  5. FreeMarker模板引擎

    现在开发的项目,也是基于SOA架构,每个功能接口都是用WebService实现,Web服务的通信协议就是用XML来传输. 以前写WebService都是自动生成XML,没想到这项目竟然要自己定义XML ...

  6. FreeMarker模板语法

    四.FreeMarker模板语法 要编写复杂的模板需要熟悉FreeMarker语法规则,官网有详细说明,中文帮助也比较详细了,下面这些内容是从网上收罗来的,感谢网友的分享,经过整理与修改的内容如下.建 ...

  7. Spring Boot 系列(五)web开发-Thymeleaf、FreeMarker模板引擎

    前面几篇介绍了返回json数据提供良好的RESTful api,下面我们介绍如何把处理完的数据渲染到页面上. Spring Boot 使用模板引擎 Spring Boot 推荐使用Thymeleaf. ...

  8. FreeMarker模板使用小结

    手册写的不错,忘记的时候可以翻翻n(*≧▽≦*)n --------------------------------------------分割线--------------------------- ...

  9. 安装freemarker模板的ftl插件

    安装freemarker模板的ftl插件 同意协议 等待运行完成 重新启动eclipse 查看是否生效

  10. JFinal配合Shiro权限控制在FreeMarker模板引擎中控制到按钮粒度的使用

    实现在FreeMarker模板中控制对应按钮的显示隐藏主要用到了Shiro中的hasRole, hasAnyRoles, hasPermission以及Authenticated等方法,我们可以实现T ...

随机推荐

  1. QT_4_QpushButton的简单使用_对象树

    QpushButton的简单使用 1.1 按钮的创建 QPushButton *btn = new QPushButton; 1.2 btn -> setParent(this);设置父窗口 1 ...

  2. 关于Java多线程(JAVA多线程实现的四种方式)

    Java多线程实现方式主要有四种:继承Thread类.实现Runnable接口.实现Callable接口通过FutureTask包装器来创建Thread线程.使用ExecutorService.Cal ...

  3. struts2中关于jsp页面向action传值出现乱码问题

    在JSP页面输入中文并传给后台的时候,常常会出现乱码问题,产生乱码的原因:java在进行传值的时候,默认用的是iso-8859-1的编码形式进行传输,而我们jsp页面常用的则是utf-8的编码形式.所 ...

  4. python基础知识11-文件操作

    文件 装饰器,装饰函数或者类的方法. 1.文件的基本操作 打开文件: 注意绝对路径与相对路径. path = 'text.txt' path = r'/home/pyvip/py_case/text. ...

  5. 剑指Offer(书):删除链表的节点

    题目:在O(1)的时间内删除列表节点. /** * 步骤: * 1.检查head与removeNode节点是否为空 * 2.检查removeNode的后一个节点是否为空,不为空则使用后一个节点的值覆盖 ...

  6. playbacktask

    / ** 播放应用程序的头文件. 此文件是头文件,用于定义Playback应用程序的API和数据类型. @file PlaybackTsk.h @ingroup mIAPPPlay @note什么都没 ...

  7. 【BZOJ 2761】 不重复数字 (哈希算法)

    链接 http://www.lydsy.com/JudgeOnline/problem.php?id=2761 Description 给出N个数,要求把其中重复的去掉,只保留第一次出现的数. 例如, ...

  8. POJ 1161 Walls(Floyd , 建图)

    题意: 给定n个城市, 然后城市之间会有长城相连, 长城之间会围成M个区域, 有L个vip(每个vip会处于一个城市里)要找一个区域聚会, 问一共最少跨越多少个长城. 分析: 其实这题难就难在建图, ...

  9. spring的IOC和DI

    https://blog.csdn.net/fuzhongmin05/article/details/55802816 (1)IOC:控制反转,把对象创建交给spring进行配置 (2)DI:依赖注入 ...

  10. PTA 03-树3 Tree Traversals Again (25分)

    题目地址 https://pta.patest.cn/pta/test/16/exam/4/question/667 5-5 Tree Traversals Again   (25分) An inor ...