freemarker数据类型,自定义指令

freemarker的数据模型最外层其实是相似的哈希表的数据结构(与json格式的map类型很类似),有一个根节点,只有经过根节点才能访问到数据模型中存在的各个变量。java

1.freemarker支持的数据类型有:标量(字符串、数字、布尔型、日期),容器(哈希表、序列、集),子程序(方法函数、自定义指令),节点(xml文档)json

序列与集的区别:集是有限的序列(数量已经固定),但集的大小获取不到,可是仍能经过list指令遍历集,相似java中的数组与list数组

2.检索变量,freemarker 全部的数据都都须要顶层变量来获取数据,从哈希表中获取数据,如上图获取user值,直接使用user便可可是获取name值就是用cargo.name或是cargo[name]来获取数据;从序列中检索数据如上图,ltteryNumbers[0]=20,使用下标获取。两个序列经过“+”运算符链接生成一个总序列,内容是二者之和,不会去重;两个哈希表也能够经过“+”进行链接,对于重复key值的,以运算符右侧的哈希表为主。数据结构

3.字符串操做:任何数据类型变量经过“+”与字符串变量链接,都会生成一个新的字符串;能够当作字符的序列,经过下标能够获取指定位置的字符函数

4.内建函数:freemarker自带的一些函数,如cap_first使字符串首字母大写,lower_case使字符串全部字母小写,upper_case使字符串全部字母大写等等;使用内建函数的格式:变量名?函数名spa

5.在ftl中自定义指令:使用macro指令来实现,macro指令不输出任何内容,是用来建立宏变量,定义宏定义体。例:code

  

自定义指令使用"@"代替"#",自定义指令的能够添加参数,即给标签添加属性上述截图中指令添加参数:xml

<#macro hello name>
    <font color='green'>这是自定义指令输出的内容,你好${name}</font>
</#macro>

<#--调用自定义指令-->
<@hello name='admin'/>

结果:生命周期

注意:自定义指令参数是在调用的时候其定义的参数在没有指定默认值的状况,全部参数都要给定一个值;同时不能再自定义指令中传入未定义的参数值,上述两种状况都会报错。可是针对第一种状况能够指定参数的默认值,这种状况下能够省略该参数,可是指定参数值时会覆盖默认值。文档

例如:

<#macro hello name color='red'>
    <font color=${color}>这是自定义指令输出的内容,你好${name}</font>
</#macro>

<#--调用自定义指令-->
<@hello name='admin'/><br/>
<#--都指定-->
<@hello name='admin' color='blue'/>

显示:


6.nested指令:自定义指令的标签能够嵌套任何内容,可是须要经过<#nested>通知freemarker引擎该指令能够支持显示嵌套的内容,若没有该指令则会这样:    

使用nested指令以后:

7.在模板中定义变量,模板中定义变量类型:简单变量、局部变量、循环变量

   简单变量:在模版中的任意位置都能访问到,包括经过include指令引入的模版,使用assign和macro指令来建立的变量。

   局部变量:只能在宏定义体内声明,且只能在宏定义体内使用,一个局部变量的生命周期就是一个宏调用(即:自定义指 令 执行的过程)的过程;使用local指令在宏定义体内建立。

  循环变量:该类型的变量是有list指令自动建立并使用的,只在list指令的开始结束和结束标记之间有效。

  三种变量之间的关系:简单变量会覆盖数据模型中的同名变量,局部变量会在本身适用范围内掩盖同名的简单变量,循环变量会在本身的有效范围内掩盖同名的局部变量和简单变量,内循环变量会掩盖外循环同名变量。

若想访问到数据模型中被隐藏的变量可以使用特殊变量globals进行访问,格式为:${.globals.变量名}

8.命名空间:经过macro和assign指令建立的变量、指令、函数的集合,用来封装这些变量、指令、函数的集合称为命名空间也称为库。

import指令与include指令的区别:include是在原有的命名空间中建立引用模版中定义声明的变量,import指令则是为引入的模版建立一个新的命名空间来建立这两个变量。

include和import指令引用模版文件的路径问题,实现模版之间的相互引用,在设置Configuration的DirectoryForTemplateLoading属性的时候,必须设置为两模版文件共同目录位置,而后在引用时使用相对DirectoryForTemplateLoading属性值的相对路径。举例说明:

模版的位置:

在代码中指定Configuration的DirectoryForTemplateLoading属性值,以及获取要展现的模版

在要展现的模版中引入其余模版文件并指明命名空间名称

命名空间之间是相互独立的,若是命名空间N1中import命名空间N2,只能表明在N1中经过相似map访问形式访问名称空间N2中的数据,而不表明着N2中的数据在名称空间N1中

相关文章
相关标签/搜索