freeMarker学习

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了freeMarker学习相关的知识,希望对你有一定的参考价值。


一、什么是FreeMarker?


FreeMarker 是一款模板引擎:一种基于模板的、用来生成输出文本(任何来自于html格式的文本用来自动生成源代码)的通用工具。它是为Java 程序员提供的一个开发包或者说是类库。它不是面向最终用户,而是为程序员提供的可以嵌入他们开发产品的一款应用程序。


结构图:


freeMarker学习(一)_python




FreeMarker 不是Web 应用框架。它是Web 应用框架中的一个适用的组件,但是FreeMarker 引擎本身并不知道HTTP 协议或Servlet。它仅仅来生成文本。


案例:


假设你在一个在线商店的应用系统中需要一个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 <span style="color:#cc0000;">$user!</span></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 服务器端的文件)在这个过程中也不会改变什么,所以这个转换过程发生在一次又一次的访问中。这样就保证了显示的信息总是即时的。

二、常用标签


if 指令


<#if animals.python.price == 0>
Pythons are free today!
</#if>

list 指令

当需要用列表来遍历集合的内容时,list 指令是非常好用的。



<#list animals as being>
<tr><td>$being.name<td>$being.price Euros
</#list>

list 指令的一般格式为:


<#list sequence as loopVariable>repeatThis</#list>


repeatThis 部分将会在给定的sequence 遍历时在每项中重复,从第一项开始,


一个接着一个。在所有的重复中,loopVariable 将持有当前项的值。这个循环变量仅


存在于<#list …>和</#list>标签之间。

include 指令

使用include 指令,我们可以在当前的模板中插入其他文件的内容。

假设要在一些页面中显示版权声明的信息。那么可以创建一个文件来单独包含版权声明,
之后在需要它的地方插入即可。比方说,我们可以将版权信息单独存放在页面文件
copyright_footer.html 中。

<html>
<head>
<title>Test page</title>
</head>
<body>
<h1>Test page</h1>
<p>Blah blah...
<#include "/copyright_footer.html">
</body>
</html>


联合使用指令


在页面也可以多次使用指令,而且指令间可以相互嵌套,正如在HTML 元素中嵌套使用
标签一样。下面的代码会遍历动物集合,用大号字体来打印大型动物的名字。


<p>We have these animals:
<table border=1>
<tr><th>Name<th>Price
<#list animals as being>
<tr>
<td>
<#if being.size == "large"><font size="+1"></#if>
$being.name
<#if being.size == "large"></font></#if>
<td>$being.price Euros
</#list>
</table>

处理不存在的变量

在实际应用中数据模型经常会有可选的变量(也就是说有时可能不存在实际值)。除了一些典型的人为原因导致失误,FreeMarker 不能容忍引用不存在的变量,除非明确地告诉它
当变量不存在时如何处理。这里介绍两种典型的处理方法。这部分对程序员而言:一个不存在的变量和一个是null 的变量,对于FreeMarker 来说是一样的,所以这里所指的丢失包含这两种情况。
不论在哪里引用变量,都可以指定一个默认值来避免变量丢失这种情况,通过在变量名后面跟着一个!和默认值。就像下面的例子,当user 从数据模型中丢失时,模板将会将
user 的值表示为字符串”Anonymous”。(若user 并没有丢失,那么模板就会表现出”Anonymous”不存在一样):


<h1>Welcome $user!"Anonymous"!</h1>


当然也可以在变量名后面通过放置??来询问FreeMarker 一个变量是否存在。将它和if指令合并,那么如果user 变量不存在的话将会忽略整个问候代码段:


<#if user??><h1>Welcome $user!</h1></#if>

关于多级访问的变量, 比如animals.python.price , 书写代码:


animals.python.price!0,仅当animals.python 存在而仅仅最后一个子变量price 可能不存在(这种情况下我们假设价格是0)。如果animals 或者python不存在,那么模板处理过程将会以“未定义的变量”错误而停止。为了防止这种情况的发生,


可以这样来书写代码(animals.python.price)!0。这种情况下当animals 或python 不存在时表达式的结果仍然是0。对于??也是同样用来的处理这种逻辑的:animals.python.price??对比(animals.python.price)??来看。











以上是关于freeMarker学习的主要内容,如果未能解决你的问题,请参考以下文章

freeMarker学习

最近学习freemarker

FreeMarker学习(springmvc配置)

FreeMarker学习2

学习笔记初识FreeMarker简单使用

FreeMarker学习(常用指令)