FreeMarker基础语法教程
根據網上自己做了測試和一點修改,測試代碼還有測試的截圖在最下面的部分貼出來了,方便大家參考和學習!不過文章中的關于測試的代碼沒有作修改,可以直接參考我的!!今天下載了一份freemarker的文檔,才發現昨天參考的那篇資料恰恰就是文檔,呼呼....啥也不說了!仔細的看了一遍文檔,又做了一些實驗,代碼補充到上來!!
常用語法
一個對象User(就是javabean對象)
1.輸出?${User.name}
空值判斷:${User.name?if_exists?},
${User.name?default(‘xxx’)}//默認值xxx
${?User.name!"xxx"}//默認值xxx
日期格式:${User.date?string('yyyy-MM-dd')}
數字格式:${User?string.number}--20
${User?string.currency}--<#--?$20.00?-->
${User?string.percent}—<#--?20%?-->
插入布爾值:
<#assign?foo=ture?/>
2.邏輯判斷
a:
<#if?condition>...
<#elseif?condition2>...
<#elseif?condition3>......
<#else>...
其中空值判斷可以寫成<#if?User.name???>
</#if>
b:
<#switch?value>
<#case?refValue1>
????...
????<#break>
<#case?refValue2>
????...
????<#break>
...
<#case?refValueN>
????...
????<#break>
<#default>
????...
</#switch>
3.循環讀取
<#list?sequence?as?item>
...
</#list>
空值判斷<#if?UserList?size?=?0></#list>
e.g.
<#list?employees?as?e>
${e_index}.?${e.name}
</#list>
輸出:
1.?Readonly
2.?Robbin
4.FreeMarker
3?宏/模板
宏Macro:宏是在模板中使用macro指令定義
l.1?基本用法
宏是和某個變量關聯的模板片斷,以便在模板中通過用戶定義指令使用該變量,下面是一個例子:
<#macro?greet>
<font?size="+2">Hello?Joe!</font>
</#macro>
調用宏時,與使用FreeMarker的其他指令類似,
只是使用@替代FTL標記中的#。
<@greet></@greet>
<#--<@greet/>-->
在macro指令中可以在宏變量之后定義參數,如:
<#macro?greet?person>
<font?size="+2">Hello?${person}!</font>
</#macro>
可以這樣使用這個宏變量:
???<@greet?person="Fred"/>
但是下面的代碼具有不同的意思:
???<@greet?person=Fred/>
這意味著將Fred變量的值傳給person參數,該值不僅是字符串,還可以是其它類型,甚至是復雜的表達式。
宏可以有多參數,下面是一個例子:
<#macro?greet?person?color>
<font?size="+2"?color="${color}">Hello?${person}!</font>
</#macro>
可以這樣使用該宏變量,其中參數的次序是無關的:
<@greet?person="Fred"?color="black"/>
可以在定義參數時指定缺省值,否則,在調用宏的時候,必須對所有參數賦值:
<#macro?greet?person?color="black">
<font?size="+2"?color="${color}">Hello?${person}!</font>
</#macro>
注意:宏的參數是局部變量,只能在宏定義中有效。
在宏里嵌套內容
FreeMarker的宏可以有嵌套內容,
<#nested>指令會執行宏調用指令開始和結束標記之間的模板片斷,舉一個簡單的例子:
<#macro?border>
<table?border=4?cellspacing=0?cellpadding=4><tr><td>
????<#nested>
</tr></td></table>
</#macro>
執行宏調用:
<@border>The?bordered?text</@border>
輸出結果:
<table?border=4?cellspacing=0?cellpadding=4>
<tr><td>
???????The?bordered?text
</tr></td>
</table>
<#nested>指令可以被多次調用,每次都會執行相同的內容。
<#macro?do_thrice>
<#nested>
<#nested>
<#nested>
</#macro>
<@do_thrice>
Anything.
</@do_thrice>
FMPP?輸出結果:
Anything.
Anything.
Anything.
嵌套內容可以是有效的FTL,下面是一個有些復雜的例子,我們將上面三個宏組合起來:
<@border>
<ul>
<@do_thrice>
????<li><@greet?person="Joe"/>
</@do_thrice>
</ul>
</@border>
輸出結果:
<table?border=4?cellspacing=0?cellpadding=4><tr><td>
<ul>
????<li><font?size="+2">Hello?Joe!</font>
????<li><font?size="+2">Hello?Joe!</font>
????<li><font?size="+2">Hello?Joe!</font>
</ul>
</tr></td></table>
宏定義中的局部變量對嵌套內容是不可見的,例如:
<#macro?repeat?count>
<#local?y?=?"test">
<#list?1..count?as?x>
????${y}?${count}/${x}:?<#nested>
</#list>
</#macro>
<@repeat?count=3>${y?default("?")}?${x?default("?")}?${count?default("?")}</@repeat>
輸出結果:
test?3/1:??????
test?3/2:??????
test?3/3:??????
在宏定義中使用循環變量
nestted指令也可以有循環變量(循環變量的含義見下節),調用宏的時候在宏指令的參數后面依次列出循環變量的名字,格式如下:
<@?macro_name?paramter?list;?loop?variable?list[,]>
例如:
<#macro?repeat?count>
<#list?1..count?as?x>
????<#nested?x,?x/2,?x==count>
</#list>
</#macro>
<@repeat?count=4?;?c,?halfc,?last>
${c}.?${halfc}<#if?last>?Last!</#if>
</@repeat>
這里count是宏的參數,c,?halfc,last則為循環變量,輸出結果:
1.?0.5
2.?1
3.?1.5
4.?2?Last!
循環變量和宏標記指定的不同不會有問題,如果調用時少指定了循環變量,那么多余的值不可見。調用時多指定了循環變量,多余的循環變量
不會被創建:
<@repeat?count=4?;?c,?halfc,?last>
${c}.?${halfc}<#if?last>?Last!</#if>
</@repeat>
<@repeat?count=4?;?c,?halfc>
${c}.?${halfc}
</@repeat>
<@repeat?count=4>
Just?repeat?it...
</@repeat>
在模板中定義變量
在模板中定義的變量有三種類型:
plain變量:可以在模板的任何地方訪問,包括使用include指令插入的模板,使用assign指令創建和替換。
局部變量:在宏定義體中有效,使用local指令創建和替換。
循環變量:只能存在于指令的嵌套內容,由指令(如list)自動創建;宏的參數是局部變量,而不是循環變量
局部變量隱藏(而不是覆蓋)同名的plain變量;循環變量隱藏同名的局部變量和plain變量,下面是一個例子:
<#assign?x?=?"plain">
${x}?<#--?we?see?the?plain?var.?here?-->
<@test/>
6.?${x}?<#--?the?value?of?plain?var.?was?not?changed?-->
<#list?["loop"]?as?x>
7.?${x}?<#--?now?the?loop?var.?hides?the?plain?var.?-->
????<#assign?x?=?"plain2">?<#--?replace?the?plain?var,?hiding?does?not?mater?here?-->
8.?${x}?<#--?it?still?hides?the?plain?var.?-->
</#list>
9.?${x}?<#--?the?new?value?of?plain?var.?-->
<#macro?test>
2.?${x}?<#--?we?still?see?the?plain?var.?here?-->
<#local?x?=?"local">
3.?${x}?<#--?now?the?local?var.?hides?it?-->
<#list?["loop"]?as?x>
????4.?${x}?<#--?now?the?loop?var.?hides?the?local?var.?-->
</#list>
5.?${x}?<#--?now?we?see?the?local?var.?again?-->
</#macro>
輸出結果:
1.?plain
2.?plain
3.?local
4.?loop
5.?local
6.?plain
7.?loop
8.?loop
9.?plain2
內部循環變量隱藏同名的外部循環變量,如:
<#list?["loop?1"]?as?x>
${x}
<#list?["loop?2"]?as?x>
????${x}
????<#list?["loop?3"]?as?x>
??????${x}
????</#list>
????${x}
</#list>
${x}
</#list>
輸出結果:
loop?1
????loop?2
??????loop?3
????loop?2
loop?1
模板中的變量會隱藏(而不是覆蓋)數據模型中同名變量,如果需要訪問數據模型中的同名變量,使用特殊變量global,下面的例子假設數據
模型中的user的值是Big?Joe:
<#assign?user?=?"Joe?Hider">
${user}??????????<#--?prints:?Joe?Hider?-->
${.globals.user}?<#--?prints:?Big?Joe?-->
名字空間
通常情況,只使用一個名字空間,稱為主名字空間,但為了創建可重用的宏、變換器或其它變量的集合(通常稱庫),必須使用多名字空間,
其目的是防止同名沖突
創建庫
下面是一個創建庫的例子(假設保存在lib/my_test.ftl中):
<#macro?copyright?date>
<p>Copyright?(C)?${date}?Julia?Smith.?All?rights?reserved.
<br>Email:?${mail}</p>
</#macro>?
<#assign?mail?=?"jsmith@acme.com">
使用import指令導入庫到模板中,Freemarker會為導入的庫創建新的名字空間,并可以通過import指令中指定的散列變量訪問庫中的變量:
<#import?"/lib/my_test.ftl"?as?my>
<#assign?mail="fred@acme.com">
<@my.copyright?date="1999-2002"/>
${my.mail}
${mail}
輸出結果:
<p>Copyright?(C)?1999-2002?Julia?Smith.?All?rights?reserved.
<br>Email:?jsmith@acme.com</p>
jsmith@acme.com
fred@acme.com
可以看到例子中使用的兩個同名變量并沒有沖突,因為它們位于不同的名字空間。還可以使用assign指令在導入的名字空間中創建或替代變量
,下面是一個例子:
<#import?"/lib/my_test.ftl"?as?my>
${my.mail}
<#assign?mail="jsmith@other.com"?in?my>
${my.mail}
輸出結果:
jsmith@acme.com
jsmith@other.com
數據模型中的變量任何地方都可見,也包括不同的名字空間,下面是修改的庫:
<#macro?copyright?date>
<p>Copyright?(C)?${date}?${user}.?All?rights?reserved.</p>
</#macro>
<#assign?mail?=?"${user}@acme.com">
假設數據模型中的user變量的值是Fred,則下面的代碼:
<#import?"/lib/my_test.ftl"?as?my>
<@my.copyright?date="1999-2002"/>
${my.mail}
輸出結果:
<p>Copyright?(C)?1999-2002?Fred.?All?rights?reserved.</p>Fred@acme.com
?
我的測測實例和測試結果截圖:
helllo.flt
?| <html> ????<head> ????????<title>hello!</title> ????</head> ????<body> ????????<div>list: ????????????<#list user?sort_by("id") as u> ????????????????<h1>${u.id}----${u.name}-----${u.date?string('yy-MM-dd HH:mm:ss')}</h1> ????????????</#list> ????????</div> ????????<div> ????????????insert a boolean: ????????????<#assign foo=true /> ????????????${foo?string} ????????</div> ?????????? ????????<div> ????????????if,elseif, else ????????????<#assign a=2 /> ????????????<#if a=1> ????????????????a value:1 ????????????<#elseif a=2> ????????????????a value:2 ????????????<#elseif a=3> ????????????????a value:3??? ????????????<#else> ????????????????a value is else ????????????</#if>???????????????? ????????</div> ?????????? ????????<div> ????????????case: ????????????<#assign str="wangkang"> ?????????????? ????????????<#switch str> ????????????????<#case "wangkang1"> ????????????????????${str} ????????????????<#break> ????????????????<#case "wangkang2"> ????????????????????${str} ????????????????<#break> ????????????????<#case "wangkang"> ????????????????????${str} ????????????????<#break> ????????????</#switch>???? ????????</div> ?????????? ????????<div> ????????????1:common ????????????<#macro greet1> ????????????????<font size="+2" color="red">Hello Kitty!</font> ????????????</#macro> ????????????<@greet1>macro:</@greet1><br /> ?????????????? ????????????2:design a parameter ????????????<#macro greet2 person> ????????????????<font size="+2" color="red">hello ${person}</font> ????????????</#macro> ????????????<@greet2 person="wangkang!"/><br /> ?????????????? ????????????3:design two parameters ????????????<#macro greet3 person color="blue"> ????????????????<font size="+2" color="${color}">hello ${person}</font> ????????????</#macro> ????????????<@greet3 person="wangkang!" color="green"/><br /> ?????????????? ????????????4:在宏里嵌套內容#nested指令.啥意思呢:好比是jsp的include指令! ????????????<#macro border> ????????????????<table border=4 cellspacing=0 cellpadding=4> ????????????????????<tr> ????????????????????????<td> ????????????????????????<#nested> ????????????????????????</td> ????????????????????</tr> ????????????????</table> ????????????</#macro> ????????????<#--引用--> ????????????<@border>The bordered text</@border> ?????????????? ????????????<#--循環引用--> ????????????<#macro do_thrice> ????????????????<ul> ????????????????????<li><#nested></li> ????????????????????<li><#nested></li> ????????????????????<li><#nested></li> ????????????????</ul> ????????????</#macro> ????????????<@do_thrice> ????????????????An cycle String ????????????</@do_thrice> ?????????????? ????????????5: 將上面所有的宏聯合顯示 ????????????<#macro do_thrice> ????????????????<@border> ????????????????????<ul> ????????????????????????<li><#nested></li> ????????????????????????<li><#nested></li> ????????????????????????<li><#nested></li> ????????????????????</ul> ????????????????</@border>???? ????????????</#macro> ????????????<@do_thrice> ????????????????Content ????????????</@do_thrice> ?????????????? ????????????6:在宏中定義使用循環變量<br /> ????????????<#macro repeat count> ????????????????<#list 1..count as x> ????????????????????<#nested x, x/2, x==count> ????????????????????<#--${x?number}--> ????????????????</#list> ????????????</#macro> ?????????????????? ????????????<@repeat count=4 ; c, halfc, last> ????????????????${c}. ${halfc}<br /> ????????????????<#if last> Last!</#if> ????????????</@repeat> ????????????<br /> ????????????<@repeat count=4 ; c, halfc, last> ????????????????${c}. ${halfc}<#if last> Last!</#if> ????????????</@repeat> ????????????<br /> ????????????<@repeat count=4 ; c, halfc> ????????????????${c}. ${halfc} ????????????</@repeat> ????????????<br /> ????????????<@repeat count=4> ????????????????Just repeat it... ????????????</@repeat> ????????????<br /> ????????</div> ?????????? ????????6: freemarker中的變量作用范圍 ????????<div> ????????????1:<br /> ????????????<#assign x = "plain"> ????????????${x} <#-- we see the plain var. here -->?????????? ????????????<@test/> ????????????6. ${x} <#-- the value of plain var. was not changed --> ????????????????<#list ["loop"] as x> ????????????7. ${x} <#-- now the loop var. hides the plain var. --> ????????????????<#assign x = "plain2"> <#-- replace the plain var, hiding does not mater here --> ????????????8. ${x} <#-- it still hides the plain var. --> ????????????????</#list> ????????????9. ${x} <#-- the new value of plain var. --> ????????????????<#macro test> ????????????2. ${x} <#-- we still see the plain var. here --> ????????????????<#local x = "local"> ????????????3. ${x} <#-- now the local var. hides it --> ????????????????<#list ["loop"] as x> ????????????4. ${x} <#-- now the loop var. hides the local var. --> ????????????????</#list> ????????????5. ${x} <#-- now we see the local var. again --> ????????????????</#macro> ????????????<br /> ????????????2: 內部循環變量隱藏同名的外部循環變量 ????????????<#list ["loop 1"] as x> ????????????????${x} ????????????????????<#list ["loop 2"] as x> ????????????????????????${x} ????????????????????????<#list ["loop 3"] as x> ??????????????????????????${x} ????????????????????????</#list> ????????????????????????${x} ????????????????????</#list> ????????????????${x} ????????????</#list> ????????????<br /> ????????????3:需要訪問數據模型中的同名變量,使用特殊變量global ????????????<#assign num=1000> ????????????剛剛定義的num:${num}<br>??????? ????????????模型中的:${.globals.num}? ????????</div> ?????????? ????????8:名字空間 ????????<div> ????????????<#-- ????????????1:? ????????????<#import "taglib.ftl" as my> ????????????<#assign mail="fred@acme.com"> ????????????<@my.copyright date="1999-2002"/> ????????????${my.mail} ????????????${mail} ????????????--> ????????????<#-- ????????????2: 用assign指令在導入的名字空間中創建或替代變量 ????????????<#import "taglib.ftl" as my> ????????????${my.mail}<br /> ????????????<#assign mail="fred@acme.com" in my> ????????????${my.mail} ????????????--> ????????????3: 數據模型中的變量任何地方都可見,也包括不同的名字空間 ????????????<#import "taglib1.ftl" as my> ????????????<@my.copyright date="1999-2002"/> ????????</div> ?????????? ????????<#-- ******************************我看手冊做的一些例子************************* --> ?????????? ????????<#-- 關于字符串的一些操作 --> ????????<div> ????????????(1)<#--Interpolation向文本中插入表達式的值--> ????????????<#assign user="Kitty" /> ????????????${"Hello ${user}"}<br /> ????????????${"${user}${user}${user}${user}"} <br /><br /> ????????????${"Hello" + user + "!!"}<br /> ????????????${user + "\n" +user}<br /> ?????????????? ????????????(2)<#--list---> ????????????${user[0]}${user[4]}<br /> ????????????${user[0..4]}<br /> ?????????????? ????????????(3)<#--使用字符串的+--> ????????????<#list ["aaa", "bbb"] + ["ccc", "ddd"] as u> ????????????????${u} ????????????</#list><br /> ?????????????? ????????????(4)<#--散列操作: 連接符號":"--> ????????????<#assign ages={"lei":30, "hou":20}+{"ying":19, "hou": 10} /> ????????????????---lei:${ages.lei}<br /> ????????????????---hou:${ages.hou}<br /> ????????????????---ying:${ages.ying}<br /> ????????</div> ?????????? ????????<#-- 關于運算的操作? --> ????????<div> ????????????<#assign x=5 /> ????????????(1)<#-- 使用內建的操作后的整數部分,去掉小數點以后的部分,直接取整 --> ????????????5/2取整:${(x/2)?int} <br /> ????????????1.3取整:${1.3?int}<br /> ????????????1.9取整:${1.89?int}<br /> ????????????-1.3取整:${1.2?int}<br /> ????????????-1.9取整:${1.9?int}<br /> ?????????????? ????????????(2)<#--freemarker的比較=,!=,>,>=,<,<=, 還有關于邏輯操作符:"&&", "||", "!" --><br /> ????????????(3)<#-- 關于字符串使用的:html對html進行編碼;cap_first字符串首字母大寫;lower_case字符串小寫;upper_case大寫;trim去掉首尾空格 --> ????????????????<#--序列使用的:size獲得序列中的元素個數--> ????????????????<#--數字是用的:int--> ????????????????<#assign names=["a<ht&ml>", "b", "c"] /> ????????????????${names[0]?upper_case?html} ????????????<br />???? ????????????(4)關于interpolation的詳細使用 ????????????<#setting number_format="currency"/> ????????????<#assign ans=100/> ????????????${ans}<br/> ????????????${ans?string}<br/> ????????????${ans?string.number}<br/> ????????????${ans?string.currency}<br/> ????????????${ans?string.percent}<br/> ????????????<br> ????????????(5)<#--關于時間的設置-->????????? ????????????${dd?string("yy-MM-dd, HH:mm:ss")} ?????????????? ????????????<#assign a=true/> ????????????${a?string("yes", "no")} ????????????<br/> ????????????(6)<#-- 關于數字的格式化(數字的Interpolation:#{exp; format}):mX:小數部分最小x位,MX:小數部分最大x位 --> ????????????<#assign ax=2.5890 /> ????????????<#assign bx=10 /> ????????????#{ax; m2}<br/> ????????????#{bx; M2}<br/> ????????????#{ax; m2}<br/> ????????????#{bx; M2}<br/> ????????????<br/> ?????????????? ????????</div> ????</body> </html> |
?
taglib.flt
?| <#macro copyright date> ????<p>Copyright (C) ${date} Julia Smith. All rights reserved. ????<br>Email: ${mail}</p> </#macro>? <#assign mail = "jsmith@acme.com"> |
tablib1.flt
?| <#macro copyright date> ????<p>Copyright (C) ${date} Julia Smith. All rights reserved numbers:${num}. ????<br>Email: ${mail}</p> </#macro>? <#assign mail = "jsmith@acme.com"> |
測試結果:
分類: JavaWeb總結
以上是生活随笔為你收集整理的FreeMarker基础语法教程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中华人民共和国全国人民代表大会是最高国家
- 下一篇: 红河州退役军人事务局关于军人家属调动有关