数据模型

scalars标量:从根 root 開始指定它的路径,每级之间用点来分隔。

如:whatnot.fruits

sequences 序列:使用数组的方括号方式来訪问一个序列的子变量。

如:animals[0].name,whatnot.fruits[1]

总结:

数据模型能够被看做是树状结构的。

标量存储单一的值。这样的类型的值能够是字符串。数字,日期/时间或者是布尔值。

哈希表是存储变量和与其相关且有唯一标识名称变量的容器。

序列是存储有序变量的容器。

存储的变量能够通过数字索引来检索,索引通常从零開始。

模板

${…}:FreeMarker 将会输出真实的值来替换花括号内的表达式,这种表达式被称为interpolations 插值.

FTL tags 标签(FreeMarker 模板的语言标签):它们是 FreeMarker 的指令并且是不会直接输出出来的东西。这些标签的使用一般以符号#开头。(用户自己定义的 FTL 标签使用@符号来取代#)

Comments 凝视:FreeMarker 的凝视和 HTML 的凝视相似,可是它用<#--和-->来分隔的。

不论什么介于这两个分隔符(包括分隔符本身)之间内容会被 FreeMarker 忽略,就不会输出出来了。

directives 指令:就是所指的 FTL 标签。这些指令在 HTML 的标签(如<table>和</table>)和 HTML 元素(如 table 元素)中的关系是同样的。

