数据模型

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. bzoj 3262

    题意:给你一些三维上的点,对于每个点,统计三个坐标都小于等于该点的点数. 如果点的范围在300以内,可以用三维树状数组搞,但这题坐标范围太大. 考虑将所有点按照x坐标排序,从左到右,相当于在一个二维平 ...

  2. win7 64位安装pywin32

    先安装pywin32-218.win-amd64-py3.4.exe文件: 安装完成后,用CMD管理员模式进入\Python34\Scripts\目录 输入pywin32_postinstall.py ...

  3. 工作记录(1)- js问题

    也是好久不写博客了,确实懒了:想想应该把node.js的东西写完整比较好,在抽时间吧: 这几天在做阿里巴巴的一个页面展示,里面设计到了一些js的问题,中途也遇到了一些幼稚的问题, 算是简单记录一下,以 ...

  4. Jenkins搭建.NET自动编译测试与发布环境

    本文地址: http://blog.csdn.net/wangjia184/article/details/18365553 操作系统Windows, 确保需要的.NET Framework已经安装 ...

  5. mysql安装三 linux源码安装mysql5.6.22

    http://blog.csdn.net/beiigang/article/details/43053803

  6. C#程序集系列04,在程序集包含多个module的场景下理解关键字internal

    本篇在一个程序集包含多个module的场景下体验internal的含义. →查看F盘as文件夹下的文件→删除MainClass.exe→把MyFirstModule和MySecondModule组装到 ...

  7. 汉字转拼音的Java类库——JPinyin

    原文:http://blog.csdn.net/stuxuhai/article/details/8932715 [JPinyin主要特性]1.准确.完善的字库:Unicode编码从4E00-9FA5 ...

  8. jsp页面传递参数是如何与javabean进行关联的

    总结:1.severlet容器是通过JavaBean中的属性方法名来获取属性名的,然后根据此属性名来从request中取值 2.JavaBean中属性方法的命名,set后的名称要与你从request中 ...

  9. nginx: [error] invalid PID number “” in “/usr/local/var/run/nginx/nginx.pid”

    在Mac上用brew安装Nginx,然后修改Nginx配置文件,再重启时报出如下错误: nginx: [error] invalid PID number "" in " ...

  10. NSPredicate 的使用(持续更新)

    NSPredicate 谓词工具一般用于过滤数组数据,也可用来过滤CoreData查询出的数据. 1). 支持keypath 2). 支持正则表达式 在使用之前先新建3个类 Teacher Info ...