首页 > 代码库 > freemark 语法与示例

freemark 语法与示例

1、if,else, elseif

语法:

<#ifcondition>

 ...

<#elseifcondition2>

 ...

<#elseifcondition3>

 ...

...

<#else>

 ...

</#if>

备注:condition、condition2···必须为boolean 类型,<#elseif··>、<#else>可有0或多个。

实例:

<#if x == 1>

 x is 1

<#elseifx == 2>

 x is 2

<#elseifx == 3>

 x is 3

<#elseifx &gt 4>

 x is 4

<#else>

x is not 1 nor2 nor 3 nor 4

</#if>

备注:< 或 > 号 必须转义,否则出错。。转义请参考其他文档。


2、switch,case, default, break

语法

<#switchvalue>

 <#case refValue1>

   ...

   <#break>

 <#case refValue2>

   ...

  <#break>

 ...

 <#case refValueN>

   ...

   <#break>

 <#default>

   ...

</#switch>

备注:该指令官方不推荐使用了,可以用if, else, elseif 指令代替。


3、list,break

语法

<#listsequence as item>

   ...

</#list>

备注: sequence 为一个sequence 或者 collection 类型。item 为 循环的变量。该指令中包含有两个特殊的循环变量,

item_index:该值为当前循环的值。 item_has_next:该值为一个boolean类型,表明该循环是否含有下一个(是否为循环到了最后一个)

实例:

<#assignseq = ["winter", "spring", "summer","autumn"]>

<#list seq as x>

 ${x_index + 1}. ${x}<#ifx_has_next>,</#if>

</#list>

输出

1. winter,

 2. spring,

 3. summer,

 4. autumn

实例

<#assign x=3>

<#list 1..x as i>

 ${i}

</#list>

备注x 为一个数值序列时可以使用该list 列出两个数值之间的值。(适合于表格的序号填写)

实例:

<#list seq as x>

${x}

<#if x = "spring"><#break></#if>

</#list>

备注:可以用<#if···><#break> 来终止该循环。


4、include

语法

<#include path>

或者

<#include path options>

备注:

path: 为包含一个文件的路径或者是一个输出为String 类型的表达式。

options: 一个或多个的参数: encoding=encoding, parse=parse

encoding: 包含文件解析的编码,如GBK、utf-8等

parse: 为一个boolean 类型值,true为用ftl解析,false为当作text文件解析(also accepts a few string values for backward compatibility)

实例:

/common/copyright.ftl内容:

Copyright2001-2002 ${me}<br>

Allrights reserved.

主体内容:

<#assignme = "Juila Smith">

<h1>Sometest</h1>

<p>Yeah.

<hr>

<#include"/common/copyright.ftl">

输出

<h1>Sometest</h1>

<p>Yeah.

<hr>

Copyright 2001-2002 JuilaSmith

All rights reserved.

