您的位置:首页 > 其它

FreeMarker的基础知识整理

2015-10-19 15:45 169 查看
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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: