Velocity模板引擎

分享知識 傳遞快樂


velocity就是由template,engine,context組成。

1、首先創建一個template(如果是用在web上就是一個html文件),將需要參數化或實例化的地方用跟context有關的符號標記出來,標記時用velocity template language。而template應該可以是任意的文本。

2、給context設定一些值,這些值用來替換在template中被標記的地方。

3、利用engine將template中需要替換的地方用context中的值替換掉,也就是所謂的merge,從而得到該模板的實例。

Velocity的初始化有多種方式:

1、init()

2、init(Properties p)

3、init(String propertiesName)


第一種init()方式是最簡單的方式,當我們的程序沒有配置類似velocity.properties這樣的文件的時候,就會使用默認的配置文件來初始化,默認的配置文件的位置在 org/apache/velocity/runtime/defaults/velocity.properties ;而將Velocity應用在WEB的時候,默認的配置文件使用的是 org/apache/velocity/tools/view/servlet/velocity.properties

在初始化前,velocity會把配置文件的屬性和值讀取後保存在內存中,初始化時,velocity將會初始化以下幾個方面:

1、Logging System 日誌系統

2、ResourceManager 資源加載器

3、EventHandler 事件句柄

4、Parser Pool 解析池

5、Global Cache 全局緩存

6、Static Content Include System

7、Velocimacro System 宏



1、Logging System

顧名思義,是進行日誌的初始化工作,Veloicty會使用LogManager來默認創建一個LogChute的實例。Velocity早些時候是使用LogSystem來作爲日誌的接口,而現在則使用LogChute。第一個最初最初的默認實例叫做HoldingLogChute,其實裏面就是一個Vector來保存信息,用來作爲初始化日誌系統的日誌實例,呵呵,很拗口。

在創建了第一個系統內置的日誌實例後,纔會開始真正的創建日誌系統,velocity會根據配置文件裏的信息,查找一個名叫runtime.log.logsystem的屬性,一旦配置文件中有配置這個屬性,則會開始去創建日誌系統。當velocity沒有配置runtime.log.logsystem這個屬性的時候,則會繼續尋找runtime.log.logsystem.class這個屬性,默認的velocity.properties配置文件中,這個屬性的值按順序依次爲:

(1)、AvalonLogChute

(2)、Log4JLogChute

(3)、CommonsLogLogChute

(4)、ServletLogChute

(5)、JdkLogChute

當然,velocity不會使用那麼多個日誌系統,只會使用第一個能實例化的日誌系統。

如果之前的創建工作都失敗的話,那麼意味着用戶沒有設置值或者是沒有找到類,velocity將會使用系統統默認的SystemLogChute來輸出日誌,這個日誌系統使用System.err方式輸出日誌。

一旦使用runtime.log.logsystem或者runtime.log.logsystem.class屬性創建日誌系統成功後,velocity就會把HoldingLogChute替換成新的日誌系統。這樣,日誌的初始化才真正的結束。


2、ResourceManager

資源加載器是velocity加載資源使用的一個工具。
Velocity的配置文件裏有個屬性叫Resource.manager.class默認的class是 org.apache.velocity.runtime.resource.ResourceManagerImpl

Velocity會嘗試初始化ResourceManagerImpl,其中會查找resource.loader這個屬性,resource.loader這個屬性是可以有多個的,每個Loader都會生效。

ResourceLoader一共有7種:

(1)、ClasspathResourceLoader

(2)、DataSourceResourceLoader

(3)、FileResourceLoader

(4)、JarResourceLoader

(5)、StringResourceLoader

(6)、URLResourceLoader

(7)、WebappLoader

默認的是第3個FileResourceLoader。除了第7個webappLoader是velocity-tools包作爲velocity的附屬工具後來添加的,其餘6個都velocity包自帶的,已經足夠滿足大多數的需求,當然,如果覺得這些都不適用,你也可以自己實現一個。實現一個資源加載器,實際上很簡單,只要繼承ResourceLoader,實現它的幾個方法就可以了。

所謂的資源加載器指的就是velocity讀取文件的方法,有直接從文件讀取的,有從jar包中讀取的,也有從類路徑中讀取的,基本上只要自己重寫getResourceStream方法就可以。

在初始化的過程中,會讀取resource.manager.logwhenfound和resource.manager.cache.class這兩個屬性,同時,也會進行資源緩存的初始化操作。


3、EventHandler

