FreeMarker設計指南 4 (完)

2021-08-29 03:29:06 字數 4891 閱讀 9052

4、雜項

(1)使用者定義指令

l 巨集和變換器變數是兩種不同型別的使用者定義指令,它們之間的區別是巨集是在模板中使用macro指令定義,而變換器是在模板外由程式定義,這裡只介紹巨集

l 基本用法

ø 巨集是和某個變數關聯的模板片斷,以便在模板中通過使用者定義指令使用該變數,下面是乙個例子:

<#macro greet>

hello joe!

ø 作為使用者定義指令使用巨集變數時,使用@替代ftl標記中的#

<@greet>

ø 如果沒有體內容,也可以使用:

<@greet/>

l 引數

ø 在macro指令中可以在巨集變數之後定義引數,如:

<#macro greet person>

hello $!

ø 可以這樣使用這個巨集變數:

<@greet person="fred"/> and <@greet person="batman"/>

輸出結果是:

hello fred!

and hello batman!

ø 巨集的引數是ftl表示式,所以下面的**具有不同的意思:

<@greet person=fred/>

ø 這意味著將fred變數的值傳給person引數,該值不僅是字串,還可以是其它型別,甚至是複雜的表示式

ø 巨集可以有多引數,下面是乙個例子:

<#macro greet person color>

hello $!

ø 可以這樣使用該巨集變數:

<@greet person="fred" color="black"/>

ø 其中引數的次序是無關的,因此下面是等價的:

<@greet color="black" person="fred"/>

ø 只能使用在macro指令中定義的引數,並且對所有引數賦值,所以下面的**是錯誤的:

<@greet person="fred" color="black" background="green"/>

<@greet person="fred"/>

ø 可以在定義引數時指定預設值,如:

<#macro greet person color="black">

hello $!

ø 這樣<@greet person="fred"/>就正確了

ø 巨集的引數是區域性變數,只能在巨集定義中有效

l 巢狀內容

ø 使用者定義指令可以有巢狀內容,使用<#nested>指令執行指令開始和結束標記之間的模板片斷

ø 例子:

<#macro border>

<#nested>

這樣使用該巨集變數:

<@border>the bordered text

輸出結果:

the bordered text

ø <#nested>指令可以被多次呼叫,例如:

<#macro do_thrice>

<#nested>

<#nested>

<#nested>

<@do_thrice>

anything.

輸出結果:

anything.

anything.

anything.

ø 巢狀內容可以是有效的ftl,下面是乙個有些複雜的例子:

<@border>

輸出結果:

ø 巨集定義中的區域性變數對巢狀內容是不可見的,例如:

<#macro repeat count>

<#local y = "test">

<#list 1..count as x>

$ $/$: <#nested>

<@repeat count=3>$ $ $

輸出結果:

test 3/1: ? ? ?

test 3/2: ? ? ?

test 3/3: ? ? ?

ø l 在巨集定義中使用迴圈變數

ø 使用者定義指令可以有迴圈變數,通常用於重複巢狀內容,基本用法是:作為nested指令的引數傳遞歸圈變數的實際值,而在呼叫使用者定義指令時,在<@…>開始標記的引數後面指定迴圈變數的名字

ø 例子:

<#macro repeat count>

<#list 1..count as x>

<#nested x, x/2, x==count>

<@repeat count=4 ; c, halfc, last>

$. $<#if last> last!

輸出結果:

1. 0.5

2. 1

3. 1.5

4. 2 last!

ø 指定的迴圈變數的數目和使用者定義指令開始標記指定的不同不會有問題

n 呼叫時少指定迴圈變數,則多指定的值不可見

n 呼叫時多指定迴圈變數,多餘的迴圈變數不會被建立

(2)在模板中定義變數

l 在模板中定義的變數有三種型別:

ø plain變數:可以在模板的任何地方訪問,包括使用include指令插入的模板,使用assign指令建立和替換

ø 區域性變數:在巨集定義體中有效,使用local指令建立和替換

ø 迴圈變數:只能存在於指令的巢狀內容,由指令(如list)自動建立;巨集的引數是區域性變數,而不是迴圈變數

