对象结构图
思想:模板 + 数据模型 = 输出
freemarker能够生成各种文本:HTML、XML、RTF、Java源代码等;
Configuration基本配置
setDirectoryForTemplateL
setServletContextForTemp
setClassForTemplateLoadi
setTemplateUpdateDelay(int delay):设置模板文件更新时间(毫秒);
setStrictSyntaxMode(boolean b):开启/关闭严格的语法,默认为true;
setWhitespaceStripping(boolean b):开启/关闭空白移除,默认为true;
setTagSyntax(int tagSyntax):设置ftl标签的类型;
setSharedVariable(String name, TemplateModel tm):设置共享变量;
setSharedVariable(String name, Object obj):设置共享变量;
setAllSharedVariables(TemplateHashModelEx hash):设置共享变量;
clearSharedVariables():清除共享变量;
clearTemplateCache():清除缓存;
setSetting(String key, String value):为freemarker做配置属性的入口;
getTemplate:一系列获取Template的方法;
Template处理方法
process(Object rootMap, Writer out)
process(Object rootMap, Writer out, ObjectWrapper wrapper, TemplateNodeModel rootNode)
process(Object rootMap, Writer out, ObjectWrapper wrapper)
标签语法
组成
文本:原样输出;
插值:使用${...}来从数据模型取数据;仅能在文本中使用和字符串文字中使用;例如:在文本区段(<h1>Hello ${name}!</h1>
指令:默认使用#开头(自定义标签使用@开头)的标签,类似HTML标签,交给后台程序处理;标签不能嵌套,例如:<#if
注释:使用<#-- ... -->来注释;可以嵌套在标签、插值中;
参考:Freemarker参考手册的第四部分第二章 指令参考文档;
数据类型快速参考
(1)直接指定值
字符串:"Foo" 或者 'Foo' 或者 "It's "quoted"" 或者 r"C:\raw\string"
数字:123.45
布尔值:true, false
序列:["foo", "bar", 123.45], 1..100
哈希表:{"name":"green mouse", "price":150}
(2)检索变量
顶层变量:user
从哈希表中检索数据:user.name, user[“name”]
从序列中检索:products[5]
特殊变量:.main
(3)字符串操作
插值(或连接):"Hello ${user}!" (或"Free" + "Marker")
获取一个字符:name[0]
(4)序列操作
连接:users + ["guest"]
序列切分:products[10..19] 或 products[5..]
(5)哈希表操作
连接:passwords + {"joe":"secret42"}
算数运算:
比较运算 :x == y, x != y, x < y, x > y, x >= y, x <= y, x < y,
逻辑操作:!registered && (firstVisit || fromEurope)
内建函数:name?upper_case
方法调用:repeat("What", 3)
(6)处理不存在的值
默认值:name!"unknown" 或者(user.name)!"unknown" 或者 name! 或者 (user.name)!
检测不存在的值:name?? 或者(user.name)??
转义符
转义序列
\
\’
\\
\n
\r
\t
\b
\f
\l
\g
\a
\xCode
在\x 之后的 Code 是1-4 位的16 进制码。下面这个示例中都是在字符串中放置版权符号"\xA9 1999-2001", "\x0A9 1999-2001", "\x00A9 1999-2001":如果紧跟16进制码后一位的字符也能解释成16进制码时,就必须把4位补全,否则FreeMarker
内建函数
使用:${变量?函数?函数...},函数可以向后传递;
常见函数:
html:处理特殊HTML字符;
cap_first:字符串的第一个字母变成大写形式;
lower_case:小写形式;
upper_case:大写形式;
trim:去掉首尾空格;
size:序列个数;
int:截取数字的整数部分;
repeat:重复多次;
其它内建函数,参考手册第四部分第1.8章 内建函数;
1 byte, double, float, int, long, short类型转换
2 number_date, number_to_time, number_to_datetime数字转时间
3 eval求值
4 has_content是否有内容
5 interpret将字符串解释为ftl模板
6 is_...判断函数族
7 namespace命名空间
8 new 创建TemplateModel实现
表达式
算术运算:+、-、*、/、%;
关系运算:gt、gte、lt、lte、==、!=;
逻辑运算:!、&&、||;
处理不存在的变量(未定义或者是null)
使用默认值
例如:${data!"0"}、${animals.python.price!0}
使用if判断
例如:<#if data??>${data?String}</#if>
freemarker标签语法,参考官方参考手册;
-------------------------------------------------------------------------------------
注意事项
1 ftl模板不是xml,属性并不一定要带双引号;ftl模板不是html,不一定有</xxx>;
<#assign list1=["aaa", "bbb", "ccc"]> <#-- 没有元素关闭标签 -->
<#macro listToStr list separator>
</#macro>
<@listToStr list=list1 separator="," />
2 不能像OGNL表达式那样方便地调用方法,集合遍历需要使用内置函数;
3 在struts2下使用标签,默认可以使用<@s.tag></@s.tag>来访问struts2标签;
freemarker支持多语言国际化,只要把模板名称安装资源文件的写法就可以了,也就是name_语言_国家地区.ftl
如果找不到对应的语言,就会用默认语言的模板。
宏使用参考:http://blog.chinaunix.net/uid-725717-id-2060340.html