Velocity在渲染頁面的時候,提供了不同的EventHanlder,供開發者callback。說白了就是Velocity渲染頁面的不同工具,用戶可以自定義響應的事件。Velocity提供了對模板解析過程事件的處理,用戶可以響應模板產生的事件。

org.apache.velocity.app.event.EventHandler,是一個最簡單的接口。我們可以通過實現這個接口來處理頁面上不同的信息。

(1)、IncludeEventHandler

在使用#include(),#parse()語法的時候,允許開發修改include或者parse文件的路徑(一般用於資源找不到的情況)。
IncludeEventHandler有兩個實現類,分別是IncludeNotFound和IncludeRelativePath。

當找不到#include指令的文件時,IncludeNotFound類會去做一些處理,例如去增加一個eventhandler.include.notfound=notfound.vm的配置,當然,如果不存在notfound.vm,也會給出”Can’t find include not found page”的提示。

(2)、InvalidReferenceEventHandler

當渲染頁面的時候,一旦遇到非法的reference,就會觸發此事件。開發者可以偵聽此事件,用於錯誤的報告,或者修改返回的內容。
ReportInvalidReferences是它的一個實現類,用於報告無效的refenrences。如果在velocity的配置文件中使用了eventhandler.invalidreference.exception = true配置,在運行過程中碰到第一個無效的refenrences就會拋出ParseErrorRuntimeException異常,執行暫停。如果配置爲false的話,則會將錯誤先收在InvalidReferenceInfo列表對象中,運行照舊。

(3)、MethodExceptionEventHandler

渲染模板,一旦發現調用的方法拋出異常的時候,就會觸發此事件。允許開發者處理這個異常,輸出友好信息或者拋出異常。必須返回一個值用於模板的渲染。

(4)、NullSetEventHandler

當使用#set()語法,設置一個null值的時候,會觸發此事件。目前Velocity官方沒有提供默認實現。

(5)、ReferenceInsertionEventHandler

當渲染變量(reference)的時候,就會觸發此事件。允許開發者返回更加友好的值--一般用於內容的escape,比如HtmlEscape等。


4、Parser Pool

Velocity會使用類似線程池的機制來解析頁面。配置的key爲parser.pool.class和parser.pool.size。
默認的實現類爲org.apache.velocity.util.SimplePoolVelocity

velocity啓動時需要創建模板解析器的個數. 默認爲20個,對一般用戶來說足夠了. 即使這個值小了,Velocity也會運行時根據系統需要動態增加(但增加的不會裝入解析池中). 新增時會在日誌中輸出信息。


5、Directives

所謂的指令指的就是在頁面上能用一些類似標籤的東西。Velocity默認的指令文件位置在 org/apache/velocity/runtime/defaults/directive.properties
在這個文件中定義了一些默認的指令,例如:

directive.1=org.apache.velocity.runtime.directive.Foreach
directive.2=org.apache.velocity.runtime.directive.Include
directive.3=org.apache.velocity.runtime.directive.Parse
directive.4=org.apache.velocity.runtime.directive.Macro
directive.5=org.apache.velocity.runtime.directive.Literal
directive.6=org.apache.velocity.runtime.directive.Evaluate
directive.7=org.apache.velocity.runtime.directive.Break
directive.8=org.apache.velocity.runtime.directive.Define

我們在vm文件中可以直接使用foreach等指令來讓我們的頁面更加的靈活。


6、Velocimacro(宏配置)

當Velocity engine運行時,會載入一個全局的宏文件。所有模板都可訪問該宏文件(Velocimacros ). 這個文件位置在相對於資源文件的根目錄下。velocity默認的配置項爲velocimacro.library = VM_global_library.vm。

此外,還有一些其他配置來處理宏的不同使用情況,例如:

velocimacro.permissions.allow.inline = true定義在模板中是否可用#macro()指令定義一個新的宏。默認爲true,表示所有的vm都可以新建宏,但是要 注意可能會把全局的宏配置給替換掉。

velocimacro.permissions.allow.inline.to.replace.global = false控制用戶定義的宏是否可以可以替換Velocity的全局宏。

velocimacro.library.autoreload = false控制宏是否自動載入。當值爲true時宏將根據是否修改而決定是否需要重新加載,這個特性可在調試時很方便,不需重啓你的服務器。

此之外,還有些組件:

Anakia:一個示例應用,該應用允許不使用xsl處理xml。

Application servers:對所有主流的servers和servlet提供了支持,比如有一個VelocityServlet類。








————————————

如有不妥之處請留言指正。
相互學習,共同進步。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章