l 區域性變數隱藏(而不是覆蓋)同名的plain變數;迴圈變數隱藏同名的區域性變數和plain變數,下面是乙個例子:

<#assign x = "plain">

1. $ <#-- we see the plain var. here -->

<@test/>

6. $ <#-- the value of plain var. was not changed -->

<#list ["loop"] as x>

7. $ <#-- now the loop var. hides the plain var. -->

<#assign x = "plain2"> <#-- replace the plain var, hiding does not mater here -->

8. $ <#-- it still hides the plain var. -->

9. $ <#-- the new value of plain var. -->

<#macro test>

2. $ <#-- we still see the plain var. here -->

<#local x = "local">

3. $ <#-- now the local var. hides it -->

<#list ["loop"] as x>

4. $ <#-- now the loop var. hides the local var. -->

5. $ <#-- now we see the local var. again -->

輸出結果:

1. plain

2. plain

3. local

4. loop

5. local

6. plain

7. loop

8. loop

9. plain2

l 內部迴圈變數隱藏同名的外部迴圈變數,如:

<#list ["loop 1"] as x>

$<#list ["loop 2"] as x>

$<#list ["loop 3"] as x>$$

$輸出結果:

loop 1

loop 2

loop 3

loop 2

loop 1

l 模板中的變數會隱藏(而不是覆蓋)資料模型中同名變數,如果需要訪問資料模型中的同名變數,使用特殊變數global,下面的例子假設資料模型中的user的值是big joe:

<#assign user = "joe hider">

$ <#-- prints: joe hider -->

$ <#-- prints: big joe -->

(3)名字空間

l 通常情況,只使用乙個名字空間,稱為主名字空間

l 為了建立可重用的巨集、變換器或其它變數的集合(通常稱庫),必須使用多名字空間,其目的是防止同名衝突

l 建立庫

ø 下面是乙個建立庫的例子(假設儲存在lib/my_test.ftl中):

email: $

<#assign mail = "[email protected]">

ø 使用import指令導入庫到模板中,freemarker會為匯入的庫建立新的名字空間,並可以通過import指令中指定的雜湊變數訪問庫中的變數:

<#import "/lib/my_test.ftl" as my>

<#assign mail="[email protected]">$$

輸出結果:

email: [email protected]

[email protected]

[email protected]

可以看到例子中使用的兩個同名變數並沒有衝突,因為它們位於不同的名字空間

l 可以使用assign指令在匯入的名字空間中建立或替代變數,下面是乙個例子:

<#import "/lib/my_test.ftl" as my>

$<#assign mail="[email protected]" in my>

$ l 輸出結果:

[email protected]

[email protected]

l 資料模型中的變數任何地方都可見,也包括不同的名字空間,下面是修改的庫:

<#assign mail = "[email protected]">

l 假設資料模型中的user變數的值是fred,則下面的**:

<#import "/lib/my_test.ftl" as my>

$ l 輸出結果:

[email protected]

Docker 實踐指南(4)

本節介紹容器的常用操作。前面說過,服務都是跑在容器裡的,容器的底層實質上也是乙個作業系統,能安裝軟體,有程序,只不過這個系統很精簡。容器和虛擬機器一樣有啟動 停止的狀態。使用 ubuntu 14.04 映象執行乙個容器來體驗一下 docker run it ubuntu 14.04 bin bash...

設計指南 布局

設計指南 布局 布局 是指頁面內容的尺寸 間距及位置。有效的布局對於幫助使用者快速找到他們想要的內容至關重要,並可以在結構外觀上令使用者感到舒服。什麼是布局?布局 是指頁面內容的尺寸 間距及位置。有效的布局對於幫助使用者快速找到他們想要的內容至關重要,並可以在結構外觀上令使用者感到舒服。如何設計有效...

RESTful API 設計指南

網路應用程式,分為前端和後端兩個部分。當前的發展趨勢,就是前端裝置層出不窮 手機 平板 桌面電腦 其他專用裝置 因此,必須有一種統一的機制,方便不同的前端裝置與後端進行通訊。這導致api構架的流行,甚至出現 api first 的設計思想。restful api是目前比較成熟的一套網際網路應用程式的...