模板数据模型=输出

假设您需要一个网站上的 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”)取决于登录用户的身份,并且最新的产品信息应来自数据库。由于此数据会更改,因此您不能使用静态 HTML。相反,您可以使用所需输出的 模板 。该模板与静态 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 就会介入,并通过将${...} -s 替换为最新内容,将模板实时转换为纯 HTML,并将结果发送到访问者的 Web 浏览器。因此,访问者的 Web 浏览器将收到类似于第一个示例 HTML(即没有 FreeMarker 指令的纯 HTML)的内容,并且不会感觉到服务器上使用了 FreeMarker。 (当然,此操作不会更改存储在 Web 服务器上的模板文件;替换仅显示在 Web 服务器的响应中.)

请注意,模板不包含用于找出当前访问者是谁或查询数据库以获取最新产品的编程逻辑。要显示的数据是在 FreeMarker 外部准备的,通常是用某些“真实”编程语言(如 Java)编写的部分。模板作者不需要知道如何计算这些值。实际上,可以完全更改这些值的计算方式,而模板可以保持完全相同,并且可以完全更改页面的外观,而无需触摸模板。当模板作者(设计者)和程序员是不同的个人时,表示逻辑和业务逻辑的这种分离特别有用,但是如果他们是同一个人,则还有助于 Management 应用程序的复杂性。保持模板专注于表示问题(视觉设计,布局和格式设置)是有效使用 FreeMarker 等模板引擎的关键。

为模板准备的数据总数称为 data-model 。就模板作者而言,数据模型是一个树状结构(例如硬盘上的文件夹和文件),在这种情况下,可以可视化为:

(root)
  |
  +- user = "Big Joe"
  |
  +- latestProduct
      |
      +- url = "products/greenmouse.html"
      |
      +- name = "green mouse"

Note:

以上只是一个可视化;数据模型不是文本格式,而是来自 Java 对象。对于 Java 程序员,其根可能是具有getUser()getLatestProduct()方法的 Java 对象,也可能是具有"user""latestProducts"键的 Java Map。同样,latestProduct可能是具有getUrl()getName()方法的 Java 对象。

之前,您已使用userlatestProduct.name表达式从此数据模型中选择了值。如果我们 continue 进行类比,即数据模型就像一个文件系统,那么“(root)”和latestProduct对应于目录(文件夹),而userurlname是这些目录中的文件。

概括一下,FreeMarker 需要一个模板和一个数据模型来生成输出(如首先显示的 HTML):

模板数据模型=输出