freemarker 基础语法学习笔记

80183053 2013-07-19

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

相关推荐