<html>
<head>
<title>Freemaker FTL指令常用标签及语法</title>
</head>
<body>
FTL指令常用标签及语法
<p><strong><span style="color:#ff0000">注意:</span></strong>使用freemaker,要求所有标签必须闭合,否则会导致freemaker无法解析。</p>
<p>freemaker注释:<#-- 注释内容 -->格式部分,不会输出</p>
<h2><span style="color:#ff0000">---------------------------------- 基础语法 ----------------------------------</span></h2>
<h3><span style="color:#0000ff">1、字符输出</span></h3>
<div class="cnblogs_code">
<pre>${emp.name?if_exists} <span style="color:#008000">//</span><span style="color:#008000"> 变量存在,输出该变量,否则不输出</span>
${emp.name!} <span style="color:#008000">//</span><span style="color:#008000"> 变量存在,输出该变量,否则不输出</span>
<span style="color:#000000">
${emp.name</span>?<span style="color:#0000ff">default</span>("xxx")} <span style="color:#008000">//</span><span style="color:#008000"> 变量不存在,取默认值xxx </span>
${emp.name!"xxx"} <span style="color:#008000">//</span><span style="color:#008000"> 变量不存在,取默认值xxx</span></pre>
</div>
<p>常用内部函数:</p>
<div class="cnblogs_code">
<pre>${"123<br>456"?html} <span style="color:#008000">//</span><span style="color:#008000"> 对字符串进行HTML编码,对html中特殊字符进行转义</span>
${"str"?cap_first} <span style="color:#008000">//</span><span style="color:#008000"> 使字符串第一个字母大写 </span>
${"Str"?lower_case} <span style="color:#008000">//</span><span style="color:#008000"> 将字符串转换成小写 </span>
${"Str"?upper_case} <span style="color:#008000">//</span><span style="color:#008000"> 将字符串转换成大写</span>
${"str"?trim} <span style="color:#008000">//</span><span style="color:#008000"> 去掉字符串前后的空白字符</span></pre>
</div>
<p>字符串的两种拼接方式拼接:</p>
<div class="cnblogs_code">
<pre>${"hello${emp.name!}"} <span style="color:#008000">//</span><span style="color:#008000"> 输出hello+变量名</span>
${"hello"+emp.name!} <span style="color:#008000">//</span><span style="color:#008000"> 使用+号来连接,输出hello+变量名</span></pre>
</div>
<p>可以通过如下语法来截取子串:</p>
<div class="cnblogs_code">
<pre><#assign str = "abcdefghijklmn"/>
<span style="color:#008000">//</span><span style="color:#008000"> 方法1</span>
${str?substring(0,4)} <span style="color:#008000">//</span><span style="color:#008000"> 输出abcd
</span><span style="color:#008000">//</span><span style="color:#008000"> 方法2</span>
${str[0]}${str[4]} <span style="color:#008000">//</span><span style="color:#008000"> 结果是ae</span>
${str[1..4]} <span style="color:#008000">//</span><span style="color:#008000"> 结果是bcde
</span><span style="color:#008000">//</span><span style="color:#008000"> 返回指定字符的索引</span>
${str?index_of("n")}</pre>
</div>
<h3><span style="color:#0000ff">2、日期输出</span></h3>
<div class="cnblogs_code">
<pre>${emp.date?string('yyyy-MM-dd')} <span style="color:#008000">//</span><span style="color:#008000">日期格式</span></pre>
</div>
<h3><span style="color:#0000ff">3、数字输出(以数字20为例)</span></h3>
<div class="cnblogs_code">
<pre>${emp.name?string.number} <span style="color:#008000">//</span><span style="color:#008000"> 输出20</span>
${emp.name?string.currency} <span style="color:#008000">//</span><span style="color:#008000"> ¥20.00 </span>
${emp.name?string.percent} <span style="color:#008000">//</span><span style="color:#008000"> 20%</span>
${1.222?<span style="color:#0000ff">int</span>} <span style="color:#008000">//</span><span style="color:#008000"> 将小数转为int,输出1</span>
<#setting number_format="percent"/> <span style="color:#008000">//</span><span style="color:#008000"> 设置数字默认输出方式('percent',百分比)</span>
<#assign answer=42/> <span style="color:#008000">//</span><span style="color:#008000"> 声明变量 answer 42</span>
#{answer} <span style="color:#008000">//</span><span style="color:#008000"> 输出 4,200%</span>
${answer?string} <span style="color:#008000">//</span><span style="color:#008000"> 输出 4,200%</span>
${answer?string.number} <span style="color:#008000">//</span><span style="color:#008000"> 输出 42</span>
${answer?string.currency} <span style="color:#008000">//</span><span style="color:#008000"> 输出 ¥42.00</span>
${answer?string.percent} <span style="color:#008000">//</span><span style="color:#008000"> 输出 4,200%</span>
#{answer} <span style="color:#008000">//</span><span style="color:#008000"> 输出 42</span>
</pre>
</div>
<pre><span>数字格式化插值可采用#{expr;format}形式来格式化数字,其中format可以是:
mX:小数部分最小X位
MX:小数部分最大X位</span></pre>
<div class="cnblogs_code">
<pre><span style="color:#000000">如下面的例子:
</span><#assign x=2.582/>
<#assign y=4/><span style="color:#000000">
#{x; M2} </span><span style="color:#008000">//</span><span style="color:#008000"> 输出2.58</span>
#{y; M2} <span style="color:#008000">//</span><span style="color:#008000"> 输出4</span>
#{x; m2} <span style="color:#008000">//</span><span style="color:#008000"> 输出2.58</span>
#{y; m2} <span style="color:#008000">//</span><span style="color:#008000"> 输出4.0</span>
#{x; m1M2} <span style="color:#008000">//</span><span style="color:#008000"> 输出2.58</span>
#{x; m1M2} <span style="color:#008000">//</span><span style="color:#008000"> 输出4.0</span></pre>
</div>
<h3><span style="color:#0000ff">4、申明变量</span></h3>
<div class="cnblogs_code">
<pre><#assign foo=<span style="color:#0000ff">false</span>/> <span style="color:#008000">//</span><span style="color:#008000"> 声明变量,插入布尔值进行显示,注意不要用引号</span>
${foo?string("yes","no")} <span style="color:#008000">//</span><span style="color:#008000"> 当为true时输出"yes",否则输出"no"</span></pre>
</div>
<p>申明变量的几种方式</p>
<div class="cnblogs_code">
<pre><#assign name=value>
<#assign name1=value1 name2=value2 ... nameN=valueN>
<#assign same as above... in namespacehash>
<#assign name><span style="color:#000000">
capture </span><span style="color:#0000ff">this</span>
</#assign>
<#assign name in namespacehash><span style="color:#000000">
capture </span><span style="color:#0000ff">this</span>
</#assign></pre>
</div>
<h3><span style="color:#0000ff">5、比较运算符</span></h3>
<p>表达式中支持的比较运算符有如下几个:<br>
= 或 == :判断两个值是否相等.<br>
!= :判断两个值是否不等.<br>
> 或 gt :判断左边值是否大于右边值<br>
>= 或 gte :判断左边值是否大于等于右边值<br>
< 或 lt :判断左边值是否小于右边值<br>
<= 或 lte :判断左边值是否小于等于右边值</p>
<h3><span style="color:#0000ff">6、算术运算符</span></h3>
<p>FreeMarker表达式中完全支持算术运算,<br>
FreeMarker支持的算术运算符包括:+, - , * , / , % <br>
注意:<br>
(1)、运算符两边必须是数字<br>
(2)、使用+运算符时,如果一边是数字,一边是字符串,就会自动将数字转换为字符串再连接,如:${3 + "5"},结果是:35</p>
<h3><span style="color:#0000ff">7、逻辑运算符</span></h3>
<p>逻辑运算符有如下几个:<br>
逻辑与:&&<br>
逻辑或:||<br>
逻辑非:!<br>
逻辑运算符只能作用于布尔值,否则将产生错误</p>
<h3><span style="color:#0000ff">8、FreeMarker中的运算符优先级如下(由高到低排列):</span></h3>
<p>①、一元运算符:!<br>
②、内建函数:?<br>
③、乘除法:*, / , %<br>
④、加减法:- , +<br>
⑤、比较:> , < , >= , <= (lt , lte , gt , gte)<br>
⑥、相等:== , = , !=<br>
⑦、逻辑与:&&<br>
⑧、逻辑或:||<br>
⑨、数字范围:..<br>
实际上,我们在开发过程中应该使用括号来严格区分,这样的可读性好,出错少</p>
<h3><span style="color:#0000ff">9、if 逻辑判断(注意:elseif 不加空格)</span></h3>
<div class="cnblogs_code">
<pre><#<span style="color:#0000ff">if</span> condition><span style="color:#000000">
...
</span><#elseif condition2><span style="color:#000000">
...
</span><#elseif condition3><span style="color:#000000">
...
</span><#<span style="color:#0000ff">else</span>><span style="color:#000000">
...
</span></#<span style="color:#0000ff">if</span>></pre>
</div>
<p>if 空值判断</p>
<div class="cnblogs_code">
<pre><span style="color:#008000">//</span><span style="color:#008000"> 当 photoList 不为空时</span>
<#<span style="color:#0000ff">if</span> photoList??>...</#<span style="color:#0000ff">if</span>><span style="color:#000000">
值得注意的是,${..}只能用于文本部分,不能用于表达式,下面的代码是错误的:
</span><#<span style="color:#0000ff">if</span> ${isBig}>Wow!</#<span style="color:#0000ff">if</span>>
<#<span style="color:#0000ff">if</span> "${isBig}">Wow!</#<span style="color:#0000ff">if</span>>
<span style="color:#008000">//</span><span style="color:#008000"> 正确写法</span>
<#<span style="color:#0000ff">if</span> isBig>Wow!</#<span style="color:#0000ff">if</span>> </pre>
</div>
<h3><span style="color:#0000ff">10、switch (条件可为数字,可为字符串)</span></h3>
<div class="cnblogs_code">
<pre><#<span style="color:#0000ff">switch</span> value>
<#<span style="color:#0000ff">case</span> refValue1><span style="color:#000000">
....
</span><#<span style="color:#0000ff">break</span>>
<#<span style="color:#0000ff">case</span> refValue2><span style="color:#000000">
....
</span><#<span style="color:#0000ff">break</span>>
<#<span style="color:#0000ff">case</span> refValueN><span style="color:#000000">
....
</span><#<span style="color:#0000ff">break</span>>
<#<span style="color:#0000ff">default</span>><span style="color:#000000">
....
</span></#<span style="color:#0000ff">switch</span>></pre>
</div>
<h3>11、集合 & 循环</h3>
<div class="cnblogs_code">
<pre><span style="color:#008000">//</span><span style="color:#008000"> 遍历集合:</span>
<#list empList! as emp><span style="color:#000000">
${emp.name</span>!<span style="color:#000000">}
</span></#list>
<span style="color:#008000">//</span><span style="color:#008000"> 可以这样遍历集合:</span>
<#list 0..(empList!?size-1) as i><span style="color:#000000">
${empList[i].name</span>!<span style="color:#000000">}
</span></#list>
<span style="color:#008000">//</span><span style="color:#008000"> 与jstl循环类似,也可以访问循环的状态。</span>
<span style="color:#000000">
empList</span>?size <span style="color:#008000">//</span><span style="color:#008000"> 取集合的长度</span>
emp_index: <span style="color:#008000">//</span><span style="color:#008000"> int类型,当前对象的索引值 </span>
emp_has_next: <span style="color:#008000">//</span><span style="color:#008000"> boolean类型,是否存在下一个对象
</span><span style="color:#008000">//</span><span style="color:#008000"> 使用<#break>跳出循环</span>
<#<span style="color:#0000ff">if</span> emp_index = 0><#<span style="color:#0000ff">break</span>></#<span style="color:#0000ff">if</span>>
<span style="color:#008000">//</span><span style="color:#008000"> 集合长度判断 </span>
<#<span style="color:#0000ff">if</span> empList?size != 0></#<span style="color:#0000ff">if</span>> <span style="color:#008000">//</span><span style="color:#008000"> 判断=的时候,注意只要一个=符号,而不是==</span>
<#assign l=0..100/> <span style="color:#008000">//</span><span style="color:#008000"> 定义一个int区间的0~100的集合,数字范围也支持反递增,如100..2</span>
<#list 0..100 as i> <span style="color:#008000">//</span><span style="color:#008000"> 等效于java for(int i=0; i <= 100; i++)</span>
<span style="color:#000000">${i}
</span></#list>
<span style="color:#008000">// </span><span style="color:#008000">截取子集合:</span>
empList[3..5] <span style="color:#008000">//</span><span style="color:#008000">返回empList集合的子集合,子集合中的元素是empList集合中的第4-6个元素
</span><span style="color:#008000">// </span><span style="color:#008000">创建集合:</span>
<#list ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"] as x>
<span style="color:#008000">// </span><span style="color:#008000">集合连接运算,将两个集合连接成一个新的集合</span>
<#list ["星期一","星期二","星期三"] + ["星期四","星期五","星期六","星期天"] as x>
<span style="color:#008000">// </span><span style="color:#008000">除此之外,集合元素也可以是表达式,例子如下:</span>
[2 + 2, [1, 2, 3, 4], "whatnot"<span style="color:#000000">]
</span><span style="color:#008000">// </span><span style="color:#008000">seq_contains:判断序列中的元素是否存在</span>
<#assign x = ["red", 16, "blue", "cyan"]><span style="color:#000000">
${x</span>?seq_contains("blue")?string("yes", "no")} <span style="color:#008000">//</span><span style="color:#008000"> yes</span>
${x?seq_contains("yellow")?string("yes", "no")} <span style="color:#008000">//</span><span style="color:#008000"> no</span>
${x?seq_contains(16)?string("yes", "no")} <span style="color:#008000">//</span><span style="color:#008000"> yes</span>
${x?seq_contains("16")?string("yes", "no")} <span style="color:#008000">//</span><span style="color:#008000"> no
</span><span style="color:#008000">// </span><span style="color:#008000">seq_index_of:第一次出现的索引</span>
<#assign x = ["red", 16, "blue", "cyan", "blue"]><span style="color:#000000">
${x</span>?seq_index_of("blue")} <span style="color:#008000">//</span><span style="color:#008000"> 2
</span><span style="color:#008000">// </span><span style="color:#008000">sort_by:排序(升序)</span>
<#list movies?sort_by("showtime") as movie></#list>
<span style="color:#008000">// sort_by:排序(降序)</span>
<#list movies?sort_by("showtime")?reverse as movie></#list>
<span style="color:#008000">// </span><span style="color:#008000">具体介绍:
</span><span style="color:#008000">// </span><span style="color:#008000">不排序的情况:</span>
<#list movies as moive>
<a href="${moive.url}">${moive.name}</a>
</#list>
<span style="color:#008000">//</span><span style="color:#008000">要是排序,则用</span>
<#list movies?sort as movie>
<a href="${movie.url}">${movie.name}</a>
</#list>
<span style="color:#008000">// </span><span style="color:#008000">这是按元素的首字母排序。若要按list中对象元素的某一属性排序的话,则用</span>
<#list moives?sort_by(["name"]) as movie>
<a href="${movie.url}">${movie.name}</a>
</#list>
<span style="color:#008000">//</span><span style="color:#008000">这个是按list中对象元素的[name]属性排序的,是升序,如果需要降序的话,如下所示:</span>
<#list movies?sort_by(["name"])?reverse as movie>
<a href="${movie.url}">${movie.name}</a>
</#list></pre>
</div>
<h3><span style="color:#0000ff">12、Map对象</span></h3>
<div class="cnblogs_code">
<pre><span style="color:#008000">//</span><span style="color:#008000"> 创建map</span>
<#assign scores = {"语文":86,"数学":78}>
<span style="color:#008000">//</span><span style="color:#008000"> Map连接运算符</span>
<#assign scores = {"语文":86,"数学":78} + {"数学":87,"Java":93}>
<span style="color:#008000">//</span><span style="color:#008000"> Map元素输出</span>
emp.name <span style="color:#008000">//</span><span style="color:#008000"> 全部使用点语法</span>
emp["name"] <span style="color:#008000">//</span><span style="color:#008000"> 使用方括号</span></pre>
</div>
<h3><span style="color:#0000ff">13、FreeMarker支持如下转义字符:</span></h3>
<p>\" :双引号(u0022)<br>
\' :单引号(u0027)<br>
\\ :反斜杠(u005C)<br>
\n :换行(u000A)<br>
\r :回车(u000D)<br>
\t :Tab(u0009)<br>
\b :退格键(u0008)<br>
\f :Form feed(u000C)<br>
\l :<<br>
\g :><br>
\a :&<br>
\{ :{<br>
\xCode :直接通过4位的16进制数来指定Unicode码,输出该unicode码对应的字符.</p>
<p>如果某段文本中包含大量的特殊符号,FreeMarker提供了另一种特殊格式:可以在指定字符串内容的引号前增加r标记,在r标记后的文件将会直接输出.看如下代码:<br>
${r"${foo}"} // 输出 ${foo}<br>
${r"C:/foo/bar"} // 输出 C:/foo/bar</p>
<h3><span style="color:#0000ff">14、include指令</span></h3>
<div class="cnblogs_code">
<pre><span style="color:#008000">//</span><span style="color:#008000"> include指令的作用类似于JSP的包含指令:</span>
<#include "/test.ftl" encoding="UTF-8" parse=<span style="color:#0000ff">true</span>>
<span style="color:#008000">//</span><span style="color:#008000"> 在上面的语法格式中,两个参数的解释如下:</span>
encoding="GBK" <span style="color:#008000">//</span><span style="color:#008000"> 编码格式</span>
parse=<span style="color:#0000ff">true</span> <span style="color:#008000">// </span><span style="color:#008000">是否作为ftl语法解析,默认是true,false就是以文本方式引入,</span><span style="color:#008000">注意:在ftl文件里布尔值都是直接赋值的如parse=true,而不是parse="true"</span></pre>
</div>
<h3><span style="color:#0000ff">15、import指令</span></h3>
<div class="cnblogs_code">
<pre><span style="color:#008000">//</span><span style="color:#008000"> 类似于jsp里的import,它导入文件,然后就可以在当前文件里使用被导入文件里的宏组件</span>
<#<span style="color:#0000ff">import</span> "/libs/mylib.ftl" as my>
<span style="color:#008000">//</span><span style="color:#008000"> 上面的代码将导入/lib/common.ftl模板文件中的所有变量,交将这些变量放置在一个名为com的Map对象中,"my"在freemarker里被称作namespace</span></pre>
</div>
<h3><span style="color:#0000ff">17、compress 压缩</span></h3>
<div class="cnblogs_code">
<pre><span style="color:#008000">//</span><span style="color:#008000"> 用来压缩空白空间和空白的行 </span>
<#compress><span style="color:#000000">
...
</span></#compress></pre>
</div>
<div class="cnblogs_code">
<pre><#t> <span style="color:#008000">//</span><span style="color:#008000"> 去掉左右空白和回车换行 </span>
<#lt><span style="color:#008000">//</span><span style="color:#008000"> 去掉左边空白和回车换行 </span>
<#rt><span style="color:#008000">//</span><span style="color:#008000"> 去掉右边空白和回车换行 </span>
<#nt><span style="color:#008000">//</span><span style="color:#008000"> 取消上面的效果</span></pre>
</div>
<h3><span style="color:#0000ff">18、escape,noescape 对字符串进行HTML编码</span></h3>
<div class="cnblogs_code">
<pre><span style="color:#008000">//</span><span style="color:#008000"> escape指令导致body区的插值都会被自动加上escape表达式,但不会影响字符串内的插值,只会影响到body内出现的插值,使用escape指令的语法格式如下:</span>
<#escape x as x?html><span style="color:#000000">
First name: ${firstName}
</span><#noescape>Last name: ${lastName}</#noescape><span style="color:#000000">
Maiden name: ${maidenName}
</span></#escape>
<span style="color:#008000">//</span><span style="color:#008000"> 相同表达式</span>
First name: ${firstName?<span style="color:#000000">html}
Last name: ${lastName}
Maiden name: ${maidenName</span>?html}</pre>
</div>
<h2><span style="color:#ff0000">---------------------------------- 高级语法 ----------------------------------</span></h2>
<h3><span style="color:#0000ff">1、global全局赋值语法</span></h3>
<div class="cnblogs_code">
<pre><#global name=value>
<#global name1=value1 name2=value2 ... nameN=valueN>
<#global name><span style="color:#000000">
capture </span><span style="color:#0000ff">this</span>
</#global>
<span style="color:#008000">//</span><span style="color:#008000"> 利用这个语法给变量赋值,那么这个变量在所有的namespace中是可见的,如果这个变量被当前的assign语法覆盖如<#global x=2><#assign x=1>在当前页面里x=2将被隐藏,或者通过${.globals.x} 来访问</span></pre>
</div>
<h3><span style="color:#0000ff">2、setting 语法</span></h3>
<div class="cnblogs_code">
<pre><span style="color:#008000">//</span><span style="color:#008000"> 用来设置整个系统的一个环境 </span>
locale <span style="color:#008000">//</span><span style="color:#008000"> zh_CN 中文环境</span>
<span style="color:#000000">number_format
boolean_format
date_format , time_format , datetime_format
time_zone
classic_compatible
</span><span style="color:#008000">//</span><span style="color:#008000"> 例1:</span>
<#setting number_format="percent"/> <span style="color:#008000">//</span><span style="color:#008000"> 设置数字默认输出方式('percent',百分比)
</span><span style="color:#008000">//</span><span style="color:#008000"> 例2:
</span><span style="color:#008000">//</span><span style="color:#008000"> 假如当前是匈牙利的设置,然后修改成美国</span>
${1.2} <span style="color:#008000">//</span><span style="color:#008000"> 输出1,2</span>
<#setting locale="en_US"><span style="color:#000000">
${</span>1.2} <span style="color:#008000">//</span><span style="color:#008000"> 输出1.2,因为匈牙利是采用", "作为十进制的分隔符,美国是用". "</span></pre>
</div>
<h3><span style="color:#0000ff">3、macro宏指令</span></h3>
<p>例子1:</p>
<div class="cnblogs_code">
<pre><#-- 定义宏 -->
<#macro test foo bar="Bar" baaz=-1><span style="color:#000000">
Text: ${foo}, ${bar}, ${baaz}
</span></#macro>
<#-- 使用宏 -->
<@test foo="a" bar="b" baaz=5*5/> <span style="color:#008000">//</span><span style="color:#008000"> 输出:Text: a, b, 25</span>
<@test foo="a" bar="b"/> <span style="color:#008000">//</span><span style="color:#008000"> 输出:Text: a, b, -1</span>
<@test foo="a" baaz=5*5-2/> <span style="color:#008000">//</span><span style="color:#008000"> 输出:Text: a, Bar, 23</span>
<@test foo="a"/> <span style="color:#008000">//</span><span style="color:#008000"> 输出:Text: a, Bar, -1</span></pre>
</div>
<p>例子2:</p>
<div class="cnblogs_code">
<pre><#-- 定义一个循环输出的宏 -->
<#macro list title items><span style="color:#000000">
${title}
</span><#list items as x>
*<span style="color:#000000">${x}
</span></#list>
</#macro>
<#-- 使用宏 -->
<@list items=["mouse", "elephant", "python"] title="Animals"/>
<span style="color:#008000">//</span><span style="color:#008000"> 输出Animals *mouse *elephant *python</span></pre>
</div>
<p>例子3:</p>
<div class="cnblogs_code">
<pre><#-- 嵌套宏 -->
<#macro border>
<table>
<#nested>
</table>
</#macro>
<#-- 嵌套宏使用 -->
<@border>
<tr><td>hahaha</td></tr>
</@border><span style="color:#000000">
输出结果:
</span><table>
<tr><td>hahaha</td></tr>
</table></pre>
</div>
<p> </p>
<p>例子4:在nested指令中使用循环变量时,可以使用多个循环变量,看如下代码:</p>
<div class="cnblogs_code">
<pre><#-- 循环嵌套宏 -->
<#macro repeat count>
<#list 1..count as x>
<#nested x, x/2, x==count> <span style="color:#008000">//</span><span style="color:#008000"> 使用nested指令时指定了三个循环变量</span>
</#list>
</#macro>
<#-- 使用宏 -->
<@repeat count = 4; c, halfc, last><span style="color:#000000">
${c}. ${halfc}</span><#<span style="color:#0000ff">if</span> last> Last!</#<span style="color:#0000ff">if</span>>
</@repeat>
<span style="color:#008000">// </span><span style="color:#008000">输出结果:
</span><span style="color:#008000">// </span><span style="color:#008000">1. 0.5
</span><span style="color:#008000">// </span><span style="color:#008000">2. 1
</span><span style="color:#008000">// </span><span style="color:#008000">3. 1.5
</span><span style="color:#008000">// </span><span style="color:#008000">4. 2 Last!</span></pre>
</div>
<p>freemarker 宏嵌套nested 的使用:<br>
<span style="color:#ff0000"><a target="_blank" target="_blank" href="http://blog.sina.com.cn/s/blog_7e5699790100z59g.html"><span style="color:#ff0000">http://blog.sina.com.cn/s/blog_7e5699790100z59g.html</span></a></span></p>
<h4><br>
<span style="color:#0000ff">4、结束macro指令</span></h4>
<div class="cnblogs_code">
<pre><span style="color:#008000">//</span><span style="color:#008000"> return指令用于结束macro指令</span>
<#-- 创建宏 -->
<#macro book><span style="color:#000000">
spring
</span><#<span style="color:#0000ff">return</span>><span style="color:#000000">
j2ee
</span></#macro>
<#-- 使用宏 -->
<@book />
<span style="color:#008000">//</span><span style="color:#008000"> 上面的代码输出:spring,而j2ee位于return指令之后,不会输出.</span></pre>
</div>
<p> </p>
<p><span style="color:#0000ff; font-family:楷体; font-size:18pt">FreeMarker 工具类:</span></p>
<p><span style="color:#ff0000"><span style="color:#ff0000"><a target="_blank" target="_blank" href="http://files.cnblogs.com/files/duke-cui/FreeMarkerUtil.rar">http://files.cnblogs.com/files/duke-cui/FreeMarkerUtil.rar</a></span></span></p>
<p> </p>
<p><span style="color:#ff0000; font-size:18pt"><span style="color:#ff0000">THE END !!!!</span></span></p>
</body>
</html>
Freemaker FTL指令常用标签及语法.html