Apache Velocity 是老牌 Java 模板引擎,語法簡潔、邏輯與視圖分離度高。本文整理核心指令、變量引用、流程控制、巨集定義與工程實踐原則,助您快速上手並避免常見誤區。
| 符號 | 用途 | 範例 |
|---|---|---|
# | 指令標識 | #if, #foreach, #set, #macro |
$ | 變量/物件引用 | $user.name, $list.size() |
{} | 明確界定變量邊界 | ${user}name 輸出 username 而非找 user.name |
! | 空值靜默輸出 | $!msg 變數不存在時輸出空字串而非 $msg |
$!obj / $!HtmlUtil.escape($!msg)#if($msg)
<script>alert('$!msg');</script>
#end
#foreach($item in $hotList)
<a href="/detail?id=$!item.id">$!item.title</a><br>
#end
#macro(orderPic $field)
#if($orderField == $field)
<img src="/icons/${orderType}.gif">
#end
#end
#orderPic("title")
#parse("/common/header.vm")(解析 VM 標籤) vs #include("/static/footer.html")(原樣輸出)。#set($i = 0)
#set($list = ["A", "B", "C"])
#set($map = {"key": "value"}) // 實為 Map
#set($i = $i + 1) // 算術運算支援 + - * / %
## 單行註解
#* 多行
註解 *#
$var$user.name → user.get("name") 或 getName()$user.getName()#set($user="csy")
${user}name ## 輸出 csyname
#if($foo) ... #elseif($bar) ... #else ... #end
## 邏輯運算子:== != && || !
#foreach($c in $list)
$velocityCount. $c.name ## 從 1 起算
#end
# 預設計數器名稱可在 velocity.properties 覆寫:
directive.foreach.counter.name = velocityCount
directive.foreach.counter.initial.value = 1
#foreach($i in [1..5]) $i #end ## 輸出 1 2 3 4 5
$DateUtil.format($order.date))。eventhandler.referenceinsertion.null = "" 或統一用 $!,杜絕頁面出現 $null 字樣。macros.vm,頁面以 #parse("macros.vm") 引入,便於複用與維護。| 現象 | 原因 | 解決 |
|---|---|---|
變量顯示為 $var 字面值 | Context 未放入該變量 | 檢查 Controller/ModelMap |
物件無 getName() 或 get("name") | 補齊 Getter 或用 Map 包裝 | |
| 巨集定義在 #parse 之後 | 巨集定義前置或獨立檔案先 #parse | |
| 巢狀 #foreach 共用同一計數器 | 手動 #set($idx=0) 管理 |
遵循「模板只負責渲染」原則,配合 Velocity 簡潔語法,能構建出易維護、高效能的視圖層。