26、顶层变量
27、从哈希表中检索数据
同含义:book.author.name;book["author"].name;book.author.["name"];book["author"]["name"]。
28、从序列中检索数据
只能用方括号语法形式,方括号内的表达式必须是一个数字而不是字符串。animals[0].name。
29、特殊变量
按照如下语法形式来进行:.variable_name。
30、插值
①、${“Hello ${user}!”
②、${“Hello “+user+”!”}
31、获取一个字符
内建函数string 。例如:user?string[0]。
32、序列操作,连接
- ${user}
</#list>
33、序列的切分
34、算数计算
+号的一端是字符串,另外一端是数字,那么数字就会自动转换为字符串类型。
只想获取计算结果的整数部分,这可以使用内建函数int来解决。${(5/2)?int}输出:2。
35、比较
表达式放括号内:<#if (x > y)>,或在比较处使用><:<#if x > y>。可用lt代<,lte代<=,gt代>,gte代>=,FTL也支持\lt, \lte,\gt和\gte,和不带反斜杠的一样。
36、内建函数
内建函数以?形式提供变量的不同形式或者其他信息。例如:user?upper_case
①、字符串使用的内建函数:
html: 字符串中所有的特殊HTML字符都需要用实体引用来代替(比如<代替<)
cap_first:字符串的第一个字母变为大写形式
lower_case:字符串的小写形式
upper_case:字符串的大写形式
trim:去掉字符串首尾的空格
②、序列使用的内建函数:
size:序列中元素的个数
③、数字使用的内建函数:
int:数字的整数部分(比如-1.9?int就是-1)
37、方法的调用
38、默认值:
<#assign mouse="Jerry">
${mouse!"No mouse."}
输出为:No mouse.
Jerry
39、检测不存在的值
40、操作符的优先级
41、插值仅仅在2种位置使用:文本区(如<h1>Hello ${name}!</h1>)和字符串表达式(如<#include "/footer/${company}.html">)
42、自定义指令
可以使用macro指令来定义,也可用扩展:freemarker.template..TemplateDirectiveModel类来扩展。
一般使用<@...>称为宏调用。
43、内容嵌套
44、模板中定义变量
②、局部变量:它们只能被设置在宏定义体内,而且只在宏内可见。一个局部变量的生存周期只是
③、循环变量:循环变量是由指令(如list)自动创建的,而且它们只在指令的开始和结束标记内有效。宏的参数是局部变量而不是循环变量。
45、命名空间的生命周期
46、加在下面这些指令之间的空白会被忽略:macro,function,assign,global,local,ftl,import,但也是仅仅指令之间只有一个空白或FTL注释。
47、替换语法
②、调用用户自定义指令:[@myMacro /]
③、注释:[#-- the comment --]
48、创建配置实例
49、创建数据模型
可以使用java.lang和java.util下的类,用户自定义的Java Beans来构建数据对象。
n 使用java.lang.String来构建字符串。
n 使用java.lang.Number来派生数字。
n 使用java.lang.Boolean来构建布尔值。
n 使用java.util.List或Java数组来构建序列。
n 使用java.util.Map来构建哈希表。
n 使用你自己定义的bean类来构建哈希表,bean中的项和bean的属性对应。
50、标准的输出
51、数据模型
想从模板访问的任何对象,早晚都要转换为实现了TemplateModel接口的对象。
有一个freemarker.template.TemplateModel粗略的子接口对应每种基本变量类型:
TemplateHashModel对哈希表,TemplateSequenceModel对序列,TemplateNumberModel对数字
52、4种标量
字符串标量的接口是TemplateScalarModel不是TemplateStringModel。
TemplateDateModel接口有两个方法:是java.util.Date getAsDate()和int getDateType()。这个接口典型的实现是存储一个java.util.Date对象,加上一个整数来辨别“数据库存储的类型”。这个整数的值必须是TemplateDateModel接口中的常量:DATE,TIME,DATETIME和UNKNOWN。
对要格式化参数使用了内建函数string,比如foo?string("MM/dd/yyyy")
53、哈希表
②、get方法当在给定的名称没有找到子变量时返回null。
54、序列
55、集合
实现TemplateCollectionModel。一法:TemplateModelIterator iterator()。和java.util.Iterator相似,返回TemplateModels,抛出TemplateModelExceptions。
56、方法
实现TemplateMethodModel的模板内。一法:TemplateModel exec(java.util.List arguments)。
57、指令
Java程序员可以使用TemplateDirectiveModel接口在Java代码中实现自定义指令。
58、提示
59、节点变量
节点变量有下列属性,这些都由TemplateNodeModel接口的方法提供。
基本属性:
TemplateSequenceModel getChildNodes():一个节点有子节点序列。
TemplateNodeModel getParentNode():一个节点只有一个父节点。
可选属性。如果一个属性在具体的使用中没有意义,那对应的方法应该返回null:
String getNodeName():节点名称也是宏的名称,当使用recurse和visit指令时,它用来控制节点。
String getNodeType():在XML中:"element","text","comment"等。如果这些信息可用,就是通过recurse和visit指令来查找节点的默认处理宏。而且,它对其他有具体用途的应用程序也是有用的。
String getNamespaceURI():这个节点所属的命名空间。例如,在XML中,这就是元素和属性所属的XML命名空间的URI。信息这个如果可用,就是通过recurse和visit指令来查找存储控制宏的FTL命名空间。
在FTL这里,节点属性的直接使用可以通过内建函数node完成,还有visit和recurse宏。
60、配置
61、共享变量
用setSharedVariable方法向配置实例中添加共享变量。
62、配置信息
63、内建模板加载器
在Configuration中可以使用下面方便的方法来建立三种模板加载方法。
64、bean的包装
65、哈希表键
66、特殊哈希表键的含义:
"elementName","prefix:elementName":返回元素名为elementName的子节点的序列。
"*":返回所有子元素(直接后继)节点的序列。
"**":返回所有后继节点的序列。这个序列按文档顺序包含元素。
"@attName","@prefix:attrName":作为一个大小为1,包含属性节点的序列的形式,返回元素的属性名attName,如果属性不存在时,作为一个空序列返回(所以来检查属性是否存在,可以使用foo.@attName[0]??,而不是foo.@attName??)。
"@@"或"@*":返回属于父节点的节点的属性序列,这和XPath中的@*是相同。
"@@qname":返回元素的完全限定名(如e:book,和由?node_name返回本地名book形成对比)。
"@@markup":这会以字符串形式返回一个节点的完整XML标记。
"@@nested_markup":这个和"@@markup"相似,但是它返回不包括开放和封闭标记元素的XML标记。对于文档节点,它返回和"@@markup"相同的内容。
"@@text":它返回文本节(所有后继文本节点,而不是直接子节点)点的值,连接成一个单独的字符串。如果节点没有子文本节点,那么返回的是空字符串。
"@@start_tag":返回元素节点开始标记的标记。
"@@end_tag":返回元素节点结束标记的标记
@@attributes_markup:返回元素节点属性的标记,
67、substring 取子串
68、cap_first 首字母大写
69、uncap_first 首字母小写
70、capitalize 首字母大写