標籤:
【FreeMarker】【程式開發】資料模型,對象封裝分類: Java.FreeMarker2014-10-25 18:49 413人閱讀 評論(0) 收藏 舉報FreeMarker
目錄(?)[+]
在簡單的樣本中,可以使用 java.lang 和 java.util 包下的類,還有使用者自訂的 Java Bean來構建資料對象。
- 使用 java.lang.String 來構建字串
- 使用java.lang.Number 來派生數字類型
- 使用 java.lang.Boolean 來構建布爾值
- 使用 java.util.List 或 Java 數組構建序列
- 使用自訂的 bean 類來構建雜湊表,bean中的項和bean的屬性對應
資料模型
在內部,模板中可用的變數都是實現了 freemarker.template.TemplateModel 介面的 java 對象。
但在自己的資料模型中,可以使用基本的Java集合類作為變數,因為這些變數會在內部被替換為適當的 TemplateModel 類型;這種功能特性被稱為 object wrapping 對象封裝。
對象封裝功能可以透明地把任何類型的對象轉換為實現了 TemplateModel 介面類型的執行個體。
這就是的下面的轉換成為可能,如在模板中 java.sql.ResultSet 轉換為序列變數,把 javax.servlet.ServletRequest 對象轉換成包含請求屬性的雜湊表變數,甚至可以遍曆 XML 文檔作為 FTL變數。
封裝這些對象,需要使用合適的,也就是所謂的對象封裝器是錢(也可能是自訂的實現)。
標量
4中類型的變數:
- 布爾值 —— 實現TemplateBooleanModel介面
- 數字 —— 實現TemplateNumberModel介面
- 字串 —— 實現TemplateScalarModel介面
- 日期 —— 實現TemplateDateModel介面
容器雜湊表
FreeMarker中的雜湊表是實現了 TemplateHashModel 介面的對象。TemplateHashModelEx介面擴充了TemplateHashModel介面;經常使用的實作類別是SimpleHash,該類實現了TemplateHashModelEx介面。
序列
序列是實現了TemplateSequenceModel介面的Java對象。經常使用的實作類別是SimpleSequence。
集合
集合是實現了TemplateCollectionModel介面的Java對象。通常使用的實作類別是SimpleCollection。
方法
方法變數實現了 TemplateMethodModel 介面。這個介面僅包含一個方法:TemplateModel exec(java.util.List arguments),當使用方法調用運算式去調用方法時,exec方法將會被調用。形參將會包含FTL方法調用形參的值,exec方法的傳回值給出了FTL方法調用運算式的傳回值。
TemplateMethodModelEx介面擴充了TemplateMethodModel介面。
例如:
[java] view plaincopy
- public class IndexOfMethod implements TemplateMethodModel {
- public TemplateModel exec(List args) throws TemplateModelException {
- if (args.size() != 2) {
- throw new TemplateModelException("Wrong arguments");
- }
- return new SimpleNumber(
- ((String) args.get(1)).indexOf((String) args.get(0)));
- }
- }
將一個方法執行個體放入根資料模型中,
[html] view plaincopy
- root.put("indexOf", new IndexOfMethod());
在模板中調用:
[html] view plaincopy
- <#assign x = "something">
- ${indexOf("met", x)}
- ${indexOf("foo", x)}
輸出為:
[html] view plaincopy
- 2
- -1
指令@
指令變數實現了TemplateDirectiveModel介面。
節點變數
節點變數體現了樹形結構中的節點。節點變數的引入是為了協助使用者在資料模型中處理XML文檔,也可以使用者構建樹狀模型。
節點變數實現TemplateNodeModel介面。
對象封裝
當往容器中添加一些對象時,可以是任意java物件類型的參數,而不一定是TemplateModel。這是因為模板實現會默默地用合適的TemplateModel對象來替換原有對象。比如向容器中加入一個String,也許它將被替換為一個SimpleScalar執行個體來儲存相同的文本。
至於什麼類型的Java對象可以被替換,又使用什麼樣的TemplateModel來實現,它可以被實現的容器自身來控制,也可以委派給ObjectWrapper的一個執行個體。
ObjectWrapper是一個介面,其中只定義了一個方法:TemplateModel wrap(java.lang.Object obj)。可以傳遞一個object類型的對象,它會返回對應的TemplateModel對象,如果不行則拋出TemplateModelException一場。替換原則是在ObjectWrapper的實作類別中編碼實現的。
最重要的ObjectWrapper實作類別是FreeMarker核心包提供的:
[html] view plaincopy
- public interface ObjectWrapper {
-
- ObjectWrapper BEANS_WRAPPER = BeansWrapper.getDefaultInstance();
-
- ObjectWrapper DEFAULT_WRAPPER = DefaultObjectWrapper.instance;
-
- ObjectWrapper SIMPLE_WRAPPER = SimpleObjectWrapper.instance;
我們使用java.util.HashMap作為根的雜湊表,而不是SimpleHash或其他特定的FreeMarker類,因為Template.process(...)自動封裝了給定的資料模型參數的對象,所以它才會起作用。它使用受Configuration設定的對象封裝器。因此,編寫簡單的FreeMarker應用程式就不需要知道TemplateModel。注意根的類型不需要一定是java.util.Map,它也可以是實現了TemplateHashModel介面的被封裝的對象。
【FreeMarker】【程式開發】資料模型,對象封裝