freemarker 模板开发入门

数据模型

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 模板开发入门

时间: 2024-10-14 01:45:36

freemarker 模板开发入门的相关文章

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

freemarker是什么? 有什么用? 怎么用? (问得好,这些都是我想知道的问题) freemarker是什么? FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具. 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件. 对于像我一样之前完全对freemarker没概念的来说,这种解释还是无法释疑解惑,需要说的再详尽点. freemarker有什么用? 模板编写

Node.js开发入门—使用jade模板引擎

在"Node.js开发入门--Express安装与使用"里,我们曾经使用express generator创建了一个HelloExpress网站,express工具为我们生成了基本的目录结构.模板.stylesheet.routers等.虽然那只是一个简单的HelloWorld类的小东西,可里面包含的内容还是有些多了,为了更好的理解Express所支持的jade模板引擎的用法,我们这次提供一个手动创建的小网站,可以显示来访者的IP,并对访问进行计数. 安装jade npm instal

Spring Boot入门系列五(FreeMarker模板的使用)

FreeMarker模板的使用 FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页.电子邮件.配置文件.源代码等)的通用工具. 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件. FreeMarker是免费的,基于Apache许可证2.0 版本发布.其模板编写为 FreeMarker Template Language(FTL),属于简单.专用的语言.需要准备数据在真实编程语言中来显示,比如数据库查询和业务运

freemarker程序开发

1.程序开发入门 1.1 创建配置实例 首先,你应该创建一个freemarker.template.Configuration的实例,然后调整它的设置.Configuration实例是存储FreeMarker应用级设置的核心部分.同时,它也处理创建和缓存预解析模板的工作.也许你只在应用(可能是servlet)生命周期的开始执行它一次: Configuration cfg = new Configuration();// 指定模板文件从何处加载的数据源,这里设置成一个文件目录.cfg.setDir

Node.js开发入门—语音合成示例

出于项目需要,搞了一个语音合成(TTS)的小示例,使用的是OKVoice. 我想在PC上测试,OKVoice的快速接入API可以实现我的目的,文档在这里:http://dev.okvoice.com/file.php. 直接上代码吧,okVoiceTts.js,内容如下: var http = require('http'); var fs =require('fs'); var crypto = require('crypto'); var util = require('util'); va

Node.js开发入门—使用对话框ngDialog

做网站经常会遇到弹出对话框获取用户输入或弹出对话框让用户确认某个操作之类的情景,有一个基于AngularJS的扩展模块可以帮我们优雅地完成这类事情:ngDialog. ngDialog在github上提供了一个示例网页,演示了它的各种用法,在这里:https://github.com/likeastore/ngDialog/blob/master/example/index.html.ngDialog的github主页的readme也对常用的指令和服务做了较为详细的介绍,可以参考.我这篇就纯粹是

Node.js开发入门—Stream用法详解

Stream是Node.js中非常重要的一个模块,应用广泛.一个流是一个具备了可读.可写或既可读又可写能力的接口,通过这些接口,我们可以和磁盘文件.套接字.HTTP请求来交互,实现数据从一个地方流动到另一个地方的功能. 所有的流都实现了EventEmitter的接口,具备事件能力,通过发射事件来反馈流的状态.比如有错误发生时会发射"error"事件,有数据可被读取时发射"data"事件.这样我们就可以注册监听器来处理某个事件,达到我们的目的. Node.js定义了R

Node.js开发入门—Angular简单示例

在"使用AngularJS"中,我们提到了如何在Node.js项目中引入AngularJS,这次提供一个非常简单的示例,演示AngularJS里的指令.数据绑定.服务等内容. 我准备做Web后台管理系统,不同的管理员会有不同的权限,管理员登录后看到的菜单和他的权限有关,能看到什么,是动态生成的(类似RBAC).本文的示例从这个项目而来,当然,现在还是最简单的. 如果没有特别说明,后面我们用到的示例都使用express generator生成. Angular小demo 先搞起来吧. 第

AppleWatch开发入门三——代码交互与控制器生命周期

AppleWatch开发入门三--代码交互与控制器生命周期 一.引言 在前两篇博客中,讨论了关于watch开发中框架与界面布局相关,然而主要的逻辑,终究还是要通过代码来实现的,在我们创建了项目之后,就会生成InterfaceController这个文件,它就是我们storyBoard中的入口视图控制器. 二.代码交互与控制器声明周期 storyBoard中的控件我们可以通过拖拽的方式关联到文件中,Action和Outlet两种关联方式基本可以达到我们修改控件和处理业务逻辑的需求. WKInter