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:&、\{:{
? ???注释使用<#-- 注释内容 -->