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能爲我們作什麼?
The Mud Store Example
假設你是一家專門出售Mud的在線商店的頁面設計人員,讓我們暫且稱它爲“在線MUD商店”。你們的業務很旺,客戶下了各種類型和數量的mud訂單。他們都是通過輸入用戶名和密碼後才登陸到你的網站,登陸後就允許他們查看訂單併購買更多的mud。現在,一種非常流行的mud正在打折銷售。另外有一些客戶規律性的購買另外一種也在打折但是不是很流行的Bright Red Mud,由於購買的人並不多所以它被安置在頁面的邊緣。所有用戶的信息都是被跟蹤並存放於數據庫中的,所以某天有一個問題可能會冒出來:爲什麼不使用velocity來使用戶更好的瀏覽他們感興趣的商品呢?
Velocity使得web頁面的客戶化工作非常容易。作爲一個web site的設計人員,你希望每個用戶登陸時都擁有自己的頁面。
你會見了一些公司內的軟件工程師,你發現他們每個人都同意客戶應該擁有具有個性化的信息。那讓我們把軟件工程師應該作的事情發在一邊,看一看你應該作些什麼吧。
你可能在頁面內嵌套如下的VTL聲明:
HTML 代碼
  1.   
  2.   
  3. Hello $customer.Name!   
  4. $flogger.getPromo( $mud )
      
  5. #foreach( $mud in $nudsOnSpecial )    
  6. #if ( $customer.hasPurchased( $mud ) )    
  7. #end   
  8. #end   


Velocity Template Language(VTL):AN introduction
VTL意味着提供最簡單、最容易並且最整潔的方式合併頁面動態內容。
VTL使用references來在web site內嵌套動態內容,一個變量就是一種類型的reference。變量是某種類型的refreence,它可以指向java代碼中的定義,或者從當前頁面內定義的VTL statement得到值。下面是一個VTL statement的例子,它可以被嵌套到HTML代碼中:
  #set ( $a = “Velocity” )
和所有的VTL statement一樣,這個statement以字符開始並且包含一個directive:set。當一個在線用戶請求你的頁面時,Velocity Templating Engine將查詢整個頁面以便發現所有#字符,然後確定哪些是VTL statement,哪些不需要VTL作任何事情。
#字符後緊跟一個directive:set時,這個set directive使用一個表達式(使用括號封閉)――一個方程式分配一個值給變量。變量被列在左邊,而它的值被列在右邊,最後他們之間使用=號分割。
在上面的例子中,變量是$a,而它的值是Velocity。和其他的references一樣以$字符開始,而值總是以雙引號封閉。Velocity中僅有String可以被賦值給變量。
記住以下的規則:
使用$字符開始的references用於得到什麼;使用#字符開始的directives用於作些什麼。
Hello Velocity World!
一旦某個變量被分配了一個值,那麼你就可以在HTML文件的任何地方引用它。在下面的例子中,一個值被分配給$foo變量,並在其後被引用。


#set ( $foo = “Velocity” )
Hello $foo World!


上面的實現結果是在頁面上打印“Hello Velocity World!”
爲了使包含VTL directives的statement更具有可讀性,我們鼓勵你在新行開始每個VTL statement,儘管你不是必須這麼作。Set directive將在後面詳細描述。
註釋
單行註釋:
  ## This is a single line comment.
多行註釋:
  #*
   Thus begins a multi-line comment. Online visitors won’t
   see this text because the Velocity Templating Engine will
ignore it.
  *#
文檔格式:
  #**
   This is a VTL comment block and
   may be used to store such information
as the document author and versioning
   information:
   @version 5
   @author
  *#

References
在VTL中有三種類型的references:變量(variables)、屬性(properties)、方法(methods)。作爲一個使用VTL的頁面設計者,你和你的工程師必須就references的名稱達成共識,以便你可以在你的template中使用它們。
Everything coming to and from a reference被作爲一個String對象處理。如果有一個對象$foo是一個Integer對象,那麼Velocity將調用它的toString()方法將這個對象轉型爲String類型。
  變量
  格式要求同java。
  屬性
  例子:
    $customer.Address
    $purchase.Total
$customer.Address有兩種含義。它可以表示:查找hashtable對象customer中以Address爲關鍵字的值;也可以表示調用customer對象的getAddress()方法。當你的頁面被請求時,Velocity將確定以上兩種方式選用那種,然後返回適當的值。
方法
一個方法就是被定義在java中的一段代碼,並且它有完成某些有用工作的能力,例如一個執行計算和判斷條件是否成立、滿足等。方法是一個由$開始並跟隨VTL標識符組成的References,一般還包括一個VTL方法體。例如:
  $customer.getAddress()
  $purchase.getTotal()
  $page.setTitle( “My Home Page” )
  $person.setAttributes( [“Strange”, “Weird”, “Excited”] )
前兩個例子$customer.getAddress()和$purchase.getTotal()看起來挺想上面的屬性$customer.Address 和 $purchase.Total。如果你覺得他們之間有某種聯繫的話,那你是正確的。
VTL屬性可以作爲VTL方法的縮寫。$customer.Address屬性和使用$customer.getAddress()方法具有相同的效果。如果可能的話使用屬性的方式是比較合理的。屬性和方法的不同點在於你能夠給一個方法指定一個參數列表。
正式reference標記
reference的正是格式如下:
  ${mudSlinger}        變量
  ${customer.Address}    屬性
  ${purchase.getTotal()}    方法

非正是格式更見常用,但是有時還是使用正是格式比較適合。例如:你希望通過一個變量$vice來動態的組織一個字符串。
  Jack is a $vicemaniac.
本來變量是$vice現在卻變成了$vicemaniac,這樣Veloctiy就不知道您到底要什麼了。所以,應該使用正是格式書寫
  Jack is a ${vice}maniac
現在Velocity知道變量是$vice而不是$vicemaniac。
Quiet reference notation
例如:
  
當頁面的form被初始加載時,變量$email還沒有值,這時你肯定是希望它能夠顯示一個blank text來代替輸出”$email”這樣的字段。那麼使用quiet reference notation就比較合適。
  
這樣文本框的初始值就不會是email而是空值了。
正式和quiet格式的reference notation也可一同使用,像下面這樣:
  
Getting literal
Velocity使用特殊字符$和#來幫助它工作,所以如果要在template裏使用這些特殊字符要格外小心。本節將討論$字符。
  貨幣字符
在VTL中使用$2.5這樣的貨幣標識是沒有問題得的,VTL不會將它錯認爲是一個reference,因爲VTL中的reference總是以一個大寫或者小寫的字母開始。
Escaping valid VTL reference
VTL中使用“\”作爲逃逸符。
例如:
  #set( $email = “foo” )
  $email
  \$email
  \\$email
  \\\$email
將render爲:
  foo
  $email
  \foo
  \\$email
如果email變量沒有被定義則
  $email
  \$email
  \\$email
  \\\$email
將被render爲:
  $email
  \$email
  \\$email
  \\\$email
注意:VTL中未被定義的變量將被認爲是一個字符串,所以以下例子:
  #set( $foo = “gibbous” )
  $moon = $foo
的輸出結果是:
$moon = gibbous
Case substitution
現在你已經對reference比較熟悉了,你可以將他們高效的應用於你的template了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章