1. 程式人生 > >最全的freemarker教程

最全的freemarker教程

FreeMarker的模板檔案並不比HTML頁面複雜多少,FreeMarker模板檔案主要由如下4個部分組成:

1,文字:直接輸出的部分

2,註釋:<#--...-->格式部分,不會輸出

3,插值:${...}#{...}格式的部分,將使用資料模型中的部分替代輸出

4,FTL指令:FreeMarker指定,HTML標記類似,名字前加#予以區分,不會輸出

下面是一個FreeMarker模板的例子,包含了以上所說的4個部分<html><br>

<head><br>
<title>Welcome!</title><br>
</head><br>
<body><br>
<#--註釋部分--><br>
<#--下面使用插值-->
<h1>Welcome${user}!</h1><br>
<p>Wehavetheseanimals:<br>
<u1><br>
<#--使用FTL指令-->
<#listanimalsasbeing><br>
<li>${being.name}for${being.price}Euros<br>
<#list><br>
<u1><br>
</body><br>
</html>

 

1.   FTL指令規則

FreeMarker,使用FTL標籤來使用指令,FreeMarker3FTL標籤,這和HTML標籤是完全類似的.

1.1.      開始標籤:<#directivenameparameter>

1.2.      結束標籤:</#directivename>

1.3.      空標籤:<#directivenameparameter/>

 

實際上,使用標籤時前面的符號#也可能變成@,如果該指令是一個使用者指令而不是系統內建指令時,應將#符號改成@符號.

使用FTL標籤時,應該有正確的巢狀,而不是交叉使用,這和XML標籤的用法完全一樣.如果全用不存在的指令,FreeMarker不會使用模板輸出,而是產生一個錯誤訊息.FreeMarker會忽略FTL標籤中的空白字元.值得注意的是<,/>和指令之間不允許有空白字元.

 

2.  插值規則

 

FreeMarker的插值有如下兩種型別:1,通用插值${expr};2,數字格式化插值:#{expr}

#{expr;format}

 

2.1.      通用插值

 

對於通用插值,又可以分為以下4種情況:

1,插值結果為字串值:直接輸出表達式結果

