[代码8]
运行得到输出文件类似这样:
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/b854634c0904529d4018c4c3336be836.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/b854634c0904529d4018c4c3336be836.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/b854634c0904529d4018c4c3336be836.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/None.gif)
[代码9]
大家比较一下,看看我们修改的地方出现了哪些效果?然后记得大家要做另外2件事情,
1。把第一行修改成为<#ftl ns_prefixes={"D": "urn:DruleForm-Lite.xsd"}> ,然后把所有的 <#macro "ns:type"> 修改成<#macro type>,把所有的.node["ns:type"]修改成 .node.type,看看能不能运行?是不是觉得简单方便些了?记住,第一行的那个D表示是default namespace的意思哦。
2。在第二行插入<#compress>,在最后一行添加。再运行一下看看结果有什么不同?
一个例子下来,大家基本对freemaker有了一些感觉了,为了纠正大家认为freemaker就是一个xml处理工具的误解,我们再来做一个简单的实验。这次我们要做的是一个正常的编程题目,做一个100以内的Fibonacci数列的程序。程序如下:
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/None.gif)
[代码10]
这个例子里边有一些问题需要注意,大家看我的 #if n lte 1 这一行,为什么我这么写?因为常规的大于小于号和xml的节点有冲突,为了避免问题,所以用 gt(>) gte(>=) lt(<) lte(<=) 来代表。
另外,复杂的字符串处理如何来做?就留作家庭作业吧,大家记得取substr的方法是 str[first .. last] 就可以了。如下的例子可能会给你一点提示:
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/None.gif)
[代码11]
最后,说一下非常有用的macro的nested指令,没有它,也许freemaker会失去大部分的魅力。我个人认为这也是freemaker全面超越velocity的地方。大家先看一下代码:
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/None.gif)
[代码12]
这段代码的作用就是一个闭包(closure)。我们用java的匿名类实现相同的功能就是这样:
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/b854634c0904529d4018c4c3336be836.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/b854634c0904529d4018c4c3336be836.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/b854634c0904529d4018c4c3336be836.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/b854634c0904529d4018c4c3336be836.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/None.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/b854634c0904529d4018c4c3336be836.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/b854634c0904529d4018c4c3336be836.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](http://bigtall.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)