天天看點

java模版 Java模版語言

Java模版語言

Velocity是由Apache軟體組織提供的一項開放源碼項目,它是一個基于Java的模闆引擎。

網頁制作者可以通過Velocity模闆語言(Velocity Template Language,VTL)定義模闆(template),并且在模闆中不包含任何Java程式代碼。Java開發人員編寫程式代碼來設定上下文,它包含了用于填充模闆的資料。Velocity引擎能夠把模闆和上下文合并起來,生成動态網頁。

VTL模闆和JSP網頁的差別在于:在VTL模闆中不包含任何Java代碼,并且VTL模闆不同經過JSP編譯器的編譯,VTL模闆的解釋是由Velocity引擎來完成的。

盡管Velocity也可用于其它獨立應用程式的開發,但其主要用途是簡化Web應用開發。Velocity将Java代碼從Web頁面中分離出來,使Web站點在長時間運作後仍然具有很好的可維護性。

建立基于Velocity的Web應用包括兩個步驟:

(1)建立Velocity模闆;

(2)建立擴充VelocityServlet的Servlet類。

在Velocity模闆語言中,"$"符号表示跟随其後的字元串為變量。如果要把"$"符号作為普通字元串處理,應該采用"\$"的形式。

VelocityServlet類,它是HttpServlet類的子類。它由兩個重要方法:loadConfiguration方法handleRequest方法。

loadConfiguration方法類似于HttpServlet類的Init方法,差別在于loadConfiguration方法傳回java.util.Properties對象。

handleRequest方法類似于HttpServlet類的doGet和doPost方法,差別在于handleRequest方法中增加了一個org.apache.velocity.context.Context類型的參數,Context類用來存放所有用于顯示到HTML頁面上的資料。

例子:

第一步,建立一個檔案名為hello.vm的簡單的模闆檔案,它的内容如下:$hello

第二步,建立擴充了VelocityServlet的HelloServlet類。

在它的loadConfiguration方法中把hello.vm模闆所在的檔案路徑及Velocity日志檔案路徑作為屬性存放在Properties對象中,然後傳回Properties對象;

在handleRequest方法中把變量hello對應的資料存放在context對象中,handleRequest方法接下來獲得hello.vm模闆,然後傳回代表hello.vm模闆的Template對象。

注釋:

在VTL中,單行注釋的前導符為"##",對于多行注釋,則采用"#*"和"*#"符号。

引用:在VTL中有3中類型的引用:變量、屬性和方法。

變量引用:

變量引用的簡略标記是由一個前導"$"字元後跟一個VTL辨別符組成的。一個VTL辨別符必須以一個字母開始,剩下的字元将由以下類型的字元組成:字母,數字,連字元,下劃線。

給引用變量指派有兩種方法,一種辦法是在Java代碼中給變量指派,此外,也可以在模闆中通過#set指令給變量指派,例如 #set($foo="bar") the output is $foo.

屬性引用:

屬性引用的簡略标記是前導符$後跟一個VTL辨別符,後面在跟一個點号("."),最後跟一個VTL辨別符。

給引用屬性指派有兩種方法,一種辦法是在Java代碼中建立一個Hashtable對象,把所有的屬性儲存在這個Hashtable對象中,再把Hashtable對象儲存在Context對象中。

給引用屬性指派的第二種辦法是定義一個JavaBean類,定義各個屬性對應的get和set方法,然後再Java代碼中建立一個JavaBean對象,設定各個屬性,再把它儲存在Context對象中。

方法引用:

方法在Java程式代碼中定義,VTL中的方法引用的簡略标記為前導符"$"後跟一個VTL辨別符,再跟一個VTL方法體。VTL方法體由一個VTL辨別符後跟一個左括号,再跟可選的參數清單,最後是右括号組成。

正式引用符:

在大多數情況下,将使用引用的簡略符号,但在一些特殊情況下,需要采用引用符來區分引用和普通的字元串。正式引用符常用在引用變量和普通文本直接鄰近的地方。${}

安靜引用符:

當Velocity遇到一個未指派的引用時,會直接輸出這個引用的名字。

安靜引用符的前導字元為"$!"

轉義符:VTL中的"$"具有特殊的含義,如果希望把"$"符号作為普通的字元來處理應該采用"\$"形式,其中"\"為轉義符。

大小寫替換:

Velocity借鑒了JavaBean的特征,能根據給定的JavaBean的屬性名,自動調用相應的get方法。

模闆設計員可以通過引用來輸出動态網頁内容,此外,還可以采用指令來靈活地控制網頁的外觀。

#set指令用來為應用變量或引用屬性指派,例如:#set( $primate = "money" )

指派表達式的左邊必須是一個變量引用或者屬性引用,右邊可以是下面的類型之一:

變量引用,字元串,屬性引用,方法引用,數字,數組清單,簡單的算術表達式。

如果指派表達式的右邊是一個屬性或方法引用,并且取值是null,那麼Velocity将不會把它指派給左邊的引用變量。在這種機制下,給一個已經指派的引用變量重新指派可能會失敗,這是使用Velocity的新手常犯的錯誤。

當使用#set指定時,在雙引号鎮南關的字面字元串将被解析,當字面字元串被包括在單引号中時,将不被解析。

當#if指令中的if條件為真是,Velocity将輸出#if代碼塊包含的文本。#if...#end

在#if語句中還可以包含#elseif和#else項,并且Velocity引擎将在遇到第一個為真的表達式時停止邏輯判斷。

在#if條件表達式中,Velocity支援3中變量類型的比較運算:字元串比較,對象比較和整數比較。

#foreach指令用來構成循環代碼。

#include指令用來導入本地檔案,這些檔案将被插入到模闆中#include指令被定義的地方。

#include指令引用的檔案名放在雙引号内,如果超過一個檔案,其間用逗号分隔開。

被包含的檔案并不一定要直接給出檔案名,事實上,最好的辦法是使用變量而不是檔案名,這在需要根據特定邏輯來決定導入相應檔案的情況下很有用。

#parse指令和#include指令很相似,兩者都可以把其他檔案導入到目前模闆中,差別在于,#parse指令能夠解析被導入的檔案。此外,單個#parse指令隻允許導入一個檔案。與#include指令一樣,#parse指令也允許檔案名用變量表示。

#macro指令允許模闆設計者在VTL模闆中定義重複的段,稱之為Velocity宏,Velocity宏不管是在複雜還是簡單的場合都非常有用。把模闆中重複的代碼定義在一個Velocity宏中,則在模闆中所有出現重複代碼的地方都可以用宏來代替,這樣使得模闆更加簡潔,易于維護。

當Velocity解析VTL代碼時,其行為不受代碼中的換行和空格的影響。

Velocity有一些内置的數學運算功能。

當進行除法運算時,得到的結果是整數。餘數可以通過模運算"%"來獲得。

在Velocity中,隻有整數可以進行數學運算。如果執行非整數的數學運算,該操作将被記錄到日志中,并傳回null。

範圍操作符可以定義包含Integer對象的數組,它常和#set或#foreach語句一起使用,範圍操作符的形式為:[n..m]。

n和m都必須是整數。m大于或者小于n都沒關系,在m小于n的情況下,數組下标從大到小計數。

字元串的連接配接:在VTL中,如果要連接配接字元串,隻需要把這些字元串“放在一起”即可。