1.基本的输出

基本输出:${student.name}        (student的定义在本文末尾)
空值判断:${student.name?if_exists}
默认值:  ${student.name?default(‘xxx’)} 或 ${ book.name!"xxx"} 
日期格式:${student.birthday?string('yyyy-MM-dd')} 
数字格式:${student.age?string.number}   --> 20
boolean值:<#assign flag=ture />
          ${flag?string("yes","no")} <#-- yes -->
 
每次输出的时候最好是带个默认值,否则没有被赋值的变量就会抛出异常,那个黄黄的freemarker出错页面,真是让人看了太难过了

3 逻辑判断

a:if else 形式
<#if condition>
<#elseif condition2>
<#else>
</#if>

等于 =
大于 gt
小于 lt
大于等于 gte
小于等于 lte
 
使用方法很简单
<#if x gt 1>
..
</#if>

b:switch 形式
<#switch value>
<#case refValue1>    
      <#break>
<#case refValue2>    
     <#break>
<#case refValueN>    
     <#break>
<#default>    
</#switch>

4 循环

遍历普通list:
<#list someList as item>
</#list>
 
遍历list的前面几项:
<#assign x=3>
<#list 1..x as i>
  ${i}
</#list>
 
遍历map:
<#list nameMap.keySet() as name>
   ${nameMap.get(name)}
</#list>
  或者
<#list nameMap?keys as name>     
   ${nameMap.get(name)}                                     
</#list>
 
list排序输出:
<#list someList?sort_by(["name"]) as item>
     ${item.name}
</#list>
按照属性name进行排序(默认升序)
 
<#list somelist?sort_by(["name"])?reverse as item>
     ${item.name}
</#list>
按照属性name进行降序排序

list指令还隐含了两个循环变量:item_index:当前迭代项在所有迭代项中的位置,是数字值。
item_has_next:用于判断当前迭代项是否是所有迭代项中的最后一项。
 
map 关于map的key,它必须是String,这个在一定程度上限制了后台程序对于map的表达。

5 宏
1 基本用法
宏是和某个变量关联的模板片断,以便在模板中通过用户定义指令使用该变量,下面是一个例子:
<#macro greet>
  < font size="+2">Hello Joe!</font>
</#macro>
调用宏时,与使用freemarker的其他指令类似,只是使用@替代FTL标记中的#:
<@greet/>
 
2 在macro指令中可以在宏变量之后定义参数,如:
<#macro greet x1 x2>
  < font size="+2" color="${x2}">Hello ${x1}!</font>
</#macro>
可以这样使用该宏变量,其中参数的次序是无关的:<@greet x1="Fred" x2="black"/>
 
可以在定义参数时指定缺省值,否则,在调用宏的时候,必须对所有参数赋值:
<#macro greet x1 x2r="black">
  < font size="+2" color="${x2}">Hello ${x1}!</font>
</#macro>

注意:宏的参数是局部变量,只能在宏定义中有效。