FreeMarker設計指南(4)
4、雜項
(1)使用者定義指令
宏和變換器變數是兩種不同型別的使用者定義指令,它們之間的區別是宏是在模板中使用macro指令定義,而變換器是在模板外由程式定義,這裡只介紹
宏
基本用法
Ø 宏是和某個變數關聯的模板片斷,以便在模板中透過使用者定義指令使用該變數,下面是一個例子:
Hello Joe!#macro> Ø 作為使用者定義指令使用宏變數時,使用@替代FTL標記中的#
< 如果沒有體內容,也可以使用:
引數
Ø 在macro指令中可以在宏變數之後定義引數,如:
Hello ${person}!#macro> Ø 可以這樣使用這個宏變數:
and 輸出結果是:
Hello Fred! and Hello Batman! Ø 宏的引數是FTL表示式,所以下面的程式碼具有不同的意思:
Ø 這意味著將Fred變數的值傳給person引數,該值不僅是字串,還可以是其它型別,甚至是複雜的表示式
Ø 宏可以有多引數,下面是一個例子:
Hello ${person}!#macro> Ø 可以這樣使用該宏變數:
Ø 其中引數的次序是無關的,因此下面是等價的:
Ø 只能使用在macro指令中定義的引數,並且對所有引數賦值,所以下面的程式碼是錯誤的:
Ø 可以在定義引數時指定預設值,如:
Hello ${person}!#macro> Ø 這樣就正確了
Ø 宏的引數是區域性變數,只能在宏定義中有效
巢狀內容
Ø 使用者定義指令可以有巢狀內容,使用指令執行指令開始和結束標記之間的模板片斷
Ø 例子:
The bordered text<>輸出結果:
The bordered text |
#macro> Anything.<> 輸出結果:
Anything. Anything. Anything. Ø 巢狀內容可以是有效的FTL,下面是一個有些複雜的例子:
- <>
|
${y} ${count}/${x}: #list>#macro>${y?default("?")} ${x?default("?")} ${count?default("?")}<>輸出結果:
test 3/1: ? ? ? test 3/2: ? ? ? test 3/3: ? ? ?Ø
在宏定義中使用迴圈變數
Ø 使用者定義指令可以有迴圈變數,通常用於重複巢狀內容,基本用法是:作為nested指令的引數傳遞迴圈變數的實際值,而在呼叫使用者定義指令時,在開始標記的引數後面指定迴圈變數的名字
Ø 例子:
#list>#macro> ${c}. ${halfc} Last!#if><> 輸出結果:
1. 0.5 2. 1 3. 1.5 4. 2 Last! Ø 指定的迴圈變數的數目和使用者定義指令開始標記指定的不同不會有問題
n 呼叫時少指定迴圈變數,則多指定的值不可見
n 呼叫時多指定迴圈變數,多餘的迴圈變數不會被建立
(2)在模板中定義變數
在模板中定義的變數有三種型別:
Ø plain變數:可以在模板的任何地方訪問,包括使用include指令插入的模板,使用assign指令建立和替換
Ø 區域性變數:在宏定義體中有效,使用local指令建立和替換
Ø 迴圈變數:只能存在於指令的巢狀內容,由指令(如list)自動建立;宏的引數是區域性變數,而不是迴圈變數
區域性變數隱藏(而不是覆蓋)同名的plain變數;迴圈變數隱藏同名的區域性變數和plain變數,下面是一個例子:
1. ${x} 6. ${x} 7. ${x} 9. ${x} 2. ${x} 3. ${x} 4. ${x} 5. ${x} 輸出結果:
1. plain 2. plain 3. local 4. loop 5. local6. plain 7. loop 8. loop9. plain2 內部迴圈變數隱藏同名的外部迴圈變數,如:
${x} ${x} ${x} #list> ${x} #list> ${x}#list>輸出結果:
loop 1 loop 2 loop 3 loop 2 loop 1 模板中的變數會隱藏(而不是覆蓋)資料模型中同名變數,如果需要訪問資料模型中的同名變數,使用特殊變數global,下面的例子假設資料模型中的user的值是Big Joe:
${user}
通常情況,只使用一個名字空間,稱為主名字空間
為了建立可重用的宏、變換器或其它變數的集合(通常稱庫),必須使用多名字空間,其目的是防止同名衝突
建立庫
Ø 下面是一個建立庫的例子(假設儲存在lib/my_test.ftl中):
Copyright (C) ${date} Julia Smith. All rights reserved.
Email: ${mail}
${my.mail}${mail} 輸出結果:
Copyright (C) 1999-2002 Julia Smith. All rights reserved.
Email: 可以看到例子中使用的兩個同名變數並沒有衝突,因為它們位於不同的名字空間
可以使用assign指令在匯入的名字空間中建立或替代變數,下面是一個例子:
${my.mail}${my.mail} 輸出結果:
資料模型中的變數任何地方都可見,也包括不同的名字空間,下面是修改的庫:
Copyright (C) ${date} ${user}. All rights reserved.
#macro> 假設資料模型中的user變數的值是Fred,則下面的程式碼:${my.mail} 輸出結果:
Copyright (C) 1999-2002 Fred. All rights reserved.
Fred@acme.com [@more@]來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/750220/viewspace-905568/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- FreeMarker設計指南(1)
- FreeMarker設計指南(2)
- FreeMarker設計指南(3)
- WebGL程式設計指南(4)顏色與紋理Web程式設計
- [筆記]UML:java程式設計師指南[1-4]筆記Java程式設計師
- [譯]AppExtension程式設計指南:擴充套件基礎4APP程式設計套件
- Python函數語言程式設計指南(4):生成器Python函數程式設計
- 敘事設計生存指南:優化遊戲敘事設計,先問自己4個問題優化遊戲
- restful api設計指南RESTAPI
- 微服務設計指南微服務
- JavaScript SDK 設計指南JavaScript
- RESTful API 設計指南RESTAPI
- 互動設計指南
- Posix執行緒程式設計指南(4)-執行緒終止 (轉)執行緒程式設計
- RESTFUL API 安全設計指南RESTAPI
- SVGA 設計使用指南SVG
- Core Text 程式設計指南程式設計
- 程式設計師脫單指南程式設計師
- UX設計指南 - DEV社群UXdev
- Spark—GraphX程式設計指南Spark程式設計
- SAP OData程式設計指南程式設計
- 滾動視差設計指南
- 程式設計師跳槽指南程式設計師
- RESTful API 設計指南【轉】RESTAPI
- Java Socket 程式設計指南Java程式設計
- 程式設計師熬夜指南程式設計師
- bash 程式設計指南(轉)程式設計
- 服務端指南 | 良好的 API 設計指南服務端API
- POCO庫中文程式設計參考指南(4)Poco::Net::IPAddress程式設計iPad
- 服務端指南 | 微服務初級設計指南服務端微服務
- 程式設計師裝B指南程式設計師
- 遊戲程式設計入門指南遊戲程式設計
- 全境封鎖UI設計指南UI
- React元件「設計模式」快速指南React元件設計模式
- 程式設計師防猝死指南程式設計師
- 程式設計師【黑話】指南程式設計師
- MT6797 LCM設計指南
- UI設計終極配色指南UI