FreeMarker 的數據模型(root 狀模型)可以使用標準的java 類(lèi)(Map,String 等等)
來(lái)表示。在其內部,FreeMarker 使用的數據模型其實(shí)是――――――――――――――――
實(shí)現了freemarker.template.TemplateModel 接口的對象。但是你卻可以使用諸如
java collections 對象作為你的數據模型,這是因為這些數據模型通常會(huì )被(FreeMarker)
在內部轉換成TemplateModel 類(lèi)型的對象。這種功能呢就叫做object wrapping。它可
以透明地把任意對象轉化成TemplateModel 接口類(lèi)型的實(shí)例。例如,它可以轉換
java.sql.ResultSet 對象,也可以轉變javax.servlet.ServletRequest 對象,
甚至可以轉化XML 文檔表示的數據模型。
但是你在轉換這些對象的時(shí)候,必須選取適合的包裹類(lèi)(Wrapper,這些包裹類(lèi)來(lái)實(shí)現
普通對象到TemplateModel 對象的轉化工作,但你也可以自己定制一些Wrapper)。既
然模版可以訪(fǎng)問(wèn)的數據模型必須都是轉化成TemplateModel 后的對象,所以你首先應該
熟悉各個(gè)實(shí)現TemplateModel 接口的子類(lèi)。
TemplateModel 主要有三個(gè)子類(lèi),每一個(gè)子類(lèi)分別表示一種FreeMarker 的基本類(lèi)型,
比如hashes 類(lèi)型用TemplateHashModel 表示, sequence 類(lèi)型實(shí)現用
TemplateSequenceModel 來(lái)表示,numbers 類(lèi)型用TemplateNumberModel 來(lái)表示,
另外,自己也可以定制其他的數據模型的轉化。
舉個(gè)例子,如果你想轉化java.sql.ResultSet 為sequence,那么你只需要寫(xiě)一個(gè)
實(shí)現了TemplateSequenceModel 接口的對象,并且該對象可以讀取ResultSet 然后并把
其轉換成相應的TemplateModel,其實(shí)你要做的僅僅是生成一個(gè)ResultSet 的包裝類(lèi),并
且繼承TemplateSequenceModel 接口。注意:一個(gè)類(lèi)可以實(shí)現多個(gè)TemplateModel
類(lèi)型的接口,這也就是為什么FreeMarker 的變量會(huì )有多種的原因。
注意:在包freemarker.template 中提供了以上這些接口的默認實(shí)現。例如,你要
轉換一個(gè)String 類(lèi)型那么你直接可以使用SimpleScalar,同樣要轉換一個(gè)Map 類(lèi)型你可
以使用SimpleScalar,諸如此類(lèi)等等。
如果你放置到root 數據模型中的對象本身就是實(shí)現了TemplateModel 接口的實(shí)
例,那么Object Wrapper 并不會(huì )去對該對象進(jìn)行任何轉換。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。