对象结构图
思想:模板 + 数据模型 = 输出
freemarker能够生成各种文本:HTML、XML、RTF、Java源代码等;
Configuration基本配置
setDirectoryForTemplateLoading(File dir):设置模板存放路径——文件路径;
setServletContextForTemplateLoading(Object sctxt, String path):设置模板存放路径——Servlet上下文;
setClassForTemplateLoading(Class clazz, String pathPrefix):设置模板存放路径——类路径;
setTemplateUpdateDelay(int delay):设置模板文件更新时间(毫秒);
setStrictSyntaxMode(boolean b):开启/关闭严格的语法,默认为true;
setWhitespaceStripping(boolean b):开启/关闭空白移除,默认为true;
setTagSyntax(int tagSyntax):设置ftl标签的类型;
•AUTO_DETECT_TAG_SYNTAX: 可以自定义格式,系统会选择第一个标签作为参照;
•ANGLE_BRACKET_TAG_SYNTAX: 使用尖括号;
•SQUARE_BRACKET_TAG_SYNTAX: 使用方括号;
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> )和字符串文字(<#include "/footer/${company}.html"> )
指令:默认使用#开头(自定义标签使用@开头)的标签,类似HTML标签,交给后台程序处理;标签不能嵌套,例如:<#if <#include 'foo'>='bar'>...</#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 * 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)
(6)处理不存在的值
默认值:name!"unknown" 或者(user.name)!"unknown" 或者 name! 或者 (user.name)!
检测不存在的值:name?? 或者(user.name)??
转义符
转义序列
\
\’ 单引号(又称为撇号)(u0027)
\\ 反斜杠(u005C)
\n 换行符(u000A)
\r 回车(u000D )
\t 水平制表符(又称为标签)(u0009)
\b 退格(u0008)
\f 换页(u000C)
\l 小于号:<</p>
\g 大于号:>
\a 和号:&
\xCode 字符的16 进制 Unicode 码 (UCS 码)
在\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>
<@compress single_line = true>
<#if list?exists>
<#list list as item>
${item}<#if item_has_next>${separator}</#if>
</#list>
</#if>
</@compress>
</#macro>
<@listToStr list=list1 separator="," /> <#-- 没有双引号 -->
2 不能像OGNL表达式那样方便地调用方法,集合遍历需要使用内置函数;
3 在struts2下使用标签,默认可以使用<@s.tag></@s.tag>来访问struts2标签;
freemarker支持多语言国际化,只要把模板名称安装资源文件的写法就可以了,也就是name_语言_国家地区.ftl
如果找不到对应的语言,就会用默认语言的模板。