2,插值結果為數字值:根據預設格式(#setting指令設定)將表示式結果轉換成文字輸出.可以使用內建的字串函式格式化單個插值,如下面的例子:

<#settionnumber_format="currency"/>
<#assignanswer=42/>
${answer}
${answer?string}<#--thesameas${answer}-->
${answer?string.number}
${answer?string.currency}
${answer?string.percent}
${answer}

輸出結果是:

$42.00
$42.00
42
$42.00
4,200%

3,插值結果為日期值:根據預設格式(#setting指令設定)將表示式結果轉換成文字輸出.可以使用內建的字串函式格式化單個插值,如下面的例子:

${lastUpdated?string("yyyy-MM-ddHH:mm:sszzzz")}
${lastUpdated?string("EEE,MMMd,''yy")}
${lastUpdated?string("EEEE,MMMMdd,yyyy,hh:mm:ssa'('zzz')'")}

輸出結果是:

2008-04-0808:08:08PacificDaylightTime
Tue,Apr8,'03
Tuesday,April08,2003,08:08:08PM(PDT)

4,插值結果為布林值:根據預設格式(#setting指令設定)將表示式結果轉換成文字輸出.可以使用內建的字串函式格式化單個插值,如下面的例子:

<#assignfoo=true/>
${foo?string("yes","no")}

輸出結果是:

yes

 

2.2.      數字格式化插值

 

數字格式化插值可採用#{expr;format}形式來格式化數字,其中format可以是:

mX:小數部分最小X

MX:小數部分最大X

如下面的例子:

<#assignx=2.582/>
<#assigny=4/>
#{x;M2}<#--輸出2.58-->
#{y;M2}<#--輸出4-->
#{x;m2}<#--輸出2.6-->
#{y;m2}<#--輸出4.0-->
#{x;m1M2}<#--輸出2.58-->
#{x;m1M2}<#--輸出4.0-->

 

3.  表示式

 

表示式是FreeMarker模板的核心功能,表示式放置在插值語法${}之中時,表明需要輸出表達式的值;表示式語法也可與FreeMarker標籤結合,用於控制輸出.實際上FreeMarker的表示式功能非常強大,它不僅支援直接指定值,輸出變數值,也支援字串格式化輸出和集合訪問等功能.

 

3.1.      直接指定值

 

使用直接指定值語法讓FreeMarker直接輸出插值中的值,而不是輸出變數值.直接指定值可以是字串,數值,布林值,集合和MAP物件.

 

3.1.1.        字串

直接指定字串值使用單引號或雙引號限定,如果字串值中包含特殊字元需要轉義,看下面的例子:

${"我的檔案儲存在C:\\盤"}
${'我名字是\"annlee\"'}

輸出結果是:

我的檔案儲存在C:\盤
我名字是"annlee"

 

FreeMarker支援如下轉義字元:

\";雙引號(u0022)

\';單引號(u0027)

\\;反斜槓(u005C)

\n;換行(u000A)

\r;回車(u000D)

\t;Tab(u0009)

\b;退格鍵(u0008)

\f;Formfeed(u000C)

\l;<

\g;>

\a;&

\{;{

\xCode;直接通過4位的16進位制數來指定Unicode,輸出該unicode碼對應的字元.

 

如果某段文字中包含大量的特殊符號,FreeMarker提供了另一種特殊格式:可以在指定字串內容的引號前增加r標記,r標記後的檔案將會直接輸出.看如下程式碼:

${r"${foo}"}
${r"C:\foo\bar"}

輸出結果是:

${foo}
C:\foo\bar

 

3.1.2.        數值

表示式中的數值直接輸出,不需要引號.小數點使用"."分隔,不能使用分組","符號.FreeMarker目前還不支援科學計數法,所以"1E3"是錯誤的.FreeMarker表示式中使用數值需要注意以下幾點:

1,數值不能省略小數點前面的0,所以".5"是錯誤的寫法

2,數值8,+8,8.00都是相同的

 

3.1.3.        布林值

直接使用truefalse,不使用引號.

 

3.1.4.        集合

集合以方括號包括,各集合元素之間以英文逗號","分隔,看如下的例子:

<#list["星期一","星期二","星期三","星期四","星期五","星期六","星期天"]asx>
${x}
</#list>

輸出結果是:

星期一
星期二
星期三
星期四
星期五
星期六
星期天

 

除此之外,集合元素也可以是表示式,例子如下:

[2+2,[1,2,3,4],"whatnot"]

 

還可以使用數字範圍定義數字集合,2..5等同於[2,3,4,5],但是更有效率.注意,使用數字範圍來定義集合時無需使用方括號,數字範圍也支援反遞增的數字範圍,5..2

 

3.1.5.        Map物件

Map物件使用花括號包括,Map中的key-value對之間以英文冒號":"分隔,多組key-value對之間以英文逗號","分隔.下面是一個例子:

{"語文":78,"數學":80}

Map物件的keyvalue都是表示式,但是key必須是字串

 

3.2.      輸出變數值

 

FreeMarker的表示式輸出變數時,這些變數可以是頂層變數,也可以是Map物件中的變數,還可以是集合中的變數,並可以使用點(.)語法來訪問Java物件的屬性.下面分別討論這些情況

 

3.2.1.       頂層變數

所謂頂層變數就是直接放在資料模型中的值,例如有如下資料模型:

Maproot=newHashMap();//建立資料模型
root.put("name","annlee");//name是一個頂層變數

 

對於頂層變數,直接使用${variableName}來輸出變數值,變數名只能是字母,數字,下劃線,$,@#的組合,且不能以數字開頭號.為了輸出上面的name的值,可以使用如下語法:

${name}

 

3.2.2.       輸出集合元素

如果需要輸出集合元素,則可以根據集合元素的索引來輸出集合元素,集合元素的索引以方括號指定.假設有索引:

["星期一","星期二","星期三","星期四","星期五","星期六","星期天"].該索引名為week,如果需要輸出星期三,則可以使用如下語法:

${week[2]}//輸出第三個集合元素

 

此外,FreeMarker還支援返回集合的子集合,如果需要返回集合的子集合,則可以使用如下語法:

week[3..5]//返回week集合的子集合,子集合中的元素是week集合中的第4-6個元素

3.2.3.       輸出Map元素

這裡的Map物件可以是直接HashMap的例項,甚至包括JavaBean例項,對於JavaBean例項而言,我們一樣可以把其當成屬性為key,屬性值為valueMap例項.為了輸出Map元素的值,可以使用點語法或方括號語法.假如有下面的資料模型:

Maproot=newHashMap();
Bookbook=newBook();
Authorauthor=newAuthor();
author.setName("annlee");
author.setAddress("gz");
book.setName("struts2");
book.setAuthor(author);
root.put("info","struts");
root.put("book",book);

 

為了訪問資料模型中名為struts2的書的作者的名字,可以使用如下語法:

book.author.name//全部使用點語法
book["author"].name
book.author["name"]//混合使用點語法和方括號語法
book["author"]["name"]//全部使用方括號語法

 

使用點語法時,變數名字有頂層變數一樣的限制,但方括號語法沒有該限制,因為名字可以是任意表達式的結果.

 

3.2.4.       字串操作

 

FreeMarker的表示式對字串操作非常靈活,可以將字串常量和變數連線起來,也可以返回字串的子串等.

 

字串連線有兩種語法:

1,使用${..}#{..}在字串常量部分插入表示式的值,從而完成字串連線.

2,直接使用連線運算子+來連線字串

 

例如有如下資料模型:

Maproot=newHashMap();root.put("user","annlee");

下面將user變數和常量連線起來:

${"hello,${user}!"}//使用第一種語法來連線
${"hello,"+user+"!"}//使用+號來連線

上面的輸出字串都是hello,annlee!,可以看出這兩種語法的效果完全一樣.

 

值得注意的是,${..}只能用於文字部分,不能用於表示式,下面的程式碼是錯誤的:

<#if${isBig}>Wow!</#if>
<#if"${isBig}">Wow!</#if>

應該寫成:

<#ifisBig>Wow!</#if>

 

擷取子串可以根據字串的索引來進行,擷取子串時如果只指定了一個索引值,則用於取得字串中指定索引所對應的字元;如果指定兩個索引值,則返回兩個索引中間的字串子串.假如有如下資料模型:

Maproot=newHashMap();root.put("book","struts2,freemarker");

可以通過如下語法來擷取子串:

${book[0]}${book[4]}//結果是su
${book[1..4]}//結果是tru

 

3.2.5.       集合連線運算子

 

這裡所說的集合運算子是將兩個集合連線成一個新的集合,連線集合的運算子是+,看如下的例子:

<#list["星期一","星期二","星期三"]+["星期四","星期五","星期六","星期天"]asx>
${x}
</#list>

輸出結果是:

星期一星期二星期三星期四星期五星期六星期天

 

3.2.6.       Map連線運算子

 

Map物件的連線運算子也是將兩個Map物件連線成一個新的Map物件,Map物件的連線運算子是+,如果兩個Map物件具有相同的key,則右邊的值替代左邊的值.看如下的例子:

<#assignscores={"語文":86,"數學":78}+{"數學":87,"Java":93}>
語文成績是${scores.語文}
數學成績是${scores.數學}
Java成績是${scores.Java}

輸出結果是:

語文成績是86
數學成績是87
Java成績是93

 

3.2.7.       算術運算子

 

FreeMarker表示式中完全支援算術運算,FreeMarker支援的算術運算子包括:+,-,*,/,%看如下的程式碼:

<#assignx=5>
${x*x-100}
${x/2}
${12%10}

輸出結果是:

-752.52

 

在表示式中使用算術運算子時要注意以下幾點:

1,運算子兩邊的運算數字必須是數字

2,使用+運算子時,如果一邊是數字,一邊是字串,就會自動將數字轉換為字串再連線,:${3+"5"},結果是:35

 

使用內建的int函式可對數值取整,:

<#assignx=5>
${(x/2)?int}
${1.1?int}
${1.999?int}
${-1.1?int}
${-1.999?int}

結果是:

211-1-1

 

3.2.8.       比較運算子

 

表示式中支援的比較運算子有如下幾個:

1,=或者==:判斷兩個值是否相等.

2,!=:判斷兩個值是否不等.

3,>或者gt:判斷左邊值是否大於右邊值

4,>=或者gte:判斷左邊值是否大於等於右邊值

5,<或者lt:判斷左邊值是否小於右邊值

6,<=或者lte:判斷左邊值是否小於等於右邊值

 

注意:=!=可以用於字串,數值和日期來比較是否相等,=!=兩邊必須是相同型別的值,否則會產生錯誤,而且FreeMarker是精確比較,"x","x","X"是不等的.其它的執行符可以作用於數字和日期,但不能作用於字串,大部分的時候,使用gt等字母運算子代替>會有更好的效果,因為FreeMarker會把>解釋成FTL標籤的結束字元,當然,也可以使用括號來避免這種情況,:<#if(x>y)>

 

3.2.9.       邏輯運算子

 

邏輯運算子有如下幾個:

邏輯與:&&

邏輯或:||

邏輯非:!

邏輯運算子只能作用於布林值,否則將產生錯誤

 

3.2.10.             內建函式

 

FreeMarker還提供了一些內建函式來轉換輸出,可以在任何變數後緊跟?,?後緊跟內建函式,就可以通過內建函式來輪換輸出變數.下面是常用的內建的字串函式:

html:對字串進行HTML編碼

cap_first:使字串第一個字母大寫

lower_case:將字串轉換成小寫

upper_case:將字串轉換成大寫

trim:去掉字串前後的空白字元

 

下面是集合的常用內建函式

相關推薦

瀏覽器緩存清理圖文教程

定時清除 target height span 保留 ont 菜單欄 工具 史記  瀏覽器是每個使用電腦的人都會用的,瀏覽器的功能就是可以瀏覽任何網頁,每瀏覽一個網頁,瀏覽器都會默認加載下載一些緩存文件,瀏覽的網頁越多,瀏覽器緩存就越多,導致時間久了,瀏覽器的反應就越來越慢

Pycharm教程(10)——Pycharm調試器總篇

通過 pro pri order 相關配置 points 信息 發現 blank   最全Pycharm教程(1)——定制外觀   最全Pycharm教程(2)——代碼風格   最全Pycharm教程(3)——代碼的調試、執行   最全Pycharm教程(4)—

Pycharm教程(24)——Pycharm編輯器功能之宏定義

ans 指針 ext election ger rda 宏定義 中源 全選   1、為什麽使用宏   增加你須要反復某種操作非常多次。比如選中源代碼並將其發送到控制臺端調試,我們能不能將著一系列操作簡化為一步,甚至用一組快捷鍵來取代呢?   2、準備工作   (

Pycharm教程(11)——Pycharm調試器之斷點篇

pes eas 觀察 project 項目 python pre 啟動 image   最全Pycharm教程(1)——定制外觀   最全Pycharm教程(2)——代碼風格   最全Pycharm教程(3)——代碼的調試、執行

Pycharm教程(26)——Pycharm搜索導航之文件名、符號名搜索(轉)

技術分享 tail link isp 嘗試 多重 image pop 教程 1、準備一個工程   向你的工程中添加一個Python文件,並輸入一些源碼,例如:   2、轉到對應文件、類、符號   Pycharm提供的一個很強力的功能就是能夠根據名稱跳轉到任何文件、類、符

Python的高級特效是什麽?有什麽用呢?史上教程

val decorator itertools 異常 最全的 運行時 factory tor rfi 本篇文章重點介紹以下內容 Python語言的一些高階用法主要有以下幾個特性: generators生成器用法 collections包常見用法 itertoo

史上SVN 教程

解決 代碼管理 右擊 gravity mark ML 頁面 就是 工作 以下博文引用《https://blog.csdn.net/u013067756/article/details/73302758》,再此僅供學習和參考。 Svn是什麽? SVN(全稱Sub

PyCharm教程(1-15)【轉】

最全Pycharm教程(1)——定製外觀 原文:https://blog.csdn.net/u013088062/article/details/50100121 最全Pycharm教程(2)——程式碼風格 原文:https://blog.csdn.net/u013088062/arti

halcon教程從0基礎到精通 快速瞭解操作並精通視覺專案視訊教程資料彙總 halcon下載

全網最全資料總連結: halcon是德國公司開發的一套很完善的機器視覺演算法包,很廣泛地應用於工業各個領域中,用途十分廣泛,是一款值得學習的影象處理軟體,個人覺得:halcon雖然沒有opencv和matlab在影象處理領域應用更加廣泛,專業性、整合封裝性、穩

從零開始搭建Detox自動化測試框架測試React Native (IOS/Andriod)也許是全網教程 持續更新中

構建APP並執行用例 構建APP 編譯 debug模式 detox build --configuration ios.sim.debug release模式 detox build --configuration ios.sim.release 5.2 執

192GPS教程+素材+外掛+推薦收藏

史上最全PS教程+素材。(192G乾貨) 內含各類PS教程(PS基礎教程,淘寶美工教程,人像教程等) 內含各個版本PS安裝包和破解包(CC2017.CS6.CS5等) 內含字型庫合集(上萬箇中文字型,上萬個英文字型) 內含相簿模版(孕婦模版,兒童寫真模版,男女證件模版等) 內

CentOS下Solr7.4.0安裝部署到Tomcat詳細教程

前言 作業系統:CentOS6.9 64位 Solr版本:Solr7.4.0 Tomcat版本:apache-tomcat-8.5.4 之前一直用Solr6,其實Solr7部署下來和Solr6是一樣的。 部署 第一步:下載安裝包 下載Solr7.4.0: w

Pycharm教程(41)——Pycharm擴充套件功能之便籤註釋

  1、主題   在開發專案的過程中經常需要建立任務列表,對於一些小任務,在程式碼中插入便籤註釋會有奇效。   這種註釋的格式如下:   2、建立便籤註釋   非常簡單:   首先,將游標定位到相應行。   然後,建立一行註釋(Ctrl+Slash)。

Pycharm教程(29)——再探IDE,速成手冊

  1、準備工作   (1)確認安裝了Python直譯器,版本2.4到3.4均可。   2、初始化安裝   第一次安裝Pycharm時,安裝程式會諮詢你幾個重要問題:   (1)是否已經預先儲存了設定資訊(例如早期版本的配置資訊)   (2)許可證資訊   

Pycharm教程(26)——Pycharm搜尋導航之檔名、符號名搜尋

  1、準備一個工程   向你的工程中新增一個Python檔案,並輸入一些原始碼,例如:   2、轉到對應檔案、類、符號   Pycharm提供的一個很強力的功能就是能夠根據名稱跳轉到任何檔案、類、符號所在定義位置。   3、跳轉到檔案   按下Ctrl+S

Pycharm教程(4)——有關Python直譯器的相關配置

如果覺得這篇文章對您有所啟發,歡迎關注我的公眾號,我會盡可能積極和大家交流,謝謝。   1、準備工作  (1)Pycharm版本為3.4或者更高。  (2)電腦上至少已經安裝了一個Python直譯器。  (3)如果你希望配置一個遠端直譯器,則需要伺服器的相關支援。  2、本地

Pycharm教程(35)——Pycharm中使用Vagrant

  1、主題   介紹如何在Pycharm中使用Vagrant   2、準備工作   確認電腦上安裝了Vagrant和Oracle VirtualBox。   3、下載安裝Vagrant   4、下載安裝Oracle VirtualBox   5、設定環境

Pycharm教程(13)——Pycharm部署

如果覺得這篇文章對您有所啟發,歡迎關注我的公眾號,我會盡可能積極和大家交流,謝謝。   1、主題  這篇教程將逐步介紹如何通過Pycharm將你的程式碼部署在遠端伺服器上。  2、準備工作  (1)Pycharm版本為3.0或者更高  (2)擁有待部署遠端伺服器的訪問許可權 

Pycharm教程(10)——Pycharm偵錯程式總篇

如果覺得這篇文章對您有所啟發,歡迎關注我的公眾號,我會盡可能積極和大家交流,謝謝。   1、準備工作  (1)Pycharm版本為3.0或者更高版本  (2)至少安裝了一個Python直譯器並且已經正確配置  (3)已經建立了一個Python工程  2、主要內容  介紹如何通

Pycharm教程(14)——Pycharm編輯器功能總篇

如果覺得這篇文章對您有所啟發,歡迎關注我的公眾號,我會盡可能積極和大家交流,謝謝。   1、主題  在編寫程式碼的過程中,大部分時間都花在了編輯框的互動中。為了能夠更高效的使用這個工具,我們將對其一下特點進行分節介紹:  2、準備工作  (1)Pycharm版本為2.7或者更