ftl常用语法整理
判空及默认值
??:判断某个变量是否存在,返回boolean值
<#if object ??></#if>
<#if object ??><#else></#if>
!:指定缺失变量的默认值
product.color!"red"
判断两个值相等:先判断是否存在,再判断是否相等
<#if id ?? && id==1></#if>
list循环:遍历list并给对象取别名attribute供对象调用,if_exists在调用变量时需要先判断是否为空,否则会报错,_index为取出行号索引,从0开始,?size可以判断list大小。
<#list obj.list as attribute>
${attribute.id?if_exists}${attribute_index}
</#list>
{obj.list ?size} //计算list大小
<#list student as stu>${stu}</#list>
item_index:当前变量的索引值
item_has_next:是否存在下一个对象,item名称为as后的变量名,如stu
for循环精简版:
<#list 1..count as x></#list>
List片段可以采用:products[10..15] or products[5..] 的格式进行定义,当只局限于数字:
<#assign c= [1,2,3,4,5,6]>
<#list c[2..5] as v>${v}</#list>
map
Map对象的key和value都是表达式,,但key必须是字符串,可以混合使用.和[""]访问。
class.student["name"] //混合使用点语法和方括号语法
<#list Map?keys as s>${Map[s]}</#list>
<#assign c= {"a":"abc","b":"ddw"}>
${c.a}
变量与指定值加减:先判断该变量是否为数字类型,然后?number转换为数字类型,再做相减运算。
${obj?number-2}
日期转换
<#if obj??>${obj.createTime?string("yyyy-MM-dd HH:mm:ss")</#if>
<#assign date1=”2019-07-02”?date(“yyyy-MM-dd”)> //结果为2019-07-02
<#assign date2=”12:10:20”?time(“HH:mm:ss”)> //结果为12:10:20
<#assign date3=” 20019-07-02 12:10:20”?time(“HH:mm:ss”)> //结果为20019-07-02 12:10:20
判断长度并截取
<#if obj.title?length lt 10>
定义全局变量
<#assign foo=ture /> //声明变量foo,插入布尔值
${foo?string("yes","no")} //结果yes
<#assign name1=“aa” name2="bb" /> //可以同时定义多个变量
使用循环来给变量赋值:
<#assign x>
<#list ["red", "green", "blue", "black"] as n>${n}</#list>
</#assign>
${x}
变量转换
?number //转为数字 ${age?string.number} //20
#{c.a;m0} //输出数字的格式化,保留小数的位数,数字格式化插值可采用#{expr;format}形式来格式化数字,其中format可以是:mX:小数部分最小X位 ,MX:小数部分最大X位。在定义字符串的时可以使''或"",对特殊字符需要使用\转义,如果存在大量特殊字符,可以使用${r"..."}进行过滤。${r"${foo}"}或${r"C:\foo\bar"}
?obj //转为字符串
?string //转为字符串
?currency //货币格式 ${price?string.currency} //$20.00
?percent //百分比格式 ${per?string.percent} //20%
trim //删除字符串首尾空格 ${“ String ”?trim} 结果为String
split //用指定分隔符将字符串拆分为一组字符串 <#list “This|is|split”?split(“|”) as s>${s}</#list>
${“heabo”?replace(“ab”,”ll”)} //结果为hello
${“hello”?contains(“he”)?string} //结果为true,布尔值必须转换为字符串才能输出
${“string”?index_of(“in”) //结果为3
${“string”?index_of(“ab”) //结果为-1
length //返回字符串长度 ${“abc”?length} 结果为3
lower_case //将字符串转为小写 ${“ABC”?lower_case} 结果为abc
upper_case //将字符串转为大写 ${“abc”?upper_case} 结果为ABC
ends_with //判断字符串是否由某个子串结尾,返回布尔值。
${“hello”?ends_with(“lo”)?string} 结果为true,布尔值必须转换为字符串才能输出
${name?if_exists} //如果存在则输出这个值
${name?default(‘xxx’)} //如果存在则输出默认值xxx
${name!"xxx"} //如果不存在则输出默认值xxx
${date?string('yyyy-MM-dd')} //输出日期格式
<#assign foo=ture /> //声明变量foo,插入布尔值
${foo?string("yes","no")} //结果yes
<#compress>...</#compress> //消除空白行。
<@compress single_line=true> //将输出压缩为一行,需要包裹所需文档freemarker可用"["代替"<"在模板的文件开头加上[#ftl]。
<#noparse>...</#noparse> //指定FreeMarker不处理该指定里包含的内容
内置函数
html //将字符串中的<、>、&和“替换为<、>、"、&
?html //用于将字符串中可能包含的html字符进行过滤
${name?html} //使用html对字符进行格式化处理对于<等的过滤,escape、noescape指令对body的内容使用统一的表达式。
<#escape x as x?html>
First name:${firstName}
Last name:${lastName}
</#escape>
上面的代码等同于:
First name:${firstName?html}
Last name:${lastName?html}
index_of(substring,start) //在字符串中查找某个子串,返回找到子串的首字符索引,若没找到则返回-1。 start参数指定从字符串的那个索引处开始,start为数字。如果start大于字符串长度,则start取值为字符串长度,如果start小于0,则取0。
${‘str’?substring(0)} //结果为str
${‘str’?substring(0,1)} //结果为s
trim //删除字符串首尾空格 ${“ String ”?trim} 结果为String
split //用指定分隔符将字符串拆分为一组字符串 <#list “This|is|split”?split(“|”) as s>${s}</#list>
cap_first //将字符串中的第一个单词的首字母变为大写,${‘str’?cap_first} //结果为Str
uncap_first //将字符串中的第一个单词的首字母变为小写,${‘Str’?cap_first} //结果为str
capitalize //将字符串中的所有单词的首字母变为大写,${‘str’?capitalize} //结果为STR
length //返回字符串长度 ${“abc”?length} 结果为3
lower_case //将字符串转为小写 ${“ABC”?lower_case} 结果为abc
upper_case //将字符串转为大写 ${“abc”?upper_case} 结果为ABC
ends_with //判断字符串是否由某个子串结尾,返回布尔值。
${“hello”?ends_with(“lo”)?string} 结果为true,布尔值必须转换为字符串才能输出
{obj.list ?size} //计算list大小
int //取得数字的整数部分 ${-1.6?int} 结果是-1
Hash内置函数
hash?keys //返回hash中所有key,结果为sequence
hash?values //返回hash中所有value,结果为sequence
<#assign emp={“name”:“张三”, “age”:“25”}>
<#assign keys=emp?keys>
<#list keys as k>${k} = ${emp[k]}</#list>
逻辑判断
if标签判断:
<#if condition>...
<#elseif condition2>...
<#elseif condition3>...
<#else>
Boolean空值判断:
<#if obj.name??>
switch标签判断:
<#switch value>
<#case refValue1>...
<#break>
<#case refValue2>...
<#break>
...
<#case refValueN>...
<#break>
<#default>...
</#switch>
assign标签生成集合:
<#assign l=0..100/> //定义int区间的集合,如0-100
外部文件导入
<#import "/page/top.ftl" as top>
<#include "/footer.html">
<#include filename options>
options包含两个属性:encoding、parse。
encoding=”GBK” //编码格式
parse=true //是否作为ftl语法解析,默认是true,false是以文本方式引入。在ftl文件里布尔值都是直接赋值的,如parse=true,而不是parse=”true”。