FreeMarker設計指南(4)

okone96發表於2007-03-16

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> Ø 這樣就正確了

Ø 宏的引數是區域性變數,只能在宏定義中有效

巢狀內容

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

Ø 例子:

#macro> 這樣使用該宏變數:

The bordered text<>輸出結果:

The bordered text
Ø 指令可以被多次呼叫,例如:

#macro> Anything.<> 輸出結果:

Anything. Anything. Anything. Ø 巢狀內容可以是有效的FTL,下面是一個有些複雜的例子:

  • <>
<> 輸出結果:

  • Hello Joe!
  • Hello Joe!
  • Hello Joe!
Ø 宏定義中的區域性變數對巢狀內容是不可見的,例如:

${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}

#macro> Ø 使用import指令匯入庫到模板中,Freemarker會為匯入的庫建立新的名字空間,並可以透過import指令中指定的雜湊變數訪問庫中的變數:

${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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章