您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > Freemaker 入门+深入+开发指南+学习笔记
1Freemaker入门+深入+开发指南+学习笔记freemaker的基本语法freemaker的基本语法:#...中存放所有freemaker的内容,之外的内容全部原样输出。@.../是函数调用两个定界符内的内容中,第一个符号表示指令或者函数名,其后的跟随参数。freemaker提供的控制包括如下:#ifcondition#elseifcondition#else/#if条件判断#listhash_or_seqasvar/#list遍历hash表或者collection(freemaker称作sequence)的成员#macronameparam1param2...#nestedparam/#macro宏,无返回参数#functionnameparam1param2#returnval/#function函数,有返回参数var?member_function(...)用函数对var进行转换,freemaker称为build-ins。实际内部实现类似member_function(var,...)stringA[M..N]取子字符串,类似substring(stringA,M,N){key:value,key2:value2...}直接定义一个hash表[item0,item1,item2...]直接定义一个序列hash0[key0]存取hash表中key对应的元素seq0[5]存取序列指定下标的元素@function1param0param1.../调用函数function12@macro0param0param1;nest_param0nest_param1...nest_body/@macro调用宏,并处理宏的嵌套#assignvar=value定义变量并初始化#localvar=value在macro或者function中定义局部变量并初始化#globalvar=value定义全局变量并初始化${var}输出并替换为表达式的值#visitxmlnode调用macro匹配xmlnode本身及其子节点#recursexmlnode调用macro匹配xmlnode的子节点FreeMaker一篇通[【转】FreeMaker一篇通[【转】2007-08-0919:38FreeMaker一篇通前言Freemaker是一个强大的模板引擎,相比velocity而言,其强大的过程调用、递归和闭包回调功能让freemaker可以完成几乎所有我们所想的功能。从个人看法而言,freemaker完全有能力作为MDA的代码辅助生成工具。本文试图越过传统的概念性介绍,通过一组例子直接把读者带入到Freemaker应用的较高层阶。正文大家看文章标题就应该知道,我想用一篇文章,把大家从对freemaker的陌生直接带入到比较深入的境界,所以不想说一些基础性的东西,如果大家不习惯我的表达方法,大可通过google去找习惯于自己阅读方式的相关文章。我用过velocity,最近才用freemaker,才知道我以前的选择是错了,因为velocity不支持过程的调用,所以我为velocity增加了很多的东西,写了很多代码,而且脚本也累赘得要命。freemaker首先吸引我的是它强大的过程调用和递归处理能力,其次则是xml风格的语法结构有着明显的边界,不象velocity要注意段落之间要留空格。所以我建议大家直接使用Freemaker,虽然freemaker3没有.net版本,我想不嵌入程序中使用的话,freemaker是绝对的首选。(题外话,谁有兴趣移植一个NFreeMaker?)在使用之前我们先要设置运行环境,在使用Freemaker的时候,我们需要下载相关的程序:freemaker::其中fmpp是一个freemaker的辅助工具,有了它,我们可以实现更多的功能。以下例子必须fmpp辅助。这里我们首先提出问题。大家看如下的一个xml文件,虽然freemaker的能力不仅在于处理xml文件,但是用xml作为例子更直观一些:?xmlversion='1.0'encoding=gb2312?typesxmlns:xsi==urn:DruleForm-Lite.xsdtypename=Type1labelslabellang=zh-CNvalue=投保单//labelsfieldname=Field11type=Floatlbound=1ubound=1labelslabellang=zh-CNvalue=投保单ID//labels/fieldfieldname=Field12type=Stringlbound=1ubound=*/fieldname=Field13type=Integerlbound=1ubound=*/fieldname=Field14type=Type2lbound=1ubound=*typename=Type2fieldname=Field21type=Stringlbound=1ubound=*/fieldname=Field22type=Integerlbound=1ubound=*//type/fieldfieldname=Field15type=InsuranceProductlbound=1ubound=*/type4typename=Type3fieldname=Field31type=Type1lbound=1ubound=*//type/types[代码1]我们的任务是把这个文件转化为相应的C#代码。大家先看转换模板的代码:1#ftlns_prefixes={ns:urn:DruleForm-Lite.xsd}2#--定义xmlnamespace,以便在以下代码中使用,注意,ftl指令必须使用单独的行--3@pp.setOutputEncodingencoding=gb2312/#--使用fmpp提供的函数来设置输出编码--45#recursedoc#--根入口,代码1部分的xml存放在变量doc中,doc变量的填充由fmpp根据config.fmpp中的配置进行--67#macrons:types#--xslt风格的匹配处理入口--8#recurse#--直接进行types节点内的匹配--9/#macro1011#macrons:type#--匹配type节点--12class${.node.@name}#--其中.node是保留字,表示当前节点,引用的@name是xslt风格--13{14#recurse#--继续匹配--15}16/#macro1718#macrons:field19public${.node.@type}${.node.@name};20/#macro2122#macro@element#--所有没有定义匹配的节点到这里处理--23/#macro2425[代码2]我们使用的配置文件设置如下:sourceRoot:srcoutputRoot:out5logFile:log.fmppmodes:[copy(common/**/*.*,resource/*.*)execute(*.ftl)ignore(templates/*.*,.project,**/*.xml,xml/*.*,*.js)]removeExtensions:ftlsourceEncoding:gb2312data:{doc:xml(freemaker.xml)}[代码3]然后我们在dos模式下运行指令:E:\work\blogs\freemakerf:\download\freemaker\fmpp\bin\fmpp最后的输出结果是这样的,存放在文件out\freemaker.中:classType1{publicFloatField11;publicStringField12;publicIntegerField13;publicType2Field14;publicFloatField15;}classType3{publicType1Field31;}[代码4]先来解释一下freemaker的基本语法了,#...中存放所有freemaker的内容,之外的内容全部原样输出。@.../是函数调用两个定界符内的内容中,第一个符号表示指令或者函数名,其后的跟随参数。freemaker提供的控制包括如下:#ifcondition#elseifcondition#else/#if条件判断#listhash_or_seqasvar/#list遍历hash表或者collection(freemaker称作sequence)的成员#macronameparam1param2...#nestedparam/#macro宏,无返回参6数#functionnameparam1param2#returnval/#function函数,有返回参数var?member_function(...)用函数对var进行转换,freemaker称为build-ins。实际内部实现类似member_function(var,...)stringA[M..N]取子字符串,类似substring(stringA,M,N){key:value,key2:value2...}直接定义一个hash表[item0,item1,item2...]直接定义一个序列hash0[key0]存取hash表中key对应的元素seq0[5]存取序列指定下标的元素@function1param0param1.../调用函数function1@macro0param0param1;nest_param0nest_param1...nest_body/@macro调用宏,并处理宏的嵌套#assignvar=value定义变量并初始化#localvar=value在macro或者function中定义局部变量并初始化#globalvar=value定义全局变量并初始化${var}输出并替换为表达式的值#visitxmlnode调用macro匹配xmlnode本身及其子节点#recursexmlnode调用macro匹配xmlnode的子节点[表1]大家仔细对比xml文件,发现少了什么吗?对了,少了一个Type2定义,我们把代码2中的ns:type匹配(第11行)修改一下:#macrons:fieldpublic${.node.@type}${.node.@name};#recurse#--深入处理子节点--/#macro[代码5]结果输出文件中的内容就变为如下:classType1{publicFloatField11;publicStringField12;publicIntegerField13;publicType2Field14;classType2{7publicStringField21;publicIntegerField22;}publicFloatField15;}classType3{publicType1Field31;}[代码6]如果各位有意向把Type2提到跟Type1和Type3同一级别的位置,那么我们要继续修改代码了。把代码2的#recursedoc行(第5行)修改成如下:#assigninner_types=pp.newWritableHash()#--
本文标题:Freemaker 入门+深入+开发指南+学习笔记
链接地址:https://www.777doc.com/doc-6184293 .html