表达式

当需要给插值或指令参数提供值时,可以使用变量或其他复杂的表达式

例如:

  • 当给插值提供值时 —— 插值的使用方式为 ${expression},把它放到想输出文本的位置上然后就可以打印出来了。例如${(5+8)/2}会打印出6.5
  • 当给指令参数提供值时 —— <#if expression> ... </#if>,这里的表达式结果必须时布尔类型;比如<#if  2 < 3  >是结果为true的布尔表达式

直接确定值

字符串

在文本中确定字符串的方法是看引号和单引号,比如 "some text" 和 'same text' 这两种形式是相等的。如果文本本身包含用于字符引用的引号或反斜杠时,应该使用转移。

例如:

${"It's \"quoted\" and
this is a backslash: \\""}${'It\'s "quoted" and
this is a backslash: \\'}

输出为:

It's "quoted" and
this is a backslash: \It's "quoted" and
this is a backslash: \

下面的表格是FreeMarker支持的所有的转义字符,在字符串使用反斜杠的其他所有情况都是错误的,运行模板都会失败:

转义序列 含义
\ 引号(u0022)
\' 单引号(u0027)
\\ 反斜杠(u005C)
\n 换行符(u000A)
\r 回车(u000D)
\t 水平制表符(u0009)
\b 退格(u0008)
\f 换页(u000C)
\l 小于号:<
\g 大于号:>
\a 和号:&
\xCode 字符的16进制Unicode码

原生字符串

在原生字符串中,反斜杠和${没有特殊的含义,它们被视为普通的字符。为了表明字符串是原生字符串,在开始的引号或单引号之间放置字母 r ,例如:

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

打印结果:

${foo}
C:\foo\bar

数字

输入不带引号的数字就可以直接指定一个数字,必须使用 点 作为小数的分隔符而不能是其他的分组分隔符。可以使用 - 和 +  表明符号。科学计数法暂不支持,且不能在小数点之前不写0

${08}, ${+8}, ${8.00}, ${8}

与数值文字 08,+8, 8.00 和 8 的打印结果是完全相等的。

布尔值

直接写 true  或 false ,不需要使用引号。

序列

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

例如:

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

打印结果:

winter
spring
summer
autumn

列表中的项目是表达式,也可以这样做:

[2 + 2, [1,2,3,4], "whatnot"]

第一个子变量是数字4,第二个子变量是一个序列,第三个子变量是字符串“whatnot”。

也可以使用 start .. end 形式存储数字范围的序列;例如 2 .. 5和[2,3,4,5]是相同的。

哈希表

在模板中指定一个哈希表,就可以遍历用逗号分隔开的“键/值”对,把列表放到花括号内。键和值成对出现并以冒号分隔。

例如:

{“name”:"green mouse", "price":150}

名字和值都是表达式,但是用来检索的名字必须是字符串类型。

检索变量

顶层变量

为了访问顶层变量,可以简单使用变量名,例如:

${user}

从哈希表中检索数据

假定如下数据模型:

(root)
|
+- book
| |
| +- title = "Breeding green mouses"
| |
| +- author
|    |
|    +- name = "Julia Smith"
|    |
|    +- info = "Biologist, 1923-1985, Canada"
|
+- test = "title"

下面这些形式都是等价的:

book.author.name,
book["author"].name,
book.author.["name"],
book["author"]["name"]

对于顶层变量来说,如果尝试访问一个不存在的变量也会引起错误导致模板解析执行的中断(除非程序员事先配置过FreeMarker)。

从序列中检索数据

使用方括号加索引值,例如:

animal[0].name

特殊变量

特殊变量是由FreeMarker引擎本身定义的,为了使用它们,可以按照如下语法形式来进行:

.variable_name

通常情况下是不需使用特殊变量。

字符串操作

插值/连接

如果要在字符串中插入表达式的值,可以在字符串的文字中使用${…}(#{…})。${...}的作用和在文本区的是相同的。

例如:假设 user 是 Big Joe,

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

打印结果:

Hello Big Joe!
Big JoeBig JoeBig JoeBig Joe

也可以使用 + 达到类似的效果,这是比较老的方法,例如:

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

插值只能在文本区段(<h1>Hello ${name}!</h1>)和字符串文字(<#include "/footer/${company}.html">)中使用

获取一个字符

使用序列方式,例如:(假设 user 为 “Big Joe”)

${user[0]}
${user[4]}

打印出:

B
J

或者还可以使用内建函数(后续)。

序列操作

连接

使用 + 号进行:

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

打印结果:

- Joe
- Fred
- Julia
- Kate

序列切分

使用

[firstindex..lastindex]

可以获取序列中的一部分,这里的firstindex和lastindex表达式的结果是数字。

如果seq存储序列"a", "b", "c", "d", "e", "f",那么表达式seq[1..4]将会是含有"b", "c", "d", "e"的序列。

lastindex可以被省略,那么这样将会读取到序列的末尾。如果seq存储序列"a", "b", "c", "d", "e", "f",那么seq[3..]将是含有"d", "e", "f"的序列。

如果试图访问一个序列首变量之前的项或末变量之后的项将会引起错误,模板的执行也会中断

哈希表操作

连接

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

例如:

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

算数运算

+  -  *  /  %

例如:假设x为5

${100 – x*x}
${x/2}
${12%10}

打印出:

75
2.5
2

除 + 号外(+号可将数字转成字符),其他的运算符中非数字操作数将会导致FreeMarker错误。

有时我们只想获取计算结果的整数部分,这可以使用内建函数int来解决;例如:

${(x/2)?int}
${1.1?int}
${1.999?int}
${-1.1?int}
${-1.999?int}

打印出:

2
1
1
-1
-1

比较运算

相等 —— =

不相等 —— !=

逻辑运算

常用的逻辑操作符:

  • 逻辑或:||
  • 逻辑与:&&
  • 逻辑非:!

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

内建函数

内建函数以  ?  形式提供变量的不同形式或者其他信息。使用内建函数的语法和访问哈希表子变量的语法很像,除了使用?号来代替点,其他的都一样。

例如得到字符串的大写形式:user?upper_case。

在参考文档中可以查到所有内建函数的资料。

  • 字符串使用的内建函数:

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

    • size:序列中元素的个数
  • 数字使用的内建函数:
    • int:数字的整数部分(比如-1.9?int就是-1)

例如,假设seasons存储了序列"winter", "spring", "summer", "autumn"

${seasons?size}
${seasons[1]?cap_first} <#-- left side can by any expression -->
${"horse"?cap_first}

打印出:

4
Spring
Horse

方法调用

可以使用方法调用操作来使用一个已经定义过的方法。方法调用的语法形式是使用逗号来分割在括号内的表达式而形成的参数列表,这些值就是参数。方法调用操作将这些值传递给方法,然后返回一个结果,这个结果就是整个方法调用表达式的值。

例如:

${repeat("What", 3)}

处理不存在的值

当访问一个不存在的变量时FreeMarker将会报错而导致模板执行中断。

模板语言中也没有null这个概念。

默认值

语法格式:

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

在不是顶层变量时,默认值操作符可以有两种使用方式

<ul><li><span style="font-family: Arial, Helvetica, sans-serif;">product.color!"red"</span></li></ul>

如果是这样的写法,那么在product中,当color不存在时(返回”red”)将会被处理,但是如果连produce都不存在时将不会处理。也就是说这样写时变量product必须存在,否则模板就会报错。

<ul><li><span style="font-family: Arial, Helvetica, sans-serif;">(product.color)!"red"</span></li></ul>

这时,如果当不存在时也会被处理,那就是说如果product不存在或者product存在而color不存在,都能显示默认值”red”而不会报错。本例和上例写法的重要区别在于用括号时,就允许其中表达式的任意部分可以未定义。

默认值也可以用于序列,例如:

<#assign seq = ['a', 'b']>
${seq[0]!'-'}
${seq[1]!'-'}
${seq[2]!'-'}
${seq[3]!'-'}

打印出:

a
b
-
-

检测不存在的值

语法格式:

unsafe_expr??
或
(unsafe_expr)??

结果是 true  或 false。

例如:

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

访问非顶层变量的使用规则和默认值操作符也是一样的,即product.color??和(product.color)?? 。

括号

表达式中的空格

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

操作符优先级

【FreeMarker】【模板文件FTL】模板表达式相关推荐

  1. freemarker常用标签 ftl模板文件常用标签

    freemarker常用标签 ftl模板文件常用标签 1.注释 <#–-–>格式不会输出 2 list循环 <#list datalist as entity>     ${e ...

  2. WordPress 主题教程 #2:模板文件和模板

    模板文件(template files)和模板(template)是从零开始创建 WordPress 主题系列教程的第二篇.开始之前,你要确保你已经看过WordPress 主题教程 #1:介绍,否则你 ...

  3. 【FreeMarker】【模板文件FTL】模板总体结构

    模板总体结构 模板也称为 FTL(FreeMarker模板语言). 模板(FTL)是由如下的部分混合而成的:(FTL区分大小写) Text文本-- 文本会照着原样来输出 Interpolation插值 ...

  4. freemarker ftl模板_Spring Boot2 系列教程(十)Spring Boot 整合 Freemarker

    今天来聊聊 Spring Boot 整合 Freemarker. Freemarker 简介 这是一个相当老牌的开源的免费的模版引擎.通过 Freemarker 模版,我们可以将数据渲染成 HTML ...

  5. Freemarker 生成word 模板文件

    2019独角兽企业重金招聘Python工程师标准>>> /***      * word 下载生成      * @param positionvo      * @return   ...

  6. springboot+freemarker实现导出word模板

    freemarker FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页.电子邮件.配置文件.源代码等)的通用工具. 它不是面向最终用户的,而是一个 ...

  7. 自己动手实现简易代码生成器、采用文本模板文件生成服务层、服务层接口代码的做法参考...

    为什么80%的码农都做不了架构师?>>>    最近受到 单程列车 http://www.cnblogs.com/zhaojingjing/  的启发,让我做一个模板文件来生成代码, ...

  8. Django框架(8.Django中的模板文件的使用和模板变量的简单使用)

    为什么使用模板 通过视图可以给用户返回一些字符串等等, 那如何向请求者返回一个漂亮的页面呢? 肯定需要用到html.css,如果想要更炫的效果还要加入js,问题来了,这么一堆字段串全都写到视图中,作为 ...

  9. html 模板配置,模板文件配置

    模板文件一定要小写下划线,如 list_pubu.html 你可以给你每一个模板文件增加一个json配置文件,用于描述这个模板文件;配置文件和模板文件名是同名的,只是后缀为 json,如simpleb ...

最新文章

  1. 【廖雪峰python入门笔记】list_创建
  2. Spring Boot配置文件学习记录【1】
  3. CISP/CISA 每日一题 11
  4. centos7下kubernetes(6。运行应用)
  5. 再窥--单链表和顺序存储
  6. View的滚动原理简单解析(二)
  7. 【洛谷1985】【USACO07OPEN】翻转棋
  8. fnt美术字处理 阴影部分
  9. 海量Oracle学习视频分享
  10. CCNP基础知识-交换技术
  11. 安全组设置IP段 -- 示列
  12. CSS层叠样式表基础知识整理
  13. 提升HTML5的性能体验系列之一 避免切页白屏
  14. oracle巡检表,ORACLE日常巡检内容
  15. Give Us the Money
  16. Pulmonary -- Detection1
  17. 十进制与二进制转换 python
  18. C语言:基础知识(整型常量,实型常量)
  19. 独立钻石Solitaire算法求解
  20. Python实现WCDMA速率匹配算法

热门文章

  1. Ubuntu下获取Android源码
  2. 淘东电商项目(35) -SSO单点登录(登录功能完善)
  3. 2843 拯救炜哥 (bfs)
  4. win10自动修复电脑无法正常启动
  5. 大型机学习之具体技术之-JCL练习(二)
  6. maven父pom和子pom的版本号一并批量修改
  7. centos上安装TeamViewer
  8. cakephp用户注册实例
  9. Folksam数据泄露将100万瑞典人的信息泄露给谷歌、Facebook等巨头
  10. JS实现页面打印,控制打印时显示隐藏