分享知識 傳遞快樂
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類。
————————————
如有不妥之處請留言指正。
互相學習,共同進步。