




已阅读5页,还剩71页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Freemaker 入门+深入+开发指南+学习笔记freemaker的基本语法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的子节点FreeMaker一篇通【转】FreeMaker一篇通【转】2007-08-09 19:38FreeMaker一篇通前言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#代码。大家先看转换模板的代码:1 23 45 67 8 91011 12 class $. 13 14 15 16171819 public $.node.type $.;202122 232425代码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.中: class Type1 public Float Field11; public String Field12; public Integer Field13; public Type2 Field14; public Float Field15; class Type3 public Type1 Field31; 代码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结果输出文件中的内容就变为如下: class Type1 public Float Field11; public String Field12; public Integer Field13; public Type2 Field14; class Type2 public String Field21; public Integer Field22; public Float Field15; class Type3 public Type1 Field31; 代码6如果各位有意向把Type2提到跟Type1和Type3同一级别的位置,那么我们要继续修改代码了。把代码2的 行(第5行)修改成如下: 代码7同时把macro ns:field(第18行)修改成如下: public $.node.type $.; 代码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件事情,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的匿名类实现相同的功能就是这样:interface ICallbackpublic 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);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的子节点 repeatThis 一个ftl标记不能放在另外一个ftl标记里面,但是注释标记能够放在ftl标记里面。系统预定义指令采用用户自定义指令采用hash片段可以采用: products10.19 or products5. 的格式。序列也可以做加法计算:passwords + joe:secret42缺省值: name!unknown或者 ()!unknown或者 name!或者 ()!null值检查: name? or ()?转义列表:Escape sequenceMeaningQuotation mark (u0022)Apostrophe (a.k.a. apostrophe-quote) (u0027)Back slash (u005C)nLine feed (u000A)rCarriage return (u000D)tHorizontal tabulation (a.k.a. tab) (u0009)bBackspace (u0008)fForm feed (u000C)lLess-than sign: aAmpersand: &Curly bracket: xCodeCharacter given with its hexadecimal Unicode code (UCS code)如果想打印$,则需要将转义,可以写成$user,或者可以用生字符(r指令):$(r $xx序列构成:$x不同的对象可以存放在一个序列里面,比如:2 + 2, 1, 2, 3, 4, whatnot. 第一个是数字,第二个是序列,第三个是字符串。可用采用start.end的方式来定义一个数字序列,start可以小于end,同时,end也可以省略。hash取值支持一下四种模式:, , , bookauthorname.特殊变量是指freemaker引擎本身定义的变量。访问时,以.variable_name的语法访问。变量表达式支持嵌套模式,比如:$Hello $user!。变量表达式在指令中的使用情况:变量表达式可以在指令中,用“”的方式存在,不如:. 但是不允许下面的方式存在: Wow!,正确写法是:Wow!. 而且 Wow!写法也不正确,因为$isBig返回的是字符串,不是boolean类型。字符串中取字符或字符串采用以下语法:$user0,$user0.2 $user4.,$user?string(4)序列操作:加法: 但要注意串联之后的读取速度变慢。子序列:seq1.4序列和hash的串联都只能用于两个相加,不能有多个相加的模式,hash相加,如果两个相加的hash存在相同的key,则后面会覆盖前面的。在使用=或者时,需要注意一些问题,因为freemaker会将解释成标记的关闭符,为了解决这个问题,需要在表达式加上括号,比如: y).或者使用 > and <符号来代替。无值变量(包括无该变量,null,返回void,无属性等):unsafe_expr!default_expr or unsafe_expr! or (unsafe_expr)!default_expr or (unsafe_expr)!缺省值可以是任何类型,不一定是数字,比如:hits!0或者 colors!red, green, blue. 如果缺省值忽略,那么将会默认为空串、空序列或者空hash,因为freemarker支持多类型的值。不过要让默认值为0或false,则不能省略缺省值。非顶层变量的无值处理:product.color!red:只处理product不为空,color为空的缺省值处理,如果product为空,则freemaker会抛出异常。(product.color)!red:则会处理product为空,color为空,或者没有color属性的无值情况。无值变量的判断操作:unsafe_expr? or (unsafe_expr)?判断变量是否是无值。普通变量插入方式: $expression,$3+5);数字变量插入方式: #expression or #expression; format:过期。变量只能用于文本区或者是字符串里面,比如:Hello $name!以及 数字值的插入:根据缺省的number_format输出,以及可以通过setting来达到设置数字格式的目的,也可以通过内置函数string来改变输出格式。日期类型的格式设置:date_format, time_format和 datetime_format定义宏:不带参数:.,引用带参数:.,引用,带有参数的宏,调用是参数的值必须和参数的个数相同。当然也可以在宏定义时给参数一些默认值。比如:宏里面的嵌套内容: 在宏的定义body中加入指令。嵌套的内容可以是任何正确的ftl块。宏的本地变量在嵌套内容中是不可见的。宏定义时,指令相当于调用定义的内容,而使用宏时,nest body相当于定义。 $c. $halfc Last!定义变量:在模板中定义的变量将会隐藏(不是更改)数据模型根下面的同名的变量。模板中的3种类型变量:1:plain variables,能够在模板中的任何地方访问,一个模板include另外一个模板,也可以访问被包含模板的变量。可以通过assign或者macro指令产生或替换变量。如果要访问数据模型中的变量,则可以通过.global来访问:$user $.globals.user 2:Local variables,宏定义body中用local指令创建或者替换。3:Loop variables:由list指令产生。namespaces: $my.mail设置命名空间里面的变量:命名空间与数据模型:命名空间的ftl可以访问数据模型的变量。同样命名空间的变量也会隐藏数据模型中同名的变量。空白问题:1:White-space stripping,默认为enabled,清除ftl标记带来的空白以及缩进。处理模板的空白。2:t, rt, lt指令。3:ftl的参数strip_text.用compress directive或者transform来处理输出。.:消除空白行。./compress将输出压缩为一行。可替换语法:freemarker可用代替.在模板的文件开头加上#ftl.Trackback: /TrackBack.aspx?PostId=1791781SpringMVC使用Freemarker Freemaker是取代JSP的又一种视图技术,和Velocity非常类似,但是它比Velocity多了一个格式化的功能,因此使用上较Velocity方便一点,但语法也稍微复杂一些。将Velocity替换为Freemarker只需要改动一些配置文件,同样,在Spring中使用Freemarker也非常方便,根本无须与Freemarker的API打交道。我们将Spring_Velocity工程复制一份,命名为Spring_Freemarker,结构如图7-44所示。图7-44修改dispatcher-servlet.xml,将velocityConfig删除,修改viewResolver为FreeMarker ViewResolver,并添加一个freemarkerConfig。 模板test.html可以稍做修改,加入Freemarker内置的格式化功能来定制Date类型的输出格式。 Spring_Freemarker Hello, $name, it is $time?string(yyyy-MM-dd HH:mm:ss)添加freemarker.jar到web/WEB-INF/lib目录后,启动Resin,可以看到由Freemarker渲染的页面FreeMarker入门文章引用自: 1、快速入门 (1)模板 + 数据模型 = 输出 l FreeMarker基于设计者和程序员是具有不同专业技能的不同个体的观念 l 他们是分工劳动的:设计者专注于表示创建HTML文件、图片、Web页面的其它可视化方面;程序员创建系统,生成设计页面要显示的数据 l 经常会遇到的问题是:在Web页面(或其它类型的文档)中显示的信息在设计页面时是无效的,是基于动态数据的 l 在这里,你可以在HTML(或其它要输出的文本)中加入一些特定指令,FreeMarker会在输出页面给最终用户时,用适当的数据替代这些代码 l 下面是一个例子: Welcome! Welcome $user! Our latest product: $latestP! l 这个例子是在简单的HTML中加入了一些由$包围的特定代码,这些特定代码是FreeMarker的指令,而包含FreeMarker的指令的文件就称为模板(Template) l 至于user、latestProduct.url和latestP来自于数据模型(data model) l 数据模型由程序员编程来创建,向模板提供变化的信息,这些信息来自于数据库、文件,甚至于在程序中直接生成 l 模板设计者不关心数据从那儿来,只知道使用已经建立的数据模型 l 下面是一个可能的数据模型: (root) | +- user = Big Joe | +- latestProduct | +- url = products/greenmouse.html | +- name = green mouse l 数据模型类似于计算机的文件系统,latestProduct可以看作是目录,而user、url和name看作是文件,url和name文件位于latestProduct目录中(这只是一个比喻,实际并不存在) l 当FreeMarker将上面的数据模型合并到模板中,就创建了下面的输出: Welcome! Welcome Big Joe! Our latest product: green mouse! (2)数据模型 l 典型的数据模型是树型结构,可以任意复杂和深层次,如下面的例子: (root) | +- animals | | | +- mouse | | | | | +- size = small | | | | | +- price = 50 | | | +- elephant | | | | | +- size = large | | | | | +- price = 5000 | | | +- python | | | +- size = medium | | | +- price = 4999 | +- test = It is a test | +- whatnot | +- because = dont know l 类似于目录的变量称为hashes,包含保存下级变量的唯一的查询名字 l 类似于文件的变量称为scalars,保存单值 l scalars保存的值有两种类型:字符串(用引号括起,可以是单引号或双引号)和数字(不要用引号将数字括起,这会作为字符串处理) l 对scalars的访问从root开始,各部分用“.”分隔,如animals.mouse.pr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 证券市场基本法律法规复习试题及答案
- 电商教学讲解课件模板
- 整体绿化项目养护合同
- 物理乐音课件
- 2025年富士康厂商安全培训试题及答案
- 个人的货物买卖合同范本
- 人教版数学二年级上册重点题型专项练习及答案一套
- 围挡施工合同印花税
- 官方推出2025年夫妻忠诚合同样本
- 劳务合同担保协议范本
- 2025年广东省中考语文试卷(含答案解析)
- 2025年昆山校医考试题库
- 8-教育系统-安全生产治本攻坚三年行动工作方案及台账模板(2024-2026年)
- 2025年云南高考历史试卷解读及备考策略指导课件
- 2025至2030中国纤维素纳米纤维(CNF)行业项目调研及市场前景预测评估报告
- (高清版)T∕CES 243-2023 《构网型储能系统并网技术规范》
- 山东淄博小升初数学真题试卷
- 网约车公司风险管理制度
- 企业丧事慰问管理办法
- 医院智慧管理分级评估标准体系(试行)-全文及附表
- 中国画基础知识课件
评论
0/150
提交评论