1、Freemarker概念
Freemarker不是web开发的应用程序框架,它是适用于web应用程序框架中的组件。
FreeMarker引擎本身不知道HTTP协议或者Java Servlet的存在。所以它也可以用于非 web应用程序的开发环境
2、模板+数据模型 = 输出
*模板:
静态的HTML代码+FreeMarker指令元素
*数据模型:
来自java对象
*输出:
模板存放在web服务器上,当有人来访问这个页面时,FreeMarker将会动转换 模板,生成普通的HTML文本并发送结果到访问者的Web浏览器中去显示
3、变量:
1)哈希表变量:
可以访问子变量名称
*指定值:
{"name":"mouse","age":128},键的类型为字符串,如 "name","age"
*检索:
hash.name,hash.age
*连接:
使用+来连接两个哈希表,如果两个哈希表含有相同键的项,
那么+右侧的哈希表中的项优先
<#assign ages = {"joe":23,"fred":24}+{"joe":20,"julia":30}>
最后ages.joe=20
2)序列变量:
按顺序存储子变量,使用数字索引访问子变量
*指定值:
["foo","bar",123]
*检索:
seq[5]
*切分:
seq[firstindex..lastindex]
seq[10..19]表达式会是包含第11个至第20个元素的序列, lastindex可以省略,这样seq[10..]表示包含第11个至最后一个 元素的序列
3)标量:
仅存储单值的变量
*字符串:
*指定值:
"aaa"或者'aaa'
*检索:
获取一个字符name[0]
*连接:
"aaa"+"bbb"
*原生字符串:
一些特殊的符号没有特殊意义,前面加r,
例如${r"${foo}"}会打印${foo}
*数字:
*指定值:
123.45
*日期/时间:
*指定值:
*布尔值:
*指定值:
true,false
6、在模板中要访问子变量,需要从根开始指定路径,每级用点来分隔。
7、FreeMarker模板(FTL)的特殊部分:
1)插值:
${表达式}
*使用:
*文本:
<h1>Hello ${name}!</h1>
*字符串:
<#include "/footer/${company}.html">
*表达式的结果:
*字符串插值:
当插值在文本区,放在escapse指令中,被插 入的字符串(HTML)会被自动转义
<#escape x as x?html>
<p>${book}</p><!--如&会被转义为&>
<p><#noescape>${pencil}</#noescape></p>
</#escape>
*数字插值:
使用number_format设置格式
使用string重写默认格式
*日期/时间插值:
使用time_format,date_format,datetime_format 设置转换格式
使用string重写默认格式
*布尔插值:
布尔类型的变量不能直接放进${}中,需要 ${user?string("yes","no")}
2)FTL标签(指令):
以#符号开头,自定义的标签以@开头,
标签不可以在其他标签和插值中使用
3)注释:
<#--和-->可以放在标签和插值中间
${user<#--the name-->}
<#list <#--some comment-->>
8、指令:
1)if指令:
<#if condition>...</if>
当condition条件为false时,if标签之间的内容会被忽略
2)if else指令:
<#if condition>
aaaaaaaa;
<#else>
bbbbbbb;
</#if>
使用<#else>标签可以指定condition为false时执行的程序
3)list指令:
<#list sequence as loopVariable>
语句;
</#list>
4)include指令:
<#include "aaa.html">
9、处理不存在的变量:(变量不存在或者为null)
1)指定默认值:
${(bianliang ! "aaa")}
当bianliang不存时指定bianliang="aaa",最好是使用括号,
如果默认值被省略了,那么结果将会是空串,空序列或空哈希表,
但是如果想让默认值为0或者false,则需要指定,不能省略。
多级访问变量问题:
1)animals.pig.price!0
animals和pig变量都需要存在才会给price赋默认值,
否则程序报错
2)(animals.pig.price)!0
animals和pig变量不存在时表达式结果也为0
2)if询问:
<#if bianliang??>
10、方法和函数:
方法来自于数据模型(反射了java对象的方法)
函数是定义在模板里的,使用函数指令
11、算数运算:
*加法:+
*减法:-
*乘法:*
*除法:/
*求模(求余):%
12、比较运算:
比较运算两边的表达式结果为数字类型
*相等:=
*不等:!=
< (lt)
<= (lte)
> (gt)
>= (gte)
*但是<和>需要放在()中,否则和FTL标签冲突
13、逻辑操作:
逻辑操作两边的表达式结果为布尔类型
*逻辑或:||
*逻辑与:&&
*逻辑非:!
14、内建函数:
内建函数提供变量的不同形式和其它信息。
*字符串使用的内建函数:
*html:
字符串中所有的特殊HTML字符都需要用实 体引用来代替。
*cap_first:
第一个字母变为大写。
*lower_case:
字符串小写形式。
*upper_case:
字符串大写形式。
*trim:
去掉字符串首尾的空格。
*string:
设置输出格式。
*序列使用的内建函数:
Size:
序列中元素的个数。
*数字使用的内建函数:
int:
数字的整数部分。
15、模板中定义的变量:
*简单变量:
能从模板中的任何位置来访问,或者从使用include指令 引入的模板访问。
可以使用assign或macro指令来创建或替换这些变量
*创建变量:
<#assign x=1>
*替换变量:
<#assign x=x+3>
*局部变量:
设置在宏定义体内,只在宏内可见。生存周期只是宏的 调用过程。可以使用local指令在宏定义体内创建或者替 换局部变量
*循环变量:
由指令(如list)自动创建,只在指令的开始和结束标记内 有效。
*隐藏变量:
*模板中定义的变量隐藏数据模型中的变量
*局部变量隐藏同名的简单变量
*循环变量隐藏同名的局部变量和简单变量
*内部循环变量隐藏外部循环变量
<#assign x="aaa">
${x} <#--普通变量-->
<#list["loop"] as x>
${x} <#--循环变量-->
<#assign x="bbb"> <#--普通变量-->
${x} <#--循环变量-->
</#list>
${x} <#--普通变量-->
<#local x="local">
${x} <#--局部变量-->
<#list ["loo"] as x>
${x} <#--循环变量x-->
</#list>
${x} <#--局部变量-->
</#local>