1、空值的判断(!的使用)
对于null,或者miss value,freemarker会报错
我们可以使用 感叹号 来进行空值的判断
 例如${user.group!"空值"}
 如果user里没有group这个属性的值,那么它就会输出"空值"
 再例如 ${user.group.name!"空值"},这样使用就是不可以的,这样写依然会报错,因为freemarker仅仅只会判断group.name是不是空值
 所以我们应该这样写${(user.group.name)!"空值"},使用括号括起来之后就会去判断里面每一个是否是空值(连续判断) 
$(demo!)  或者 ${demo!"默认值"} :如果demo是空,那么就使用空字符串或者默认值来代替

2、if指令
<#if condifition> 
 <#elseif condifition> 
<#else> 
</#if>
 Boolean类型的空值判断 
 空值判断可以写成<#if book.name?? > //注意${}为变量的渲染显示,而<>为定义等操作符的定义,在if里面不能使用$符号  ——
<#if demoList??>两个问号判断是否是空值,返回bool
 <#if ${user.login??}>或<#if "${user.login??}">都是错误的;<#if user.login??>是正确的。 
 

 3、数字格式化
 数字格式化插值可采用#{expr;format}形式来格式化数字,其中format可以是: 
 mX:小数部分最小X位 
 MX:小数部分最大X位eg:#{hotgood.spCost ;m2M2}  最大两位,最小两位---显示两位 
注:hotgood.spCost} ;m2M2}  不要这样写 4、list--break
 
  <#list sequence as item> 
                      </#list>

                     item_has_next    :是否存在下一个对象.
                     例子:
                      <#list ${demoList} as  item>
item_index + 1}.${x}
 item_has_next>,</#if>——当前变量的索引值.   <#if item_index == 0> 在if中不能使用$/#符号,直接使用就行
 item="星期四"><#break></#if>
                       </#list>
                            输出结果:
                                   1.星期一,
                                   2.星期二,
                                   3.星期三,
.星期四,
5、常用

FreeMarker的插值有如下两种类型:1,通用插值${expr};2,数字格式化插值:#{expr}或#{expr;format} 
 ${book.name?if_exists } //用于判断如果存在,就输出这个值 
 ${book.name?default(‘xxx’)}//默认值xxx 
 ${book.name!"xxx"}//默认值xxx 
 ${book.date?string('yyyy-MM-dd')} //日期格式 
 ${book?string.number} 20 //三种不同的数字格式 
 ${book?string.currency}--<#-- $20.00 --> 
 ${book?string.percent}—<#-- 20% --> <#assign foo=ture /> //声明变量,插入布尔值进行显示 
 ${foo?string("yes","no")} <#-- yes --> 大小比较符号使用需要注意:(xml的原因),可以用于比较数字和日期 
 使用lt、lte、gt和gte来替代<、<=、>和>= 也可以使用括号<#if (x>y)> 

 6、定义变量 
<#-- 定义变量 -->
 <#assign myname="Jadyer"/>
 ${myname}


 <#-- 定义数字 -->
 <#assign mynum=10/>
 ${mynum + 20}


 <#-- 定义字符串 -->
 <#assign mystr="55"/>
 ${mystr + 20}
 <#-- 下面的变量会覆盖上面定义的同名变量,而不会顾及数据类型是否一致 -->
 <#assign mystr=55/>
 ${mystr + 20}
<#-- 下面的两种写法是等价的,它们连接字符串的方式分别为:字符串连接方式和插值连接方式 -->
 ${"hello,welcome:" + username}
 ${"hello,welcome:${username}"} 7、布尔值和日期的输出
 <#-- 定义布尔型 -->    直接使用true和false,不使用引号.:下面是输出,这说的是判断 
<#-- 如果直接输出${myflag}则会报错,因为FreeMarker不能直接输出数字或字符串以外的东西,否则都会报错 -->
<#-- 此时需要将其转换为字符串才能输出:使用xxx?string可以完成对字符串的转换。另外??用于判断变量是否存在 -->
 <#assign myflag=true/>
 ${myflag?string}
 ${myflag?string("isTrue","isFalse")}
 ${(user.name)???string("user.nameIsTrue","user.nameIsFalse")} 

 <#-- 日期类型的处理。如果直接输出${currTime}则会报错,此时仍需将其转换为字符串 -->
 ${currTime?string("yyyy-MM-dd HH:mm:ss")} 插值结果为日期值:根据默认格式(由#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) 
 
 
 
 
 
 
 
 
 
 
 
 
 
 <#if demoList??>
          <#list demoList as demo>  
                  <#if demo_index == 0>
                      <dl class="sort unfold" id="${demo_index!}">
                  <#else>
                      <dl class="sort" id="${demo_index!}">
                  </#if>
              
                 <dt><i></i>${demo.head!}</dt> 
                  <#list demo.contents as content> 
                      <dd><a href="#">${content!}</a></dd>  
                 </#list> 
             </dl>
         </#list>
      </#if>