2007-06-30
FreeMarker一篇通2[代码8] 运行得到输出文件类似这样:
class Type1
{ public Float Field11; public String Field12; public Integer Field13; public Type2 Field14; public Float Field15; } class Type3 { public Type1 Field31; } class Type2 { public String Field21; public Integer Field22; } [代码9] 大家比较一下,看看我们修改的地方出现了哪些效果?然后记得大家要做另外2件事情, 一个例子下来,大家基本对freemaker有了一些感觉了,为了纠正大家认为freemaker就是一个xml处理工具的误解,我们再来做一个简单的实验。这次我们要做的是一个正常的编程题目,做一个100以内的Fibonacci数列的程序。程序如下: 迭代次数:
<#list 1 .. 10 as n> ${n} = ${fibo(n)} #list> <#compress> <#function fibo n> <#if n lte 1> <#return 1> <#elseif n = 2> <#return 1> <#else> <#return fibo(n-1) + fibo(n-2)> #if> #function> #compress> [代码10] 这个例子里边有一些问题需要注意,大家看我的 #if n lte 1 这一行,为什么我这么写?因为常规的大于小于号和xml的节点有冲突,为了避免问题,所以用 gt(>) gte(>=) lt(<) lte(<=) 来代表。 另外,复杂的字符串处理如何来做?就留作家庭作业吧,大家记得取substr的方法是 str[first .. last] 就可以了。如下的例子可能会给你一点提示: <#assign str = "hello!$world!">
<#assign mid = (str?length + 1)/2-1 > <#list mid .. 0 as cnt> ${str[(mid - cnt) .. (mid + cnt)]?left_pad(mid*2)} #list> [代码11] 最后,说一下非常有用的macro的nested指令,没有它,也许freemaker会失去大部分的魅力。我个人认为这也是freemaker全面超越velocity的地方。大家先看一下代码: <#assign msg = "hello">
<@macro0 ; index > ${msg} ${index} @macro0> <#macro macro0> <#list 0 .. 10 as number> <#nested number> #list> #macro> [代码12] 这段代码的作用就是一个闭包(closure)。我们用java的匿名类实现相同的功能就是这样: interface ICallback
{ public void call(int index); } void Main() { String msg = "hello"; macro0( new ICallback() { public void call(int index) { System.out.println(msg + index.toString()); } } ); } void macro0(ICallback callback) { for(int i = 0; i < 10; ++i) { callback.call(i); } } |
|