FreeMarker 模板引擎在线手册归纳 之 引论与入门

2020-03-21   223 次阅读


因为打算自己动手改造博客而不是一味地使用模板
也就是自己亲手写模板(结果还是在用模板),但至少使用的是自己写的模板
本文内容大部分来自
FREEMARKER在线手册
在此本人只提炼出其中认为重要的部分

引论

  1. FreeMarker 是一款模板引擎,也就是一种基于模板和要改变的数据,并用来生成输出文本的通用工具
  2. 是一个Java类库
  3. 模板编写为FTL(FreeMarker Template Language)

在模板中可以专注于如何展现数据,而在模板之外可以专注于要展示什么数据

1.png

该模式一般称为MVC(模型视图控制器)模式

入门

1.模板 + 数据模型 = 输出

倘若一个HTML页面如下

<html>
<head>
  <title>Welcome!</title>
</head>
<body>
  <h1>Welcome John Doe!</h1>
  <p>Our latest product:
  <a href="products/greenmouse.html">green mouse</a>!
</body>
</html>

其中John Doe应当是该网站的访问者
a标签中的href也应当是对应选择产品所在的url
gree mouse 是产品的名字
因为每次访问网站的用户不同,而每次用户所访问的内容不同,因此为了随时更新内容,不能使用静态代码。此时就可以使用要求输出的模板,模板与静态HTML类似
只不过其包含了一些FreeMarker将其变为动态内容的指令

<html>
<head>
  <title>Welcome!</title>
</head>
<body>
  <h1>Welcome ${user}!</h1>
  <p>Our latest product:
  <a href="${latestProduct.url}">${latestProduct.name}</a>!
</body>
</html>

模板文件存放在Web服务器上,就像通常存放静态HTML页面那样。当有人来访问这个页面, FreeMarker将会介入执行,然后动态转换模板
用最新的内容替换模板中${...}的部分,随后将结果发送到访问者的Web浏览器中
重要的是访问者收到的内容样式与第一个HTML样例一样不包含${...},访问者也不会察觉到服务端使用了FreeMarker

模板并没有包含程序逻辑来查找当前的访问者是何人,显示的数据是在FreeMarker之外准备的,模板作者无需知道这些值是如何计算出的
保证模板专注于现实问题是高效使用模板引擎的关键
为模板准备的数据整体被称为数据模型

2.数据模型

(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"
  • 上图中的变量扮演目录的角色,被称为hashes(哈希表),哈希表可存储其他变量(子变量)
  • 存储单值的变量称为scalars(标量)
  • 倘若要访问变量price,要从根root开始制定其路径,每级之间用.隔开,可以这样写animals.elephant.prize
  • 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开始,比如要得到上表中第一个动物的名字,可以使用animals[0].name

  • 标量类型:字符串,数字,日期/时间,布尔值

3.模板

FreeMaker本身不属于HTML

①interpolation
${...}
FreeMarker会输出真实的值来替换大括号内的表达式

②FTL标签

  • 与HTML标签有相似之处,但是它们并不会在输出中打印,属于FreeMarker指令
  • 名字以#开头
  • 用户自定义的FTL标签以@开头

③注释
使用<#---->标识,注意的是FTL注释不会出现在访问者的界面中(就是你对一个浏览器界面右键检察元素,显示HTML代码,HTML注释会显示而FTL注释不会)

Q.E.D.

知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议