總以為明天會更好,但是今天都做不好,明天怎麼會好?
任何學習總是從概念開始,所以先摘抄一段網路上關於Velocity的定義:
Velocity是一個基於java的模板引擎(template engine)。它允許任何人僅僅簡單的使用範本語言(template language)來引用由java代碼定義的對象。
當 Velocity應用於web開發時,介面設計人員可以和java程式開發人員同步開發一個遵循MVC架構的web網站,也就是說,頁面設計人員可以只關 注頁面的顯示效果,而由java程式開發人員關注商務邏輯編碼。Velocity將java代碼從web頁面中分離出來,這樣為web網站的長期維護提供 了便利,同時也為我們在JSP和PHP之外又提供了一種可選的方案。
Velocity的能力遠不止web網站 開發這個領域,例如,它可以從模板(template)產生SQL和PostScript、XML,它也可以被當作一個獨立工具來產生原始碼和報告,或者 作為其他系統的整合組件使用。Velocity也可以為Turbine web開發架構提供模板服務(template service)。Velocity+Turbine提供一個模板服務的方式允許一個web應用以一個真正的MVC模型進行開發。
下面簡單的總結一下,Velocity的使用方法,當然你完全可以在網路上找到類似的文檔。我更主要的是想說明一下我們常用的文法,並給出一些執行個體。
1, 注釋,任何一種語言中,注釋總是必不可少的。
(1) 單行注釋:
## 這是單行注釋
(2) 多行注釋:
#*
這是多行注釋
*#
2, 輸出,也就是資料展現。
$userName
這樣便可以輸出使用者名稱了。但是,並不是絕對的能夠輸出使用者名稱,因為可能這裡輸出的變數並不存在。如果userName這個變數不存在,或者為空白,$userName將會被當 作字串直接輸出,也就是當我們期望在userName為空白的時候輸出空,但是卻輸出了’$userName’。為了避免這種情況,推薦這樣的變數輸出寫法:
$!{userName}
3, 變數聲明與賦值
一般情況下,我們不推薦在html頁面中直接聲明Velocity變數,因為這會增加html介面的複雜度。如果確實有必要,可以使用下面的語句聲明變數並賦值:
#set($userName=’hanmeimei’)
請注意:Velocity的變數聲明都要帶著$符號。
在LML中,我們經常在所謂的後台,也就是Action中給變數賦值,這樣在Action對應的html模板中也可以直接使用該變數。可使用一下兩種方法:
(1) 傳統的getter/setter
(2) ViewBag.Add(key,value)
相比之下,第二種非傳統的方式更快速。
4, 算術運算
Velocity支援在模板中使用(+,—,*,/),例如:
#set($a=1)
#set($b=1)
#set($c=$a + $b)
C在算對的情況下等於2,算錯的情況下等於3.。有一個問題大家需要注意,我在使用四則運算的時候,發現’—‘不起作用,最後經過嘗試,發現需要在變數和運算子之 間留一個空格,這樣就沒問題了。如果,你也遇到這樣的問題,也可以這麼嘗試一下。
5, 邏輯運算
支援一下幾個運算子,就如同java一樣:
&&:與。
||:或。
!:非。
6, 迭代
#foreach ($item in $list)
這是第 $velocityCount 個元素: $item
#end
$velocityCount,表示當前序號。
還要說一下我們在LML中分頁顯示資料用到的迭代,如下:
#foreach($item in $pager.result.rows)
$item.userName
##以下兩種方式可迭代列
#set($row=$item.values().toArray())
##方式1
#foreach($a in $row) $!a #end
##方式2
#foreach($i in [0..2]) $row.item($i) #end
#end
$pager.result是在分頁Action中查詢到的一個資料集Result。
我們也可以在模板中直接聲明並賦值一個list,而後進行迭代:
#set( $list = ["a", "b", "c"])
#foreach ($item in $list)
$velocityCount
#end
還有一種情況,我們需要迭代從1到10,所有的整數:
#foreach ($item in [1..10])
$velocityCount
#end
注意中間就是兩個點。
查閱很多資料,都直接說明Velocity不能迭代數組,下面說明原因:
對數組的訪問在Velocity中存在問題,因為Velocity只能訪問對象的方法,而數組又是一個特殊的Array,所以雖然數組可以進行迴圈列舉,但卻不能定位訪問特定位置 的 元素,如 strs[2],數組對固定位置元素的訪問調用了Array的反射方法get(Object array, int index),而Velocity沒能提供這樣的訪問,所以數組要麼改成List等其他類容器的方式來封裝,要麼就通過公用Util類的方式來提供,傳入數組對象和要訪問的位置參數,從而達到返回所需值的目的。
Velocity支援迭代的資料類型有:Vector、Hashtable或者Array
7, 條件判斷
#if (條件1)
#elseif (條件2)
#else
#end
一直不是很理解Velocity的資料類型,所以在項目中最多使用的是String,就像這裡的條件運算式,我們經常這樣寫: if(“$!{userSex}”==”0”),雖然性別使用int表示。
8, 檔案引入,#include與#parse
兩者作用類似,但是有以下不同:
(1) 與#include不同的是,#parse只能指定單個對象。而#include可以有多個
如果您需要引入多個檔案,可以用逗號分隔就行:
#include ("a.gif", "b.txt", "c.htm" )
在括弧內可以是檔案名稱,但是更多的時候是使用變數的:
#include ( “a.txt”, $photo )
(2) #include被引入檔案的內容將不會通過模板引擎解析;
而#parse引入的檔案內容Velocity將解析其中的velocity文法並移交給模板,意思就是說相當與把引入的檔案copy到檔案中。
以上兩點摘自互連網,到目前我基本沒有使用過#include。#parse最大的用處或許是這樣用:
#parse(“title.html”)
類似layout。
9, 內建對象
Velocity內建了一些對象,在模版裡可以直接調用,列舉如下:
$request、$response、$session
這些一直也沒使用過,完全可以在Action頁面把各種對象處理好了。
基本上,在我們的一般開發中,掌握以上文法已經可以應付自如了。是不是很簡單呢,我們希望的不就是簡單嗎,簡單所以快。寫的不好,敬請見諒。
補充:
LML支援在html模板中直接調用java方法,並可以向方法傳遞參數(字面值,或者Velocity變數),還可以輸出方法的傳回值。當然,為了避免模板頁面過於複雜,我們還是應該盡量減少在模板中調用java方法。如果確實有必要調用,則需要現在模板頁面對應的Action類上先行聲明:
@Helper( { TestHelper.class })
這樣就可以在html模板中調用:
$!TestHelper.Test("$!{userName}")
這裡提出了協助類的概念,一般情況下我們把需要多次在html模板中調用的方法集中寫在一個類中,我們稱它為協助類。方法是否靜態並不做要求,可自行選擇。