二、FreeMarker 模版开发指南 第二章 数值和类型
章节内容如下:
基本内容
类型
一、基本内容
简介
什么是数值?
什么是类型?
数据模型是哈希表
a、简介
理解数值和类型的概念是理解数据模型的关键所在。然而,数值和类型的概念并不局限于数据模型,下面你就会看到。
什么是数值
什么是类型
数据模型是哈希表
b、类型
简介
标量
容器
子程序
方法和函数
用户自定义指令
函数/方法和用户自定义指令的比较
其它
节点
简介
支持的类型有:
- 标量:
- 字符串
- 数字
- 布尔值
- 日期
- 容器:
- 哈希表
- 序列
- 集
- 子程序:
- 方法和函数
- 用户自定义指令
- 其它/很少使用:
- 节点
标量
......
容器
这些值存在的目的是为了包含其他变量,它们仅仅作为容器。被包含的变量通常是子变量。容器的类型有:
- 哈希表:每个子变量都可以通过一个唯一的名称来查找,这个名称是不受限制的字符串。哈希表并不确定其中子变量的顺序,也就是说没有第一个变量,第二个变量这样的说法,变量仅仅是通过名称来访问的。
- 序列:每个子变量通过一个整数来标识。第一个子变量的标识符是0,第二个是1,第三个是2,这样来类推,而且子变量是有顺序的。这些数字通常被称为是子变量的索引。序列通常比较密集,也就是所有索引,包括最后一个子变量的都和子变量是相关联的,但不是绝对必要的。子变量的数值类型也并不需要一致。
- 集: 从模板设计者角度来看,集是有限制的序列。不能获取集的大小,也不能通过索引取出集中的子变量,但是它们仍然可以通过list 指令来遍历。
要注意一个数值也可有多种类型,对于一个数值可能存在哈希表和序列这两种类型,这时,该变量就支持索引和名称两种访问方式。不过容器基本是当作哈希表或者序列来使用的,而不是两者同时使用。
尽管存储在哈希表,序列(集)中的变量可以是任意类型的,这些变量也可以是哈希表,序列(集)。这样就可以构建任意深度的数据结构。
数据模型本身(最好说为它的根)也是哈希表。
子程序
方法和函数
方法是来自于数据模型(它们反射了Java 对象的方法),而函数是定义在模板内的(使用了函数指令-这也是高级主题),但二者可以用同一种方式来使用。
The average of 3 and 5 is: ${avg(3, 5)}
The average of 6 and 10 and 20 is: ${avg(6, 10, 20)}
The average of the price of a python and an elephant is:
${avg(animals.python.price, animals.elephant.price)}
The average of 3 and 5 is: 4
The average of 6 and 10 and 20 is: 12
The average of the price of a python and an elephant is: 4999.5
用户自定义指令
用户自定义指令(用自定义名称作为FreeMarker 的标签)这种类型的值也是一种子程序,一种可以复用的模板代码段。但这也是高级主题,我们在后续章节中会详细解释。
对于程序员来说:用户自定义指令(比如宏),也是第一类值,就像函数/方法一样。
这里仅仅对用户自定义指令有一个认识即可(如果现在还不能理解可以先忽略它)。假设现在有一个变量,box,它的值是用户自定义的指令,用来打印一些特定的HTML信息,这个指令定义了一个标题和其中的信息。
函数/方法和用户自定义指令的比较
这个内容也是对高级用户来说的(如果你还不能理解可以先忽略这部分)。如果要使用函数/方法或自定义指令去实现一些东西的时候,二者之间的选择是两难的。按经验来说, 如果能够实现,请用自定义指令而不用函数/方法。
- 输出(返回值)的是标记(HTML,XML等)。主要原因是函数的返回结果可以自动进行XML转义(这是因为${…}的特性),而用户自定义指令的输出则不是(这是因为<@...>的特性所致,它的输出假定为是标记,因此就不再转义)。
- 副作用是重要的,而不是返回值。例如一个指令的目的是往服务器日志中添加一个条目。(事实上你不能得到自定义指令的返回值,但有些反馈的类型是有可能设置非本地变量的)
- 会进行流程的控制(就像list 或if 指令那样),但是不能在函数/方法上这么做。
FreeMarker不知道的Java 对象的方法通常在模板中是可以作为方法来使用的,而不用考虑Java 对象方法本身的特性,因为在这里没有其他的选择。
其它(节点)
节点变量代表了树状结构中的一个节点,而且通常是配合XML来处理的,这是专业且高级的主题。
这里我们仅对高级用户进行一个概览:节点和存储在其他节点中的序列很相似,通常也被当作为子节点。节点存储它所在容器节点的引用,也就是父节点。节点的主要作用是拓扑信息。其他数据必须通过使用多类型的值来存储。就像一个值可以同时是一个节点和一个数字,这样它存储的数字可以作为支付额来使用。除了拓扑信息,节点也可以存储一些元信息:如节点名称,类型(字符串),命名空间(字符串)。若一个节点象征XHTML文档中的h1元素,那么它的名字可以是”h1”,类型可以是”element”,命名空间可以是”http://www.w3.org/1999/xhtml”。但对于数据模型设计者来说,如果这些元信息还有如何来使用有什么意义呢。检索拓扑信息和元信息的方法将会在后续章节中来说明(这里你可以先不用理解)。
二、FreeMarker 模版开发指南 第二章 数值和类型的更多相关文章
- 一、FreeMarker 模版开发指南 第一章 入门
所有资料来自 南磊 翻译的官方文档,我弄简单了,适合自己以后拿出来翻看. 章节内容如下: 简介 模板+数据模型=输出 数据模型一览 模板一览 一.模板 + 数据模型 = 输出 输出结果: &l ...
- Knockout应用开发指南 第二章:监控属性(Observables)
原文:Knockout应用开发指南 第二章:监控属性(Observables) 关于Knockout的3个重要概念(Observables,DependentObservables,Observabl ...
- 三、FreeMarker 模版开发指南 第三章 模版
章节内容如下: 总体结构 指令 表达式 插值 一.总体结构 实际上你用程序语言编写的程序就是模板,模板也被称为FTL(代表FreeMarker模板语言).这是为编写模板设计的非常简单的编程语言. ...
- FreeMarker笔记 第二章 数值和类型
2.1 基本内容 2.1.1 简介 2.1.2 什么是数值 和程序语言中的数值类型是相似的. 2.1.3 什么是类型? 2.1.4 数据模型是哈希表 2.2 类型 2.2.1 简介 2.2.2 标量 ...
- PJSIP开发指南-第二章
一.模块 2.1 模块框架 模块框架的主要作用是在应用程序组件之间分发SIP消息,PJSIP的所有的组件,包括dialog和transaction都是以模块方式实现的,没有模块,核心协议栈将不知 ...
- Android艺术开发探索——第二章:IPC机制(下)
Android艺术开发探索--第二章:IPC机制(下) 我们继续来讲IPC机制,在本篇中你将会学习到 ContentProvider Socket Binder连接池 一.使用ContentProvi ...
- Knockout应用开发指南 第九章:高级应用举例
原文:Knockout应用开发指南 第九章:高级应用举例 1 Contacts editor 这个例子和微软为演示jQuery Data Linking Proposal例子提供的例子一样的提供的 ...
- [翻译]现代java开发指南 第二部分
现代java开发指南 第二部分 第二部分:部署.监控 & 管理,性能分析和基准测试 第一部分,第二部分 =================== 欢迎来到现代 Java 开发指南第二部分.在第一 ...
- 编写高质量代码:改善Java程序的151个建议(第二章:基本类型)
编写高质量代码:改善Java程序的151个建议(第二章:基本类型) 目录 建议21:用偶判断,不用奇判断 建议22:用整数类型处理货币 建议23:不要让类型默默转换 建议24:边界还是边界 建议25: ...
随机推荐
- FTPClient 工具类
package com.photoann.core.util; import java.io.BufferedInputStream; import java.io.File; import java ...
- C#中种常用的计时器
1.System.Timers.Timer和System.Windows.Forms.Timer,它的最低识别为1/18s. 2.timeGetTime,他的最低识别能达到5ms. 3.System. ...
- poj 2996 Help Me with the Game(模拟)
题目:http://poj.org/problem?id=2996 题意:给出 棋盘 情况 输出 白棋 和 黑棋在 棋盘上的 白棋为大写字母 黑棋为小写字母 棋盘 左下点为原点(1,a) 输出 是 按 ...
- 如何把Excel另存为XML格式文件(快速转换)
这时,我们尝试另存为另一种文件类型: XML电子表格2003(*.xml)
- poj3186 poj3267
两道很不错的dp 3186很神似回文词,合并石子之类的问题: 一开始不知道怎么在dp方程中体现权值天数,很来才想起来 对于一段区间[i,j],里面的东西必然是要卖完的 又因为只能从两头开始卖,所以 d ...
- android.util.AndroidRuntimeException: requestFeature() must be called before adding content 错误解决方法
Activity全屏,网上的代码如下:protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstance ...
- jQuery.autoComplete 多参数
query 版本 1.3.2插件默认的 参数 是q 如果需要传递多个参数呢?$("#stylistname").autocomplete("/page/autostyli ...
- codeforces 672C - Recycling Bottles 贪心水题
感觉很简单,就是讨论一下 #include <stdio.h> #include <string.h> #include <algorithm> #include ...
- 十款PHP开发框架对比
PHP开发框架近来在PHP社区中成为讨论的热点,几乎每天都在推出新的框架.面对市面上超过四十种的开发框架,你很难判断究竟哪一款最适合你,尤其是在这些框架所提供的功能不尽相同的时候. 本文将引导你 ...
- 关于photoshop钢笔工具中各点对应到“贝塞尔曲线”中的含义(cocos2d-x与iOS)
1.程序中贝塞尔曲线的简单介绍,只介绍曲线部分.程序中的贝塞尔曲线需要四个点:起始点(startPoint) ,控制点1(controlPoint1),控制点2(controlPoint2),结束点( ...