freemarker常用标签

一、FreeMarker模板文件主要有4个部分组成
1、文本,直接输出的部分
2、注释,即<#–…–>格式不会输出
3、插值(Interpolation):即${..}或者#{..}格式的部分,将使用数据模型中的部分替代输出
4、FTL指令:FreeMarker指令,和HTML标记类似,名字前加#予以区分,不会输出。

 

  1、文本,直接输出的部分

FTL指令规则
FreeMarker有三种FTL标签,这和HTML的标签是完全类似的
开始标签:<#directivename parameters>
结束标签:</#directivename>
空标签: <#directivename parameters />
实际上,使用标签时前面的#符号也可能变成@,如果该指令是一个用户指令而不是系统内建指令时,应将#符号改为@符号

插值规则
FreeMarker的插值有如下两种类型
1、通用插值:${expr}
2、数字格式化插值:#{expr}或者#{expr;format}

通用插值,有可以分为四种情况
a、插值结果为字符串值:直接输出表达式结果
b、插值结果为数字值:根据默认格式(#setting 指令设置)将表达式结果转换成文本输出。可以使用内建的字符串函数格式单个插值,例如

Java

<#setting number_format = “currency” /> <#assign price = 42 /> priceprice{price?string} price?string.numberprice?string.number{price?string.currency} ${price?string.percent}

1

2

3

4

5

6

7

    <#setting number_format = “currency” />

       <#assign price = 42 />

       </span><span class="crayon-sy">{</span><span class="crayon-v">price</span><span class="crayon-sy">}</span></div><div class="crayon-line crayon-striped-line" id="crayon-58e6eccb27416601793378-4"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="crayon-sy"></span><span class="crayon-sy">{</span><span class="crayon-v">price</span><span class="crayon-sy">}</span></div><div class="crayon-line crayon-striped-line" id="crayon-58e6eccb27416601793378-4"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="crayon-sy">{price?string}

       </span><span class="crayon-sy">{</span><span class="crayon-v">price</span><span class="crayon-sy">?</span><span class="crayon-t">string</span><span class="crayon-sy">.</span><span class="crayon-v">number</span><span class="crayon-sy">}</span></div><div class="crayon-line crayon-striped-line" id="crayon-58e6eccb27416601793378-6"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="crayon-sy"></span><span class="crayon-sy">{</span><span class="crayon-v">price</span><span class="crayon-sy">?</span><span class="crayon-t">string</span><span class="crayon-sy">.</span><span class="crayon-v">number</span><span class="crayon-sy">}</span></div><div class="crayon-line crayon-striped-line" id="crayon-58e6eccb27416601793378-6"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="crayon-sy">{price?string.currency}

       ${price?string.percent}

c、输出值为日期值:根据默认格式(由 #setting 指令设置)将表达式结果转换成文本输出,可以使用内建的字符串函数格式化单个插值,例如

Java

<#assign lastUpdated = “2009-01-07 15:05”?datetime(“yyyy-MM-dd HH:mm”) />lastUpdated?string(“yyyy−MM−ddHH:mm:sszzzz”);lastUpdated?string(“yyyy−MM−ddHH:mm:sszzzz”);{lastUpdated?string(“EEE,MMM d,yy”)};lastUpdated?string(“EEEE,MMMMdd,yyyy,hh:mm:ssa‘(‘zzz′)′”);lastUpdated?string(“EEEE,MMMMdd,yyyy,hh:mm:ssa‘(‘zzz′)′”);{lastUpdated?string.short};lastUpdated?string.long;lastUpdated?string.long;{lastUpdated?String.full};

1

2

3

4

5

6

7

    <#assign lastUpdated = “2009-01-07 15:05”?datetime(“yyyy-MM-dd HH:mm”) />

      </span><span class="crayon-sy">{</span><span class="crayon-v">lastUpdated</span><span class="crayon-sy">?</span><span class="crayon-t">string</span><span class="crayon-sy">(</span><span class="crayon-s">"yyyy-MM-dd HH:mm:ss zzzz"</span><span class="crayon-sy">)</span><span class="crayon-sy">}</span><span class="crayon-sy">;</span></div><div class="crayon-line" id="crayon-58e6eccb27421400180773-3"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-sy"></span><span class="crayon-sy">{</span><span class="crayon-v">lastUpdated</span><span class="crayon-sy">?</span><span class="crayon-t">string</span><span class="crayon-sy">(</span><span class="crayon-s">"yyyy-MM-dd HH:mm:ss zzzz"</span><span class="crayon-sy">)</span><span class="crayon-sy">}</span><span class="crayon-sy">;</span></div><div class="crayon-line" id="crayon-58e6eccb27421400180773-3"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-sy">{lastUpdated?string(“EEE,MMM d,yy”)};

      </span><span class="crayon-sy">{</span><span class="crayon-v">lastUpdated</span><span class="crayon-sy">?</span><span class="crayon-t">string</span><span class="crayon-sy">(</span><span class="crayon-s">"EEEE,MMMM dd,yyyy,hh:mm:ss a '('zzz')'"</span><span class="crayon-sy">)</span><span class="crayon-sy">}</span><span class="crayon-sy">;</span></div><div class="crayon-line" id="crayon-58e6eccb27421400180773-5"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-sy"></span><span class="crayon-sy">{</span><span class="crayon-v">lastUpdated</span><span class="crayon-sy">?</span><span class="crayon-t">string</span><span class="crayon-sy">(</span><span class="crayon-s">"EEEE,MMMM dd,yyyy,hh:mm:ss a '('zzz')'"</span><span class="crayon-sy">)</span><span class="crayon-sy">}</span><span class="crayon-sy">;</span></div><div class="crayon-line" id="crayon-58e6eccb27421400180773-5"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-sy">{lastUpdated?string.short};

      </span><span class="crayon-sy">{</span><span class="crayon-v">lastUpdated</span><span class="crayon-sy">?</span><span class="crayon-t">string</span><span class="crayon-sy">.</span><span class="crayon-t">long</span><span class="crayon-sy">}</span><span class="crayon-sy">;</span></div><div class="crayon-line" id="crayon-58e6eccb27421400180773-7"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-sy"></span><span class="crayon-sy">{</span><span class="crayon-v">lastUpdated</span><span class="crayon-sy">?</span><span class="crayon-t">string</span><span class="crayon-sy">.</span><span class="crayon-t">long</span><span class="crayon-sy">}</span><span class="crayon-sy">;</span></div><div class="crayon-line" id="crayon-58e6eccb27421400180773-7"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-sy">{lastUpdated?String.full};

d、插值结果为布尔值

Java

<#assign foo=true /> ${foo?string(“是foo”,”非foo”)}

1

2

   <#assign foo=true />

      ${foo?string(“是foo”,“非foo”)}

数字格式化插值
数字格式化插值可采用#{expr;format}的形式来格式化数字,其中format可以是:
mX:小数部分最小X位
MX:小数部分最大X位
例如:

Java

<#assign x = 2.582 /> <#assign y =4 /> #{x;M2}; #{y;M2}; #{x;m1}; #{y;m1}; #{x;m1M2}; #{y:m1M2};

1

2

3

4

5

6

7

8

<#assign x = 2.582 />

        <#assign y =4 />

        #{x;M2};

        #{y;M2};

        #{x;m1};

        #{y;m1};

        #{x;m1M2};

        #{y:m1M2};

 

 

二、表达式

表达式是FreeMarker的核心功能。表达式放置在插值语法(${…})之中时,表面需要输出表达式的值,表达式语法也可以与FreeMarker标签结合,用于控制输出

1、直接指定值
例如:
a、字符串

Java

   ‘我的名字是\”yeek\”′;‘我的名字是\”yeek\”′;{“我的文件保存在d:\\盘”};

1

2

   </span><span class="crayon-sy">{</span><span class="crayon-s">'我的名字是\"yeek\"'</span><span class="crayon-sy">}</span><span class="crayon-sy">;</span></div><div class="crayon-line crayon-striped-line" id="crayon-58e6eccb2742c290336393-2">&nbsp;&nbsp;<span class="crayon-h"> </span><span class="crayon-sy"></span><span class="crayon-sy">{</span><span class="crayon-s">'我的名字是\"yeek\"'</span><span class="crayon-sy">}</span><span class="crayon-sy">;</span></div><div class="crayon-line crayon-striped-line" id="crayon-58e6eccb2742c290336393-2">&nbsp;&nbsp;<span class="crayon-h"> </span><span class="crayon-sy">{“我的文件保存在d:\\盘”};

b、数值
c、布尔值
d、日期型
FreeMarker支持date、time、datetime三种类型,这三种类型的值无法直接指定,通常需要借助字符串的date、time、datetime三个内建函数进行转换才可以

Java

<#assign test1 = “2009-01-22”?date(“yyyy-MM-dd”) />; <#assign test2 =”16:34:43”?time(“HH:mm:ss”) /> <#assign test2 = “2009-01-22 17:23:45”?datetime(“yyyy-MM-dd HH:mm:ss”) /> ${test1?string.full}

1

2

3

4

         <#assign test1 = “2009-01-22”?date(“yyyy-MM-dd”) />;

           <#assign test2 =“16:34:43”?time(“HH:mm:ss”) />

           <#assign test2 = “2009-01-22 17:23:45”?datetime(“yyyy-MM-dd HH:mm:ss”) />

           ${test1?string.full}

e、集合
集合以方括号包括,各集合元素之间以英文逗号(,)分隔,看如下的示例:

Java

      <#list[“星期一”,,[“星期二”,[“星期三”,[“星期四”,[“星期五”] as x>          ${s};         </#list>

1

2

3

      <#list[“星期一”,,[“星期二”,[“星期三”,[“星期四”,[“星期五”] as x>

         ${s};

        </#list>

f、Map集合
Map对象使用花括号包括,Map中的key-value对之间以英文冒号(:)隔开,多组key-value对之间以英文逗号(,) 隔开
例如

Java

   <#assign score = {“语文”:78,”数学”:83,”Java”:89} >              <#list score?key as x>               {x}---&gt;{x}---&gt;{score[x]};              </#list>

1

2

3

4

   <#assign score = {“语文”:78,“数学”:83,“Java”:89} >

             <#list score?key as x>

              </span><span class="crayon-sy">{</span><span class="crayon-v">x</span><span class="crayon-sy">}</span><span class="crayon-o">--</span><span class="crayon-o">-&gt;</span><span class="crayon-sy"></span><span class="crayon-sy">{</span><span class="crayon-v">x</span><span class="crayon-sy">}</span><span class="crayon-o">--</span><span class="crayon-o">-&gt;</span><span class="crayon-sy">{score[x]};

             </#list>

 

2、输出变量值
FreeMarker的表达式输出变量时,这些变量可以是顶层变量,也可以是Map对象中的变量,还可以是集合中的变量,并可以使用点(.)语法来访问Java对象的属性
a、顶层变量

Java

   Map root = new HashMap();              root.put(“name”,”wenchao”);

1

2

   Map root = new HashMap();

             root.put(“name”,“wenchao”);

对应顶层变量,直接使用variableName来输出变量值,变量名只能是数字、字母、下划线、variableName来输出变量值,变量名只能是数字、字母、下划线、、@和#的组合,并不能以数字开头
b、输出集合元素
如果需要输出集合元素,则可以根据集合元素的索引来输出元素。集合元素的索引以方括号指定。
假设有集合对象为:[“星期一”,”星期二”,”星期三”,”星期四”,”星期五”,”星期六”],该集合对象名为week, 如果需要输出星期三,则可以使用如下语法:
${week[2]}
集合里的第一个元素的索引是0
c、输出Map元素
这里的Map对象可以是直接HashMap的实例,甚至包括 JavaBean实例,对应JavaBean实例,我们一样可以把其当成属性为key,属性为value的Map实例

3、字符串操作
a、字符串链接
字符串连接有两种语法
A、使用${..}(或#{..})在字符串常量部分插入表达式的值,从而完成字符串连接
B、直接使用连接运算符(+)来连接字符串
使用第一种语法来连接字符串

Java

       {"Hello,{"Hello,{user}!”}

1

       </span><span class="crayon-sy">{</span><span class="crayon-s">"Hello,</span><span class="crayon-sy">{</span><span class="crayon-s">"Hello,{user}!”}

第二种使用连接符号来连接字符串
“Hello,”+user+”!”;值的注意的是,“Hello,”+user+”!”;值的注意的是,{..}只能用于文本部分,因此,下面的代码是错误的:

Java

  <#if {isBig}>Wow!</#if>
                 <#if “{isBig}>Wow!</#if>                 <#if “{isBig}”>Wow!</#if>                  应该写成:                  <#if isBig>Wow!</#if>

1

2

3

4

         <#if </span><span class="crayon-sy">{</span><span class="crayon-v">isBig</span><span class="crayon-sy">}</span><span class="crayon-o">&gt;</span><span class="crayon-v">Wow</span><span class="crayon-o">!</span><span class="crayon-o">&lt;</span><span class="crayon-o">/</span><span class="crayon-o">#</span><span class="crayon-st">if</span><span class="crayon-o">&gt;</span></div><div class="crayon-line crayon-striped-line" id="crayon-58e6eccb27442863763172-2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="crayon-h"> </span><span class="crayon-o">&lt;</span><span class="crayon-o">#</span><span class="crayon-st">if</span><span class="crayon-h"> </span><span class="crayon-s">"</span><span class="crayon-sy">{</span><span class="crayon-v">isBig</span><span class="crayon-sy">}</span><span class="crayon-o">&gt;</span><span class="crayon-v">Wow</span><span class="crayon-o">!</span><span class="crayon-o">&lt;</span><span class="crayon-o">/</span><span class="crayon-o">#</span><span class="crayon-st">if</span><span class="crayon-o">&gt;</span></div><div class="crayon-line crayon-striped-line" id="crayon-58e6eccb27442863763172-2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="crayon-h"> </span><span class="crayon-o">&lt;</span><span class="crayon-o">#</span><span class="crayon-st">if</span><span class="crayon-h"> </span><span class="crayon-s">"{isBig}”>Wow!</#if>

                 应该写成:

                 <#if isBig>Wow!</#if>

 

b、截取字符串

Java

        Map root = new HashMap();             root.put(“book”,”疯狂Ajax讲义”);                         book[0]book[0]{book[4]}             ${book[1..4]}

1

2

3

4

5

6

            Map root = new HashMap();

            root.put(“book”,“疯狂Ajax讲义”);

           

            </span><span class="crayon-sy">{</span><span class="crayon-v">book</span><span class="crayon-sy">[</span><span class="crayon-cn">0</span><span class="crayon-sy">]</span><span class="crayon-sy">}</span></div><div class="crayon-line" id="crayon-58e6eccb27445589997824-5">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="crayon-h"> </span><span class="crayon-sy"></span><span class="crayon-sy">{</span><span class="crayon-v">book</span><span class="crayon-sy">[</span><span class="crayon-cn">0</span><span class="crayon-sy">]</span><span class="crayon-sy">}</span></div><div class="crayon-line" id="crayon-58e6eccb27445589997824-5">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="crayon-h"> </span><span class="crayon-sy">{book[4]}

            ${book[1..4]}

4、集合连接运算符
这里所说的集合连接运算时将两个集合连接成一个新的集合,连接集合的运算符是+,例如

Java

    <#list [“星期一”,” 星期二”,”星期三”]+[“星期四”,”星期五”] as x>            ${x}         </#list>

1

2

3

       <#list [“星期一”,” 星期二”,“星期三”]+[“星期四”,“星期五”] as x>

           ${x}

        </#list>

 

5、Map连接运算符
Map对象的连接运算也是将两个Map对象连接成一个新的Map对象,Map对象的连接运算符是+。如果两个Map对象具有相同的 key,则后加入Map里的key所
对应的value替代原来key所对应的value

6、算术运算符
FreeMarker表达式中完全支持算术运算,FreeMarker支持的算术运算符包括: +,-,*,/,%
看如下代码示范

Java

<#assign x = 5 />            x∗−100x∗−100{x/2}            ${12%10}

1

2

3

4

       <#assign x = 5 />

           </span><span class="crayon-sy">{</span><span class="crayon-v">x</span><span class="crayon-o">*</span><span class="crayon-h"> </span><span class="crayon-o">-</span><span class="crayon-cn">100</span><span class="crayon-sy">}</span></div><div class="crayon-line" id="crayon-58e6eccb2744c300553478-3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="crayon-h"> </span><span class="crayon-sy"></span><span class="crayon-sy">{</span><span class="crayon-v">x</span><span class="crayon-o">*</span><span class="crayon-h"> </span><span class="crayon-o">-</span><span class="crayon-cn">100</span><span class="crayon-sy">}</span></div><div class="crayon-line" id="crayon-58e6eccb2744c300553478-3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="crayon-h"> </span><span class="crayon-sy">{x/2}

           ${12%10}

在表达式中使用算术运算时要注意以下几点。
A、运算符两边的运算数必须是数字,因此下面的代码是错误的:
3∗”5''B、使用+(既可以作为加号,也可以作为字符串连接运算符)运算时,如果一边是数字,一边是字符串,就会自动将数字转化为字符串。例如3∗”5″B、使用+(既可以作为加号,也可以作为字符串连接运算符)运算时,如果一边是数字,一边是字符串,就会自动将数字转化为字符串。例如{3+”5″}
输出结果:35
C、使用内建的int函数可对数值取整。例如

Java

   <#assign x = 5>             (x/2)?int(x/2)?int{1.1?int}             1.999?int1.999?int{-1.9999?int}             ${-1.1?int}

1

2

3

4

5

6

         <#assign x = 5>

            </span><span class="crayon-sy">{</span><span class="crayon-sy">(</span><span class="crayon-v">x</span><span class="crayon-o">/</span><span class="crayon-cn">2</span><span class="crayon-sy">)</span><span class="crayon-sy">?</span><span class="crayon-t">int</span><span class="crayon-sy">}</span></div><div class="crayon-line" id="crayon-58e6eccb2744f319204970-3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="crayon-h"> </span><span class="crayon-sy"></span><span class="crayon-sy">{</span><span class="crayon-sy">(</span><span class="crayon-v">x</span><span class="crayon-o">/</span><span class="crayon-cn">2</span><span class="crayon-sy">)</span><span class="crayon-sy">?</span><span class="crayon-t">int</span><span class="crayon-sy">}</span></div><div class="crayon-line" id="crayon-58e6eccb2744f319204970-3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="crayon-h"> </span><span class="crayon-sy">{1.1?int}

            </span><span class="crayon-sy">{</span><span class="crayon-cn">1.999</span><span class="crayon-sy">?</span><span class="crayon-t">int</span><span class="crayon-sy">}</span></div><div class="crayon-line" id="crayon-58e6eccb2744f319204970-5">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="crayon-h"> </span><span class="crayon-sy"></span><span class="crayon-sy">{</span><span class="crayon-cn">1.999</span><span class="crayon-sy">?</span><span class="crayon-t">int</span><span class="crayon-sy">}</span></div><div class="crayon-line" id="crayon-58e6eccb2744f319204970-5">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="crayon-h"> </span><span class="crayon-sy">{-1.9999?int}

            ${-1.1?int}

 

7、比较运算符
表达式中支持的比较运算符有如下几个
a、=(或者==):判断两个值是否相等.
b、!=:判断两个值是否不相等
c、 >(或者gt):判断坐标值是否大于右边值
d、 >=(或者gte):判断坐标值是否大于等于右边值
e、 <(或者lt):判断左边值是否小于右边值
f、 <=(或者lte):判断左边值是否小于等于右边值

8、逻辑运算符
逻辑运算符有如下几个
a、逻辑与:&&
b、逻辑或:||
c、逻辑非:!
逻辑运算符只能作用于布尔值,否则将产生错误。

9、内建函数
FreeMarker还提供了一些内建函数来转换输出,可以在任何变量后紧跟?,?后紧跟内建函数,就可通过内建函数来转换输出变量
下面是常用的内建的字符串函数
a、html:对字符串进行HTML编码
b、cap_first:将字符串第一个字母成大写
c、lower_case:将字符串转换成小写
d、upper_case:将字符串转换成大写
e、trim: 去掉字符串前后的空白字符
下面是集合的常用的内建函数
a、size: 获得序列中元素的数目

下面是数字值的常用的内建函数
a、int 取得数字的整数部分
例如

Java

    <#assign test=”Tom & Jerry” />           test?htmltest?html{test?upper_case?html}

1

2

3

    <#assign test=“Tom & Jerry” />

          </span><span class="crayon-sy">{</span><span class="crayon-v">test</span><span class="crayon-sy">?</span><span class="crayon-v">html</span><span class="crayon-sy">}</span></div><div class="crayon-line" id="crayon-58e6eccb27453543397156-3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="crayon-h"> </span><span class="crayon-sy"></span><span class="crayon-sy">{</span><span class="crayon-v">test</span><span class="crayon-sy">?</span><span class="crayon-v">html</span><span class="crayon-sy">}</span></div><div class="crayon-line" id="crayon-58e6eccb27453543397156-3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="crayon-h"> </span><span class="crayon-sy">{test?upper_case?html}

 

10、空值处理运算符
FreeMarker对空值的处理非常严格,FreeMarker的变量必须有值,没有被赋值的变量就会抛出异常。

11、运算符优先级

三、FreeMarker 的常用指令

 

 

1、if指令
        分支控制语句
        语法格式如下
       <#if condition>
            ....
       <#elseif condition2>
          ...
       <#elseif condition3>      
          ...
       <#else>
          ...
       </#if>

     2、switch、case、default、break指令
        <#switch value>
           <#case refValue>
              ...
              <#bread>
           <#case refValue>
              ...
              <#bread>
           <#default>
              ...
        </#switch>
        虽然FreeMarker提供了switch指令,但它并不推荐使用switch指令来控制也输出,而是推荐使用FreeMarker的if..elseif..else 指令来替代它。

    3、list、break指令
    list指令时一个典型的迭代输出指令,用于迭代输出数据模型中的集合。list指令的语法格式如下:
     <#list sequence as item>
       ...
     </#list>
      除此之外,迭代集合对象时,还包括两个特殊的循环变量:
      a、item_index:当前变量的索引值。
      b、item_has_next:是否存在下一个对象
      也可以使用<#break>指令跳出迭代
      <#list ["星期一","星期二","星期三","星期四","星期五"] as x>
          ${x_index +1}.${x} <#if x_has_next>,</#if>
          <#if x = "星期四"><#break></#if>
      </#list>

      4、include 指令
        include指令的作用类似于JSP的包含指令,用于包含指定页,include指令的语法格式如下
         <#include filename [options]
          在上面的语法格式中,两个参数的解释如下
          a、filename:该参数指定被包含的模板文件
          b、options:该参数可以省略,指定包含时的选项,包含encoding和parse两个选项,encoding指定包含页面时所使用的解码集,而parse指定被
             包含是否作为FTL文件来解析。如果省略了parse选项值,则该选项值默认是true
     5、 import指令
        该指令用于导入FreeMarker模板中的所有变量,并将该变量放置在指定的Map对象中,import 指令的语法格式如下
        <#import path as mapObject>
        在上面的语法格式中,path指定要被导入的模板文件,而mapObject是一个Map对象名,通过这行代码,将导致path模板中的所有变量都被放置
        在mapObject中
        <#import "/lib/common.ftl" as com>

     6、noparse指令
         noparse指令指定FreeMarker不处理该指令里包含的内容,该指令的语法格式如下:
         <#noparse>
            ...
         </#noparse>

     7、escape、noescape指令


     8、assign指令
        它用于为该模板页面创建或替换一个顶层变量

     9、setting指令
        该指令用于设置FreeMarker的运行环境,该指令的语法格式如下:
        <#setting name = value>
        name 的取值范围包括如下几个
         locale :该选项指定该模板所用的国家/语言选项
         number_format:该选项指定格式化输出数字的格式
         boolean_format:该选项指定两个布尔值的语法格式,默认值是"true、false"
         date_format,time_format,datetime_format:该选项指定格式化输出日期的格式
         time_zone:  设置格式化输出日期时所使用的时区
     10、macro、nested、return指令
在 Spring Boot 中使用 Freemarker 模板引擎时,可以通过自定义标签来实现一些常用的功能。下面介绍如何自定义一个列表标签。 首先,创建一个类,实现 `freemarker.template.TemplateDirectiveModel` 接口。这个接口只有一个方法 `execute`,需要在其中实现自定义标签的逻辑。例如: ``` import java.io.IOException; import java.util.Map; import freemarker.core.Environment; import freemarker.template.TemplateDirectiveBody; import freemarker.template.TemplateDirectiveModel; import freemarker.template.TemplateException; import freemarker.template.TemplateModel; import freemarker.template.TemplateModelException; public class CustomListDirective implements TemplateDirectiveModel { @Override public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body) throws TemplateException, IOException { // 获取参数 String items = params.get("items").toString(); String separator = params.get("separator").toString(); // 分割字符串,生成列表 String[] itemList = items.split(","); StringBuilder result = new StringBuilder(); for (String item : itemList) { result.append(item).append(separator); } // 输出结果 env.getOut().write(result.toString()); } } ``` 这个类实现了一个简单的列表标签,根据传入的参数 `items` 和 `separator`,将 `items` 字符串按照 `separator` 分割生成列表,并输出。 接着,在 Spring Boot 的配置类中注册这个自定义标签: ``` import java.util.HashMap; import java.util.Map; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import freemarker.template.Configuration; import freemarker.template.TemplateDirectiveModel; @Configuration public class FreemarkerConfig { @Bean public Configuration freemarkerConfig() { Configuration configuration = new Configuration(Configuration.VERSION_2_3_28); configuration.setClassForTemplateLoading(this.getClass(), "/templates"); // 注册自定义标签 Map<String, TemplateDirectiveModel> directives = new HashMap<>(); directives.put("customList", new CustomListDirective()); configuration.setSharedVariable("directives", directives); return configuration; } } ``` 这里将自定义标签注册到了 `Configuration` 中,然后在模板中使用 `<@directives.customList items="a,b,c" separator="-" />` 的方式调用即可。 需要注意的是,在模板中使用自定义标签时需要加上 `@` 符号,例如 `<@directives.customList ... />`。另外,`directives` 名称可以自定义,只要与 `freemarkerConfig` 中设置的名称一致即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值