Freemarker常⽤基本命令
freemarker包括下⾯⼏个基本命令
if,el,elif指令
switch,ca,default,break指令
list,break指令
include指令
import 指令
nopar指令
手机流量监控compress指令
escape,noescape指令
assign 指令
global 指令
local 指令
tting 指令
⽤户⾃定义指令(<@...>)
macro,nested,return 指令
function,return 指令
flush 指令
stop 指令
ftl 指令
t,lt,rt 指令
nt 指令
attempt,recover 指令
visit,recur,fallback 指令
南仁东星常⽤技巧之⼀
1 截取字符串
有的时候我们在页⾯中不需要显⽰那么长的字符串,⽐如新闻标题,这样⽤下⾯的例⼦就可以⾃定义显⽰的长度
<#t?length lt 8>
<a href>${t?default("")}</a>
<#el>
<a href title="${t}">${t[0..3]?default("")}...</a>
</#if>
意思就是如果这个字符串的长度⼩于8,那么就正常显⽰,反之则取4位
注意:常⽤的⽐较运算符
=(==):判断两个值是否相等
!=:不相等
>(gt):判断左边是否⼤于右边兵马佣
>=(gte):
<(lt):
<=(lte):
2 连接字符串
${"Hello," + ur + "!"} //输出结果为:hello,swiftlet!
3 ⽇期格式和boolean类型,转化为string类型
${lastUpdate?string("yyyy-MM-dd HH:mm:ss")}
输出结果如下:
2003-04-08 21:24:44
<#assign foo=true/>
${foo?string("yes","no")} //输出结果:yes
4 排序
升序⽤sort_by()
<#list list?sort_by("字段") as x>
</#list>
降序⽤sort_by()?rever
<#list list?sort_by("字段")?rever as x>
</#list>
5 去空格
${xx?trim}
6 数值精度控制
mX:⼩数部分最⼩X位。
MX:⼩数部分最⼤X位。
<#assign x=2.582/>
<#assign y=4/>
#{x; M2}//2.58
#{y; M2}//4
#{x; m1M2}//2.58
#{y; m1M2}//4.0
7 内置函数
html:字符串中所有的特殊HTML字符都需要⽤实体引⽤来代替(⽐如<;代替<)
cap_first:字符串的第⼀个字母变为⼤写形式
lower_ca:字符串的⼩写形式
变速自行车原理upper_ca:字符串的⼤写形式
trim:去掉字符串⾸尾的空格
序列使⽤的内建函数:
size:序列中元素的个数
数字使⽤的内建函数:
int:数字的整数部分(⽐如-1.9?int就是-1)9>.空值运算符
length:字符串的长度
string :把其他格式的数据,转化为string类型
${test?html}
${test?upper_ca?html}
假设字符串test存储”Tom & Jerry”,那么输出为:
Tom & Jerry
TOM & JERRY
${asons?size}
${asons[1]?cap_first}
${"hor"?cap_first}
假设asons存储了序列"winter", “spring”, “summer”, “autumn”,那么上⾯的输出将会是:4
Spring
Hor
8 顶层变量
所谓顶层变量就是直接放在数据模型中的值。
Map root = new HashMap();
root.put(“name”,“admin”);//name是⼀个顶层对象
对于顶层变量,直接使⽤${variableName}来输出变量值
9 集合连接运算符
集合连接运算是将两个集合连接成⼀个新的集合,连接集合的运算符是’+’.
<#list [“⼀”,“⼆”,“三”] + [“四”,“五”,“六”] as x>
${x}
</#list>
/
/输出结果如下:
⼀⼆三四五六
10 算术运算符
取整运算
<#assign x=5>
${(x/2)?>int}//2
${1.1?int}//1
${1.999?int} //1
${-1.1?int}//-1
常⽤技巧之⼆
1 list、break指令
<#list quence as item>
…
</#list>
tem_index:当前变量的索引值.
item_has_next:是否存在下⼀个对象.
<#list [“星期⼀”,“星期⼆”,“星期三”,“星期四”,“星期五”,“星期六”] as x>
{x}
<#if x_has_next>,</#if>
<#if x=“星期四”><#break></#if>
</#list>
输出结果:
1.星期⼀,
2.星期⼆,
3.星期三,
4.兴趣四,
2 import指令
<#import path as mapObject>
path:指定要被导⼊的模板⽂件.
mapObject:是⼀个Map对象.
意思:将path路径中的变量都放在mapObject中.
例⼦:<#import “/lib/common.ftl” as com>
3 宏的基本⽤法
例如:
<#macro greet>
<font size="+2"> Hello JOE!</font>
</#macro>
使⽤时:
<@greet></@greet>
如果没有体内容也可以⽤
<@greet />
可以在宏定义之后定义参数,宏参数是局部变量,只在宏定义中有效。如:
<#macro greet person>
<font size="+2"> Hello ${person}!</font>
</#macro>
使⽤时:
<@greet person="emma"> and <@greet person="LEO">
输出为:
<font size="+2"> Hello emma!</font>
<font size="+2"> Hello LEO!</font>
x ndex +1.i
注意:宏的参数是FTL表达式,所以,person=emma和上⾯的例⼦中具有不同的意义,这意味着将变量emma的值传给person,这个值可能是任意⼀种数据类型,甚⾄是⼀个复杂的表达式。
宏可以有多个参数,使⽤时参数的次序是⽆关的,但是只能使⽤宏中定义的参数,并且对所有参数赋值。如:
<#macro greet person color>
Hello ${person}!
</#macro>
使⽤时:
<@greet color=“black” person=“emma” />正确
<@greet person=“emma” />错误,color没有赋值,此时,如果在定义宏时为color定义缺省值<#macro greet person
color=“black”>这样的话,这个使⽤⽅法就是正确的。
FreeMarker缓存处理
上周我⾯试了⼀个⼈,⽆意中我问了⼀个问题:freemarker加载模板⽂件的缓存策略是什么呢?很遗憾,⾯试者没有回答出来。后来,我告诉⾯试者,学习⼀个框架,不仅仅是要明⽩这个框架如何使⽤,还要了解⼀下框架的底层实现。本⽂主要是给⼤家说⼀下FreeMarker的缓存实现部分。本⽂的内容⼤部分来⾃于互联⽹,要想更深⼊的了解与掌握
FreeMarker缓存处理,我个⼈觉得还是要深⼊研读源码,然后再看看⽹上的分析以加深印象,这样的学习效果是最好的。
喜福会小说
FreeMarker 的缓存处理主要⽤于模版⽂件的缓存,⼀般来讲,模版⽂件改动不会很频繁,在⼀个流量⾮常⼤的⽹站中,如果频繁的读取模版⽂件对系统的负担还是很重的,因此 FreeMarker 通过将模版⽂件的内容进⾏缓存,来降低模版⽂件读取的频次,降低系统的负载。
当处理某个模版时,FreeMarker直接从缓存中返回对应的 Template 对象,并有⼀个默认的机制来保证该模版对象是跟模版⽂件同步的。如果使⽤的时候 FreemarkerServlet 时,有⼀个配置项template_update_delay⽤来指定更新模版⽂件的间隔时间,相当于多长时间检测⼀下是否有必要重新加载模版⽂件,0 表⽰每次都重新加载,否则为多少毫秒钟检测⼀下模版是否更改。
FreeMarker定义了⼀个统⼀的缓存处理接⼝CacheStorage,默认的实现是 MruCacheStorage 最近最少使⽤的缓存策略。⼀般情况下,很少需要对缓存进⾏扩展处理。您可以通过下⾯的代码指定最⼤缓存的模版数:
1 cfg.tCacheStorage(new freemarker.cache.MruCacheStorage(20, 250))
其中第⼀个参数是最⼤的强引⽤对象数,第⼆个为最⼤的弱引⽤对象数。这两个值FreeMarker默认的是0和 Integer.MAX_VALUE,表明模版缓存数是⽆限的。
freemarker空值的处理
FreeMarker的变量必须赋值,否则就会抛出异常。⽽对于FreeMarker来说,null值和不存在的变量是完全⼀样的,因为FreeMarker⽆法理解null值。FreeMarker提供两个运算符来避免空值:
(1)!运算符:指定缺失变量的默认值;
(2)??运算符:判断变量是否存在。
!运算符有两种⽤法:variable!或variable!defaultValue。第⼀种⽤法不给变量指定默认值,表明默认值是空字符串、长度为0的集合、或长度为0的Map对象。
注意:使⽤!运算符指定默认值并不要求默认值的类型和变量类型相同。下⾯是⼀个⼩例⼦:
<#-- ${sss}没有定义这个变量,会报异常!–>
${sss!} <#–没有定义这个变量,默认值是空字符串!–>
${sss!“abc”} <#–没有定义这个变量,默认值是字符串abc!–>
运算符返回布尔值,如:variable,如果变量存在,返回true,否则返回fal。⼀般情况下与if指令共
同使⽤。将它和if指令合并,如下⾯的例⼦:如果ur变量不存在的话将会忽略整个问候代码段:
<#if ur??>
Welcome ${ur}!
</#if>
关于多级访问的变量,⽐如animals.python.price,书写代码:animals.python.price!0,仅当animals.python存在⽽仅仅最后⼀个⼦变量price可能不存在(这种情况下我们假设价格是0)。如果animals或者python不存在,那么模板处理过程将会以“未定义的变量”错误⽽停⽌。为了防⽌这种情况的发⽣,可以这样来书写代码(animals.python.price)!0。这种情况下当animals或python不存在时表达式的结果仍然是0。对于??也是同样⽤来的处理这种逻辑的:animals.python.price??对⽐(animals.python.price)??来看。
freemarker数据类型
freemarker的数据类型主要包括下⾯⼏类:
字符串类型
定义字符串可以使⽤双引号和单引号,例如:
<#assign temp = “some text” />
或者
<#assign temp = ‘some text’ />
这两种形式是相等的。字符串中可以使⽤转义字符""。如果字符串内有⼤量的特殊字符,则可以在引号的前⾯加上⼀个字母r,则字符串内的所有字符都将直接输出。例如:“It’s “quoted”” 或者 r"C:\raw\string"
数字类型
输⼊不带引号的数字就可以直接指定⼀个数字,必须使⽤点作为⼩数的分隔符⽽不能是其他的分组分隔符。可以使⽤-或+来表明符号(+是多余的)。科学记数法暂不⽀持使⽤(1E3就是错误的),⽽且也不能在⼩数点之前不写0(.5也是错误的)。
哈希表类型
键和值成对出现并以冒号分隔,最外⾯使⽤花括号。看这个例⼦:
鸡蛋灌饼制作方法
前庭训练<#assign temp = {“name”:“green mou”, “price”:150} />
注意到名字和值都是表达式,但是⽤来检索的名字就必须是字符串类型的。
磅礴的近义词序列类型
指定⼀个序列,使⽤逗号来分隔其中的每个⼦变量,然后把整个列表放到⽅括号中。例如:
<#assign nums=[1,2,3,4,5,77,8,99]/>
使⽤list指令将序列输出,如下所⽰:
<#list nums as num>
${num}
</#list>
还可以采⽤数字范围定义了⼀个连续的序列,例如:
<#assign nums=12…99/>
这种⽅式定义的序列的内容是12到99。总之,使⽤数字范围也可以表⽰⼀个数字集合,如1…5等同于集合[1,2, 3, 4, 5];同样也可以⽤5…1来表⽰[5, 4, 3, 2, 1]。
时间类型
FreeMarker⽀持date、time、datetime三种类型,这三种类型的值⽆法直接指定,通常需要借助字符串的date、time、datetime三个内建函数进⾏转换才可以:
<#assign test1 = “2009-01-22”?date(“yyyy-MM-dd”) />;
<#assign test2 =“16:34:43”?time(“HH:mm:ss”) />
<#assign test2 = “2009-01-22 17:23:45”?datetime(“yyyy-MM-dd HH:mm:ss”) />
布尔类型
直接使⽤true或fal,不使⽤引号。例如:<#assign temp = true />
freemarker的配置简介
在freemarker启动的过程中,参与配置功能的类主要有四个:Configurable,Configuration,Template
和Environment。下⾯给⼤家简单介绍⼀下这⾥类的特点,内容主要是出⾃freemarker的源码,⽽且这些英⽂⽐较简单,稍微耐⼼⼀点就可以读懂的。
Configurable简介
This is a common superclass of {@plate.Configuration},{@plate.Template}, and {@link Environment} class.
It provides ttings that are common to each of them. FreeMarker us a three-level tting hierarchy - the return value of every tting getter method on <code>Configurable</code> objects inherits its value from its parent <code>Configurable</code> object, unless explicitly overridden by a call to a correspo nding tter method on the object itlf. The parent of an
<code>Environment</code> object is a <code>Template</code> object, the parent of a <code>Template</code> object is a <code>Configuration</code> o bject.
Configuration简介