杂杂杂杂freemarker
FreeMarker
1、 模板 + 数据模型 = 输出
2、 MVC模式:Model-View-Controller的缩写,中文翻译为"模型-视图-控制器"。
3、 哈希表通过可查找的名称来访问存储的其他空间
4、 用数组的方括号方式来访问一个序列的子变量:animals[0].name;whatnot.fruits[1],索引通常从零开始。
5、 标量存储单一的值,这种类型的值可以是字符串,数字,日期/时间或者是布尔值。
6、 ${…}:FreeMarker将会输出真实的值来替换花括号内的表达式。
FTL tags标签(FreeMarker 模板的语言标签):这些标签的使用一般以符号#开头。(用户自定义的FTL标签使用@符号来代替#)。
Comments注释:FreeMarker的注释和HTML的注释相似,但是它用<#--和-->来分隔。
directives指令就是所指的FTL标签。这指令在HTML的标签(如<table>和</table>)元素(如table元素)中的关系是相同的
7、 使用if指令可以有条件地跳过模板的一部分,
我们尊敬的领导是if条件中那唯一的user变量值,当它和“Big Joe”相同时才显示出来。当condition的判断结果为false(布尔值)时,在<#if condition>和</#if>标签之间的内容将会被略过。
8、 使用<#else>标签可以指定当条件为假时程序可以执行的内容。
9、 list指令的一般格式为:<#list sequence as loopVariable>repeatThis</#list>
sequence:序列;repeatThis:在给定的sequence遍历时的每项中重复,从第一项开始,一个接着一个。
10、include指令:插入其他文件的内容到当前的模板中。
Include里面包含的是一个网址,显示的是网址里面的全部内容!
11、处理不存在变量
通过放置??在变量名后面来询问FreeMarker一个变量是否存在。将它和if指令合并,那么如果user变量不存在的话将会忽略整个问候代码段
12、数值
不需要存储的数值也可以称之为数值,例如:100
当模板被执行时,计算的临时结果也称为数值,比如20,120(它会打印120)
13、类型
例如:
上面表的解析:
14、支持的类型有:标量:字符串;数字;布尔值;日期
容器: 哈希表;序列;集
子程序:方法和函数;用户自定义指令
其它/很少使用:节点
15、方法和函数:
数据模型中放置了一个方法变量avg,求平均值:
16、用户自定义指令:
假设现在有一个变量,box,它的值是用户自定义的指令,用来打印一些特定的HTML信息,这个指令定义了一个标题和其中的信息。
17、如果能够实现,请用自定义指令而不用函数/方法
①、输出(返回值)的是标记(HTML,XML等)。主要原因是函数的返回结果可以自动进行XML转义(这是因为${…}的特性),而用户自定义指令的输出则不是(这是因为<@...>的特性所致,它的输出假定为是标记,因此就不再转义)。
②、副作用是重要的,而不是返回值。例如一个指令的目的是往服务器日志中添加一个条目。(事实上你不能得到自定义指令的返回值,但有些反馈的类型是有可能设置非本地变量的)
③、会进行流程的控制(就像list或if指令那样),但是不能在函数/方法上这么做。
18、节点
节点的主要作用是拓扑信息,还可以存储节点名称,类型(字符串),命名空间(字符串)。
19、模板的总体结构(FTL是区分大小写的)
①、Text文本:文本会照着原样来输出。
②、Interpolation插值:这部分的输出会被计算的值来替换。插值由${和}所分隔
③、FTL tags标签:与HTML标签很相似,但它们却是给FreeMarker的指示且不会打印在输出内容中。
④、Comments注释:注释和HTML的注释很相似,但是由<#--和-->来隔的。
注:FTL是区分大小写的,插值仅仅可以在文本中间使用(也可以在字符串表达式中)。FTL标签不可以在其他FTL标签和插值中使用。注释可以放在FTL标签和插值中间。
20、指令的调用:
如调用list指令:在语法上使用了两个标签:<#list animals as being>和</#list>。
对于用户自定义的指令使用@来代替#。例如:<@mydirective parameters>...</@mydirective>
21、备忘单
㈠、直接指定值
①字符串:"Foo" 或者 'Foo' 或者 "It's \"quoted\"" 或者 r"C:\raw\string"
②数字:123.45
③布尔值:true, false
④序列:["foo", "bar", 123.45], 1..100
⑤哈希表:{"name":"green mouse", "price":150}
㈡、检索变量
①顶层变量:user
②从哈希表中检索数据:user.name, user[“name”]
③从序列中检索:products[5]
④特殊变量:.main
㈢、字符串操作
①插值(或连接):"Hello ${user}!"(或"Free" + "Marker")
②获取一个字符:name[0]
㈣、序列操作
①连接:users + ["guest"]
②序列切分:products[10..19] 或 products[5..]
③哈希表操作
④连接:passwords + {"joe":"secret42"}
㈤、算数计算: (x * 1.5 + 10) / 2 - y % 100
㈥、比较:x == y, x != y, x < y, x > y, x >= y, x <= y, x < y, 等等
㈦、逻辑操作:!registered && (firstVisit || fromEurope)
㈧、内建函数:name?upper_case
㈨、方法调用:repeat("What", 3)
㈩、处理不存在的值
①默认值:name!"unknown" 或者(user.name)!"unknown" 或者name! 或者 (user.name)!
②检测不存在的值:name?? 或者(user.name)??
22、字符串
如果文本本身包含用于字符引用的引号(双引号”或单引号’)或反斜杠时,应该在它们的前面再加一个反斜杠,这就是转义。
23、FreeMarker所支持的所有的转义符序列
一种特殊的字符串就是原生字符串。在原生字符串中,反斜杠和${没有特殊的含义,它们被视为普通的字符。为了表明字符串是原生字符串,在开始的引号或单引号之前放置字母r。
24、序列
指定一个文字的序列,使用逗号来遍历子变量,然后把整个列表放到方括号内。
输出:
25、哈希表
在模板中指定一个哈希表,就可以遍历用逗号来分隔的“键/值”对,把列表放到花括号内。
例如:{"name":"green mouse", "price":150}。
26、顶层变量
变量名不能以数字开头。表达式中变量名可以包含字母(也可以是非拉丁文),数字,下划线(_),美元符号($),at符号(@)和哈希表(#)。
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、序列操作,连接
<#list ["Joe", "Fred"] + ["Julia", "Kate"] as user>
- ${user}
</#list>
33、序列的切分
如seq存储列"a", "b", "c", "d", "e", "f",表达式seq[1..4]是"b", "c", "d", "e"的序列
34、算数计算
+号的一端是字符串,另外一端是数字,那么数字就会自动转换为字符串类型。
例如:${3 + "5"}将会输出35
只想获取计算结果的整数部分,这可以使用内建函数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、方法的调用
${repeat("What", 3)} 输出为:WhatWhatWhat
38、默认值:
${mouse!"No mouse."}
<#assign mouse="Jerry">
${mouse!"No mouse."}
输出为:No mouse.
Jerry
39、检测不存在的值
unsafe_expr??或(unsafe_expr)??
40、操作符的优先级
41、插值仅仅在2种位置使用:文本区(如<h1>Hello ${name}!</h1>)和字符串表达式(如<#include "/footer/${company}.html">)
插值表达式的结果必须是字符串,数字或日期类型的。
42、自定义指令
可以使用macro指令来定义,也可用扩展:freemarker.template..TemplateDirectiveModel类来扩展。
一般使用<@...>称为宏调用。
43、内容嵌套
<#if ...>nested content</#if>
44、模板中定义变量
①、简单变量:它能从模板中的任何位置来访问,或者从使用include指令引入的模板访问。可以使用assign或macro指令来创建或替换这些变量。
②、局部变量:它们只能被设置在宏定义体内,而且只在宏内可见。一个局部变量的生存周期只是 宏的调用过程。可以使用local指令在宏定义体内来创建或替换局部变量。
③、循环变量:循环变量是由指令(如list)自动创建的,而且它们只在指令的开始和结束标记内有效。宏的参数是局部变量而不是循环变量。
45、命名空间的生命周期
输出为:
46、加在下面这些指令之间的空白会被忽略:macro,function,assign,global,local,ftl,import,但也是仅仅指令之间只有一个空白或FTL注释。
使用compress指令,和剥离空白相反,这个工作是直接基于生成的输出内容的。
47、替换语法
在FreeMarker指令和注释中用[和]来代替和。
例如:①、调用预定义指令:[#list animals as being]...[/#list]
②、调用用户自定义指令:[@myMacro /]
③、注释:[#-- the comment --]
48、创建配置实例
首先创建一个freemarker.template.Configuration实例,然后调整位置。
49、创建数据模型
可以使用java.lang和java.util下的类,用户自定义的Java Beans来构建数据对象。
使用java.lang.String来构建字符串。
使用java.lang.Number来派生数字。
使用java.lang.Boolean来构建布尔值。
使用java.util.List或Java数组来构建序列。
使用java.util.Map来构建哈希表。
使用你自己定义的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、哈希表
①、TemplateModel get(String key),这个方法根据给定的名称返回子变量,boolean isEmpty()这个方法表明哈希表是否含有子变量。
②、get方法当在给定的名称没有找到子变量时返回null。
54、序列
实现TemplateSequenceModel。两法:TemplateModel get(int index)和int size()。
55、集合
实现TemplateCollectionModel。一法:TemplateModelIterator iterator()。和java.util.Iterator相似,返回TemplateModels,抛出TemplateModelExceptions。
56、方法
实现TemplateMethodModel的模板内。一法:TemplateModel exec(java.util.List arguments)。
57、指令
Java程序员可以使用TemplateDirectiveModel接口在Java代码中实现自定义指令。
58、提示
TemplateDirectiveModel对象通常是有状态的。
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、配置
配置对象是freemarker.template.Configuration的实例,可以通过构造方法来创建它。一个应用程序通常只使用一个共享的Configuration实例
61、共享变量
用setSharedVariable方法向配置实例中添加共享变量。
它包含下列用户自定义指令(用户自定义指令使用时需要用@来代替#):
62、配置信息
有3层:configuration ; Template ;Environment 。分别是配置,模板,环境。
63、内建模板加载器
在Configuration中可以使用下面方便的方法来建立三种模板加载方法。
64、bean的包装
freemarker.ext.beans.BeansWrapper是一个对象包装器
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 取子串 exp?substring(from, toExclusive),
68、cap_first 首字母大写 ${" green mouse"?cap_first}
69、uncap_first 首字母小写
70、capitalize 首字母大写 字符串的所有单词都大写
71、chop_linebreak 切断换行符
72、date,time,datetime 日期,时间,时间日期
73、ends_with 以…结尾
74、html HTML格式的转义文本
<用<替换;
>用>替换;
&用&替换;
"用"替换;
xhtml XHTML格式
字符串作为XHTML格式文本输出,下面这些:
<替换为<
>替换为>
&替换为&
"替换为"
'替换为'
xml XML格式
字符串作为XML格式文本输出,下面这些:
<替换为<
>替换为>
&替换为&
"替换为"
'替换为'
75、group 分组
76、index_of 索引所在位置 "abcabc"?index_of("bc", 2)会返回4。
77、last_index_of 最后的索引所在位置 "abcabc"?last_index_of("ab", 2),将会返回0
78、length 字符串长度
79、lower_case 小写形式
80、left_pad 距左边。 如果字符串的长度达到指定数值或者比指定的长度还长,那就什么都不做了。
81、right_pad 距右边 但是它从末尾开始插入字符而不是从开头
82、contains 包含 <#if"piceous"?contains("ice")>It contains "ice"</#if>输出It contains "ice"
83、matches 匹配 决定字符串是否精确匹配上模式。返匹配的子串列表。返回值是一个多类型的值
84、number 数字格式 字符串转化为数字格式。
85、replace 替换 在源字符串中,用另一个字符穿来替换原字符串中出现它的部分。它不处理词的边界。
86、rtf 富文本 字符串作为富文本(RTF 文本),也就是说,下列字符串:
87、url URL转义 <#assign x = 'a/b c'> ${x?url} 输出:a%2Fb%20c
88、split 分割 它被用来根据另外一个字符串的出现将原字符串分割成字符串序列。
<#list "someMOOtestMOOtext"?split("MOO") as x>
- ${x}
</#list>
输出:- some
- test
- text
89、starts_with 以…开头
字符串以指定的子字符串开头,返回true。如"redhead"?starts_with("red")返回布尔值true
90、string(当被用作是字符串值时) 什也不做,仅仅返回和其内容一致的字符串。
91、trim 修整字符串 掉字符串首尾的空格。
(${" green mouse "?trim}) 输出: (green mouse)
92、upper_case 大写形式 字符串的大写形式。如"GrEeN MoUsE"将会是"GREEN MOUSE"。
93、word_list 词列表
包含字符串词的列表,并按它们在字符串中的顺序出现。词是连续的字符序列,包含任意字符,但是不包括空格<#assign words = " a bcd, . 1-2-3"?word_list>
<#list words as word>[${word}]</#list> 输出:[a][bcd,][.][1-2-3]
94、下面是标记字母的完整列表:
i:大小写不敏感:不区分同一个字母大小写之间的差异。
f:仅仅是第一。也就是说,替换/查找等,只是第一次出现的东西。
r:查找的子串是正则表达式。FreeMarker使用变化的正则表达式,只有你使用Java2平台的1.4版本以后,标记才会起作用。
m:正则表达式多行模式。在多行模式下,表达式^和$仅仅匹配前后,分别是一行结尾或者是字符串的结束。默认这些表达式仅仅匹配整个字符串的开头和结尾。
s:启用正则表达式的dotall模式(和Perl的单行模式一样)。在dotall模式下,表达式.匹配任意字符串,包括行结束符。默认这个表达式不匹配行结束符。
c:在正则表达式中许可空白和注释。
95、c 数字转字符
96、string(当用作是数值类型时)数字转字符串:将一个数字转换成字符串。
97、round,floor,ceiling 数字的舍入处理
round:返回最近的整数。如果数字以.5结尾,那么它将进位(也就是说向正无穷方向进位)
floor:返回数字的舍掉小数后的整数(也就是说向服务穷舍弃)
ceiling:返回数字小数进位后的整数(也就是说向正无穷进位)
98、sort 排序: 以升序方式存储序列并返回。
99、sort_by 以…来排序 返回由给定的哈希表子变量来升序排序的哈希表序列,
100、eval 求值 求一个作为FTL表达式的字符串的值。比如"1+2"?eval返回数字3。
101、has_content 是否有内容
102、interpret 将字符串解释为FTL模板
103、is_... 判断函数族 这些内建函数用来检查变量的类型,然后根据类型返回或
104、namespace 命名空间 这个函数返回和宏变量关联的命名空间
105、new 创建TemplateModel实现
106、支持的特殊变量有:
data_model:你可以使用来直接访问数据模型的哈希表。使用global指令定义在这里不可见的的变量。
error(从FM2.3.1版开):这个变量在recover指令体中可以访问,它存储了我们恢复错的错误信息。
globals:你可以使用来访问全局可访问的变量的哈希表:数据模型和由global指令创建的变量。language:返回当前本地设置的语言部分的值。比如.locale是en_US,那么.lang是en。
locale:返回当前本地设置的值。这是一个字符串,比如en_US。
locales:你可以访问本地化变量的哈希表(由local指令创建的变量,还有宏的参数)。
main:你可用来访问主命名空间的哈希表。注意像数据模型中的全局变量通过这个哈希表是不可见的。
namespace:你可用来访问当前命名空间的哈希表。后面的话同上。
node: 用访问者模式处理的当前节点。当你使用FreeMarker XML的Ant 任务时,它初始存储根节点。
output_encoding(FM2.3.1版始用):返回当前输出字符集的名称。
template_name:当前模板的名称(从FreeMarker 2.3.14版本开始可用)。
url_escaping_charset(从FreeMarker 2.3.1版本开始可用):如果存在,它存储了应该用于URL转义的字符集的名称。如果这个变量不存在就意味着没有人指定URL编码应该使用什么样的字符集。
vars:表达式.vars.foo返回和表达式foo相同的变量。出于某些原因你不得不使用方括号语法时这是有用的,因为它只对哈希表子变量有用,所以你需要一个人工的父哈希表。可写.vars["A strange name!"]。使用和变量varName给定的动态名称访问顶层变量可写.vars[varName]。
version:返回FreeMarker版本号的字符串形式,比如2.2.8。
107、if,else,elseif指令
switch,case,default,break指令
list,break 指令
include指令
import 指令
noparse指令
compress指令
escape,noescape指令
assign 指令
global 指令
local 指令
setting 指令
用户自定义指令(<@...>)
macro,nested,return 指令
function,return 指令
flush 指令
stop 指令
ftl 指令
t,lt,rt 指令
nt 指令
attempt,recover 指令
visit,recurse,fallback 指令
1、 模板 + 数据模型 = 输出
2、 MVC模式:Model-View-Controller的缩写,中文翻译为"模型-视图-控制器"。
3、 哈希表通过可查找的名称来访问存储的其他空间
4、 用数组的方括号方式来访问一个序列的子变量:animals[0].name;whatnot.fruits[1],索引通常从零开始。
5、 标量存储单一的值,这种类型的值可以是字符串,数字,日期/时间或者是布尔值。
6、 ${…}:FreeMarker将会输出真实的值来替换花括号内的表达式。
FTL tags标签(FreeMarker 模板的语言标签):这些标签的使用一般以符号#开头。(用户自定义的FTL标签使用@符号来代替#)。
Comments注释:FreeMarker的注释和HTML的注释相似,但是它用<#--和-->来分隔。
directives指令就是所指的FTL标签。这指令在HTML的标签(如<table>和</table>)元素(如table元素)中的关系是相同的
7、 使用if指令可以有条件地跳过模板的一部分,
我们尊敬的领导是if条件中那唯一的user变量值,当它和“Big Joe”相同时才显示出来。当condition的判断结果为false(布尔值)时,在<#if condition>和</#if>标签之间的内容将会被略过。
8、 使用<#else>标签可以指定当条件为假时程序可以执行的内容。
9、 list指令的一般格式为:<#list sequence as loopVariable>repeatThis</#list>
sequence:序列;repeatThis:在给定的sequence遍历时的每项中重复,从第一项开始,一个接着一个。
10、include指令:插入其他文件的内容到当前的模板中。
Include里面包含的是一个网址,显示的是网址里面的全部内容!
11、处理不存在变量
通过放置??在变量名后面来询问FreeMarker一个变量是否存在。将它和if指令合并,那么如果user变量不存在的话将会忽略整个问候代码段
12、数值
不需要存储的数值也可以称之为数值,例如:100
当模板被执行时,计算的临时结果也称为数值,比如20,120(它会打印120)
13、类型
例如:
上面表的解析:
14、支持的类型有:标量:字符串;数字;布尔值;日期
容器: 哈希表;序列;集
子程序:方法和函数;用户自定义指令
其它/很少使用:节点
15、方法和函数:
数据模型中放置了一个方法变量avg,求平均值:
16、用户自定义指令:
假设现在有一个变量,box,它的值是用户自定义的指令,用来打印一些特定的HTML信息,这个指令定义了一个标题和其中的信息。
17、如果能够实现,请用自定义指令而不用函数/方法
①、输出(返回值)的是标记(HTML,XML等)。主要原因是函数的返回结果可以自动进行XML转义(这是因为${…}的特性),而用户自定义指令的输出则不是(这是因为<@...>的特性所致,它的输出假定为是标记,因此就不再转义)。
②、副作用是重要的,而不是返回值。例如一个指令的目的是往服务器日志中添加一个条目。(事实上你不能得到自定义指令的返回值,但有些反馈的类型是有可能设置非本地变量的)
③、会进行流程的控制(就像list或if指令那样),但是不能在函数/方法上这么做。
18、节点
节点的主要作用是拓扑信息,还可以存储节点名称,类型(字符串),命名空间(字符串)。
19、模板的总体结构(FTL是区分大小写的)
①、Text文本:文本会照着原样来输出。
②、Interpolation插值:这部分的输出会被计算的值来替换。插值由${和}所分隔
③、FTL tags标签:与HTML标签很相似,但它们却是给FreeMarker的指示且不会打印在输出内容中。
④、Comments注释:注释和HTML的注释很相似,但是由<#--和-->来隔的。
注:FTL是区分大小写的,插值仅仅可以在文本中间使用(也可以在字符串表达式中)。FTL标签不可以在其他FTL标签和插值中使用。注释可以放在FTL标签和插值中间。
20、指令的调用:
如调用list指令:在语法上使用了两个标签:<#list animals as being>和</#list>。
对于用户自定义的指令使用@来代替#。例如:<@mydirective parameters>...</@mydirective>
21、备忘单
㈠、直接指定值
①字符串:"Foo" 或者 'Foo' 或者 "It's \"quoted\"" 或者 r"C:\raw\string"
②数字:123.45
③布尔值:true, false
④序列:["foo", "bar", 123.45], 1..100
⑤哈希表:{"name":"green mouse", "price":150}
㈡、检索变量
①顶层变量:user
②从哈希表中检索数据:user.name, user[“name”]
③从序列中检索:products[5]
④特殊变量:.main
㈢、字符串操作
①插值(或连接):"Hello ${user}!"(或"Free" + "Marker")
②获取一个字符:name[0]
㈣、序列操作
①连接:users + ["guest"]
②序列切分:products[10..19] 或 products[5..]
③哈希表操作
④连接:passwords + {"joe":"secret42"}
㈤、算数计算: (x * 1.5 + 10) / 2 - y % 100
㈥、比较:x == y, x != y, x < y, x > y, x >= y, x <= y, x < y, 等等
㈦、逻辑操作:!registered && (firstVisit || fromEurope)
㈧、内建函数:name?upper_case
㈨、方法调用:repeat("What", 3)
㈩、处理不存在的值
①默认值:name!"unknown" 或者(user.name)!"unknown" 或者name! 或者 (user.name)!
②检测不存在的值:name?? 或者(user.name)??
22、字符串
如果文本本身包含用于字符引用的引号(双引号”或单引号’)或反斜杠时,应该在它们的前面再加一个反斜杠,这就是转义。
23、FreeMarker所支持的所有的转义符序列
一种特殊的字符串就是原生字符串。在原生字符串中,反斜杠和${没有特殊的含义,它们被视为普通的字符。为了表明字符串是原生字符串,在开始的引号或单引号之前放置字母r。
24、序列
指定一个文字的序列,使用逗号来遍历子变量,然后把整个列表放到方括号内。
输出:
25、哈希表
在模板中指定一个哈希表,就可以遍历用逗号来分隔的“键/值”对,把列表放到花括号内。
例如:{"name":"green mouse", "price":150}。
26、顶层变量
变量名不能以数字开头。表达式中变量名可以包含字母(也可以是非拉丁文),数字,下划线(_),美元符号($),at符号(@)和哈希表(#)。
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、序列操作,连接
<#list ["Joe", "Fred"] + ["Julia", "Kate"] as user>
- ${user}
</#list>
33、序列的切分
如seq存储列"a", "b", "c", "d", "e", "f",表达式seq[1..4]是"b", "c", "d", "e"的序列
34、算数计算
+号的一端是字符串,另外一端是数字,那么数字就会自动转换为字符串类型。
例如:${3 + "5"}将会输出35
只想获取计算结果的整数部分,这可以使用内建函数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、方法的调用
${repeat("What", 3)} 输出为:WhatWhatWhat
38、默认值:
${mouse!"No mouse."}
<#assign mouse="Jerry">
${mouse!"No mouse."}
输出为:No mouse.
Jerry
39、检测不存在的值
unsafe_expr??或(unsafe_expr)??
40、操作符的优先级
41、插值仅仅在2种位置使用:文本区(如<h1>Hello ${name}!</h1>)和字符串表达式(如<#include "/footer/${company}.html">)
插值表达式的结果必须是字符串,数字或日期类型的。
42、自定义指令
可以使用macro指令来定义,也可用扩展:freemarker.template..TemplateDirectiveModel类来扩展。
一般使用<@...>称为宏调用。
43、内容嵌套
<#if ...>nested content</#if>
44、模板中定义变量
①、简单变量:它能从模板中的任何位置来访问,或者从使用include指令引入的模板访问。可以使用assign或macro指令来创建或替换这些变量。
②、局部变量:它们只能被设置在宏定义体内,而且只在宏内可见。一个局部变量的生存周期只是 宏的调用过程。可以使用local指令在宏定义体内来创建或替换局部变量。
③、循环变量:循环变量是由指令(如list)自动创建的,而且它们只在指令的开始和结束标记内有效。宏的参数是局部变量而不是循环变量。
45、命名空间的生命周期
输出为:
46、加在下面这些指令之间的空白会被忽略:macro,function,assign,global,local,ftl,import,但也是仅仅指令之间只有一个空白或FTL注释。
使用compress指令,和剥离空白相反,这个工作是直接基于生成的输出内容的。
47、替换语法
在FreeMarker指令和注释中用[和]来代替和。
例如:①、调用预定义指令:[#list animals as being]...[/#list]
②、调用用户自定义指令:[@myMacro /]
③、注释:[#-- the comment --]
48、创建配置实例
首先创建一个freemarker.template.Configuration实例,然后调整位置。
49、创建数据模型
可以使用java.lang和java.util下的类,用户自定义的Java Beans来构建数据对象。
使用java.lang.String来构建字符串。
使用java.lang.Number来派生数字。
使用java.lang.Boolean来构建布尔值。
使用java.util.List或Java数组来构建序列。
使用java.util.Map来构建哈希表。
使用你自己定义的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、哈希表
①、TemplateModel get(String key),这个方法根据给定的名称返回子变量,boolean isEmpty()这个方法表明哈希表是否含有子变量。
②、get方法当在给定的名称没有找到子变量时返回null。
54、序列
实现TemplateSequenceModel。两法:TemplateModel get(int index)和int size()。
55、集合
实现TemplateCollectionModel。一法:TemplateModelIterator iterator()。和java.util.Iterator相似,返回TemplateModels,抛出TemplateModelExceptions。
56、方法
实现TemplateMethodModel的模板内。一法:TemplateModel exec(java.util.List arguments)。
57、指令
Java程序员可以使用TemplateDirectiveModel接口在Java代码中实现自定义指令。
58、提示
TemplateDirectiveModel对象通常是有状态的。
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、配置
配置对象是freemarker.template.Configuration的实例,可以通过构造方法来创建它。一个应用程序通常只使用一个共享的Configuration实例
61、共享变量
用setSharedVariable方法向配置实例中添加共享变量。
它包含下列用户自定义指令(用户自定义指令使用时需要用@来代替#):
62、配置信息
有3层:configuration ; Template ;Environment 。分别是配置,模板,环境。
63、内建模板加载器
在Configuration中可以使用下面方便的方法来建立三种模板加载方法。
64、bean的包装
freemarker.ext.beans.BeansWrapper是一个对象包装器
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 取子串 exp?substring(from, toExclusive),
68、cap_first 首字母大写 ${" green mouse"?cap_first}
69、uncap_first 首字母小写
70、capitalize 首字母大写 字符串的所有单词都大写
71、chop_linebreak 切断换行符
72、date,time,datetime 日期,时间,时间日期
73、ends_with 以…结尾
74、html HTML格式的转义文本
<用<替换;
>用>替换;
&用&替换;
"用"替换;
xhtml XHTML格式
字符串作为XHTML格式文本输出,下面这些:
<替换为<
>替换为>
&替换为&
"替换为"
'替换为'
xml XML格式
字符串作为XML格式文本输出,下面这些:
<替换为<
>替换为>
&替换为&
"替换为"
'替换为'
75、group 分组
76、index_of 索引所在位置 "abcabc"?index_of("bc", 2)会返回4。
77、last_index_of 最后的索引所在位置 "abcabc"?last_index_of("ab", 2),将会返回0
78、length 字符串长度
79、lower_case 小写形式
80、left_pad 距左边。 如果字符串的长度达到指定数值或者比指定的长度还长,那就什么都不做了。
81、right_pad 距右边 但是它从末尾开始插入字符而不是从开头
82、contains 包含 <#if"piceous"?contains("ice")>It contains "ice"</#if>输出It contains "ice"
83、matches 匹配 决定字符串是否精确匹配上模式。返匹配的子串列表。返回值是一个多类型的值
84、number 数字格式 字符串转化为数字格式。
85、replace 替换 在源字符串中,用另一个字符穿来替换原字符串中出现它的部分。它不处理词的边界。
86、rtf 富文本 字符串作为富文本(RTF 文本),也就是说,下列字符串:
87、url URL转义 <#assign x = 'a/b c'> ${x?url} 输出:a%2Fb%20c
88、split 分割 它被用来根据另外一个字符串的出现将原字符串分割成字符串序列。
<#list "someMOOtestMOOtext"?split("MOO") as x>
- ${x}
</#list>
输出:- some
- test
- text
89、starts_with 以…开头
字符串以指定的子字符串开头,返回true。如"redhead"?starts_with("red")返回布尔值true
90、string(当被用作是字符串值时) 什也不做,仅仅返回和其内容一致的字符串。
91、trim 修整字符串 掉字符串首尾的空格。
(${" green mouse "?trim}) 输出: (green mouse)
92、upper_case 大写形式 字符串的大写形式。如"GrEeN MoUsE"将会是"GREEN MOUSE"。
93、word_list 词列表
包含字符串词的列表,并按它们在字符串中的顺序出现。词是连续的字符序列,包含任意字符,但是不包括空格<#assign words = " a bcd, . 1-2-3"?word_list>
<#list words as word>[${word}]</#list> 输出:[a][bcd,][.][1-2-3]
94、下面是标记字母的完整列表:
i:大小写不敏感:不区分同一个字母大小写之间的差异。
f:仅仅是第一。也就是说,替换/查找等,只是第一次出现的东西。
r:查找的子串是正则表达式。FreeMarker使用变化的正则表达式,只有你使用Java2平台的1.4版本以后,标记才会起作用。
m:正则表达式多行模式。在多行模式下,表达式^和$仅仅匹配前后,分别是一行结尾或者是字符串的结束。默认这些表达式仅仅匹配整个字符串的开头和结尾。
s:启用正则表达式的dotall模式(和Perl的单行模式一样)。在dotall模式下,表达式.匹配任意字符串,包括行结束符。默认这个表达式不匹配行结束符。
c:在正则表达式中许可空白和注释。
95、c 数字转字符
96、string(当用作是数值类型时)数字转字符串:将一个数字转换成字符串。
97、round,floor,ceiling 数字的舍入处理
round:返回最近的整数。如果数字以.5结尾,那么它将进位(也就是说向正无穷方向进位)
floor:返回数字的舍掉小数后的整数(也就是说向服务穷舍弃)
ceiling:返回数字小数进位后的整数(也就是说向正无穷进位)
98、sort 排序: 以升序方式存储序列并返回。
99、sort_by 以…来排序 返回由给定的哈希表子变量来升序排序的哈希表序列,
100、eval 求值 求一个作为FTL表达式的字符串的值。比如"1+2"?eval返回数字3。
101、has_content 是否有内容
102、interpret 将字符串解释为FTL模板
103、is_... 判断函数族 这些内建函数用来检查变量的类型,然后根据类型返回或
104、namespace 命名空间 这个函数返回和宏变量关联的命名空间
105、new 创建TemplateModel实现
106、支持的特殊变量有:
data_model:你可以使用来直接访问数据模型的哈希表。使用global指令定义在这里不可见的的变量。
error(从FM2.3.1版开):这个变量在recover指令体中可以访问,它存储了我们恢复错的错误信息。
globals:你可以使用来访问全局可访问的变量的哈希表:数据模型和由global指令创建的变量。language:返回当前本地设置的语言部分的值。比如.locale是en_US,那么.lang是en。
locale:返回当前本地设置的值。这是一个字符串,比如en_US。
locales:你可以访问本地化变量的哈希表(由local指令创建的变量,还有宏的参数)。
main:你可用来访问主命名空间的哈希表。注意像数据模型中的全局变量通过这个哈希表是不可见的。
namespace:你可用来访问当前命名空间的哈希表。后面的话同上。
node: 用访问者模式处理的当前节点。当你使用FreeMarker XML的Ant 任务时,它初始存储根节点。
output_encoding(FM2.3.1版始用):返回当前输出字符集的名称。
template_name:当前模板的名称(从FreeMarker 2.3.14版本开始可用)。
url_escaping_charset(从FreeMarker 2.3.1版本开始可用):如果存在,它存储了应该用于URL转义的字符集的名称。如果这个变量不存在就意味着没有人指定URL编码应该使用什么样的字符集。
vars:表达式.vars.foo返回和表达式foo相同的变量。出于某些原因你不得不使用方括号语法时这是有用的,因为它只对哈希表子变量有用,所以你需要一个人工的父哈希表。可写.vars["A strange name!"]。使用和变量varName给定的动态名称访问顶层变量可写.vars[varName]。
version:返回FreeMarker版本号的字符串形式,比如2.2.8。
107、if,else,elseif指令
switch,case,default,break指令
list,break 指令
include指令
import 指令
noparse指令
compress指令
escape,noescape指令
assign 指令
global 指令
local 指令
setting 指令
用户自定义指令(<@...>)
macro,nested,return 指令
function,return 指令
flush 指令
stop 指令
ftl 指令
t,lt,rt 指令
nt 指令
attempt,recover 指令
visit,recurse,fallback 指令
相关推荐
本篇将深入探讨如何自定义FreeMarker标签,以扩展其功能并适应特定项目需求。 首先,理解FreeMarker的默认标签语法至关重要。FreeMarker使用${...}表达式来插入变量,#{...}用于输出注释,以及、等控制结构进行条件...
标题:Freemarker 描述:孔浩的Freemarker视频笔记,值得一看! 根据给定的文件信息,我们可以深入探讨Freemarker的相关知识点,包括其基本概念、工作流程以及具体的代码实现。 ### Freemarker基本概念 ...
Freemarker是一个强大的模板引擎,常用于JavaEE应用中的视图层处理,尤其与Struts2等MVC框架配合使用,能实现灵活的动态页面渲染。这个"freemarker Demo"是一个适合初学者的示例项目,旨在帮助新接触Freemarker的...
而Freemarker则是一种轻量级的、基于模板的Java模板引擎,常用于Web应用中的动态内容生成,比如JSP替代技术。它允许开发者将业务逻辑与页面展示分离,提高代码的可维护性和可读性。 "eclipse的freemarker插件"是指...
`freemarker-2.3.23.jar`是Freemarker库的一个版本,发布于2.3.23,这个版本可能包含了对早期版本的一些改进、新功能或bug修复。 Freemarker的核心概念是模板语言,它是一种声明式的编程方式,允许开发者编写不包含...
camel-freemarker-1.6.4.jar, camel-freemarker-2.8.1.jar, com.springsource.freemarker-2.3.15.jar, com.springsource.freemarker-sources-2.3.15.jar, freemarker-1.4.1.jar, freemarker-2-3-18.jar, freemarker-...
FreeMarker的设计理念是将表现层(视图)和业务逻辑层(控制器)分离,从而实现MVC(Model-View-Controller)架构中的“View”部分。 FreeMarker的核心概念是模板文件,这是一种特殊的文本文件,其中包含可替换的...
FreeMarker 2.3.18是该引擎的一个版本,它提供了一系列的更新和改进,以提高性能和易用性。 1. **模板语言基础** FreeMarker的模板语言是一种声明式的编程方式,它允许开发者通过简单的标记语法来控制输出。这些...
这个"freemarker-2.3.28.jar"是Freemarker库的一个具体版本,版本号为2.3.28,它是Java的一个可执行的JAR(Java Archive)文件,用于在Eclipse集成开发环境中作为插件使用。 在Freemarker的2.3.28版本中,我们可以...
FreeMarker api 2.3.16 FreeMarker api 2.3.16 FreeMarker api 2.3.16 FreeMarker api 2.3.16 FreeMarker api 2.3.16 FreeMarker api 2.3.16
2.3.23是FreeMarker的一个稳定版本,这个版本的官方中文文档提供了全面的指导和说明,帮助开发者更好地理解和使用这个模板语言。 在FreeMarker的核心概念中,它是一个基于数据驱动的模板语言。这意味着,开发者不...
freemarker替换变量实例
赠送jar包:freemarker-2.3.31.jar; 赠送原API文档:freemarker-2.3.31-javadoc.jar; 赠送源代码:freemarker-2.3.31-sources.jar; 赠送Maven依赖信息文件:freemarker-2.3.31.pom; 包含翻译后的API文档:...
Struts2 和 Freemarker 是两个在Java Web开发中广泛应用的技术,它们共同构成了强大的MVC(模型-视图-控制器)框架。Struts2是Action框架,主要负责处理用户请求、业务逻辑控制以及与视图层的交互,而Freemarker则是...
Freemarker是一款强大的模板引擎,用于将数据模型与表示层分离,从而实现在Web开发中的动态页面生成。根据所提供的文件信息,我们可以详细探讨以下几个关键的知识点: ### 1. 创建配置实例 在Freemarker中,`...
这个“freemarker中文学习资料”压缩包提供了详尽的网页版API文档,对于想要深入理解和掌握Freemarker的开发者来说,是一份非常宝贵的资源。 1. **Freemarker基础概念** - **模板语言**:Freemarker使用一种简单的...
Freemarker是一个强大的模板引擎,常用于Web应用中的视图层渲染,比如Java Web开发。它的核心设计理念是将数据模型与展示逻辑分离,使得开发者可以专注于业务数据的处理,而视图的呈现则由模板来完成。这个压缩包...