就如你們所看到的,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 中,animals、whatnot.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開始的下標進行訪問。