(假设如今你还不能区分它们。那么把“FTL 标签”和“指令”看做是同义词就可以。






指令演示样例

1 if 指令

<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。在==的左側,是引用的变量,我们非常熟悉这种语法。它会被变量的值来替代。

右側是指定的字符串。在模板中的字符串必须放在引號内。


使用<#else>标签能够指定当条件为假时程序运行的内容。

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

假设变量本身就是布尔值(true 或者 false),那么能够直接让其作为 if 的条件

condition:

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

2 list 指令

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

比如,假设在模板中用前面演示样例描写叙述序列的数据模型。

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

list 指令的一般格式为:


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

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

3 include 指令

使用 include 指令。我们能够在当前的模板中插入其它文件的内容。

如果要在一些页面中显示版权声明的信息。那么能够创建一个文件来单独包括版权声明,之后在须要它的地方插入就可以。例如说,我们能够将版权信息单独存放在页面文件copyright_footer.html 中。

<hr>
<i>
Copyright (c) 2000 <a href="http://www.acmee.com">Acmee
Inc</a>,
<br>
All Rights Reserved.
</i>

当须要用到这个文件时。能够使用 include 指令来实现插入。

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

4 联合使用指令

<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>

5 处理不存在的变量

不论在哪里引用变量。都能够指定一个默认值来避免变量丢失这样的情况,通过在变量名后面跟着一个!和默认值。就像以下的样例。当 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 模板开发入门的更多相关文章

  1. FreeMarker模板开发指南知识点梳理

    freemarker是什么? 有什么用? 怎么用? (问得好,这些都是我想知道的问题) freemarker是什么? FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生 ...

  2. freeMarker(二)——模板开发指南之入门

    学习笔记,选自freeMarker中文文档,译自 Email: ddekany at users.sourceforge.net 模板开发指南-入门  1.模板+数据模型=输出 假设在一个在线商店的应 ...

  3. freeMarker(五)——模板开发指南补充知识

    学习笔记,选自freeMarker中文文档,译自 Email: ddekany at users.sourceforge.net 模板开发指南补充知识 1. 自定义指令 自定义指令可以使用 macro ...

  4. freeMarker(四)——模板开发指南之模板

    学习笔记,选自freeMarker中文文档,译自 Email: ddekany at users.sourceforge.net 模板开发指南之模板 1. 总体结构 实际上用程序语言编写的程序就是模板 ...

  5. FreeMarker:模板开发指南

    ylbtech-FreeMarker:模板开发指南 1.返回顶部 1. Section Contents 入门 模板 + 数据模型 = 输出 数据模型一览 模板一览 数值,类型 基本内容 类型 模板 ...

  6. Spring Boot 系列(五)web开发-Thymeleaf、FreeMarker模板引擎

    前面几篇介绍了返回json数据提供良好的RESTful api,下面我们介绍如何把处理完的数据渲染到页面上. Spring Boot 使用模板引擎 Spring Boot 推荐使用Thymeleaf. ...

  7. freeMarker(三)——模板开发指南之数值、类型

    学习笔记,选自freeMarker中文文档,译自 Email: ddekany at users.sourceforge.net 模板开发指南——数值.类型 1.基本内容 1.1 什么是数值? 正如你 ...

  8. 一、FreeMarker 模版开发指南 第一章 入门

    所有资料来自 南磊 翻译的官方文档,我弄简单了,适合自己以后拿出来翻看. 章节内容如下: 简介 模板+数据模型=输出 数据模型一览 模板一览 一.模板  +  数据模型  =  输出 输出结果: &l ...

  9. Freemarker 程序开发

    Freemarker 程序开发 现在web开发中,多使用freemarker 来描述页面.通常会使用的macro来定义各种组件,从而达到UI组件的复用.结合使用其它的指定,可快速的描述一个html页面 ...

随机推荐

  1. dll文件反编译,c#、vb动态库反编译

    最近开发遇到一个项目,对方提供一个c#编写的动态库,图片处理需要调用该动态库方法,发现一张图片处理起来需要5s时间,对方无法提供有效解决手段,抱着试一试的想法反编译的对方的动态库,发现其中问题. 一下 ...

  2. C# .NET 获取网络适配器信息和路径信息

    C# .NET 获取网络适配器信息 1:NetworkInterface 类: 该类位于 System.Net.NetworkInformation 命名空间 该类可以方便的检测本机有多少个网卡(网络 ...

  3. SQL2008″Unable to read the list of previously registered servers on this system”

    打开SQL2008,弹出”Unable to read the list of previously registered servers on this system”错误, 微软官方的解决方法:h ...

  4. 信用卡:银联,VISA,MasterCard

    国际信用卡是一种银行联合国际信用卡组织签发给那些资信良好的人士并可以在全球范围内进行透支消费的卡片,同时该卡也被用于在国际网络上确认用户的身份. 国际发卡组织是一个由全世界银行参与的非营利的国际性组织 ...

  5. jQuery闭包之浅见,从面向对象角度来理解

    本篇的标题虽然是"jQuery闭包之浅见...",但实际上本篇涉及的多半是javascript"闭包"相关内容,之所以写这个标题,完全是因为自己平常用jQuer ...

  6. python接口自动化6-重定向(Location)

    前言 某屌丝男A鼓起勇气向女神B打电话表白,女神B是个心机婊觉得屌丝男A是好人,不想直接拒绝于是设置呼叫转移给闺蜜C了,最终屌丝男A和女神闺蜜C表白成功了,这种场景其实就是重定向了. 一.重定向 1. ...

  7. Linux车载系统的开发方向

    眼下Linux基金会推出了基于Tizen 开源的车载系统平台Automotive Grade Linux (AGL), 眼下早期版本号的AGL已提供下载. UI用HTML5和JavaScript编程. ...

  8. 实现工资的按天统计(X:日期 Y:姓名)

    案例:工人工资按天按班别存入数据库,想实现一根据部门及员工姓名还有日期的汇总表... 汇总表效果如下: 还可以根据XY坐标对应的值查询显示该日期的明细记细 2013-09-06升级(如是当月最多只能显 ...

  9. 嵌入式linux应用程序调试方法

    嵌入式linux应用程序调试方法 四 内存工具 五 C/C++代码覆盖.性能profiling工具 四 内存工具 您肯定不想陷入类似在几千次调用之后发生分配溢出这样的情形. 许多小组花了许许多多时间来 ...

  10. Coursera课程python中的一些程序

    Index of /code Name Last modified Size Description Parent Directory - BeautifulSoup.py 07-Aug-2015 1 ...