天天看點

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類。

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

如有不妥之處請留言指正。

互相學習,共同進步。