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. dos command

    dos command md 创建目录 rd 删除目录 cd\ 返回到根目录 cd.. 返回到上一级目录 cd 进入指定目录 dir 列出当前目录下的文件夹及文件 echo 文件内容>文件名称. ...

  2. 使用jave2将音频wav转换成mp3格式

    最近需要用到语音合成功能,网上查阅了一番,发现可以使用腾讯云的语音合成API来完成这个功能,但是腾讯云的api返回的是wav格式的音频文件,这个格式的文件有些不通用,因此需要转换成mp3格式的文件.  ...

  3. [LOJ] 分块九题 8

    区间查询数值+整体赋值 维护tag代表整个区间被赋成了tag[i] 用pushdown操作,而不是修改了再check. 不压缩代码了,调起来心累,长点有啥不好. //Stay foolish,stay ...

  4. 用Jenkins构建项目实战

    登录Jenkins,新建任务 输入一个任务名称,选择一个项目类型 使用自定义工作空间:使该项目独立于系统的工作空间 自动从Git下载源码,点击添加可以增加凭证 日程表的参数: 第一个参数代表的是分钟 ...

  5. 快速部署jumpserver堡垒机

    jumpserver版本:Version 1.4.1-2 (社区版) 主机IP地址:10.0.0.105 准备环境1.安装依赖yum -y install wget sqlite-devel xz g ...

  6. tornado框架基础08-sqlalchemy表关系和简单登录注册

    01 一对一表关系 Module 需要先创建对应的 Module ,这里采用之前建立好的 User 和 UserDetails relationship from sqlalchemy.orm imp ...

  7. Poj 2337 Catenyms(有向图DFS求欧拉通路)

    题意: 给定n个单词, 问是否存在一条欧拉通路(如acm,matal,lack), 如果存在, 输出字典序最小的一条. 分析: 这题可以看作http://www.cnblogs.com/Jadon97 ...

  8. 大数据学习——点击流日志每天都10T,在业务应用服务器上,需要准实时上传至(Hadoop HDFS)上

    点击流日志每天都10T,在业务应用服务器上,需要准实时上传至(Hadoop HDFS)上 1需求说明 点击流日志每天都10T,在业务应用服务器上,需要准实时上传至(Hadoop HDFS)上 2需求分 ...

  9. String字符串去掉双引号

    public static String stringReplace(String str) { //去掉" "号 String str= str.replace("\& ...

  10. Leetcode 319.灯泡开关

    灯泡开关 初始时有 n 个灯泡关闭.第 1 轮,你打开所有的灯泡.第 2 轮,每两个灯泡你关闭一次.第 3 轮,每三个灯泡切换一次开关(如果关闭则开启,如果开启则关闭).第 i 轮,每 i 个灯泡切换 ...