备注:path 可以包含*任意取值例如:*/copyright.ftlcommons/*/copyright.ftl,*表示任意路径下的。

该指令具有国际化<#include "footer.ftl">这个指令的搜索文件的顺序为footer_en_US.ftl,footer_en.ftl,footer.ftl本地为英国


5、import

语法

<#import path as hash>

备注

path:模板的路径名.

hash: 在该文件中使用该模板指令的名称。

实例

<#import"/libs/mylib.ftl" as my>

文件中的使用

<@my.copyrightdate="1999-2002"/>


6、noparse

语法

<#noparse>

 ...

</#noparse>

备注该指令包含的文件将不被解析成ftl而是直接输出。

实例

Example:

--------

<#noparse>

 <#list animals as being>

 <tr><td>${being.name}<td>${being.price}Euros

 </#list>

</#noparse>

输出

Example:

--------

 <#list animals as being>

<tr><td>${being.name}<td>${being.price} Euros

 </#list>


7、compress

语法

<#compress>

 ...

</#compress>

备注该指令将会把数据模型中的空格或者html格式去掉。

实例

<#assign x = "    moo \n\n   ">

(<#compress>

 1 2 3   4    5

 ${moo}

 test only


 I said, test only


</#compress>)

输出:

(1 23 4 5

moo

testonly

Isaid, test only)


8、escape,noescape

语法:

<#escape identifier asexpression>

 ...

 <#noescape>...</#noescape>

...

</#escape>

备注:该指令对${```}该指令进行了格式化的输出。

备注:

<#escapex as x?html>

 Customer Name: ${customerName}

 Items to ship:

 <#escape x as itemCodeToNameMap[x]>

   ${itemCode1}

   ${itemCode2}

   ${itemCode3}

   ${itemCode4}

 </#escape>

</#escape>

相当于:

CustomerName: ${customerName?html}

 Items to ship:

   ${itemCodeToNameMap[itemCode1]?html}

   ${itemCodeToNameMap[itemCode2]?html}

   ${itemCodeToNameMap[itemCode3]?html}

   ${itemCodeToNameMap[itemCode4]?html}


9、assign

语法:

<#assignname=value>

or

<#assignname1=value1 name2=value2 ... nameN=valueN>

or

<#assignsame as above... in namespacehash>

or

<#assign name>

 capture this

</#assign>

or

<#assign name innamespacehash>

 capture this

</#assign>

备注该指令可以创建或者替换变量为页面使用该变量为最高的层才能被创建或替换foofoo.bar时将不能被创建或者替换。

name变量的名称。value:变量的值。namespacehash:import指令中的引用名。

实例:

<#assignseasons = ["winter", "spring", "summer","autumn"]>

<#assign

 seasons = ["winter","spring", "summer", "autumn"]

 test = test + 1

>

实例:  

<#import"/mylib.ftl" as my>

<#assignbgColor="red" in my>

实例:

<#macromyMacro>foo</#macro>

<#assign x>

 <#list 1..3 as n>

   ${n} <@myMacro />

 </#list>

</#assign>

Number of words:${x?word_list?size}

${x}

输出

Number of words: 6

   1 foo

   2 foo

   3 foo


10、global

语法

<#global name=value>

or

<#global name1=value1name2=value2 ... nameN=valueN>

or

<#global name>

 capture this

</#global>

备注:该指令相似于assign 指令,只是该指令创建的变量可以被所有命名空间使用。

实例:

<#globalx = 1>

<#assignx = 2>

${x}

${.global.x}

</#assign>

输出:

2

1

备注:如果在当前命名空间中,有同名的变量存在,则global 变量将没隐藏,如需访问则:${.global.x}


11、local

语法:

<#localname=value>

or

<#localname1=value1 name2=value2 ... nameN=valueN>

or

<#localname>

 capture this

</#local>

备注:该指令类似 assign 指令,但它创建或者替换了本例变量,它只能在macro定义或者function定义中有效。


12、setting

语法:

<#setting name=value>

备注:该指令的设置将影响到该指令设置的地方以下的内容有效。

它提供的设值有:

local:该值为本地的语言,将影响数值、时间等的格式。取值例如:en, en_US,en_US_MAC

number_format:用于将数值转换成String当没有明确的格式被指定时。

boolean_format:用于将boolean转换成String

date_format,time_format,datetime_format:用于将时间转换成String

time_zone:用于设置时区,"GMT", "GMT+2", "GMT-1:30", "CET","PST", "America/Los_Angeles"

url_escaping_charset:

classic_compatible:

实例

${1.2}

<#settinglocale="en_US">

${1.2}

输出

1,2

1.2


13、User-defineddirective (<@...>)

语法

<@user_def_dir_expparam1=val1 param2=val2 ... paramN=valN/>

(Note the XML-style / beforethe >)  

or if you need loop variables

<@user_def_dir_expparam1=val1 param2=val2 ... paramN=valN ; lv1, lv2, ..., lvN/>


Or the same as the above twobut with end-tag


<@user_def_dir_exp ...>

 ...

</@user_def_dir_exp>

or

<@user_def_dir_exp ...>

 ...

</@>


Or all above but withpositional parameter passing


<@ val1, val2, ...,valN/>

...etc.

备注该指令为调用用户自定义的指令比如macro

实例

<@listitems=["mouse", "elephant", "python"]title="Animals"/>

...

<#macro list titleitems>

 <p>${title?cap_first}:

 <ul>

   <#list items as x>

     <li>${x?cap_first}

   </#list>

 </ul>

</#macro>

输出

<p>Animals:

 <ul>

     <li>Mouse

     <li>Elephant

     <li>Python

 </ul>


...

实例

<@myRepeatMacro count=4 ;x, last>

 ${x}. Something... <#if last> This wasthe last!</#if>

</@myRepeatMacro>


14、macro,nested, return

语法

<#macro name param1 param2... paramN>

 ...

 <#nested loopvar1, loopvar2, ...,loopvarN>

 ...

 <#return>

 ...

</#macro>

备注该指令保存着模板的部分定义可以用用户指令来调用该指令使用。该指令可以定义在任何地方,不管设定的地方之前或者之后都能使用。也可以指定默认参数的默认值。

实例:

<#macrotest foo bar="Bar" baaz=-1>

 Test text, and the params: ${foo}, ${bar},${baaz}

</#macro>

<@testfoo="a" bar="b" baaz=5*5-2/>

<@test foo="a"bar="b"/>

<@test foo="a"baaz=5*5-2/>

<@testfoo="a"/>

输出

Test text, and the params: a, b, 23

 Test text, and the params: a, b, -1

 Test text, and the params: a, Bar, 23

 Test text, and the params: a, Bar, -1

实例

<#macro img srcextra...>

 <img src="http://www.mamicode.com/context${src?html}"

 <#list extra?keys as attr>

   ${attr}="${extra[attr]?html}"

 </#list>

 >

</#macro>

<@imgsrc="http://www.mamicode.com/images/test.png" width=100 height=50 alt="Test"/>

输出

<img src="http://www.mamicode.com/context/images/test.png"

   alt="Test"

   height="50"

   width="100"

 >

实例

<#macro do_thrice>

 <#nested 1>

 <#nested 2>

 <#nested 3>

</#macro>

<@do_thrice ; x>

 ${x} Anything.

</@do_thrice>

输出:

1 Anything.

 2 Anything.

 3 Anything.

实例:

<#macrotest>

 Test text

 <#return>

 Will not be printed.

</#macro>

<@test/>

输出:

Testtext


15、function,return

语法:

<#functionname param1 param2 ... paramN>

 ...

 <#return returnValue>

 ...

</#function>

备注:该指令创建了一个方法变量,该指令和macro指令类似,只是return 中必须有返回值。

实例:

<#functionavg x y>

 <#return (x + y) / 2>

</#function>

${avg(10,20)}

输出:

15

实例:

<#functionavg nums...>

 <#local sum = 0>

<#list numsas num>

   <#local sum = sum + num>

 </#list>

 <#if nums?size != 0>

   <#return sum / nums?size>

 </#if>

</#function>

${avg(10, 20)}

${avg(10, 20, 30, 40)}

${avg()!"N/A"}

输出:

15

25

N/A


16、flush

语法

<#flush>

备注强制输出。虽然FreeMarker会自动的flush 但有些时候要强制flash 的时候可以使用该指令。


17、stop

语法

<#stop>

or

<#stop reason>

备注FreeMarker要强制终止的时候可以使用该指令,reason 为自定义终止的原因。


18、ftl

语法

<#ftl param1=value1param2=value2 ... paramN=valueN>

备注:该指令是提供一些参数如果该文件是ftl文件,如果该文件存在则该设置在文件的最开始的地方。

设置的参数有:

encoding:模板的编码,取值为:utf-8、GBK等

strip_whitespace:是否去掉空格。取值为true、false

strip_text:是否去掉最高层的文本,取值为true、false

strict_syntax:是否为严格的语法,取值为true、false

ns_prefixes:

attributes:


19、t,lt, rt

语法

<#t>  -在该行中忽略所有的空格

<#lt>-在该行中忽略左边的所有空格

<#rt>-在该行中忽略右边的所有空格

<#nt>-不去掉该行的空格


实例:

--

 1 <#t>

 2<#t>

 3<#lt>

 4

 5<#rt>

 6

--

输出:

--

1 23

 4

 5  6

--


20、attempt,recover

语法:

<#attempt>

 attempt block

<#recover>

 recover block

</#attempt>

备注:该指令是一个错误的捕获,和java 中的 try{}catch 相似。<#recover>是修复指令,代替出错的输出文本。

实例:

Primarycontent

<#attempt>

 Optional content: ${thisMayFails}

<#recover>

 Ops! The optional content is not available.

</#attempt>

Primarycontent continued

输出:

如果thisMayFails 变量不存在

Primarycontent

 Ops! The optional content is not available.

Primarycontent continued

如果thisMayFails 变量存在

Primarycontent

 Optional content: 123

Primarycontent continued


21、visit,recurse, fallback

语法:

<#visitnode using namespace>

or

<#visit node>

<#recurse node usingnamespace>

or

<#recursenode>

or

<#recurseusing namespace>

or

<#recurse>

<#fallback>

备注:visit 和recurse 指令是用来递归处理树节点的。在实际中,很多情况下是用来处理xml。

实例:

<#--Assume that nodeWithNameX?node_name is "x" -->

<#visitnodeWithNameX>

Done.

<#macro x>

  Now I‘m handling a node that has the name"x".

  Just to show how to access this node: thisnode has ${.node?children?size} children.

</#macro>

输出:

NowI‘m handling a node that has the name "x".

  Just to show how to access this node: thisnode has 3 children.

Done.

实例:

主体

<#import"n1.ftl" as n1>

<#import"n2.ftl" as n2>


<#-- This will call n2.x(because there is no n1.x): -->

<#visit nodeWithNameXusing [n1, n2]>


<#-- This will call the xof the current namespace: -->

<#visitnodeWithNameX>


<#macro x>

 Simply x

</#macro>


n1.ftl

<#macro y>

 n1.y

</#macro>


n2.ftl:  

<#macro x>

 n2.x

 <#-- This will call n1.y, becuase itinherits the "using [n1, n2]" from the pending visit call: -->

 <#visit nodeWithNameY>

 <#-- This will call n2.y: -->

 <#visit nodeWithNameY using .namespace>

</#macro>


<#macro y>

 n2.y

</#macro>  

输出:

n2.x

 n1.y

 n2.y


 Simply x



本文出自 “树凋窗有日,池满水无声” 博客,请务必保留此出处http://djbiiinng.blog.51cto.com/296891/1411398