【FreeMarker】【程序开发】数据模型,对象包装
在简单的示例中,可以使用 java.lang 和 java.util 包下的类,还有用户自定义的 Java Bean来构建数据对象。
- 使用 java.lang.String 来构建字符串
- 使用java.lang.Number 来派生数字类型
- 使用 java.lang.Boolean 来构建布尔值
- 使用 java.util.List 或 Java 数组构建序列
- 使用 java.util.Map 来构建哈希表
- 使用自定义的 bean 类来构建哈希表,bean中的项和bean的属性对应
数据模型
在内部,模板中可用的变量都是实现了 freemarker.template.TemplateModel 接口的 java 对象。
但在自己的数据模型中,可以使用基本的Java集合类作为变量,因为这些变量会在内部被替换为适当的 TemplateModel 类型;这种功能特性被称为 object wrapping 对象包装。
对象包装功能可以透明地把任何类型的对象转换为实现了 TemplateModel 接口类型的实例。
这就是的下面的转换成为可能,如在模板中 java.sql.ResultSet 转换为序列变量,把 javax.servlet.ServletRequest 对象转换成包含请求属性的哈希表变量,甚至可以遍历 XML 文档作为 FTL变量。
包装这些对象,需要使用合适的,也就是所谓的对象包装器是钱(也可能是自定义的实现)。
标量
4中类型的变量:
- 布尔值 —— 实现TemplateBooleanModel接口
- 数字 —— 实现TemplateNumberModel接口
- 字符串 —— 实现TemplateScalarModel接口
- 日期 —— 实现TemplateDateModel接口
容器
哈希表
FreeMarker中的哈希表是实现了 TemplateHashModel 接口的对象。TemplateHashModelEx接口扩展了TemplateHashModel接口;经常使用的实现类是SimpleHash,该类实现了TemplateHashModelEx接口。
序列
序列是实现了TemplateSequenceModel接口的Java对象。经常使用的实现类是SimpleSequence。
集合
集合是实现了TemplateCollectionModel接口的Java对象。通常使用的实现类是SimpleCollection。
方法
方法变量实现了 TemplateMethodModel 接口。这个接口仅包含一个方法:TemplateModel exec(java.util.List arguments),当使用方法调用表达式去调用方法时,exec方法将会被调用。形参将会包含FTL方法调用形参的值,exec方法的返回值给出了FTL方法调用表达式的返回值。
TemplateMethodModelEx接口扩展了TemplateMethodModel接口。
例如:
- public class IndexOfMethod implements TemplateMethodModel {
- public TemplateModel exec(List args) throws TemplateModelException {
- if (args.size() != 2) {
- throw new TemplateModelException("Wrong arguments");
- }
- return new SimpleNumber(
- ((String) args.get(1)).indexOf((String) args.get(0)));
- }
- }
将一个方法实例放入根数据模型中,
- root.put("indexOf", new IndexOfMethod());
在模板中调用:
- <#assign x = "something">
- ${indexOf("met", x)}
- ${indexOf("foo", x)}
输出为:
- 2
- -1
指令@
指令变量实现了TemplateDirectiveModel接口。
节点变量
节点变量体现了树形结构中的节点。节点变量的引入是为了帮助用户在数据模型中处理XML文档,也可以用户构建树状模型。
节点变量实现TemplateNodeModel接口。
对象包装
当往容器中添加一些对象时,可以是任意java对象类型的参数,而不一定是TemplateModel。这是因为模板实现会默默地用合适的TemplateModel对象来替换原有对象。比如向容器中加入一个String,也许它将被替换为一个SimpleScalar实例来存储相同的文本。
至于什么类型的Java对象可以被替换,又使用什么样的TemplateModel来实现,它可以被实现的容器自身来控制,也可以委派给ObjectWrapper的一个实例。
ObjectWrapper是一个接口,其中只定义了一个方法:TemplateModel wrap(java.lang.Object obj)。可以传递一个object类型的对象,它会返回对应的TemplateModel对象,如果不行则抛出TemplateModelException一场。替换原则是在ObjectWrapper的实现类中编码实现的。
最重要的ObjectWrapper实现类是FreeMarker核心包提供的:
- public interface ObjectWrapper {
- ObjectWrapper BEANS_WRAPPER = BeansWrapper.getDefaultInstance();
- ObjectWrapper DEFAULT_WRAPPER = DefaultObjectWrapper.instance;
- ObjectWrapper SIMPLE_WRAPPER = SimpleObjectWrapper.instance;
我们使用java.util.HashMap作为根的哈希表,而不是SimpleHash或其他特定的FreeMarker类,因为Template.process(...)自动包装了给定的数据模型参数的对象,所以它才会起作用。它使用受Configuration设置的对象包装器。因此,编写简单的FreeMarker应用程序就不需要知道TemplateModel。注意根的类型不需要一定是java.util.Map,它也可以是实现了TemplateHashModel接口的被包装的对象。
【FreeMarker】【程序开发】数据模型,对象包装的更多相关文章
- Freemarker 程序开发
Freemarker 程序开发 现在web开发中,多使用freemarker 来描述页面.通常会使用的macro来定义各种组件,从而达到UI组件的复用.结合使用其它的指定,可快速的描述一个html页面 ...
- freemarker程序开发
1.程序开发入门 1.1 创建配置实例 首先,你应该创建一个freemarker.template.Configuration的实例,然后调整它的设置.Configuration实例是存储FreeMa ...
- 小程序开发 event对象中 target和currentTarget 属性的区别。
首先本质区别是: event.target返回触发事件的元素 event.currentTarget返回绑定事件的元素 p包含在div内 在outer上点击时,target跟currentTarget ...
- freeMarker(七)——程序开发指南之数据模型
学习笔记,选自freeMarker中文文档,译自 Email: ddekany at users.sourceforge.net 1.基本内容 在入门章节中, 我们已经知道如何使用基本的Java类(M ...
- freeMarker(九)——程序开发指南补充知识
学习笔记,选自freeMarker中文文档,译自 Email: ddekany at users.sourceforge.net 1.变量.范围 本章介绍当模板在访问变量时发生了什么事情,还有变量是如 ...
- FreeMarker开发-数据模型
FreeMarker用于处理模板的数据模型是哈希表,也就是一个树状结构的name-value对.如下: (root)|+- string="string"| +- map| || ...
- FreeMarker模板开发指南知识点梳理
freemarker是什么? 有什么用? 怎么用? (问得好,这些都是我想知道的问题) freemarker是什么? FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生 ...
- 二、FreeMarker 模版开发指南 第二章 数值和类型
章节内容如下: 基本内容 类型 一.基本内容 简介 什么是数值? 什么是类型? 数据模型是哈希表 a.简介 理解数值和类型的概念是理解数据模型的关键所在.然而,数值和类型的概念并不局限于数据模型, ...
- ASP.NET4.5Web API及非同步程序开发系列3
ASP.NET4.5Web API及非同步程序开发系列(3) 接着上一篇博客的内容做一个补充,正好是一个大哥提出来的,我们看看一个有趣的现象. 请求相关问题的补充: 我们先在Controller中的定 ...
随机推荐
- github的上面的安全工具
简介 Scanners Box也被称为 scanbox,是一个强大完备的黑客工具箱,它收集了Github上数10种类别的开源扫描器,包括子域名,数据库,中间件和其他模块化设计的扫描器等,但对于一些被大 ...
- 学习scrapy爬虫框架的一些经验和教训
首先python的scrapy框架很好,功能强大,使用起来也很方便,省去了很多造轮子的时间.在学习的过程中也碰到了一些问题,在这里希望能分享与大家分享,做一个参考 1.安装(pip延时响应问题) sc ...
- springboot集成axis1.4
1.首先通过axis工具根据wsdl文件生成java代码和wsdd文件 set Axis_Lib=/Users/apple/configuration/axis-1_4/lib //lib文件目录se ...
- 【转】Kerberos简介
Kerberos协议: Kerberos协议主要用于计算机网络的身份鉴别(Authentication), 其特点是用户只需输入一次身份验证信息就可以凭借此验证获得的票据(ticket-grantin ...
- wr720n v4 折腾笔记(三):网络配置与扩充USB
0x01 前言 网络配置比较简单,但是USB拓展就麻烦许多了,这里由于overlay的内存分配问题导致软件安装失败,这里找到了一种方法就是直接从uboot刷入南浦月大神的wr720n的openwrt固 ...
- 一文综述python读写csv xml json文件各种骚操作
Python优越的灵活性和易用性使其成为最受欢迎的编程语言之一,尤其是对数据科学家而言.这在很大程度上是因为使用Python处理大型数据集是很简单的一件事情. 如今,每家科技公司都在制定数据战略. ...
- elasticsearch在linux上的安装,Centos7.X elasticsearch 7.6.2
本文环境:Elasticsearch7.6.2目前最先版本 centos7.X JDK1.8 elasticsearch介绍 官网:https://www.elastic.co/cn/pr ...
- GitHub 热点速览 Vol.14:周获 2k+ Vim 掀起三维编程风
作者:HelloGitHub-小鱼干 摘要(用于 公众号/博客园等地方)寓教于乐,应该是上周 Trending 的主题了,无论是被多人转发推荐的三维 Vim 项目 Vim³ 或者是流体运动的 WebG ...
- Redis对象——列表(List)
列表(list)类型是用来存储多个有序的字符串,列表中的每个字符串称为元素(element),一个列表最多可以存储232-1个元素.在Redis中,可以对列表两端插入(push)和弹出(pop),还可 ...
- 字符串学习笔记(一)---- String介绍
一.String类的特点 1.字符串对象一旦被初始化就不会被改变: (1)常见问题 a public static void main(String[] args) { String a = &quo ...