freemarker 基础语法学习笔记
一.FreeMarker简介:
1.FreeMarker是一个模板引擎,一个基于模板生成HTML/XML/RTF/Java源代码等等的通用工具,使用纯Java编写
2.FreeMarker与容器无关,因为它并不知道HTTP或Servlet,也可以在FreeMarker模板中使用JSP标记库 //支持JSP标记库
3.FreeMarker是一个轻量级组件(易于嵌入到产品中),不需要Servlet环境
4.可以在FreeMarker模板中清楚和直觉地访问XML对象模型 //如:用<#recurse>和<#visit>指令(2.3版本)结构递归遍历XML树
5.FreeMarker页面的扩展/后缀名为.ftl
二.FreeMarker中的指令语法:
ftl页面支持所有Html标记和js、css语法,ftl指令区分大小写,ftl页面中的<script>中也可使用ftl指令
注:ftl中可以使用内置函数操作/维护与Java后台程序无关的string、list和map等,如:通过索引访问list元素、获得子list、合并list、对list排序,通过key变量访问map元素
、检查map是否为空、获得key或值的list
1.ftl中判断对象/字符串是否为null:
在<#if>指令中用Object或String?exists判断,在${}指令中用Object或String?if_exists输出布尔形式判断
2.ftl中对字符串的处理
${String?string("yyyy-MM-dd HH:mm:ss zzzz")/("EEE,MMM d,''yy")/("EEEE,MMMM dd,yyyy,hh:mm:ss a '('zzz')'")} //日期格式化
${String?substring(startIndex,endIndex)} //截取字符串,还可以用更简单的${String[0..number]}
${String?split("*")} //用指定的分隔符将字符串拆分成数组
${String?replace("字符串中指定的子串","替换后的子串"[,"规则参数"])} //将字符串中的子串从左到右替换为指定的子串,规则参数有:i、r、m、s、c、f,具体含义如下:
i:不区分大小写
f:只替换第一个出现被替换字符串的字符串
r:表示第二个参数(替换后的子串)是正则表达式
m:
s:
c:
${String?length} //获取字符串长度
${String?trim} //字符串去空格
${String?upper_case} //将字母字符串转为大写
${String?capitalize} //将字母字符串的每个单词的首字母转为大写
${String?lower_case} //将字母字符串转为小写
${String?cap_first} //将字符串中的第一个字符转为大写
${String?uncap_first} //将字符串中的第一个字符转为小写
${String?ends_with("str")} //判断字符串是否以指定子串结尾/返回布尔值
${String?index_of("查找的子串"[,开始查找的索引])} //在字符串中查找子串第一次出现处的索引,没有找到则返回-1
${String?contains("str")} //判断字符串中是否包含子串,返回布尔值
${String?number} //将字符串转为数字
${bool?string("yes/是","no/否")} //布尔值格式化
3.ftl中对整型的处理:
#{int?c} //将数字转为字符串,还可用#{int?string}
#{int?string.currency} //将数字转为货币(¥)形式,还可用#{int?string("currency")}
#{int?string.percent} //将数字转为百分比(%)形式,还可用${int?string("percent")}
数字格式化:#{变量;format},其中format可以是:mn:小数部分最少n位,Mn:小数部分最多n位;如:
<#assign a=2.582/>,<#assign b=4/>
#{a;M2} //输出2.58
#{a;m2} //输出2.58
#{b;m2} //输出4.00
#{a;m1M2} //输出2.58
#{b;m1M2} //输出4.0
4.ftl中的控制结构:
(1).<#if>、<#else>/<#else if>、</#if>
判断对象是否为空:?exists
判断变量是否为空:?if_exists
判断集合/数组中是否有数据:?has_content
(2).switch结构:
<#switch 变量>
<#case value>...<#break>
<#case value>...<#break>
<#default>...<#break>
</#switch>
5.ftl中的循环结构:<#list 4个范围内的集合/数组 as 遍历的集合/数组中的对象的别名>循环体</#list> //ftl中的循环也支持break子句
获取集合的当前循环索引:集合的别名_index
判断是否达到最后一次循环:集合的别名_has_next //返回true/false
注:ftl中可以使用类似[i]语法的索引方式访问集合/数组中的元素、可以在循环外访问循环体内的控制变量
6.ftl访问集合/数组:
集合对象?first //获取集合中的第一个值
集合对象?last //获取集合中的最后一个值
集合对象?reverse //将集合中的顺序反转(即倒序排序)
集合对象?size //获取集合中的元素个数
集合对象?sort //将集合中的对象转化为字符串后顺序排序
集合对象?sort_by(value) //按集合中对象的属性value进行排序
7.ftl访问Hash:
hash对象?keys //返回hash中的所有key,返回结果为集合
hash对象?values //返回hash中的所有value,返回结果为sequence
8.ftl中定义变量:
(1).使用<#assign 变量名="值">指令定义局部变量 //用于在页面创建或替换一个变量(当前ftl范围内/page范围内的变量声明,在宏定义体中有效)
(2).plain变量:可以在模板的任何地方访问,包括使用include指令插入的模板,
(3).使用local指令创建和替换
9.ftl中的运算符:
比较运算符可以用gt、gte、、lt、lte、或>、>=、==、<、<=、!= //不推荐使用后者(因为麻烦),因为Freemarker会将>解释成FTL标记的结束字符,故对于>和>=要用括号括起来(如:& lt;#if (x>y)>)
算术运算符:+、-、*、/、%
逻辑操作符:&&:and、||:or、!:not //只能用于布尔值
<#recurse>和<#visit>指令 //递归遍历XML树,访问XML对象模型
10.import指令:用于导入FreeMarker模板中的所有变量,并将该变量放置在指定的Map对象中
<#import "/lib/common.ftl" as com> //此处将导入/lib/common.ftl模板文件中的所有变量,将这些变量放置在一个名为com的Map对象中
11.include指令:用于包含指定页面(类似JSP的包含指令,如:<#include "/common/copyright.ftl" encoding="GBK">)
12.setting指令:用来设置ftl使用的环境,如:<#setting locale="en_US">
13.ftl中的宏:宏相当于程序中的函数,可以传参,可以调用宏以执行宏体内的内容,在那里调用宏宏体中的内容就相当于写在那里。以便在模板中通过用户定义指令使用该变量
(1).宏的定义:用macro指令定义,如:<#macro 宏名 [宏的输入参数名 ...(可选)]>Hello Joe!</#macro> //创建时可带多个参数,可在定义时指定参数的缺省值,否则在调用宏
时必须对所有参数赋值,宏的参数只在宏范围中有效,在宏体中使用宏中的参数用${参数名}
(2).宏的调用:使用@表示调用宏,可以是双标签也可以是单标签,如:<@宏名 [宏的输入参数名="值" ...(可选,当宏定义中带参时这里才有参数)]></@宏名> //宏调用中可嵌套
调用其它宏,调用的同时给多个参数赋值,如果在定义时指定了参数的缺省值则在调用时可以不用给参数赋值,否则必须对所有参数赋值
(3).宏嵌套html/其它内容:宏嵌套html/其它内容使用<#nested>指令,在宏定义/体中用<#nested>指令将调用宏时的html/其它内容嵌套到<#nested>指令所在的位置,调用宏时
在调用宏体中输入html/其它内容即可嵌套到宏体中,如:
定义时加入<#nested>指令将嵌套内容加入到<#nested>指令处:<#macro 宏名>
<table border=4 cellspacing=0 cellpadding=4><tr><td>
<#nested>
</tr></td></table>
</#macro>
调用时在调用宏体中加入要嵌套的内容:<@宏名>嵌套内容</@宏名>,输出:<table border=4 cellspacing=0 cellpadding=4><tr><td>嵌套内容</tr></td>< /table>
n.ftl中的其它用法:
取值:${4个范围内的非int型的任意对象},#{4个范围内的int型变量}
ftl中调用对象或action中的方法
使用${对象.方法}调用对象的方法
使用${action.方法名}调用当前action中的方法
支持其它语言一样的转义序列:\g:大于号、\l:小于号、\":双引号、\':单引号、\\:反斜杠、\n:换行、\r:Return、\t:Tab(制表符)、\b:Backspace(退格)、\f:Form feed、\a:&、\{:{
注释使用<#-- 注释内容 -->