freemarker中exist,default说明
<#if s?exists>
${s?if_exists}
exists用在逻辑判断,而if_exists用来打印东西时用到,如果存在打印,不存在打印空字符串.
exp1?exists将会被exp1??代替
exp1?if_exists将会被exp1!代替
exp1?default(exp2)将会被exp1!exp2.
FTL区分大小写,所以list是正确的FTL指令,而List不是;${name}和${NAME}是不同的
如果使用不存在的指令,FreeMarker不会使用模板输出,而是产生一个错误消息
FreeMarker会忽略FTL标记中的空白字符, 但是,<、</和指令之间不允许有空白字符
局部变量隐藏(而不是覆盖)同名的plain变量;循环变量隐藏同名的局部变量和plain变量
==================序列=================
序列:由逗号分隔的子变量列表,由方括号限定,索引从0开始
例如: <#list ["winter", "spring", "summer", "autumn"] as x>
${x}
</#list>
可以使用数字范围定义数字序列,例如2..5等同于[2, 3, 4, 5],但是更有效率,注意数字范围没有方括号,可以定义反递增的数字范围,如5..2
序列片断:使用[startIndex..endIndex]语法,从序列中获得序列片断(也是序列);startIndex和endIndex是结果为数字的表达式
=====. 子串 ===============================
假设user的值为”tom cat”
${user[0]}${user[4]} ? tc
${user[1..4]} ? om c
===================散列=================
散列(hash):由逗号分隔的键/值列表,由大括号限定,键和值之间用冒号分隔
例如:{"name":"green mouse", "price":150}
键和值都是表达式,但是键必须是字符串
${..}只能用于文本部分,下面的代码是错误的:
<#if ${isBig}>Wow!</#if>
<#if "${isBig}">Wow!</#if>
应该写成:
<#if isBig>Wow!</#if>
====================算术运算=============
+、-、×、/、%,下面是一个例子:
avg 求平均值
${avg(3,5,20)} ${avg(student.zhangyaang.age,student.situ.age)}
${x * x - 100}
${x / 2}
${12 % 10}
操作符两边必须是数字,因此下面的代码是错误的:
${3 * "5"} <#-- WRONG! -->
使用+操作符时,如果一边是数字,一边是字符串,就会自动将数字转换为字符串,例如:
${3 + "5"}
输出结果是:
35
使用内建的int(后面讲述)获得整数部分,例如:
${(x/2)?int} 输出结果是(假设x为5)2
=================== 比较操作符=============
使用=(或==,完全相等)测试两个值是否相等,使用!=测试两个值是否不相等
=和!=两边必须是相同类型的值,否则会产生错误,例如<#if 1 = "1">会引起错误
Freemarker是精确比较,所以对"x"、"x "和"X"是不相等的
对数字和日期可以使用<、<=、>和>=,但不能用于字符串
由于Freemarker会将>解释成FTL标记的结束字符,所以对于>和>=可以使用括号来避免这种情况,例如<#if (x > y)>
另一种替代的方法是,使用lt、lte、gt和gte来替代<、<=、>和>=
===================逻辑操作符===============
&&(and)、||(or)、!(not),只能用于布尔值,否则会产生错误
================== 内建函数=================
内建函数的用法类似访问散列的子变量,只是使用“?”替代“.”,下面列出常用的一些函数
---------------字符串使用的:
html:对字符串进行HTML编码
cap_first:使字符串第一个字母大写
lower_case:将字符串转换成小写
upper_case:将字符串转换成大写
trim:去掉字符串前后的空白字符
-------------序列使用的:
size:获得序列中元素的数目
-------------数字使用的:
int:取得数字的整数部分(如-1.9?int的结果是-1)
=======================操作符优先顺序==============
操作符组 操作符
后缀 [subvarName] [subStringRange]. (methodParams)
一元 +expr、-expr、!
内建 ?
乘法 *、 / 、%
加法 +、-
关系 <、>、<=、>=(lt、lte、gt、gte)
相等 ==(=)、!=
逻辑and &&
逻辑or ||
数字范围 ..
====================插值 Interpolation=============
Interpolation有两种类型:
通用Interpolation:${expr}
数字Interpolation:#{expr}或#{expr; format}
注意:Interpolation只能用于文本部分
通用Interpolation ,插入字符串值:直接输出表达式结果
插入数字值:根据缺省格式(由#setting指令设置)将表达式结果转换成文本输出;可以使用内建函数string格式化单个Interpolation
例如:
<#setting number_format="currency"/>
<#assign answer=42/>
${answer}
${answer?string} <#-- the same as ${answer} -->
${answer?string.number}
${answer?string.currency}
${answer?string.percent}
输出结果是:
$42.00
$42.00
42
$42.00
4,200%
插入日期值:根据缺省格式(由#setting指令设置)将表达式结果转换成文本输出;可以使用内建函数string格式化单个Interpolation
例如:
${lastUpdated?string("yyyy-MM-dd HH:mm:ss zzzz")}
${lastUpdated?string("EEE, MMM d, ''yy")}
插入布尔值:根据缺省格式(由#setting指令设置)将表达式结果转换成文本输出;可以使用内建函数string格式化单个Interpolation
例如:
<#assign foo=true/>
${foo?string("yes", "no")}
输出:yes
数字Interpolation的#{expr; format}形式可以用来格式化数字,format可以是:
mX:小数部分最小X位
MX:小数部分最大X位
例如:
<#assign x=2.582/>
<#assign y=4/>
#{x; M2} <#-- 2.58 -->
#{y; M2} <#-- 4 -->
===============string============
--截取字符串
exp?substring(from,toExclusive)
exp?substring(from)
--第一个单词的首字母大写
exp?cap_first
例如:${"greEN mouse"?cap_first} 输出:GreEN mouse
--取消第一个单词的首字母大写
exp?uncap_first
--所有单词的首字母大写
capitalize
例如: ${" green mouse"?capitalize} 输出: Green Mouse
--字符串转换成日期时间值
date, time, datetime
例如:
<#assign test1 = "10/25/1995"?date("MM/dd/yyyy")>
<#assign test2 = "15:05:30"?time("HH:mm:ss")>
<#assign test3 = "1995-10-25 03:05 PM"?datetime("yyyy-MM-dd hh:mm a")>
${test1}
${test2}
${test3}
输出:
Oct 25, 1995
3:05:30 PM
Oct 25, 1995 3:05:00 PM
也可以不带格式化参数,将按照默认的格式显示
例如:<#assign test1 = "Oct 25, 1995"?date>
<#assign test2 = "3:05:30 PM"?time>
<#assign test3 = "Oct 25, 1995 03:05:00 PM"?datetime>
--判断字符串以什么字符串结束
ends_with 返回Boolean值
例如:"redhead"?ends_with("head") 返回:true
--判断字符串以什么字符串开始
starts_with 返回Boolean值
--逃逸字符
< ======== <
> ======== >
& ======== &
" ======== "
\ ======== \\
{ ======== \{
} ======== \}
\n 换行(u000A)
\r Return (u000D)
\t Tab (u0009)
\b Backspace (u0008)
\f Form feed (u000C)
\l <
\g >
\a &
--获取字符串在字符串中的下标索引,索引值从0开始
index_of
例如:"abcabc"?index_of("bc") 输出:1
"abcabc"?index_of("bc",2) 输出:4
--取最后匹配的字符串的索引
last_index_of
例如:"abcabc"?last_index_of("ab") 输出:3
"abcabc"?last_index_of("ab", 2) 输出:0
--根据java语言的转义字符串规则转义字符串
j_string
例如:<#assign beanName = 'The "foo" bean.'>
String BEAN_NAME = "${beanName?j_string}";
输出:String BEAN_NAME = "The \"foo\" bean.";
--根据javascript语言的转义字符串规则转义字符串
js_string
例如:
<#assign user = "Big Joe's \"right hand\"">
<script>
alert("Welcome ${user?js_string}!");
</script>
输出:
<script>
alert("Welcome Big Joe\'s \"right hand\"!");
</script>
--取字符串的长度
length
--将字符串转换成小写
lower_case
例如:"GrEeN MoUsE"?lower_case 输出:"green mouse"
--将字符串转换成大写
upper_case
--左补齐
left_pad 补齐的长度大于等于number
例如:
[${""?left_pad(5)}]
[${"a"?left_pad(5)}]
[${"abcdefg"?left_pad(5)}]
输出:
[ ]
[ a]
[abcdefg]
[abcdefg]
可以指定补齐的字符
[${"a"?left_pad(5, "-")}]
输出:[----a]
--右补齐
right_pad
--判断是否包含某个字符串
contains
例如:<#if "piceous"?contains("ice")>It contains "ice"</#if>
输出:
It contains "ice"
--匹配正则表达式
matches 返回boolean值
例如:"fooo"?matches('fo*') 返回:true
--字符串转换成数字
number
--替换字符串
replace
例如:
${"this is a car acarus"?replace("car", "bulldozer")}
输出:this is a bulldozer abulldozerus
--字符串拆分
split
例如:
<#list "someMOOtestMOOtext"?split("MOO") as x>
- ${x}
</#list>
输出:
- some
- test
- text
--去除前后的空格
trim
例如: (${" green mouse "?trim}) 输出:(green mouse)
--word_list
例如:
<#assign words = " a bcd, . 1-2-3"?word_list>
<#list words as word>[${word}]</#list>
输出:[a][bcd,][.][1-2-3]
==================数字=====================
将数字转换成字符串
string
例如: <#assign answer=42/>
${answer}
${answer?string} <#-- the same as ${answer} -->
${answer?string.number}
${answer?string.currency}
${answer?string.percent}
输出:
42
42
42
$42.00
4,200%
================日期时间=================
将日期时间转换成指定格式的字符串
string
例如:
${openingTime?string.short}
${openingTime?string.medium}
${openingTime?string.long}
${openingTime?string.full}
输出:
12:45 PM
12:45:09 PM
12:45:09 PM CEST
12:45:09 PM CEST
备注:date(年月日), time(时间), datetime(年月日+时间)
==============booleans ==================
将逻辑boolean值转换成字符串
string
例如:foo?string 输出:"true"
foo?string("yes", "no") 输出:"yes"
================序列 sequences=============
--取序列的第一个变量
first 如果序列为空将报错
--取序列的最后一个变量
last 如果序列为空将报错
--序列中是否包含某个变量
seq_contains
例如:<#assign x = ["red", 16, "blue", "cyan"]>
"blue": ${x?seq_contains("blue")?string("yes", "no")}
输出:"blue": yes
--取变量在序列中首次出现的索引值
seq_index_of
例如:
<#assign colors = ["red", "green", "blue"]>
${colors?seq_index_of("blue")}
输出:2
--取变量在序列中末次出现的索引值
seq_last_index_of
--序列顺序翻转
reverse
--返回序列的大小
size
--升序排列序列
sort
例如:<#assign ls = ["whale", "Barbara", "zeppelin", "aardvark", "beetroot"]?sort>
<#list ls as i>${i} </#list>
输出:aardvark Barbara beetroot whale zeppelin
--按照关键字升序排列序列
sort_by
例如:
<#assign ls = [
{"name":"whale", "weight":2000},
{"name":"Barbara", "weight":53},
{"name":"zeppelin", "weight":-200},
{"name":"aardvark", "weight":30},
{"name":"beetroot", "weight":0.3}
]>
Order by name:
<#list ls?sort_by("name") as i>
- ${i.name}: ${i.weight}
</#list>
Order by weight:
<#list ls?sort_by("weight") as i>
- ${i.name}: ${i.weight}
</#list>
--将序列分成多组
chunk
例如:
<#assign seq = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']>
<#list seq?chunk(4) as row>
<#list row as cell>${cell} </#list>
</#list>
<#list seq?chunk(4, '-') as row>
<#list row as cell>${cell} </#list>
</#list>
输出:
a b c d
e f g h
i j
a b c d
e f g h
i j - -
==================== hashes==========
keys--取关键字
例如:
<#assign h = {"name":"mouse", "price":50}>
<#assign keys = h?keys>
<#list keys as key>${key} = ${h[key]}; </#list>
输出:
name = mouse; price = 50;
values--取value值
=====================其他插件方法=======
--表达式运算
eval
例如:"1+2"?eval 输出:3
--判断变量的类型
Built-in Returns true if the value is a ...
is_string string
is_number number
is_boolean boolean
is_date date (all types: date-only, time-only and date-time)
is_method method
is_transform transform
is_macro macro
is_hash hash
is_hash_ex extended hash (i.e. supports ?keys and ?values)
is_sequence sequence
is_collection collection
is_enumerable sequence or collection
is_indexable sequence
is_directive macro or transform
is_node node
##################指令参考################
===============if, else, elseif===========
<#if condition>
...
<#elseif condition2>
...
<#elseif condition3>
...
...
<#else>
...
</#if>
================switch, case, default, break===========
<#switch value>
<#case refValue1>
...
<#break>
<#case refValue2>
...
<#break>
...
<#case refValueN>
...
<#break>
<#default>
...
</#switch>
=================list, break======================
<#list sequence as item>
...
</#list>
<#list seq as x>
${x}
<#if x = "spring"><#break></#if>
</#list>
<#list students[0..5] as s_list></#list>取list的前5条记录
list项的索引 xxx_index 索引值从0开始
判断是否有下一项 xxx_has_next
例如:
<#assign seq = ["winter", "spring", "summer", "autumn"]>
<#list seq as x>
${x_index + 1}. ${x}<#if x_has_next>,</#if>
</#list>
输出:
1. winter,
2. spring,
3. summer,
4. autumn
=====================include=================
<#include filename>
or
<#include filename options>
options:含两项encoding=encoding, parse=parse
encoding 编码字符串 parse 是否解析模板
=====================import=================
<#import path as hash>
===============noparse===================
<#noparse>
...
</#noparse>
不解析某段文字
例如:
<#noparse>
<#list animals as being>
<tr><td>${being.name}<td>${being.price} Euros
</#list>
</#noparse>
输出:
<#list animals as being>
<tr><td>${being.name}<td>${being.price} Euros
</#list>
=======================compress=====================
<#compress>
...
</#compress>
去掉多余的空格和换行
例如:
<#assign x = " moo \n\n ">
(<#compress>
1 2 3 4 5
${moo}
test only
I said, test only
</#compress>)
输出:
(1 2 3 4 5
moo
test only
I said, test only)
=====================定义变量 给变量赋值 assign=========
<#assign name=value>
or
<#assign name1=value1 name2=value2 ... nameN=valueN>
or
<#assign same as above... in namespacehash>
or
<#assign name>
capture this
</#assign>
or
<#assign name in namespacehash>
capture this
</#assign>
==============定义全局变量 赋值 global===========
<#global name=value>
or
<#global name1=value1 name2=value2 ... nameN=valueN>
or
<#global name>
capture this
</#global>
===============setting 设置freemarker的系统变量=================
<#setting name=value>
===================去除空格============
<#t> <#lt> <#rt> <#nt> 成对使用 类似 trim方法
##################freemarker中的保留字###################
true: boolean value ``true''
false: boolean value ``false''
gt: comparison operator ``greater than''
gte: comparison operator ``greater than or equivalent''
lt: comparison operator ``less than''
lte: comparison operator ``less than or equivalent''
as: used by a few directives
in: used by a few directives
using: used by a few directives
========================注释comment=============
旧格式:<#--...-->
新格式:
<#comment> .........</#comment>
=====================循环foreach===============
<#foreach item in sequence>
类似于:<#list sequence as item>.
==================默认值default===================
exp1?default(exp2)
类似于原来的 exp1!exp2
===============判断变量是否存在exists if_exists==============
exists 老版本中 (exp1)?exists
if_exists 新版本中 (exp1)?if_exists