FreeMarker設計指南(3)
3、模板
(1)整體結構
模板使用FTL(FreeMarker模板語言)編寫,是下面各部分的一個組合:
Ø 文字:直接輸出
Ø Interpolation:由${和},或#{和}來限定,計算值替代輸出
Ø FTL標記:FreeMarker指令,和HTML標記類似,名字前加#予以區分,不會輸出
Ø 註釋:由
下面是以一個具體模板例子:
We have these animals:
- ${being.name} for ${being.price} Euros #list>
注意事項:
Ø FTL區分大小寫,所以list是正確的FTL指令,而List不是;${name}和${NAME}是不同的
Ø Interpolation只能在文字中使用
Ø FTL標記不能位於另一個FTL標記內部,例如:
='bar'>...Ø 註釋可以位於FTL標記和Interpolation內部,如下面的例子:
Welcome ${user [BR]
We have these animals:[BR]
- [BR][BR]... Ø 多餘的空白字元會在模板輸出時移除
- ${being.name} for ${being.price} Euros (except for you)#list>#if> 如果使用不存在的指令,FreeMarker不會使用模板輸出,而是產生一個錯誤訊息
FreeMarker會忽略FTL標記中的空白字元,如下面的例子:
[BR]${being.name} for ${being.price} Euros[BR]#list > 但是,
(3)表示式
直接指定值
Ø 字串
n 使用單引號或雙引號限定
n 如果包含特殊字元需要轉義,如下面的例子:
${"It's "quoted" andthis is a backslash: "} ${'It's "quoted" andthis is a backslash: } 輸出結果是:
It's "quoted" andthis is a backslash: It's "quoted" andthis is a backslash: 下面是支援的轉義序列:
轉義序列
含義
"
雙引號(u0022)
'
單引號(u0027)
反斜槓(u005C)
n
換行(u000A)
r
Return (u000D)
t
Tab (u0009)
b
Backspace (u0008)
f
Form feed (u000C)
l
<
g
>
a
&
{
{
xCode
4位16進位制Unicode程式碼
有一類特殊的字串稱為raw字串,被認為是純文字,其中的和{等不具有特殊含義,該類字串在引號前面加r,下面是一個例子:
${r"${foo}"}${r"C:foobar"} 輸出的結果是:
${foo}C:foobar Ø 數字
n 直接輸入,不需要引號
n 精度數字使用“.”分隔,不能使用分組符號
n 目前版本不支援科學計數法,所以“1E3”是錯誤的
n 不能省略小數點前面的0,所以“.5”是錯誤的
n 數字8、+8、08和8.00都是相同的
Ø 布林值
n true和false,不使用引號
Ø 序列
n 由逗號分隔的子變數列表,由方括號限定,下面是一個例子:
${x}#list> 輸出的結果是:
winterspringsummerautumnn 列表的專案是表示式,所以可以有下面的例子:
[2 + 2, [1, 2, 3, 4], "whatnot"]n 可以使用數字範圍定義數字序列,例如2..5等同於[2, 3, 4, 5],但是更有效率,注意數字範圍沒有方括號
n 可以定義反遞增的數字範圍,如5..2
Ø 雜湊(hash)
n 由逗號分隔的鍵/值列表,由大括號限定,鍵和值之間用冒號分隔,下面是一個例子:
{"name":"green mouse", "price":150}n 鍵和值都是表示式,但是鍵必須是字串
l 獲取變數
Ø 頂層變數: ${variable},變數名只能是字母、數字、下劃線、$、@和#的組合,且不能以數字開頭
Ø 從雜湊中獲取資料
n 可以使用點語法或方括號語法,假設有下面的資料模型:
(root) | +- book | | | +- title = "Breeding green mouses" | | | +- author | | | +- name = "Julia Smith" | | | +- info = "Biologist, 1923-1985, Canada" | +- test = "title" 下面都是等價的:
book.author.namebook["author"].namebook.author.["name"]book["author"]["name"]n 使用點語法,變數名字有頂層變數一樣的限制,但方括號語法沒有該限制,因為名字是任意表示式的結果
Ø 從序列獲得資料:和雜湊的方括號語法語法一樣,只是方括號中的表示式值必須是數字;注意:第一個專案的索引是0
Ø 序列片斷:使用[startIndex..endIndex]語法,從序列中獲得序列片斷(也是序列);startIndex和endIndex是結果為數字的表示式
Ø 特殊變數:FreeMarker內定義變數,使用.variablename語法訪問
字串操作
Ø Interpolation(或連線操作)
n 可以使用${..}(或#{..})在文字部分插入表示式的值,例如:
${"Hello ${user}!"}${"${user}${user}${user}${user}"} n 可以使用+運算子獲得同樣的結果
${"Hello " + user + "!"}${user + user + user + user}n ${..}只能用於文字部分,下面的程式碼是錯誤的:
Wow!#if>Wow!#if>應該寫成:
Wow!#if>Ø 子串
n 例子(假設user的值為“Big Joe”):
${user[0]}${user[4]}${user[1..4]}結果是(注意第一個字元的索引是0):
BJig J 序列操作
Ø 連線操作:和字串一樣,使用+,下面是一個例子:
- ${user}#list>輸出結果是:
- Joe- Fred- Julia- Kate 雜湊操作
Ø 連線操作:和字串一樣,使用+,如果具有相同的key,右邊的值替代左邊的值,例如:
- Joe is ${ages.Joe}- Fred is ${ages.Fred}- Julia is ${ages.Julia} 輸出結果是:
- Joe is 30- Fred is 25- Julia is 18 算術運算
Ø +、-、×、/、%,下面是一個例子:
${x * x - 100}${x / 2}${12 % 10}輸出結果是(假設x為5):
-752.52 Ø 運算子兩邊必須是數字,因此下面的程式碼是錯誤的:
${3 * "5"}
${3 + "5"} 輸出結果是:
35Ø 使用內建的int(後面講述)獲得整數部分,例如:
${(x/2)?int}${1.1?int}${1.999?int}${-1.1?int}${-1.999?int}輸出結果是(假設x為5):
211-1-1 比較運算子
Ø 使用=(或==,完全相等)測試兩個值是否相等,使用!= 測試兩個值是否不相等
Ø =和!=兩邊必須是相同型別的值,否則會產生錯誤,例如會引起錯誤
Ø Freemarker是精確比較,所以對"x"、"x "和"X"是不相等的
Ø 對數字和日期可以使用和>=,但不能用於字串
Ø 由於Freemarker會將>解釋成FTL標記的結束字元,所以對於>和>=可以使用括號來避免這種情況,例如 y)>
Ø 另一種替代的方法是,使用lt、lte、gt和gte來替代和>=
邏輯運算子
Ø &&(and)、||(or)、!(not),只能用於布林值,否則會產生錯誤
Ø 例子:
We have less than 12 things, and they are green.#if> 內建函式
Ø 內建函式的用法類似訪問雜湊的子變數,只是使用“?”替代“.”,下面列出常用的一些函式
Ø 字串使用的:
n html:對字串進行HTML編碼
n cap_first:使字串第一個字母大寫
n lower_case:將字串轉換成小寫
n upper_case:將字串轉換成大寫
n trim:去掉字串前後的空白字元
Ø 序列使用的:
n size:獲得序列中元素的數目
Ø 數字使用的:
n int:取得數字的整數部分(如-1.9?int的結果是-1)
Ø 例子(假設test儲存字串"Tom & Jerry"):
${test?html}${test?upper_case?html}輸出結果是:
Tom & JerryTOM & JERRY 運算子優先順序
運算子組
運算子
字尾
[subvarName] [subStringRange] . (methodParams)
一元
+expr、-expr、!
內建
?
乘法
*、 / 、%
加法
+、-
關係
、<=、>=(lt、lte、gt、gte)
相等
==(=)、!=
邏輯and
&&
邏輯or
||
數字範圍
..
(4)Interpolation
Interpolation有兩種型別:
Ø 通用Interpolation:${expr}
Ø 數字Interpolation:#{expr}或#{expr; format}
注意:Interpolation只能用於文字部分
通用Interpolation
Ø 插入字串值:直接輸出表示式結果
Ø 插入數字值:根據預設格式(由#setting指令設定)將表示式結果轉換成文字輸出;可以使用內建函式string格式化單個Interpolation,下面是一個例子:
${answer}${answer?string}
$42.00$42.0042$42.004,200%Ø 插入日期值:根據預設格式(由#setting指令設定)將表示式結果轉換成文字輸出;可以使用內建函式string格式化單個Interpolation,下面是一個使用格式模式的例子:
${lastUpdated?string("yyyy-MM-dd HH:mm:ss zzzz")}${lastUpdated?string("EEE, MMM d, ''yy")}${lastUpdated?string("EEEE, MMMM dd, yyyy, hh:mm:ss a '('zzz')'")} 輸出的結果類似下面的格式:
2003-04-08 21:24:44 Pacific Daylight TimeTue, Apr 8, '03Tuesday, April 08, 2003, 09:24:44 PM (PDT)Ø 插入布林值:根據預設格式(由#setting指令設定)將表示式結果轉換成文字輸出;可以使用內建函式string格式化單個Interpolation,下面是一個例子:
${foo?string("yes", "no")}輸出結果是:
yes 數字Interpolation的#{expr; format}形式可以用來格式化數字,format可以是:
Ø mX:小數部分最小X位
Ø MX:小數部分最大X位
Ø 例子:
#{x; M2} [@more@]
(2)指令
在FreeMarker中,使用FTL標記引用指令
有三種FTL標記,這和HTML標記是類似的:
Ø 開始標記:
Ø 結束標記:#directivename>
Ø 空內容指令標記:
有兩種型別的指令:預定義指令和使用者定義指令
使用者定義指令要使用@替換#,如...<>(會在後面講述)
FTL標記不能夠交叉,而應該正確的巢狀,如下面的程式碼是錯誤的:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/750220/viewspace-905566/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- FreeMarker設計指南(1)
- FreeMarker設計指南(2)
- FreeMarker設計指南(4)
- FreeMarker整合Spring 3Spring
- 來做題,拿《CSS設計指南(第3版)》CSS
- [譯]AppExtension程式設計指南:擴充套件基礎3APP程式設計套件
- Python函數語言程式設計指南(3):迭代器Python函數程式設計
- POCO庫中文程式設計參考指南(3)Poco::Net::Socket程式設計
- restful api設計指南RESTAPI
- 微服務設計指南微服務
- JavaScript SDK 設計指南JavaScript
- RESTful API 設計指南RESTAPI
- 互動設計指南
- WebGL程式設計指南(3)高階變換與動畫基礎Web程式設計動畫
- Posix執行緒程式設計指南(3)-執行緒同步 (轉)執行緒程式設計
- RESTFUL API 安全設計指南RESTAPI
- SVGA 設計使用指南SVG
- Core Text 程式設計指南程式設計
- 程式設計師脫單指南程式設計師
- UX設計指南 - DEV社群UXdev
- Spark—GraphX程式設計指南Spark程式設計
- SAP OData程式設計指南程式設計
- 滾動視差設計指南
- 程式設計師跳槽指南程式設計師
- RESTful API 設計指南【轉】RESTAPI
- Java Socket 程式設計指南Java程式設計
- 程式設計師熬夜指南程式設計師
- bash 程式設計指南(轉)程式設計
- 服務端指南 | 良好的 API 設計指南服務端API
- 服務端指南 | 微服務初級設計指南服務端微服務
- 程式設計師裝B指南程式設計師
- 遊戲程式設計入門指南遊戲程式設計
- 全境封鎖UI設計指南UI
- React元件「設計模式」快速指南React元件設計模式
- 程式設計師防猝死指南程式設計師
- 程式設計師【黑話】指南程式設計師
- MT6797 LCM設計指南
- UI設計終極配色指南UI