## 12.10. 宏
\#macro 腳本元素允許模板設計者在VTL 模板中定義重復的段。 Velocimacros 不管是在復雜還是簡單的場合都非常有用。下面這個Velocimacro,僅用來節省擊鍵和減少排版錯誤,介紹了一些Velocity宏的概念。
```
#macro( d )
<tr><td></td></tr>
#end
```
在例子中,Velocimacro定義為d,它可以象調用其他VTL指令一樣的形式來進行調用:
```
#d()
```
當這個模板被調用時, Velocity 將 #d() 替換為一個單行的空表格。
Velocimacro 可以帶一些參數,也可以不帶參數(如上例所示)。但在他被調用時,所帶的參數必須和其定義時的參數一樣。很多Velocimacros 定義為不止一個參數。下面這個宏帶有兩個參數,一個顏色,一個數組。
```
#macro( tablerows $color $somelist )
#foreach( $something in $somelist )
<tr><td bgcolor=$color>$something</td></tr>
#end
#end
```
在這個例子中定義的Velocimacro,名為tablerows, 要求兩個參數。第一個參數代替$color, 第二個代替$somelist。
可以寫進VTL 模板中的東西都可以寫進Velocimacro 的主體部分。tablerows 宏其實是一個foreach 語句。在#tablerows 宏的定義中有兩個#ende語句,第一個屬于#foreach, 第二個結束宏定義。
```
#set( $greatlakes = ["Superior","Michigan","Huron","Erie","Ontario"] )
#set( $color = "blue" )
<table>
#tablerows( $color $greatlakes )
</table>
```
請注意$greatlakes 替換了$somelist。這樣,當#tablerows 宏被調用時,將產生以下輸出:
```
<table>
<tr><td bgcolor="blue">Superior</td></tr>
<tr><td bgcolor="blue">Michigan</td></tr>
<tr><td bgcolor="blue">Huron</td></tr>
<tr><td bgcolor="blue">Erie</td></tr>
<tr><td bgcolor="blue">Ontario</td></tr>
</table>
```
Velocimacros 在Velocity 模板語句內定義,這意味著它在同一站點內的其他Velocity 模板中并不有效。定義一個宏,并使其與其他模板共享很具有明顯的優點:他減少了在大量的模板內重復定義宏的工作,并減少了出錯的機會,并確保對其他宏的改變對其他所有模板有效。
但如果 #tablerows($color $list) 宏是在一個Velocimacros 模板庫內定義的,它就可以被其他常規模板所用。當然,它可以用于各種目的,也可重用多次。在表示所有真菌類(fungi)的mushroom.vm 模板中,#tablerows 宏可以被用來列出典型的蘑菇。
```
#set( $parts = ["volva","stipe","annulus","gills","pileus"] )
#set( $cellbgcol = "#CC00FF" )
<table>
#tablerows( $cellbgcol $parts )
</table>
```
我們對mushroom.vm執行請求,Velocity 將在模板庫內找到#tablerows 宏 (在velocity.properties 文件中定義)并產生以下輸出:
```
<table>
<tr><td bgcolor="#CC00FF">volva</td></tr>
<tr><td bgcolor="#CC00FF">stipe</td></tr>
<tr><td bgcolor="#CC00FF">annulus</td></tr>
<tr><td bgcolor="#CC00FF">gills</td></tr>
<tr><td bgcolor="#CC00FF">pileus</td></tr>
</table>
```
- 1. 關于
- 2. 什么是Velocity?
- 3. Velocity 可以做什么?
- 3.1. Mud Store 示例
- 4. Velocity模板語言(VTL): 介紹
- 5. Hello Velocity World!
- 6. 注釋
- 7. 引用
- 7.1. 變量Variables
- 7.2. 屬性
- 7.3. 方法
- 8. 形式引用符Formal Reference Notation
- 9. 安靜引用符Quiet Reference Notation
- 11. Case Substitution
- 12. 指令
- 12.1. #set
- 12.2. 字面字符串
- 12.3. 條件
- 12.3.1 If / ElseIf / Else
- 12.3.2 關系和邏輯操作符
- 12.4. 循環
- 12.4.1. Foreach 循環
- 12.5. 包含
- 12.6. 解析
- 12.7. 停止
- 12.10. 宏
- 12.10.1. Velocimacro 參數
- 12.10.2. Velocimacro 屬性
- 12.10.3. Velocimacro Trivia
- 13. Getting literal
- 13.1. 貨幣字符
- 13.2. 轉義 有效的 VTL 指令
- 13.3. 轉義 無效的 VTL 指令
- 14. VTL 格式化問題
- 15. 其它特征和雜項
- 15.1. 數學特征
- 15.2. 范圍操作符
- 15.3. 進階:轉義和!
- 15.4. Velocimacro 雜記
- 15.5. 字符串聯