freemarker模版语法
2.freemarker的内容
1)FTL标签(用于FreeMarker模板语言标签):FTL标签的名称以 #。(用户定义的FTL标签使用@ 不是#)
2)注释 <#-- --> 与HTML注释不同,FTL注释不会输入到输出中(访问者的页面源将不会显示),因为FreeMarker会跳过它们。
任何不是FTL标签或插值或注释的东西都被视为静态文本,不会被FreeMarker解释; 它只是原样打印到输出。
3.基本的指令
3-1.if指令
<#if 1+1<2>
真的么
<#elseif 1+1==2>
好像吧
<#else>
不知道
</#if>
3-2.列表指令
1)循环显示 list中的内容
<#list animals as animal>
<tr> <td> $ { animal .name} <td> $ { animal .price}欧元
</#list>
2)list为空的话 不显示 list不为空的话 用items循环显示
<#list misc.fruits>
<ul>
<#items as fruit>
<li> $ {fruit}
</#items>
</ ul>
</#list>
3)#sep在显示一些分隔符的时候会非常有用
#sep将仅在下一个项目执行时执行。因此,在最后的水果之后没有逗号。
<p>水果:<#list misc.fruits as fruit> $ {fruit} <#sep>,</#sep> </#list>
4)list else /list 当list中没有数据时 显示的内容
<#list misc.fruits>
水果:
<ul>
<#items as fruit>
<li> $ {fruit} <#sep>和</#sep>
</#items>
</ ul>
<#else>
我们没有水果。
</#list>
3-3.include指令
使用该include指令,您可以将另一个文件的内容插入到模板中
<#include“/copyright_footer.html”>
3-4.处理缺失的变量
1)如果变量未取到 用!后指定的值做默认值
<h1>欢迎$ {user!"missing"}!</ h1>
2)变量名?? 询问变量是否存在 如果变量存在显示true
<#if user??> <h1>欢迎$ {user}!</ h1> </#if>
3-5.常用内置函数
user?upper_case 转化为大写
user?cap_first 首字母大写
user?length 获取字符串长度
list?size 获取list的数据数量
bool?string("Y", "N") 根据布尔值返回字符串
list?join(", ")用指定字符连接数组
user?starts_with("J") 字符串以XXX开头 是返回true 否返回false
user?html
num?int取整数部分
在list标签中也可使用以下内置函数
list?index 从0开始获取数据行数
list?counter 类似index从1开始计数
list?item_parity 返回"odd" "even" 表示奇偶数
list?item_cycle('lightRow', 'darkRow') 类似item_parity 返回指定字符串
4,转义
freemark使用"\"来进行转义 也可以在字符串前加"r"来表示转义
${r"C:\foo\bar"}
5.数组声明
freemark的语法与js很像
<#list ["aa","bb",33] as vaaq>
${vaaq}
</#list>
范围截取
<#assign aa = "012345"/>
${aa[2..5]}指定结束下标
${aa[2..<6]}指定结束下标小于几
${aa[2..*4]}指定个数
通过"+"可以何并集合
<#assign s1 = ["11","22"]/>
<#assign s2 = ["22","33"]/>
${(s1+s2)?join(",")}
通过"+"可以何并对象 如果有重复值 之后的值将覆盖之间的值
<#assign ages = {"aa":20,"bb":30} + {"bb":40,"cc":50}>
${ages.aa}
${ages.bb}//40
${ages.cc}
6.变量的命名规范
在这种表达式中,变量名只能包含字母(包括非拉丁字母),数字(包括非拉丁数字),下划线(_),美元($),在符号(@)
第一个字符不能为数字
从FreeMarker 2.3.22开始,变量名称还可以在任何位置都包含负(-),dot(.)和冒号(:),但必须使用前面的反斜杠(\)进行转义
7.html中大于号小于号的规避
有一个问题>=和 >。FreeMarker将该字符 >解释为FTL标签的结束字符。
为了防止这种情况,你可以使用lt的替代<,lte而不是 <=,gt代替 >和gte代替 >=,像<#if x gt y>。
另一个技巧是把表达式转换括号像 <#if (x > y)>,但它被认为是不太优雅。
8.用户自定义宏
格式为<#macro 宏名字 变量名N个 >
变量可以设置默认值
使用@宏名的方式调用宏
<#macro greet person color =“black” >
<font size =“+ 2”color =“$ {color}”> Hello $ {person}!</ font>
</#macro>
<@greet person="Fred"/>
<@greet person="Fred" color="black"/>
9.嵌入nested
<#macro lls count>
<p>hello nested</p>
<#nested>
</#macro>
nested也可以带有参数
<#macro lls lsdata>
hello nexted
<#list lsdata as va>
<#nested va>
</#list>
</#macro>
<@lls ["11","22","33","44"];a>
this is: ${a}
</@lls>
10.四种变量定义
global assign local以及在list中定义的临时变量
<#global gl="global">
${gl}
<#assign al="assign">
${al}
<@mc></@mc>
<#macro mc>
<#local ll="local">
${ll}
</#macro>
11.命名空间
import as 引入其他模版空间
当想覆盖引入的模版空间的值 或 向引入的模版空间中追加一些值的时候可以使用 in
下面的命名空间虽然有三个不同名字 但指向的同一个模版 修改其中一个也会影响其他的
<#import "/core.ftl" as core1>
<#import "/core.ftl" as core2>
<#import "/core.ftl" as core3>
<#import "/core.ftl" as core>
${core.ages.aa}
<@m2 core.ages.aa core.ages.bb core.ages.cc/>
<#assign dd="dd" in core>
${core.dd}
12.自动转义
1)可以使用线面的语句对模版进行自动转移设置
<#ftl output_format ="HTML" auto_esc=true>
2)?no_esc ?esc禁用单个转义
3)<#noautoesc></#noautoesc> <#autoesc></#autoesc>对一块代码转义
4)<#outputformat 'XML'></#outputformat>指定格式转义
<#assign mo1 ="<p>hell</p>"?esc>
HTLM:${mo1}
XML:<#outputformat 'XML'> ${mo1} </#outputformat>
RTF:<#outputformat 'RTF'> ${mo1} </#outputformat>