【FreeMarker】【程式開發】資料模型,對象封裝

來源:互聯網
上載者:User

標籤:

【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 數組構建序列
  • 使用 java.util.Map 來構建雜湊表
  • 使用自訂的 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
  1. public class IndexOfMethod implements TemplateMethodModel {  
  2.     public TemplateModel exec(List args) throws TemplateModelException {  
  3.         if (args.size() != 2) {  
  4.             throw new TemplateModelException("Wrong arguments");  
  5.         }  
  6.         return new SimpleNumber(  
  7.                ((String) args.get(1)).indexOf((String) args.get(0)));  
  8.     }  
  9. }  

 

將一個方法執行個體放入根資料模型中,

 

[html] view plaincopy
  1. root.put("indexOf", new IndexOfMethod());  

 

在模板中調用:

 

[html] view plaincopy
  1. <#assign x = "something">  
  2. ${indexOf("met", x)}  
  3. ${indexOf("foo", x)}  

 

輸出為:

 

[html] view plaincopy
  1. 2  
  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
  1. public interface ObjectWrapper {  
  2.   
  3.     ObjectWrapper BEANS_WRAPPER = BeansWrapper.getDefaultInstance();  
  4.   
  5.     ObjectWrapper DEFAULT_WRAPPER = DefaultObjectWrapper.instance;  
  6.   
  7.     ObjectWrapper SIMPLE_WRAPPER = SimpleObjectWrapper.instance;  

 

 

我們使用java.util.HashMap作為根的雜湊表,而不是SimpleHash或其他特定的FreeMarker類,因為Template.process(...)自動封裝了給定的資料模型參數的對象,所以它才會起作用。它使用受Configuration設定的對象封裝器。因此,編寫簡單的FreeMarker應用程式就不需要知道TemplateModel。注意根的類型不需要一定是java.util.Map,它也可以是實現了TemplateHashModel介面的被封裝的對象。

【FreeMarker】【程式開發】資料模型,對象封裝

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.