On this page
数据模型一目了然
如您所见,数据模型基本上是一棵树。该树可以任意复杂和深入,例如:
(root)
|
+- animals
| |
| +- mouse
| | |
| | +- size = "small"
| | |
| | +- price = 50
| |
| +- elephant
| | |
| | +- size = "large"
| | |
| | +- price = 5000
| |
| +- python
| |
| +- size = "medium"
| |
| +- price = 4999
|
+- message = "It is a test"
|
+- misc
|
+- foo = "Something"
像目录一样起作用的变量(根animals
,mouse
,elephant
,python
,misc
)称为**。哈希通过查询名称(例如“动物”,“鼠标”或“价格”)存储其他变量(所谓的 * sub 变量*)。
存储单个值(size
,price
,message
和foo
)的变量称为“标量”。
当您想在模板中使用子变量时,请从根目录指定其路径,并用点分隔步骤。要访问mouse
的price
,请从根目录开始,进入animals
,然后进入mouse
,然后进入price
。所以你写animals.mouse.price
。
另一重要变量是** sequences。它们存储像哈希一样的子变量,但是这里的子变量没有名称,它们只是列表中的项。例如,在此数据模型中,animals
和misc.fruits
是序列:
(root)
|
+- animals
| |
| +- (1st)
| | |
| | +- name = "mouse"
| | |
| | +- size = "small"
| | |
| | +- price = 50
| |
| +- (2nd)
| | |
| | +- name = "elephant"
| | |
| | +- size = "large"
| | |
| | +- price = 5000
| |
| +- (3rd)
| |
| +- name = "python"
| |
| +- size = "medium"
| |
| +- price = 4999
|
+- misc
|
+- fruits
|
+- (1st) = "orange"
|
+- (2nd) = "banana"
要访问序列的子变量,请在方括号中使用数字索引。索引从 0 开始(程序员习惯从 0 开始),因此第一个项目的索引为 0,第二个项目的索引为 1,依此类推。因此,要获取第一个动物的名称,您可以编写animals[0].name
。要获得misc.fruits
中的第二项(字符串"banana"
),请编写misc.fruits[1]
。 (实际上,您通常只是按 Sequences 遍历序列,而不在乎索引,但是将是shown later。)
标量可以进一步分为以下几类:
字符串:文本,即上面的“ m”,“ o”,“ u”,“ s”,“ e”之类的任意字符序列。例如,
name
-s 和size
-s 是上面的字符串。数字:这是一个数字值,类似于上面的
price
-s。字符串"50"
和数字50
是 FreeMarker 中完全不同的两件事。前者只是两个字符的序列(对于人类来说恰好可以理解为一个数字),而后者是可以在算术计算中使用的数值。类似于日期的日期:日期时间(存储日期和一天中的时间),日期(无时间)或时间(一天中的时间,无日期)。
布尔值:对/错(是/否,打开/关闭等)。像动物一样,它可能有一个
protected
子变量,该子变量存储动物是否受到保护。
Summary:
数据模型可以可视化为树。
标量存储单个值。该值可以是字符串或数字,也可以是日期时间/日期/时间或布尔值。
散列是存储其他变量并将其与唯一查找名称关联的容器。
序列是按 Sequences 存储其他变量的容器。可以通过数字索引(从 0 开始)检索存储的变量。
Note:
这里还有其他一些更高级的值类型,例如方法和指令。