文章图片标题

freemarker入门篇

分类:模板引擎 作者:阳光倾城 评论:1 点击: 525 次 日期:2015-07-29


freemarker这种模板引擎可以把jsp视图(freemaker不只用于java web)分割为两部分:展现层 和 数据输出层。展现层与java程序员的java开发无关。

用户在浏览器上看到的网页是web程序的输出,这种输出包含两个成分:输出的样式布局,输出的数据内容,简单说就是:模板 + 数据模型 = 输出。

举个例子:如果你需要在自己的购物网站上增加一个HTML页面,代码如下:

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

比方说,用户名(所有的”Big Joe”)应该是登录这个网页访问者的名字,最新产品的数
据应该来自于数据库,这样它才可以随时更新。 在这样的情况下你不能在 HTML 页面中直接
输入登录的用户名, 最新产品的 URL 和名称,你不能使用静态的 HTML 代码,那样是不能即
时改变的。
对于这个问题, FreeMarker 的解决方案是使用模板来代替静态 HTML 文本。 模板文件同
样是静态的 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 将会介入执行,然后动态转换模板,用最新的数据内容替
换${…}中的部分(例如:用 Big Joe 或者其他的访问者的用户名来代替${user}) ,生成普通的
HTML 文本并发送结果到访问者的 Web 浏览器中去显示。所以访问者的 Web 浏览器会接收
到类似于第一个 HTML 示例的内容(也就是说,显示普通的 HTML 文本而没有 FreeMarker
的指令) ,浏览器也不会感知到 FreeMarker 在服务器端被调用了。模板文件本身(存储在
Web 服务器端的文件)在这个过程中也不会改变什么,所以这个转换过程发生在一次又一
次的访问中。这样就保证了显示的信息总是即时的。
现在,你也许已经注意到, 该模板并没有包含关于如何找出当前的访问者是谁,或者是
如何去查询数据库查找最新的产品的指令。它似乎已经知道了这些数据。确实是这样,
FreeMarker 背后(确切的说是 MVC 模式的背后)的重要思想就是表现逻辑和业务逻辑相分
离。 在模板只是处理显示问题,也就是视觉设计问题和格式问题。所准备要显示的数据(如
用户名等)与 FreeMarker 无关,这通常是使用 Java 语言或其他目的语言来编写的。所以模
板开发者不需要关心这些数值是如何计算出来的。事实上, 在模板保持不变的同时,这些数
值的计算方式可以完全发生变化。 而且,除了模板外,页面外观发生的变化可以完全不触碰
其他任何东西。 当模板开发者和程序员是不同一个人的时候,分离带来的好处更是显而易见
的。
FreeMarker (还有模板开发者)并不关心数据是如何计算的,FreeMarker 只是知道真实
的数据是什么。模板能用的所有数据被包装成 data-model 数据模型。数据模型的创建是通
过已经存在的程序计算得到的。 至于模板开发者,数据模型像是树状结构(比如硬盘上的文
件夹和文件),正如本例中的数据模型,就可以如下形式来描述:

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

 

(为了避免误解:数据模型并不是文本文件,上面所描述的只是一种数据模型的表现形式。
它来自于 Java 对象,但这会成为 Java 程序员要面对的问题。 )
比较之前你在模板中看到的${user}和${latestProduct.name} 。作为一种
比喻:数据模型就像计算机文件系统上的内容:根 root 和 latestProduct 对应目录
(文件夹), user, url 和 name 对应文件。 url 和 name 在 latestProduct 目录
中,所以 latestProduct.name 就像是说 latestProduct 目录的 name 一样。
但是我所说的,这仅仅是个比喻,这里并没有真实的文件和目录。
概括地讲,模板和数据模型是 FreeMarker 所需,并用来生成输出内容的(比如之前展
示的 HTML) :模板+数据模型=输出




声明: 除非注明,本文属( 阳光倾城 )原创,转载请保留链接: http://www.tomrrow.com/archives-2995.html