zoukankan      html  css  js  c++  java
  • 二、FreeMarker 模版开发指南 第二章 数值和类型

    章节内容如下:
     
      基本内容
      类型

    一、基本内容

      简介
      什么是数值?
      什么是类型?
      数据模型是哈希表

    a、简介

    理解数值和类型的概念是理解数据模型的关键所在。然而,数值和类型的概念并不局限于数据模型,下面你就会看到。

    什么是数值

    什么是类型

    数据模型是哈希表

    b、类型

    简介
      标量
      容器
      子程序
        方法和函数
        用户自定义指令
        函数/方法和用户自定义指令的比较
      其它
        节点

    简介

    支持的类型有:

    • 标量:
      •   字符串
      •   数字
      •   布尔值
      •   日期
    • 容器:
      •   哈希表
      •   序列
      •   集
    • 子程序:
      •   方法和函数
      •   用户自定义指令
    • 其它/很少使用:
      •   节点

    标量

    ......

    容器

      这些值存在的目的是为了包含其他变量,它们仅仅作为容器。被包含的变量通常是子变量。容器的类型有:

    • 哈希表:每个子变量都可以通过一个唯一的名称来查找,这个名称是不受限制的字符串。哈希表并不确定其中子变量的顺序,也就是说没有第一个变量,第二个变量这样的说法,变量仅仅是通过名称来访问的。
    • 序列:每个子变量通过一个整数来标识。第一个子变量的标识符是0,第二个是1,第三个是2,这样来类推,而且子变量是有顺序的。这些数字通常被称为是子变量的索引。序列通常比较密集,也就是所有索引,包括最后一个子变量的都和子变量是相关联的,但不是绝对必要的。子变量的数值类型也并不需要一致。
    • 集:  从模板设计者角度来看,集是有限制的序列。不能获取集的大小,也不能通过索引取出集中的子变量,但是它们仍然可以通过list 指令来遍历。

      要注意一个数值也可有多种类型,对于一个数值可能存在哈希表和序列这两种类型,这时,该变量就支持索引和名称两种访问方式。不过容器基本是当作哈希表或者序列来使用的,而不是两者同时使用。
      尽管存储在哈希表,序列(集)中的变量可以是任意类型的,这些变量也可以是哈希表,序列(集)。这样就可以构建任意深度的数据结构。
      数据模型本身(最好说为它的根)也是哈希表。

     子程序

       方法和函数

       方法是来自于数据模型(它们反射了Java 对象的方法),而函数是定义在模板内的(使用了函数指令-这也是高级主题),但二者可以用同一种方式来使用。

       

    1 The average of 3 and 5 is: ${avg(3, 5)} 
    2 The average of 6 and 10 and 20 is: ${avg(6, 10, 20)} 
    3 The average of the price of a python and an elephant is: 
    4 ${avg(animals.python.price, animals.elephant.price)}
    1 The average of 3 and 5 is: 4 
    2 The average of 6 and 10 and 20 is: 12 
    3 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”。但对于数据模型设计者来说,如果这些元信息还有如何来使用有什么意义呢。检索拓扑信息和元信息的方法将会在后续章节中来说明(这里你可以先不用理解)。

  • 相关阅读:
    eclipse fail to create java virtual machine
    sas软件连接Oracle数据库的办法
    JAVA中数据的读取与写入,不同类型数据的转换
    二维数组的在函数中的传递
    【转】值传递与引用传递
    【转】深拷贝与浅拷贝
    (转)JS报表控件highcharts应用
    highstocks.js使用指南
    (转)Highcharts使用指南(出处:http://liuhaorain.cnblogs.com )
    jQuery实现checkbox全选,反选
  • 原文地址:https://www.cnblogs.com/xunol/p/3259239.html
Copyright © 2011-2022 走看看