您的位置:首页 > 其它

[FreeMarker 2.3.20] Part I 关于模版设计的介绍 ~准备阶段~ data-model总览

2014-03-14 10:23 246 查看
就如你们所看到的,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开始的下标进行访问。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息