java velocity 语法_Velocity 语法
Velocity Notes
變量名$name
為空時打印變量本身。
$!name
為空時打印空字符串(不打印任何內容)。
${name}
類似?$name,為空時原樣打印。但可以將變量和連續的字符串分隔,例如:${name}space。
$!{name}
類似?$!name,為空時打印空字符串,但可以將變量和連續的字符串分隔。例如:?$!{name}space。$name$!name${name}$!{name}
為空時打印:"$name""""${name}"""
帶花括號的屬性/方法調用方式,屬性/方法需要在花括號之內:${cookie.name}${request.getCookies()}
#set()??中,賦值符號左邊的變量名不能加感嘆號。#set($idx?=?0)#foreach($!item?in?$!list)????#set($idx?=?$!idx?+?1)#end
注:jQuery 的?$.ajax()?之類的代碼會導致 Velocity 解析異常,好在 Javascript 語法的靈活性,可以增加無效空白?$ .ajax(),當然也可以使用?jQuery.ajax()
#set()#set($list?=?["pine",?"oak",?"maple"])
注:?如果右側的值為 null,則賦值失敗,左側變量仍保持原值。
#if()#if(true)????TRUE.#elseif(false)????FALSE.#end
其實不僅僅是變量名可以使用花括號,保留字同樣可以使用,這在內聯 Velocity 腳本的時候 非常有用。 例如:
#foreach()#foreach($item?in?$list)????${velocityCount}.?$item.#end
#break
可用于中斷?#foreach()?循環。
#parse()
例如:a.vm 中包含如下代碼#parse("b.vm")
則在解析 a.vm 頁面的這行代碼時,先將 b.vm 插入到其所在的位置,并解析執行, 而且 b.vm 可以共享 a.vm 中的變量。
如果 a.vm?#parse("b.vm"),b.vm 可以直接使用 a.vm 中定義的變量。 注意:如果 b.vm 定義了同名變量,則 b.vm 中使用自身的定義。
#evaluate()
動態執行一串字符串的值:#evaluate('string?with?VTL?#if(true)will?be?displayed#end')
#include()
將文件原文包含進當前文檔中。#include("a.vm"?"readme.txt")
#define()
類似于 C 語言的?#define?命令。#define($hello)????????Hello?${who}!????#end????#set($who?=?"World")????$hello
##?顯示?"Hello?World!"
數組 & 訪問
Velocity 訪問數組對象,無法通過類似 arr[2] 來訪問特定位置的元素。#set($arr?=?[0,?1,?2,?3])$arr.get(2)
注:Velocity 中的數組對應 Java 中的 List 對象。對于 Java 原生 Array 對象, 只能夠?#foreach?進行遍歷,無法使用?$arr[0]?和?$arr.get(0)?方法。
范圍(range)#foreach($item?in?[10..20])????$item#end
對象 & 訪問#set($obj?=?{"key":"value",?"name":"space"})$obj.get("key")#foreach(#item?in?$obj)????$item#end
上面的 $item 取到的是 values,如果需要在遍歷對象過程中,同時取到對象的 keys, 可以使用?entrySet()?或?keySet()?方法。#foreach($item?in?$!obj.entrySet())????$!item.key?:?$!item.value#end#foreach($item?in?$obj.keySet())????$item?:?$obj.get($item)#end
注:?這種集合的遍歷是無序的,即遍歷順序可能不同于 $obj 中元素的定義順序 (據目前所知,是根據鍵的字母排序的)。
另外有兩種不完美解決方法:I:#set($obj?=?[????{"key":"key",?"value":"value"},????{"key":"name",?"value":"space"}????])#foreach($item?in?$obj)????$item.key?:?$item.value#end
II:#set($obj?=?[????["key","value"],????["name","space"]????])#foreach($item?in?$obj)????$item.get(0)?:?$item.get(1)#end
之所以說?不完美?是因為:對于已知的 key,本可以直接$obj.get("key")
現在只能遍歷并進行比較取得,而且較早的 Velocity 版本無法使用?#break, 以便在找到匹配項之后立即退出循環。#foreach($item?in?$obj)????#if("key"?==?$!obj.get(0))????????#set($myKey?=?$!type.get(1))????????##break????#end#end
#macros()#macro(macroName)????#subMacro("name",?"value")#end#macro(subMacro?$param1?$param2)????this?is?sub?macro($param1,?$param2).#end
注意:如果 a.vm 和 b.vm 都在頁面級存在同名,參數數量相同的宏,則后訪問的頁面 的宏不被加載。
參考:
#stop
停止模板引擎,在 Debug 時比較有用。
條件比較
在 Velocity 中可以使用大于(>)/小于(1)?要修改為?if($num > 1)?或?if(${num}>1)。
轉義$\name
$\{name}
不解析執行的內容#[[????這段內容將不被?Velocity?引擎解析,原文打出。????*?#define()????*?${blah]]#
內置對象
$request,?$response,?$session#foreach($cookie?in?$request.getCookies())????$cookie.name?:?$cookie.value#end
獲得 URL 中的參數:#set($n?=?$!request.getParameter('n'))
另外還可以使用?$msg?內的消息工具訪問 Struts 的國際化資源。
參考:
注釋##?單行注釋。#*?*?多行注釋。?*##**?*?文檔風格的注釋。?*?@version?2010/12/27?*#
據說 vm 頁面的末尾寫注釋,會導致解析異常 (SofaMVC )。
Tips
Velocity 在表單中添加 name="action" 的文本/隱藏域,可以調用對應 Java 類 (submit 按鈕的 name 則指定對應的方法名稱,如 event_submit_do_save ), 但是此時 IE 瀏覽器通過 js 獲得 form 元素本身的 action 屬性值的方式, 和其他瀏覽器稍有不同。
例如對于如下 HTML DOM 結構:
????IE 中需要使用form.attributes["action"].value
非 IE 瀏覽器還可以使用:form.getAttribute("action")
以下是些詳細的對照://?codes????????????????????????????//??IE??????????!IEform.action.value???????????????????//?elem?????????elemform.getAttribute("action")?????????//?[object]?????attrform.getAttribute("action").value???//?elem?????????undefinedform.attributes["action"].value?????//?attr?????????attr
Form 本身的 action 屬性和 action 隱藏域在提交時,瀏覽器本身不受影響, action 隱藏域被當作正常的參數附在 Form 的 action 屬性值所對應 URL 之后。
延伸閱讀
總結
以上是生活随笔為你收集整理的java velocity 语法_Velocity 语法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端学习(170):无语义元素二
- 下一篇: spring学习(48):自动装配中定义