`
杨胜寒
  • 浏览: 286164 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

FreeMarker中文手册:模板一览

阅读更多

转载自 yshjava的个人博客主页 FreeMarker中文手册:模板一览

上一篇:《FreeMarker中文手册:模板开发入门

FreeMarker中文版手册由南磊翻译(译者联系方式为:nanlei1987@gmail.com 或http://weibo.com/nanlei1987),官网地址http://www.freemarker.org

 
最简单的模板是普通HTML文件(或者是其他任何文本文件—FreeMarker本身不属于HTML)。当客户端访问页面时,FreeMarker 要发送HTML 代码至客户端浏览器端显示。如果想要页面动起来,就要在HTML中放置能被FreeMarker 所解析的特殊部分。

 

${…}:FreeMarker 将会输出真实的值来替换花括号内的表达式,这样的表达式被称为interpolations插值,可以参考前一篇文章《FreeMarker中文手册:模板开发入门》中的范例内容。

 

FTL tags 标签(FreeMarker 模板的语言标签):FTL 标签和HTML 标签有一点相似,但是它们是FreeMarker 的指令而且是不会直接输出出来的东西。这些标签的使用一般以符号#开头。(用户自定义的FTL 标签使用@符号来代替#,但这是更高级的主题内容了,后面会详细地讨论)

Comments 注释:FreeMarker 的注释和HTML 的注释相似,但是它用<#---->来分隔的。任何介于这两个分隔符(包含分隔符本身)之间内容会被FreeMarker 忽略,就不会输出出来了。

 

其他任何不是FTL 标签,插值或注释的内容将被视为静态文本,这些东西就不会被FreeMarker 所解析,会被按照原样输出出来。


directives 指令:就是所指的FTL标签。这些指令在HTML 的标签(如<table></table> )和HTML 元素(如table 元素)中的关系是相同的。(如果现在你还不能区分它们,那么把“FTL 标签”和“指令”看做是同义词即可。)

 

 

指令示例

 

尽管FreeMarker 有很多指令,作为入门,在快速了解过程中我们仅仅来看三个最为常用的指令。

 

if 指令

 

使用if 指令可以有条件地跳过模板的一部分,这和程序语言中if 是相似的。假设在第一个示例中,你只想向你的老板Big Joe(而不是其他人)问好,就可以这样做:

<html>
 <head>
  <title>Welcome!</title>
 </head>
 <body>
  <h1>
  Welcome ${user}<#if user == "Big Joe">, our beloved
  leader</#if>!
  </h1>
  <p>Our latest product:
  <a href="${latestProduct.url}">${latestProduct.name}</a>!
 </body>
</html>

 

 

 

我们来详细说说condition 的使用:==是来判断在它两侧的值相等的操作符,比较的结果是布尔值,true 或者false。在==的左侧,是引用的变量,我们很熟悉这样的语法,它会被变量的值来替代。右侧是指定的字符串,在模板中的字符串必须放在引号内。

 

当price 是0 的时候,下面的代码将会打印:”Pythons are free today!”

 

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

 

 

和前面的示例相似,字符串被直接指定,但是这里则是数字(0)被直接指定。注意到数字是不用放在引号内的。如果将0 放在引号内( ”0” ),FreeMarker 就会将其误判为字符串了。

 

当price 不是0 的时候,下面的代码将会打印:”Pythons are not free today!”

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

 

 

你也许会猜测了,!=就是不等于。


你也可以这样来写代码(使用数据模型来描述哈希表变量):

<#if animals.python.price < animals.elephant.price>
 Pythons are cheaper than elephants today.
</#if>

 

 

使用<#else>标签可以指定当条件为假时程序执行的内容。例如:

<#if animals.python.price < animals.elephant.price>
 Pythons are cheaper than elephants today.
<#else>
 Pythons are not cheaper than elephants today.
</#if>

 

 

如果蟒蛇的价格比大象的价格低,将会打印”Python are cheaper than elephants today.”,否则就打印”Pythons are not cheaper than elephants today.”

如果变量本身就是布尔值(true 或者false),那么可以直接让其作为if 的条件condition

 

<#if animals.python.protected>
 Warning! Pythons are protected animals!
</#if>

 

 

list 指令

当需要用列表来遍历集合的内容时,list 指令是非常好用的。例如,如果在模板中用前面示例描述序列的数据模型。

<p>We have these animals:</p>
<table border=1>
 <tr><th>Name<th>Price
 <#list animals as being>
  <tr><td>${being.name}<td>${being.price} Euros
 </#list>
</table>

 

 

那么输出结果将会是这样的

<p>We have these animals:</p>
<table border=1>
 <tr><th>Name<th>Price
 <tr><td>mouse<td>50 Euros
 <tr><td>elephant<td>5000 Euros
 <tr><td>python<td>4999 Euros
</table>

 

 

list 指令的一般格式为:

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

 

 

 

repeatThis 部分将会在给定的sequence 遍历时在每项中重复,从第一项开始,一个接着一个。在所有的重复中,loopVariable 将持有当前项的值。这个循环变量仅存在于<#list …></#list>标签之间。

 

再看一个示例,遍历示例数据模型fruits

<p>And BTW we have these fruits:</p>
<ul>
 <#list whatnot.fruits as fruit>
  <li>${fruit}
 </#list>
<ul>

 

 

 

 

 

include 指令

 

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

 

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

 

<hr>
<div>
 Copyright (c) 2000 <a href=http://www.yshjava.cn>Acmee Inc</a>,
 <br>
 All Rights Reserved.
</div>

 

 

当需要用到这个文件时,可以使用include 指令来实现插入。

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

 

 

输出的内容为:

<html>
 <head>
  <title>Test page</title>
 </head>
 <body>
  <h1>Test page</h1>
  <p>Blah blah...</p>
  <hr>
  <div>
   Copyright (c) 2000 <a href="http://www.yshjava.cn">Acmee Inc</a>,
   <br>
   All Rights Reserved.
  </div>
 </body>
</html>

 

 

如果改变了copyright_footer.html 中的内容,那么访问者就会在所有页面中看到新的版权声明信息了。

 

 


联合(混合)使用指令

 

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

 

<p>We have these animals:</p>
<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 并不解析FTL 标签外的文本,插值和注释,当条件不满足时它也会忽略所有嵌套的font 标签。

 


处理不存在的变量

 

在实际应用中数据模型经常会有可选的变量(也就是说有时可能不存在实际值)。除了一些典型的人为原因导致失误,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)??来看。

 

 

2
4
分享到:
评论

相关推荐

    FreeMarker中文手册

    - **1.4 模板一览**:提供了模板的基本结构、指令和表达式的概览。 ##### 第二章:数值和类型 - **2.1 基本内容**:介绍了数值类型的基础知识,包括整数、浮点数等。 - **2.2 类型**:深入探讨了FreeMarker中的各种...

    FreeMarker中文版文档1

    1.4 模板一览 模板文件通常使用`.ftl`扩展名,其中包含HTML代码和其他FreeMarker指令。FreeMarker提供了多种控制结构,如条件语句(`&lt;#if&gt;`, `&lt;#else&gt;`)、循环(`&lt;#foreach&gt;`)以及包含其他模板的功能(`&lt;#include&gt;`), ...

    FreeMarker 2.3.19 中文手册

    - **模板一览:**详细介绍了模板的结构、语法及使用方式。 **第二章 数值和类型** - **2.1 基本内容:**涵盖了FreeMarker中的基本数据类型及其使用方法。 - **2.2 类型:**深入探讨了FreeMarker支持的不同数据类型...

    FreeMarker 中文教程 用于 FreeMarker 2.3.19

    - **模板一览**:展示了模板的基本结构,包括指令、表达式等内容。 ##### 2. 数值和类型 - **基本内容**:讲解了 FreeMarker 中的数值和类型的基本概念,包括整数、浮点数等。 - **类型**:详细介绍了 ...

    FreeMarker_Manual_zh_CN

    - **模板一览**:模板是FreeMarker中的关键组成部分,用于定义输出内容的布局和样式。模板可以包含文本、表达式、指令等元素。 ##### 2. 数值和类型 - **基本内容**:介绍FreeMarker中的基本数据类型和如何在模板...

    FreeMarker

    - **1.4 模板一览**:展示了FreeMarker模板的语法元素,如变量、表达式、控制结构、注释等。 #### 第二章:数值和类型 这一章深入探讨了FreeMarker中的数值处理和类型系统,包括数值类型、字符串、布尔值、列表、...

    FreeMarker Manual Simplified Chinese 2.3.18

    - **模板一览**:模板文件可以包含文本、指令和表达式等。FreeMarker 提供了一系列指令(如 if、switch、foreach 等)来控制逻辑流程,同时也支持自定义指令的定义。 - **数值和类型**:这部分详细介绍了 ...

    FreeMarker 手册 2.3.18.zip

    中文手册,内容很全面! Translated By Nan Lei 南磊 译 第一部分 模板开发指南 ................................................................................................... 9 第一章 模板开发入门...

    FreeMarkder中文手册

    - **1.4 模板一览** 展示了一些常见的模板示例,帮助初学者快速上手,了解如何在模板中嵌入变量、条件语句、循环结构等。 3. **第二章:数值和类型** - 本章深入探讨了FreeMarker支持的不同数值类型和数据类型...

    FreeMarker 手册

    1.4 模板一览 ................................................................................................... 13 第二章 数值和类型 .....................................................................

    FreeMarker.pdf

    根据提供的文件信息,我们可以从《FreeMarker手册》中提取出一系列关键知识点,这些知识点主要围绕着FreeMarker模板引擎的基础概念、使用方法以及高级特性展开。下面是对这些知识点的详细总结: ### 一、FreeMarker...

Global site tag (gtag.js) - Google Analytics