分类: Java.FreeMarker2014-10-25 18:49 413人阅读 评论(0) 收藏 举报
 

目录(?)[+]

 

在简单的示例中,可以使用 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接口。

例如:

  1. public class IndexOfMethod implements TemplateMethodModel {
  2. public TemplateModel exec(List args) throws TemplateModelException {
  3. if (args.size() != 2) {
  4. throw new TemplateModelException("Wrong arguments");
  5. }
  6. return new SimpleNumber(
  7. ((String) args.get(1)).indexOf((String) args.get(0)));
  8. }
  9. }

将一个方法实例放入根数据模型中,

  1. root.put("indexOf", new IndexOfMethod());

在模板中调用:

  1. <#assign x = "something">
  2. ${indexOf("met", x)}
  3. ${indexOf("foo", x)}

输出为:

  1. 2
  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核心包提供的:

  1. public interface ObjectWrapper {
  2. ObjectWrapper BEANS_WRAPPER = BeansWrapper.getDefaultInstance();
  3. ObjectWrapper DEFAULT_WRAPPER = DefaultObjectWrapper.instance;
  4. ObjectWrapper SIMPLE_WRAPPER = SimpleObjectWrapper.instance;

我们使用java.util.HashMap作为根的哈希表,而不是SimpleHash或其他特定的FreeMarker类,因为Template.process(...)自动包装了给定的数据模型参数的对象,所以它才会起作用。它使用受Configuration设置的对象包装器。因此,编写简单的FreeMarker应用程序就不需要知道TemplateModel。注意根的类型不需要一定是java.util.Map,它也可以是实现了TemplateHashModel接口的被包装的对象。

【FreeMarker】【程序开发】数据模型,对象包装的更多相关文章

  1. Freemarker 程序开发

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

  2. freemarker程序开发

    1.程序开发入门 1.1 创建配置实例 首先,你应该创建一个freemarker.template.Configuration的实例,然后调整它的设置.Configuration实例是存储FreeMa ...

  3. 小程序开发 event对象中 target和currentTarget 属性的区别。

    首先本质区别是: event.target返回触发事件的元素 event.currentTarget返回绑定事件的元素 p包含在div内 在outer上点击时,target跟currentTarget ...

  4. freeMarker(七)——程序开发指南之数据模型

    学习笔记,选自freeMarker中文文档,译自 Email: ddekany at users.sourceforge.net 1.基本内容 在入门章节中, 我们已经知道如何使用基本的Java类(M ...

  5. freeMarker(九)——程序开发指南补充知识

    学习笔记,选自freeMarker中文文档,译自 Email: ddekany at users.sourceforge.net 1.变量.范围 本章介绍当模板在访问变量时发生了什么事情,还有变量是如 ...

  6. FreeMarker开发-数据模型

    FreeMarker用于处理模板的数据模型是哈希表,也就是一个树状结构的name-value对.如下: (root)|+- string="string"| +- map| || ...

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

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

  8. 二、FreeMarker 模版开发指南 第二章 数值和类型

    章节内容如下:   基本内容 类型 一.基本内容 简介 什么是数值? 什么是类型? 数据模型是哈希表 a.简介 理解数值和类型的概念是理解数据模型的关键所在.然而,数值和类型的概念并不局限于数据模型, ...

  9. ASP.NET4.5Web API及非同步程序开发系列3

    ASP.NET4.5Web API及非同步程序开发系列(3) 接着上一篇博客的内容做一个补充,正好是一个大哥提出来的,我们看看一个有趣的现象. 请求相关问题的补充: 我们先在Controller中的定 ...

随机推荐

  1. List集合概述和特点

    List集合概述 有序集合(也称序列)用户可以精确控制列表的每一个元素的位置插入,用户可以通过整数索引访问元素,并搜索列表中的元素 与set集合不同,列表通常允许重复的元素 List集合的特点 有序: ...

  2. Centos7配置IP地址和DNS

    目录 一.查看IP地址 1.ifconfig命令 2.ip addr命令 二.配置网卡 1.动态IP地址 2.静态IP地址 3.重启网卡 三.注意事项 四.本地虚拟机设置静态IP后不能上网的解决方法 ...

  3. hdu4587 Two Nodes 求图中删除两个结点剩余的连通分量的数量

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4587 题目给了12000ms,对于tarjan这种O(|V|+|E|)复杂度的算法来说,暴力是能狗住的 ...

  4. alsa-lib及alsa-utils成功移植(转载)

    准备工作 alsa-lib版本:alsa-lib-1.0.23.tar.bz2 alsa-util版本:alsa-utils-1.0.23.tar.bz2 其他版本的alsa-lib和alsa-uti ...

  5. 详解firewalld 和iptables

    在RHEL7里有几种防火墙共存:firewalld.iptables.ebtables,默认是使用firewalld来管理netfilter子系统,不过底层调用的命令仍然是iptables等. fir ...

  6. Java基础语法(7)-数组

    title: Java基础语法(7)-数组 blog: CSDN data: Java学习路线及视频 1.数组的概述 数组(Array),是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并 ...

  7. Java网络编程——Socket

    网络是连接不同计算机的媒介,不同的计算机依靠网络来互相通信,即传递数据. Java中与网络编程相关的部分主要是Socket(套接字),它作为一种抽象的结构,实现了与通信相关的各类方法,构成一套完整的通 ...

  8. Python如何用virtualenv搭建虚拟环境

    虚拟环境的搭建 优点 1.使不同应用开发环境相互独立 2.环境升级不影响其他应用,也不会影响全局的python环境 3.防止出现包管理混乱及包版本冲突 windows 安装 # 建议使用pip3安装到 ...

  9. SpringBoot 集成ehcache

    1, 项目实在springboot 集成mybatis 的基础上的: https://www.cnblogs.com/pickKnow/p/11189729.html 2,pom 如下,有的不需要加, ...

  10. Spring中应用的那些设计模式

    设计模式作为工作学习中的枕边书,却时常处于勤说不用的尴尬境地,也不是我们时常忘记,只是一直没有记忆. 今天,我们就设计模式的内在价值做一番探讨,并以spring为例进行讲解,只有领略了其设计的思想理念 ...