freemaker基础
来源 http://demojava.iteye.com/blog/800204
组成 1,文本 2,注释<#-- 注释部分 --> 3,插值:即${...}或#{...}格式的部分,将使用数据模型中的部分替代输出 4,FTL指令:名字前面加# <#-- 使用FTL指令 --> <#list animals as being><br> <li>${being.name} for ${being.price} Euros<br> <#list><br> FTL规则 1使用标签时用户指令用@,系统指令用# FreeMarker会忽略FTL标签中的空白字符.值得注意的是< , /> 和指令之间不允许有空白字符. 2插值规则 1)通用插值${expr} 2) (1)数字格式化插值#{expr},#{expr,format} <#settion number_format="currency"/> <#assign answer=42/> ${answer} ${answer?string} <#-- the same as ${answer} --> ${answer?string.number} ${answer?string.currency} ${answer?string.percent} ${answer} 输出结果是: $42.00 $42.00 42 $42.00 4,200% (2)数字格式化插值可采用#{expr;format}形式来格式化数字,其中format可以是: mX:小数部分最小X位 MX:小数部分最大X位 如下面的例子: <#assign x=2.582/> <#assign y=4/> #{x; M2} <#-- 输出2.58 --> #{y; M2} <#-- 输出4 --> #{x; m2} <#-- 输出2.6 --> #{y; m2} <#-- 输出4.0 --> #{x; m1M2} <#-- 输出2.58 --> #{x; m1M2} <#-- 输出4.0 --> 3,插值结果为日期值:根据默认格式(由#setting指令设置) ${lastUpdated?string("yyyy-MM-dd HH:mm:ss zzzz")} ${lastUpdated?string("EEE, MMM d, ''yy")} ${lastUpdated?string("EEEE, MMMM dd, yyyy, hh:mm:ss a '('zzz')'")} 输出结果是: 2008-04-08 08:08:08 Pacific Daylight Time Tue, Apr 8, '03 Tuesday, April 08, 2003, 08:08:08 PM (PDT) 4插值结果为布尔值:根据默认格式(由#setting指令设置) <#assign foo=true/> ${foo?string("yes", "no")} 输出结果是: yes 3表达式 3.1直接指定值,让FreeMarker直接输出插值中的值,注意转义 ${'我名字是\"annlee\"'} 3.2数值 1,数值不能省略小数点前面的0,所以".5"是错误的写法 2,数值8 , +8 , 8.00都是相同的 3.3布尔值 直接使用true和false,不使用引号. 3.4集合 <#list ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"] as x> ${x} </#list> 5.Map对象 5.1顶层变量 所谓顶层变量就是直接放在数据模型中的值,例如有如下数据模型: Map root = new HashMap(); //创建数据模型 root.put("name","annlee"); //name是一个顶层变量 对于顶层变量,直接使用${variableName}来输出变量值,变量名只能是字母,数字,下划线,$,@和#的组合,且不能以数字开头号.为了输出上面的name的值,可以使用如下语法: ${name} 5.2输出集合元素 如果需要输出集合元素,则可以根据集合元素的索引来输出集合元素,集合元素的索引以方括号指定.假设有索引:(类似数组) ["星期一","星期二","星期三","星期四","星期五","星期六","星期天"].该索引名为week,如果需要输出星期三,则可以使用如下语法: ${week[2]} //输出第三个集合元素 此外,FreeMarker还支持返回集合的子集合,如果需要返回集合的子集合,则可以使用如下语法: week[3..5] //返回week集合的子集合,子集合中的元素是week集合中的第4-6个元素 5.3输出map元素,支持:点语法和方括号法 book.author.name //全部使用点语法 book["author"].name book.author["name"] //混合使用点语法和方括号语法 book["author"]["name"] //全部使用方括号语法 5.4字符串操作 下面将user变量和常量连接起来: ${"hello, ${user}!"} //使用第一种语法来连接 ${"hello, " + user + "!"} //使用+号来连接 5.5Map连接运算符 Map对象的连接运算符+ 也可以将两个Map对象连接成一个新的Map对象,如果两个Map对象具有相同的key,则右边的值替代左边的值.看如下的例子: <#assign scores = {"语文":86,"数学":78} + {"数学":87,"Java":93}> 语文成绩是${scores.语文} 数学成绩是${scores.数学} Java成绩是${scores.Java} 输出结果是: 语文成绩是86 数学成绩是87 Java成绩是93 5.6支持算术运算符 5.7空值处理运算符 FreeMarker对空值的处理非常严格,没有被赋值的变量就会抛出异常 !:指定缺失变量的默认值,variable!或variable!defaultValue,第一种用法不给缺失的变量指定默认值,表明默认值是空字符串,长度为0的集合,或者长度为0的Map对象. ??:判断某个变量是否存在 4FTL常用指令 4.1 if <#assign age=23> <#if (age>60)>老年人 <#elseif (age>40)>中年人 <#elseif (age>20)>青年人 <#else> 少年人 </#if> 4.2 switch , case , default , break指令 <#switch value> <#case refValue>...<#break> <#case refValue>...<#break> <#default>... </#switch> 4.3 list,break <#list sequence as item> ... </#list> 4.4include指令的作用类似于JSP的包含指令, 4.5mport指令 该指令用于导入FreeMarker模板中的所有变量,并将该变量放置在指定的Map对象中,import指令的语法格式如下:<#import "/lib/common.ftl" as com> 4.6 noparse指令指定FreeMarker不处理该指定里包含的内容 4.7escape指令导致body区的插值都会被自动加上escape表达式,但不会影响字符串内的插值,只会影响到body内出现的插值 <#escape x as x?html> First name:${firstName} Last name:${lastName} Maiden name:${maidenName} </#escape> 上面的代码等同于: First name:${firstName?html} Last name:${lastName?html} Maiden name:${maidenName?html} escape指令在解析模板时起作用而不是在运行时起作用,除此之外,escape指令也嵌套使用,子escape继承父escape的规则,如下例子: <#escape x as x?html> Customer Name:${customerName} Items to ship; <#escape x as itemCodeToNameMap[x]> ${itemCode1} ${itemCode2} ${itemCode3} ${itemCode4} </#escape> </#escape> 上面的代码类似于: Customer Name:${customerName?html} Items to ship; ${itemCodeToNameMap[itemCode1]?html} ${itemCodeToNameMap[itemCode2]?html} ${itemCodeToNameMap[itemCode3]?html} ${itemCodeToNameMap[itemCode4]?html} 对于放在escape指令中所有的插值而言,这此插值将被自动加上escape表达式,如果需要指定escape指令中某些插值无需添加escape表达式,则应该使用noescape指令,放在noescape指令中的插值将不会添加escape表达式. 4.8.8 assign指令 assign指令在前面已经使用了多次,它用于为该模板页面创建或替换一个顶层变量 4.9 setting指令 该指令用于设置FreeMarker的运行环境 4.10 macro , nested , return指令 #macro name param1 param2 ... paramN> ... <#nested loopvar1, loopvar2, ..., loopvarN> ... <#return> ... </#macro> 例子: <#macro book booklist> //定义一个自定义指令booklist是参数 <#list booklist as book> ${book} </#list> </#macro> <@book booklist=["spring","j2ee"] /> //使用刚刚定义的指令 上面的代码为book指令传入了一个参数值,上面的代码的输出结果为:spring j2ee
给笨笨的自己提个醒>_<~