项目中Freemarker有一定的使用量,因此这里将Freemarker的基础知识做下总结:
什么是Freemarker了,FreeMarker是一款模板引擎:一种基于模板的、用来生成输出文本(任何来自于HTML格式的文用本来自动生成源代码)的通用工具。FreeMarker仅仅使用模板生成文本页面来呈现已经准备好的数据。
在FreeMarker学习过程中,发现其语法结构与Python有很大的相似之处,例如序列。
1. 示例
?
<html> <head> <title>Welcome!</title> </head> <body> <h1>Welcome ${user}!</h1> <p>Our latest product: <a href="${a.url}">${a.name}</a>! </body> </html>
?? 对于上述代码,能看懂HTML代码以及Struts2的OGNL或者java的EL表达式时,那么这么几行代码实在小case。
?
2. 模板
?? ?Freemarker的模板组成部分:文本,上面$那样的插值(interpolations),FTL标签外加注释。<#--和-->
?? ?2.1 if指令
?? ?<#if a.count< 1>
数字为0; <#else> 数字为1; </#if>?
?
?? 2.2 list指令
???<#list sequence as loopVariable>repeatThis</#list>
?
?? 2.3?include指令
???使用include指令,我们可以插入其他文件的内容到当前的模板中。
???<#include "/a.html">
?
?? 2.4?处理不存在变量
?? 1. 不存在赋初值
???<h1>Welcome ${user!"a"}!</h1>
?? 2. 不存在忽略代码段
???<#if user??><h1>Welcome ${user}!</h1></#if>
?? ???返回的值是true或false
?
?3. 数值
?序列:["foo", "bar", 123.45], 1..100
?哈希表:{"name":"green mouse", "price":150}
?从哈希表中检索数据:user.name, user[“name”]
?序列切分:products[10..19] ? ?和Python相似的是因为可以正反序遍历
?该了解的知识:
?
转义序列 ??含义
\ ?引号(u0022) ? ? ? ? ? ? ? ? ?
\’?单引号(又称为撇号)(u0027)
\\?反斜杠(u005C)
\n?换行符(u000A)
\r?回车(u000D)
\t?水平制表符(又称为标签)(u0009) ? ? ? ? ? ? ? --tab
\b?退格(u0008) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? --backspace
\f?换页(u000C)
\l?小于号:< ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?--less
\g?大于号:> ?
\a?和号:& ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?--and
?
??3.1 序列
?? 这个例子可以结合list指令看
?
??<#list ["winter", "spring", "summer", "autumn"] as x>
${x} </#list>?
?
??3.2 ?哈希表操作
?? ? ? ?下面的例子键值一样,那么优先是右边的。
?
<#assign ages = {"Joe":23, "Fred":25} + {"Joe":30, "Julia":18}> - Joe is ${ages.Joe} --这个打印的将是30 - Fred is ${ages.Fred} - Julia is ${ages.Julia}?
?
??3.3 ? = ?和!=
??java中判断俩对象是否相等,用的是==,Freemarker用=即可。
??使用>或者>=的情况,难道不会出问题,这个解析的时候不会将其当做结束符。所以对于这种情况,可以用gt代替>, ? ? ?gte代替>=,小于这种情况,也有可能出现问题。例如用逻辑与操作的时候,此时可能解析误以为为开始符。所以可以用lt代替 ?<,lte代替<=。
?
?3.4 ?逻辑操作
?? ? ?逻辑或:|| ? ? ??逻辑与:&& ? ? ?逻辑非:!
?
?3.5 内建函数(有用的东东)
?格式为:得到字符串的大写形式:user?upper_case,相当于?意思表示.的意思即可理解。
?常见内建函数:
?html: 字符串中所有的特殊HTML字符都需要用实体引用来代替(比如<代替<)
?cap_first:字符串的第一个字母变为大写形式
?lower_case:字符串的小写形式
?upper_case:字符串的大写形式
?trim:去掉字符串首尾的空格
?size:序列中元素的个数
?int:数字的整数部分(比如-1.9?int就是-1)
?
?3.6 方法调用
?目前有方法repartStr,用于将字符串复制制定次数。
?${repeatStr("What", 3)}
?
?4. 自定义
?4.1 ?自定义指令
?自定义指令可以使用macro指令来定义,这是模板设计者所关心的内容。Java程序员若不想在模板中实现指令,而在Java 语言中实现指令,可以使用freemarker.template.TemplateDirectiveModel类来扩展。
?4.1.1 ?宏
?宏是有一个变量名的模板片段。你可以在模板中使用宏作为自定义指令,这样就能进行重复性的工作。
?
<#macro greet> <font size="+2">Hello Joe!</font> </#macro>? ?
?调用方法为<@greet></@greet>
?
?4.2 ?自定义指令参数
?
<#macro greet person color> <font size="+2" color="${color}">Hello ${person}!</font> </#macro>
?? ?那么如何调用了。
?? ?<@greet person="Fred" color="black"/>
?? ?记得两个参数都得配置,否则解释不过去。当然可以在宏定义时,设置初始值。例如
?? ?<#macro greet person color="black">
?
?? ??根据FTL表达式规则,someParam=foo和someParam="${foo}"是不同的。第一种情况,是把变量foo的值作为参数的值来使用。第二种情况则是使用插值形式的字符串,那么参数值就是字符串了,赋予给someParam也就是字符串了。
?
?4.3 ?嵌套
?个人感觉,嵌套使用之后相当于一个while循环。指令为<#nested>,其执行位于开始和结束标记指令之间的模板代码段
??
?
<#macro do_thrice> <#nested> <#nested> <#nested> </#macro> <@do_thrice> a. </@do_thrice>
?
??运行结果为三个a.呗。
?
?4.4 ?宏和循环变量
?
<#macro repeat count> <#list 1..count as x> <#nested x, x/2, x==count> </#list> </#macro> <@repeat count=4 ; c, halfc, last> ${c}. ${halfc}<#if last> Last!</#if> </@repeat>
?
?那么输出的结果为:
?
1. 0.5 2. 1 3. 1.5 4. 2 Last!
?
?应该很好理解吧,例如上面1到count=4的值赋给x让其循环,得到的x有几种处理:x ,x/2, x==count
?然后调用,调用的变量用;进行隔开。注意变量和循环参数的顺序。
?
?4.5 变量
?1. 简单变量。用assign或macro指令来创建或替换这些变量
?2.?局部变量。被设置在宏定义体内,使用local指令在宏定义体内来创建或替换局部变量。使用周期为宏的调用过程。
?3.?循环变量。由指令(如list)自动创建的,而且它们只在指令的开始和结束标记内有效。
<#assign x = 1> ? 简单变量
<#list ["loop"] as x> 循环变量
?
?4.6 命名空间
<#macro copyright date> <p>Copyright (C) ${date} Julia Smith. All rights reserved. <br>Email: ${mail}</p> </#macro>
<#import "/lib/my_test.ftl" as my> <#assign mail="fred@acme.com"> <@my.copyright date="1999-2002"/> //调用函数 ${my.mail} ${mail}
???看上面的代码知道属于两个不同的命名空间,自己ftl文件直接调用即可,而引入的ftl文件命名空间为my,所以用my可以调用其函数和变量。如果偶尔想要在一个被包含的命名空间上创建或替换一个变量。采用下面的方式
<#import "/lib/my_test.ftl" as my> ${my.mail} <#assign mail="jsmith@other.com" in my> ${my.mail} 输出结果为: jsmith@acme.com jsmith@other.com
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?