freemarker语法2
最常用的概念
1、 scalars:存储单值
字符串:简单文本由单或双引号括起来。
数字:直接使用数值。
日期:通常从数据模型获得
布尔值:true或false,通常在标记中使用
2、 hashes:充当其它对象的容器,每个都关联一个唯一的查询名字
具有一个唯一的查询名字和他包含的每个变量相关联。
3、 sequences:充当其它对象的容器,按次序访问
使用数字和他包含的每个变量相关联。索引值从0开始。
4、 集合变量:
除了无法访问它的大小和不能使用索引来获得它的子变量:集合可以看作只能由指令使用的受限sequences。
5、 方法:通过传递的参数进行计算,以新对象返回结果
方法变量通常是基于给出的参数计算值在数据模型中定义。
6、 用户自定义FTL指令:宏和变换器
7、 节点
节点变量表示为树型结构中的一个节点,通常在XML处理中使用。
在模板里对sequences和hashes初始化
sequences
1. [“you”,”me”,”he”] 2. 1..100 3. [ {“Akey”:”Avalue”},{“Akey1”:”Avalue1”}, {“Bkey”:”Bvalue”},{“Bkey1”:”Bvalue1”}, ] hashes {“you”:”a”,”me”:”b”,”he”:”c”}
注释标志
这里是注释
-->
旧版本的freemarker采用的是 注释 #comment>方法
sequences内置方法
sequence?first
返回sequence的第一个值;前提条件sequence不能是null
sequence?last
返回sequence最后一个值
sequence?reverse
反转sequence的值
sequence?size
返回sequence的大小
sequence?sort
对sequence按里面的对象toString()的结果进行排序
sequence?sort_by(value)
对sequence 按里面的对象的属性value进行排序
如: sequence里面放入的是10 个user对象,user对象里面包含name,age等属性
sequence?sort_by(name) 表示所有的user按user.name进行排序
hashes内置方法
hash?keys
返回hash里的所有keys, 返回结果类型sequence
hash?values
返回hash里的所有value, 返回结果类型sequence
模板
使用FTL(freeMarker模板语言)编写
组成部分
一、整体结构
1、注释:,不会输出。
2、文本:直接输出。
3、interpolation:由 ${var} 或 #{var} 限定,由计算值代替输出。
4、FTL标记
二.表达式
1、直接指定值:
1-1、字符串:
由双引号或单引号括起来的字符串,其中的特殊字符(如' " \等)需要转义。
1-2、raw字符串:
有一种特殊的字符串称为raw字符串,被认为是纯文本,其中的\和{等不具有特殊含义,该类字符串在引号前面加r,下面是一个例子:
${r"/${data}"year""}屏幕输出结果为:/${data}"year"
转义 含义
序列
\" 双引号(u0022)
\' 单引号(u0027)
\\ 反斜杠(u005C)
\n 换行(u000A)
\r Return (u000D)
\t Tab (u0009)
\b Backspace (u0008)
\f Form feed (u000C)
\l <
\g >
\a &
\{ {
\xCode 4位16进制Unicode代码
1-3、数字:直接输入,不需要引号
1)、精度数字使用“.”分隔,不能使用分组符号
2)、目前版本不支持科学计数法,所以“1E3”是错误的
3)、不能省略小数点前面的0,所以“.5”是错误的
4)、数字8、+8、08和8.00都是相同的
1-4、布尔值:true和false,不使用引号
1-5、序列:由逗号分隔的子变量列表,由[]方括号限定。
1)、子变量列表可以是表达式
2)、可以使用数字范围定义数字序列,不需要方括号限定,例如2..5等同于[2, 3, 4, 5],但是更有效率,可以定义反递增范围如:5..2。
1-6、散列(hash)
1)、由逗号分隔的键/值列表,由{}大括号限定,键和值之间用冒号分隔,如:{"key1":valu1,"key2":"character string"....}
2)、键和值都是表达式,但是键必须是字符串。
2、获取变量:
2-1、顶层变量:${变量名}
变量名只能是字母、数字、下划线、$、#、@ 的组合,且不能以数字开头。
2-2、散列:有两种方法
1)、点语法:变量名字和顶层变量的名字受同样的限制
2)、方括号语法:变量名字无限制,可以是任意的表达式的结果
book.author.name
book.author.["name"]
book["author"].name
book["author"]["name"]
以上是等价的。
2-3、序列:使用散列的方括号语法获取变量,方括号中的表达式结果必须为数字。注意:第一个项目的索引为0。可以使用
[startindex..endindex]语法获取序列片段。
2-4、特殊变量:FreeMarker内定义变量,使用.variablename语法访问。
3、字符串操作
3-1、interpolation:使用${}或#{}在文本部分插入表达式的值,例如:
${"hello${username}!"}
${"${username}${username}${username}"}
也可以使用+来获得同样的结果:
${"hello"+username+"!"}
${username+username+username}
注意:${}只能用于文本部分而不能出现于标记内。
或都是错误的;
是正确的。
本例中user.login的值必须是布尔类型。
3-2、子串:
举例说明:假如user的值为"Big Joe"
${user[0]}${user[4]}结果是:BJ
${user[1..4]}结果是:ig J
4、序列操作
4-1、连接操作:可以使用+来操作,例如:
["title","author"]+["month","day"]
5、散列操作
5-1、连接操作:可以使用+来操作,如果有相同的KEY,则右边的值会替代左边的值,例如:
{"title":散列,"author":"emma"}+{"month":5,"day":5}+{"month":6}结果month的值就是6。
6、算术运算
6-1、操作符:+、-、*、/、%
除+号以外的其他操作符两边的数据,必须都是数字类型。
如果+号操作符一边有一个字符型数据,会自动将另一边的数据转换为字符型数据,运算结果为字符型数据。
6-2、比较操作符:
1}、=
2}、==
3}、!=
4}、<
5}、<=
6}、>
7}、>=
1-3的操作符,两边的数据类型必须相同,否则会产生错误
4-7的操作符,对于日期和数字可以使用,字符串不可以使用。
注意:
1}、FreeMarker是精确比较,所以"x" "x " "X"