FreeMaker一篇通.doc_第1页
FreeMaker一篇通.doc_第2页
FreeMaker一篇通.doc_第3页
FreeMaker一篇通.doc_第4页
FreeMaker一篇通.doc_第5页
免费预览已结束,剩余4页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

FreeMaker一篇通前言Freemaker是一个强大的模板引擎,相比velocity而言,其强大的过程调用、递归和闭包回调功能让freemaker可以完成几乎所有我们所想的功能。从个人看法而言,freemaker完全有能力作为MDA的代码辅助生成工具。 本文试图越过传统的概念性介绍,通过一组例子直接把读者带入到Freemaker应用的较高层阶。正文大家看文章标题就应该知道,我想用一篇文章,把大家从对freemaker的陌生直接带入到比较深入的境界,所以不想说一些基础性的东西,如果大家不习惯我的表达方法,大可通过google去找习惯于自己阅读方式的相关文章。我用过velocity,最近才用freemaker,才知道我以前的选择是错了,因为velocity不支持过程的调用,所以我为 velocity增加了很多的东西,写了很多代码,而且脚本也累赘得要命。freemaker首先吸引我的是它强大的过程调用和递归处理能力,其次则是 xml风格的语法结构有着明显的边界,不象velocity要注意段落之间要留空格。所以我建议大家直接使用Freemaker,虽然freemaker 没有.net版本,我想不嵌入程序中使用的话,freemaker是绝对的首选。(题外话,谁有兴趣移植一个NFreeMaker?)在使用之前我们先要设置运行环境,在使用Freemaker的时候,我们需要下载相关的程序:freemaker: /fmpp: / 其中fmpp是一个freemaker的辅助工具,有了它,我们可以实现更多的功能。以下例子必须fmpp辅助。这里我们首先提出问题。大家看如下的一个xml文件,虽然freemaker的能力不仅在于处理xml文件,但是用xml作为例子更直观一些:代码1我们的任务是把这个文件转化为相应的C#代码。大家先看转换模板的代码:123456789101112class$.13141516171819public$.node.type$.;202122232425代码2我们使用的配置文件设置如下:sourceRoot:srcoutputRoot:outlogFile:log.fmppmodes:copy(common/*/*.*,resource/*.*)execute(*.ftl)ignore(templates/*.*,.project,*/*.xml,xml/*.*,*.js)removeExtensions:ftlsourceEncoding:gb2312data:doc:xml(freemaker.xml)代码3然后我们在dos模式下运行指令:E:workblogsfreemakerf:downloadfreemakerfmppbinfmpp最后的输出结果是这样的,存放在文件outfreemaker.中:classType1publicFloatField11;publicStringField12;publicIntegerField13;publicType2Field14;publicFloatField15;classType3publicType1Field31;代码4先来解释一下freemaker的基本语法了, 中存放所有freemaker的内容,之外的内容全部原样输出。 是函数调用两个定界符内的内容中,第一个符号表示指令或者函数名,其后的跟随参数。freemaker提供的控制包括如下: 条件判断 遍历hash表或者collection(freemaker称作sequence)的成员 宏,无返回参数函数,有返回参数var?member_function(.) 用函数对var进行转换,freemaker称为build-ins。实际内部实现类似member_function(var, .)stringAM . N 取子字符串,类似substring(stringA, M, N)key:value, key2:value2 . 直接定义一个hash表item0, item1, item2 . 直接定义一个序列hash0key0 存取hash表中key对应的元素seq05 存取序列指定下标的元素 调用函数function1 nest_body 调用宏,并处理宏的嵌套 定义变量并初始化 在 macro 或者 function 中定义局部变量并初始化 定义全局变量并初始化$var 输出并替换为表达式的值 调用macro匹配xmlnode本身及其子节点 调用macro匹配xmlnode的子节点表1大家仔细对比xml文件,发现少了什么吗?对了,少了一个Type2定义,我们把代码2中的ns:type匹配(第11行)修改一下:public$.node.type$.;代码5结果输出文件中的内容就变为如下:classType1publicFloatField11;publicStringField12;publicIntegerField13;publicType2Field14;classType2publicStringField21;publicIntegerField22;publicFloatField15;classType3publicType1Field31;代码6如果各位有意向把Type2提到跟Type1和Type3同一级别的位置,那么我们要继续修改代码了。把代码2的 行(第5行)修改成如下:代码7同时把macro ns:field(第18行)修改成如下:public$.node.type$.;代码8运行得到输出文件类似这样:classType1publicFloatField11;publicStringField12;publicIntegerField13;publicType2Field14;publicFloatField15;classType3publicType1Field31;classType2publicStringField21;publicIntegerField22;代码9大家比较一下,看看我们修改的地方出现了哪些效果?然后记得大家要做另外2件事情,1。把第一行修改成为 ,然后把所有的 修改成,把所有的.nodens:type修改成 .node.type,看看能不能运行?是不是觉得简单方便些了?记住,第一行的那个D表示是default namespace的意思哦。2。在第二行插入,在最后一行添加。再运行一下看看结果有什么不同?一个例子下来,大家基本对freemaker有了一些感觉了,为了纠正大家认为freemaker就是一个xml处理工具的误解,我们再来做一个简单的实验。这次我们要做的是一个正常的编程题目,做一个100以内的Fibonacci数列的程序。程序如下:迭代次数:$n=$fibo(n)代码10这个例子里边有一些问题需要注意,大家看我的 #if n lte 1 这一行,为什么我这么写?因为常规的大于小于号和xml的节点有冲突,为了避免问题,所以用 gt() gte(=) lt() lte(=) 来代表。另外,复杂的字符串处理如何来做?就留作家庭作业吧,大家记得取substr的方法是 strfirst . last 就可以了。如下的例子可能会给你一点提示:$str(mid-cnt).(mid+cnt)?left_pad(mid*2)代码11最后,说一下非常有用的macro的nested指令,没有它,也许freemaker会失去大部分的魅力。我个人认为这也是freemaker全面超越velocity的地方。大家先看一下代码:$msg$index代码12这段代码的作用就是一个闭包(closure)。我们用java的匿名类实现相同的功能就是这样:interfaceICallbackpublicvoidcall(intindex);voidMain

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论