




已阅读5页,还剩33页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
作成者Hathor时间2006.11.6Freemarker详解 A概念最常用的概念1、 scalars:存储单值字符串:简单文本由单或双引号括起来。数字:直接使用数值。日期:通常从数据模型获得布尔值:true或false,通常在标记中使用2、 hashes:充当其它对象的容器,每个都关联一个唯一的查询名字具有一个唯一的查询名字和他包含的每个变量相关联。3、 sequences:充当其它对象的容器,按次序访问使用数字和他包含的每个变量相关联。索引值从0开始。4、 集合变量:除了无法访问它的大小和不能使用索引来获得它的子变量:集合可以看作只能由指令使用的受限sequences。5、 方法:通过传递的参数进行计算,以新对象返回结果方法变量通常是基于给出的参数计算值在数据模型中定义。6、 用户自定义FTL指令:宏和变换器7、 节点节点变量表示为树型结构中的一个节点,通常在XML处理中使用。在模板里对sequences和hashes初始化sequences 1. “you”,”me”,”he” 2. 1.1003. “Akey”:”Avalue”,“Akey1”:”Avalue1”,“Bkey”:”Bvalue”,“Bkey1”:”Bvalue1”, hashes “you”:”a”,”me”:”b”,”he”:”c”注释标志旧版本的freemarker采用的是 注释 方法sequences内置方法sequence?first返回sequence的第一个值;前提条件sequence不能是nullsequence?last返回sequence最后一个值sequence?reverse反转sequence的值sequence?size返回sequence的大小sequence?sort对sequence按里面的对象toString()的结果进行排序sequence?sort_by(value)对sequence 按里面的对象的属性value进行排序如: sequence里面放入的是10 个user对象,user对象里面包含name,age等属性sequence?sort_by(name) 表示所有的user按进行排序hashes内置方法hash?keys返回hash里的所有keys, 返回结果类型sequencehash?values返回hash里的所有value, 返回结果类型sequence模板使用FTL(freeMarker模板语言)编写组成部分一、整体结构1、注释:,不会输出。2、文本:直接输出。3、interpolation:由 $var 或 #var 限定,由计算值代替输出。4、FTL标记二.表达式1、直接指定值:1-1、字符串:由双引号或单引号括起来的字符串,其中的特殊字符(如 等)需要转义。1-2、raw字符串:有一种特殊的字符串称为raw字符串,被认为是纯文本,其中的和等不具有特殊含义,该类字符串在引号前面加r,下面是一个例子:$r/$datayear屏幕输出结果为:/$datayear转义 含义序列 双引号(u0022) 单引号(u0027) 反斜杠(u005C) n 换行(u000A) r Return (u000D) t Tab (u0009) b Backspace (u0008) f Form feed (u000C) l a & xCode 4位16进制Unicode代码 1-3、数字:直接输入,不需要引号 1)、精度数字使用“.”分隔,不能使用分组符号 2)、目前版本不支持科学计数法,所以“1E3”是错误的 3)、不能省略小数点前面的0,所以“.5”是错误的 4)、数字8、+8、08和8.00都是相同的 1-4、布尔值:true和false,不使用引号1-5、序列:由逗号分隔的子变量列表,由方括号限定。1)、子变量列表可以是表达式2)、可以使用数字范围定义数字序列,不需要方括号限定,例如2.5等同于2, 3, 4, 5,但是更有效率,可以定义反递增范围如:5.2。1-6、散列(hash)1)、由逗号分隔的键/值列表,由大括号限定,键和值之间用冒号分隔,如:key1:valu1,key2:character string.2)、键和值都是表达式,但是键必须是字符串。2、获取变量:2-1、顶层变量:$变量名变量名只能是字母、数字、下划线、$、#、 的组合,且不能以数字开头。2-2、散列:有两种方法1)、点语法:变量名字和顶层变量的名字受同样的限制2)、方括号语法:变量名字无限制,可以是任意的表达式的结果bookauthorname以上是等价的。2-3、序列:使用散列的方括号语法获取变量,方括号中的表达式结果必须为数字。注意:第一个项目的索引为0。可以使用startindex.endindex语法获取序列片段。2-4、特殊变量:FreeMarker内定义变量,使用.variablename语法访问。3、字符串操作3-1、interpolation:使用$或#在文本部分插入表达式的值,例如:$hello$username!$username$username$username也可以使用+来获得同样的结果:$hello+username+!$username+username+username注意:$只能用于文本部分而不能出现于标记内。或都是错误的;是正确的。本例中user.login的值必须是布尔类型。3-2、子串:举例说明:假如user的值为Big Joe$user0$user4结果是:BJ$user1.4结果是:ig J4、序列操作4-1、连接操作:可以使用+来操作,例如:title,author+month,day5、散列操作5-1、连接操作:可以使用+来操作,如果有相同的KEY,则右边的值会替代左边的值,例如: title:散列,author:emma+month:5,day:5+month:6结果month的值就是6。6、算术运算6-1、操作符:+、-、*、/、%除+号以外的其他操作符两边的数据,必须都是数字类型。如果+号操作符一边有一个字符型数据,会自动将另一边的数据转换为字符型数据,运算结果为字符型数据。6-2、比较操作符:1、= 2、=3、!=4、5、7、=1-3的操作符,两边的数据类型必须相同,否则会产生错误4-7的操作符,对于日期和数字可以使用,字符串不可以使用。注意:1、FreeMarker是精确比较,所以x x X是不等的。2、因为对FTL来说是开始和结束标记,所以,可以用两种方法来避免这种情况:一种是使用括号#if (a 另一是使用替代输出,对应如下: lt gt = gte 6-3、逻辑操作符:只能用于布尔值,否则会出现错误。&(and)与运算|(or)或运算!(not)非运算6-4、内建函数:使用方法类似于访问散列的子变量,只是使用?代替.例如:$test?upper_case?html常用的内建函数列举如下:1、字符串使用:html:对字符串进行HTML编码cap_first:字符串第一个字母大写lower_first:字符串第一个字母小写upper_case:将字符串转换成大写trim:去掉字符前后的空白字符2)、序列使用:size:获得序列中元素的数目3)、数字使用:int:取得数字的整数部分7、操作符的优先顺序:后缀:subbarNamesubStringRange.(mathodParams)一元:+expr、-expr、! (not)内建:?乘法:*、/、%加法:+、-关系:、= (lt、lte、gt、gte)相等:=、=、!=逻辑与:& (and)逻辑或:| (or)数字范围:.四、interpolationinperpolation只能用于文本,有两种类型:通用interpolation及数字interpolation1、通用interpolation如$expr1-1、插入字符串值:直接输出表达式结果。1-2、插入数字值:根据缺省格式(由setting指令设置)将表达式结果转换成文本输出;可以使用内建函数string来格式化单个interpolation如:$answer $answer?string $answer?string.number $answer?string.currency $answer?string.percent 1-3、插入日期值:根据缺省格式(由setting指令设置)将表达式结果转换成文本输出;可以使用内建函数string来格式化单个interpolation如:$lastupdata?string(yyyy-MM-dd HH:mm:ss zzzz) $lastupdata?string(EEE,MMM d, yy) $lastupdata?string(EEEE,MMMM dd, yyyy,hh:mm:ss a (zzz) 1-4、插入布尔值:根据缺省格式(由setting指令设置)将表达式结果转换成文本输出;可以使用内建函数string来格式化单个interpolation如:$foo?string(yes,no) 2、数字interpolation:有两种形式:1)、#expr2)、#expr;format:format可以用来格式化数字,format可以是如下:mX:小数部分最小X位MX:小数部分最大X位例如:#x;M2 #y;M2 #x;m1 #y;m1 #x;m1M2 #y;m1M2 宏宏和变换器变量是两种不同类型的用户自定义指令,他们的区别是:宏可以在模板中用macro指令来定义变换器是在模板外由程序定义1、宏:和某个变量关联的模板片段,以便在模板中通过用户自定义指令使用该变量1-1、基本用法:例如: Hello JOE!使用时:如果没有体内容也可以用1-2、变量:1)、可以在宏定义之后定义参数,宏参数是局部变量,只在宏定义中有效。如: Hello $person!使用时: and 输出为: Hello emma! Hello LEO!注意:宏的参数是FTL表达式,所以,person=emma和上面的例子中具有不同的意义,这意味着将变量emma的值传给person,这个值可能是任意一种数据类型,甚至是一个复杂的表达式。宏可以有多个参数,使用时参数的次序是无关的,但是只能使用宏中定义的参数,并且对所有参数赋值。如: Hello $person!使用时:正确错误,color没有赋值,此时,如果在定义宏时为color定义缺省值这样的话,这个使用方法就是正确的。错误,宏greet定义中未指定bgcolor这个参数2、嵌套内容:2-1、自定义指令可以有嵌套内容,使用指令,执行自定义指令开始和结束标记之间的模板片段。例如:hello Emma!输出为hello Emma!2-2、指令可以被多次调用,例如hello Emma!输出为hello Emma!hello Emma!hello Emma!hello Emma!2-3、嵌套的内容可以是有效的FTL,例如: Hello $person!输出为: Hello Emma! Hello Andrew! Hello Peter!2-4、宏定义中的局部变量对嵌套内容是不可见的,例如: $y$count/$x: $y?default(?) $x?default(?)$count?default(?)输出结果为test 3/1:?test 3/2:?test 3/3:?2-5、在宏定义中使用循环变量,通常用来重复嵌套内容,基本用法为:作为nested指令的参数,传递循环变量的实际值,而在调用自定义指令时,在标记的参数后面指定循环变量的名字。例如:$c. $halfclast!输出结果是1. 0.52. 13. 1.54. 2last!注意:指定循环变量的数目和用户定义指令开始标记指定的不同不会有问题调用时,少指定循环变量,多指定的值会不见调用时,多指定循环变量,多余的循环变量不会被创建二、在模板中定义变量1、在模板中定义的变量有三种类型1-1、plain变量:可以在模板的任何地方访问,包括使用include指令插入的模板,使用assign指令创建和替换。1-2、局部变量:在宏定义体中有效,使用local指令创建和替换。1-3、循环变量:只能存在于指令的嵌套内容,由指令(如list)自动创建。注意:1)、宏的参数是局部变量,不是循环变量。2)、局部变量隐藏同名的plain变量3)、循环变量隐藏同名的plain变量和局部变量。例如:1. $x 6. $x7. $x 8. $x 9. $x 2. $x 3. $x 4. $x 5. $x 4)、内部循环变量隐藏同名的外部循环变量$x $x $x $x $x 5)、模板中的变量会隐藏数据模型中的同名变量,如果需访问数据模型中的变量,使用特殊变量global。例如:假设数据模型中的user值为Emma$user $.global.user macro, nested, return语法 . . .用例 Test text, and the params: $foo, $bar, $baaz输出 Test text, and the params: a, b, 23 Test text, and the params: a, b, -1 Test text, and the params: a, Bar, 23 Test text, and the params: a, Bar, -1定义循环输出的宏 $title?cap_first: $x?cap_first 输出结果 Animals: Mouse Elephant Python 包含body的宏 $c. $halfc Last!输出1. 0.5 2. 1 3. 1.5 4. 2 Last!t, lt, rt语法 去掉左右空白和回车换行去掉左边空白和回车换行去掉右边空白和回车换行取消上面的效果B指令freemarker指令有两种:1、预定义指令:引用方式为2、用户定义指令:引用方式为,引用用户定义指令时须将#换为。注意:如果使用不存在的指令,FreeMarker不会使用模板输出,而是产生一个错误消息。freemarker指令由FTL标记来引用,FTL标记和HTML标记类似,名字前加#来加以区分。如HTML标记的形式为则FTL标记的形式是(此处h1标记和list指令没有任何功能上的对应关系,只是做为说明使用一下)。有三种FTL标记:1)、开始标记:2)、结束标记:3)、空标记:注意:1) FTL会忽略标记之中的空格,但是,#和指令 与 /#和指令 之间不能有空格。2) FTL标记不能够交叉,必须合理嵌套。每个开始标记对应一个结束标记,层层嵌套。 如:$数据game over!注意事项:1)、FTL对大小写敏感。所以使用的标记及interpolation要注意大小写。name与NAME就是不同的对象。是正确的标记,而则不是。2)、interpolation只能在文本部分使用,不能位于FTL标记内。如是错误的,正确的方法是:,而且此处var必须为布尔值。3)、FTL标记不能位于另一个FTL标记内部,注释例外。注释可以位于标记及interpolation内部。if, else, elseif语法 . . . .用例 x is 1 x is 1 x is not 1We have these animals: NamePrice $ $being.price Euros It is Big Joe It is not Big Joeswitch, case, default, break语法 . . . . .用例字符串 This will be processed if it is small This will be processed if it is medium This will be processed if it is large This will be processed if it is neither数字 1 2 d如果x=1 输出 1 2, x=2输出 2, x=3 输出dlist, break语法.关键字item_index:是list当前值的下标item_has_next:判断list是否还有值用例 $x_index + 1. $x,输出 1. winter, 2. spring, 3. summer, 4. autumn include语法oroptions包含两个属性encoding=”GBK” 编码格式parse=true 是否作为ftl语法解析,默认是true,false就是以文本方式引入.注意在ftl文件里布尔值都是直接赋值的如parse=true,而不是parse=”true”用例/common/copyright.ftl包含内容Copyright 2001-2002 $meAll rights reserved. 模板文件Some testYeah.输出结果Some testYeah.Copyright 2001-2002 Juila SmithAll rights reserved. Test page Test page Blah blah.Import语法类似于java里的import,它导入文件,然后就可以在当前文件里使用被导入文件里的宏组件用例假设mylib.ftl里定义了宏copyright那么我们在其他模板页面里可以这样使用my在freemarker里被称作namespacecompress语法 .用来压缩空白空间和空白的行用例( 1 2 3 4 5 $moo test only I said, test only) 输出(1 2 3 4 5mootest onlyI said, test only)escape, noescape语法 . . .用例主要使用在相似的字符串变量输出,比如某一个模块的所有字符串输出都必须是html安全的,这个时候就可以使用该表达式 First name: $firstName Last name: $lastName Maiden name: $maidenName相同表达式 First name: $firstName?html Last name: $lastName Maiden name: $maidenName?htmlassign语法ororor capture thisor capture this用例生成变量,并且给变量赋值给seasons赋予序列值给变量test加1给my namespage 赋予一个变量bgColor,下面可以通过my.bgColor来访问这个变量将一段输出的文本作为变量保存在x里下面的阴影部分输出的文本将被赋值给x $n Number of words: $x?word_list?size$xHello $user! error true同时也支持中文赋值,如: java$语法打印输出:javaglobal语法oror capture this全局赋值语法,利用这个语法给变量赋值,那么这个变量在所有的namespace页:23这里的abc叫做namespace中是可见的,如果这个变量被当前的assign语法覆盖 如 在当前页面里x=2将被隐藏,或者通过$.global.x来访问setting语法用来设置整个系统的一个环境localenumber_formatboolean_formatdate_format, time_format, datetime_formattime_zoneclassic_compatible用例假如当前是匈牙利的设置,然后修改成美国$1.2$1.2 输出1,21.2因为匈牙利是采用“,”作为十进制的分隔符,美国是用“.”C一些常用方法或注意事项表达式转换类$expression计算expression并输出# expression 数字计算# expression ;format安格式输出数字format为M和mM表示小数点后最多的位数,m表示小数点后最少的位数如#121.2322;m2M2输出121.23数字循环1.5 表示从1到5,原型number.number对浮点取整数$123.23?int 输出123给变量默认值$var?default(“hello world”)?html如果var is null那么将会被hello world替代判断对象是不是null Mouse found也可以直接$mouse?if_exists)输出布尔形常用格式化日期 openingTime必须是Date型,详细查看freemarker文档 Reference-build-in referece-build-in for date$openingTime?date$openingTime?date_time$openingTime?time添加全局共享变量数据模型在代码里的实现 cfg = Configuration.getDefaultConfiguration();cfg.setSharedVariable(global, you good); 页面实现可以通过global指令,具体查看指令里的global部分直接调用java对象的方法$object.methed(args) 字符串处理(内置方法)html安全输出“abcsdfsf”?html 返回安全的html输出,替换掉html代码xml安全输出var?xml substring的用法$user0$user4 $user1.4输出 :hoello 类似String.split的用法 “abc;def;ghi”?split(“;”)返回sequence将字符串按空格转化成sequence,然后取sequence的长度 var?word_list 效果同 var?split(“ ”) var?word_list?size取得字符串长度var?length大写输出字符var?upper_case小写输出字符var?lower_case首字符大写var?cap_first首字符小写var?uncap_first去掉字符串前后空格 var?trim每个单词的首字符大写var?capitalize类似String.indexof: “babcdabcd”?index_of(“abc”) 返回1“babcdabcd”?index_of(“abc”,2) 返回5类似String.lastIndexOf last_index_of和String.lastIndexOf类似,同上下面两个可能在代码生成的时候使用(在引号前加”)j_string: 在字符串引号前加”String BEAN_NAME = $beanName?j_string;打印输出:String BEAN_NAME = The foo bean.;js_string: alert(Welcome $user!); 打印输出alert(Welcome Big Joes right hand!);替换字符串 replace$s?replace(ba, XY )$s?replace(ba, XY , 规则参数)将s里的所有的ba替换成xy 规则参数包含: i r m s c f 具体含义如下: i: 大小写不区分. f: 只替换第一个出现被替换字符串的字符串 r: XY是正则表达式 m: Multi-line mode for regular expressions. In multi-line mode the expressions and $ match just after or just before, respectively, a line terminator or the end of the string. By default these expressions only match at the beginning and the
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025湖北襄阳市中医医院(襄阳市中医药研究所)招聘急需专业技术人才55人模拟试卷附答案详解
- 2025江苏南通市崇川区卫生系统面向毕业生招聘备案制高层次卫生人才15人考前自测高频考点模拟试题及答案详解(新)
- 2025合肥市口腔医院招聘工作人员81人模拟试卷及一套参考答案详解
- 百合的种植技术
- 2025年绍兴市上虞区中医医院医共体公开招聘编外人员46人考前自测高频考点模拟试题及答案详解(各地真题)
- 2025湖南省永州市双牌县引进急需紧缺人才(医卫岗25人)考前自测高频考点模拟试题及答案详解(名校卷)
- 2025广东云浮市罗定市市场监督管理局招用青年见习人员2人考前自测高频考点模拟试题(含答案详解)
- 2025年中国户外面罩行业市场分析及投资价值评估前景预测报告
- 2025春季内蒙古包头市九原区机关事业单位引进高层次和紧缺急需人才27人考前自测高频考点模拟试题及答案详解(历年真题)
- 2025年甘肃陇南事业单位预计将于5月中旬发布考前自测高频考点模拟试题及参考答案详解一套
- T-CPQS C010-2024 鉴赏收藏用潮流玩偶及类似用途产品
- 盐酸右美托咪定鼻喷雾剂-临床用药解读
- 电子工业出版社四年级下册信息技术教学计划
- 电泳工艺卡样本
- 食管炎的护理查房
- TNAHIEM 96-2023 静脉用药调配中心建设与配置标准
- 数字化教学资源开发与应用
- 高一生物考试背诵内容
- 新消费者权益保护法
- 实验 曝气系统中氧的转移
- 基础医学概论
评论
0/150
提交评论