[FreeMarker 2.3.20] Part I 關於模版設計的介紹 ~準備階段~ data-model總覽

就如你們所看到的,data-model 就是一顆簡單的樹。這棵樹可以是任意的複雜度和深度,比如下例:

(root)
  |
  +- animals
  |   |
  |   +- mouse
  |   |   |   
  |   |   +- size = "small"
  |   |   |   
  |   |   +- price = 50
  |   |
  |   +- elephant
  |   |   |   
  |   |   +- size = "large"
  |   |   |   
  |   |   +- price = 5000
  |   |
  |   +- python
  |       |   
  |       +- size = "medium"
  |       |   
  |       +- price = 4999
  |
  +- test = "It is a test"
  |
  +- whatnot
      |
      +- because = "don't know"  

	

那些類似文件夾的變量 (比如 root, animals, mouse, elephant, python, whatnot) 我們把它們叫做 hashes我們可以通過查找名字 (比如:animal, mouse, price) 來訪問其他變量的值 (被稱作 子變量)。


那些存儲當個值的變量我們叫做 scalars.


當你在模板中想要使用一個子變量的時候,你只需要指定一個從根節點到目標變量的以 dot 分隔的字符串就好,這個比較像是樹的訪問,在數據結構中,多數是將值存在葉子節點。當你想訪問 mouse 裏的 price 變量時,那麼就需要從 root 開始 首先進入 animals, 然後是 mouses 最後將碰到 price,因此這樣一個字符串是這樣的 animals.mouse.price。這時當你用 ${...} 符號將類似字符串圍起來的時候其實就是在告訴 FreeMarker 讓它在符號出現的地方顯示對應的值。


此外這裏還有一種更重要的變量:sequences. 它們和 hashes 是比較類似的,但有點不同的就是它們不會存儲對應變量的名稱,更多的感覺是將原來可以用 hashes 表示的地方換成序號了,相應的會順序 (sequentially) 存儲這些變量集,就像數組一樣通過下表來訪問對應的值。如下例,在這個 data-model 中,animalswhatnot.fruits 就是 sequences:


(root)
  |
  +- animals
  |   |
  |   +- (1st)
  |   |   |
  |   |   +- name = "mouse"
  |   |   |
  |   |   +- size = "small"
  |   |   |
  |   |   +- price = 50
  |   |
  |   +- (2nd)
  |   |   |
  |   |   +- name = "elephant"
  |   |   |
  |   |   +- size = "large"
  |   |   |
  |   |   +- price = 5000
  |   |
  |   +- (3rd)
  |       |
  |       +- name = "python"
  |       |
  |       +- size = "medium"
  |       |
  |       +- price = 4999
  |
  +- whatnot
      |
      +- fruits
          |
          +- (1st) = "orange"
          |
          +- (2nd) = "banana" 

如上述,只要在 [] 中用數字就可訪問一個sequence 的子變量。這個數字可以稱爲下標,從 0 開始 (程序員的傳統,0 總是第一個的),所以第一個子變量的下標爲 0, 第二個爲 1, 以此類推。所以訪問第一個 animal 的表達式是這樣的 animals[0].name。同樣要想得到 whatnot.fruits 中的 "banana" scalars值只需要這樣就好 whatnot.fruits[1]


Scalars 還可以進一步的劃分爲以下四個類別:

  • String         即文本,如同上邊由 "m","o","u","s","e"組成的任意序列,上邊的 name-S, size-S 同樣是 string值
  • Number      這是種數值類型,如同 price-S的值。不過呢在 FreeMarker中的字符串 "50" 和數字的 50 是兩種完全不同的值類型,其實這是和 Java 等語言有同等語法的。前者只是兩個字符組成的序列罷了 (碰巧對人來說是可讀的數而已),後者呢,從數學的計算上說就是一個可計算的數值
  • Date/time    一個日期或者時間,存在就是年月日和時分秒的區別,比如動物被捕獲的日期,商店開門的時間
  • Boolean      一類能以 true/false(yes/no, on/off 等等) 表示的值。比如 animals 可以有個 protected 子變量來表示其是否被保護。
總結:

  • data-model 可以被視爲一棵樹
  • Scalars 存儲單個值,它的值可以是 字符串、數值、日期/時間、boolean
  • Hashes 則是能存儲別的變量的容器,可以通過唯一的名稱來查詢包含的變量值
  • Sequences 是存儲那些存在順序的變量的容器。裏邊的值可以通過以0開始的下標進行訪問。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章