freemarker中文api手册

freemarker中文api手册

ID:35200159

大小:309.50 KB

页数:30页

时间:2019-03-21

上传者:U-25932
freemarker中文api手册_第1页
freemarker中文api手册_第2页
freemarker中文api手册_第3页
freemarker中文api手册_第4页
freemarker中文api手册_第5页
资源描述:

《freemarker中文api手册》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

 FreeMarker概述l        FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写l        FreeMarker被设计用来生成HTMLWeb页面,特别是基于MVC模式的应用程序l        虽然FreeMarker具有一些编程的能力,但通常由Java程序准备要显示的数据,由FreeMarker生成页面,通过模板显示准备的数据(如下图)l        FreeMarker不是一个Web应用框架,而适合作为Web应用框架一个组件l        FreeMarker与容器无关,因为它并不知道HTTP或Servlet;FreeMarker同样可以应用于非Web应用程序环境l        FreeMarker更适合作为Model2框架(如Struts)的视图组件,你也可以在模板中使用JSP标记库l        FreeMarker是免费的  1、通用目标l        能够生成各种文本:HTML、XML、RTF、Java源代码等等l        易于嵌入到你的产品中:轻量级;不需要Servlet环境l        插件式模板载入器:可以从任何源载入模板,如本地文件、数据库等等l        你可以按你所需生成文本:保存到本地文件;作为Email发送;从Web应用程序发送它返回给Web浏览器 2、强大的模板语言l        所有常用的指令:include、if/elseif/else、循环结构l        在模板中创建和改变变量l        几乎在任何地方都可以使用复杂表达式来指定值l        命名的宏,可以具有位置参数和嵌套内容l        名字空间有助于建立和维护可重用的宏库,或者将一个大工程分成模块,而不必担心名字冲突l        输出转换块:在嵌套模板片段生成输出时,转换HTML转义、压缩、语法高亮等等;你可以定义自己的转换 3、通用数据模型l        FreeMarker不是直接反射到Java对象,Java 对象通过插件式对象封装,以变量方式在模板中显示l        你可以使用抽象(接口)方式表示对象(JavaBean、XML文档、SQL查询结果集等等),告诉模板开发者使用方法,使其不受技术细节的打扰 4、为Web准备l        在模板语言中内建处理典型Web相关任务(如HTML转义)的结构l        能够集成到Model2Web应用框架中作为JSP的替代l        支持JSP标记库l        为MVC模式设计:分离可视化设计和应用程序逻辑;分离页面设计员和程序员 5、智能的国际化和本地化l        字符集智能化(内部使用UNICODE)l        数字格式本地化敏感l        日期和时间格式本地化敏感l        非US字符集可以用作标识(如变量名)l        多种不同语言的相同模板 6、强大的XML处理能力l        <#recurse>和<#visit>指令(2.3版本)用于递归遍历XML树l        在模板中清楚和直觉的访问XML对象模型 FreeMarker设计指南(1)   1、快速入门(1)模板+数据模型=输出l        FreeMarker基于设计者和程序员是具有不同专业技能的不同个体的观念l        他们是分工劳动的:设计者专注于表示——创建HTML文件、图片、Web页面的其它可视化方面;程序员创建系统,生成设计页面要显示的数据l        经常会遇到的问题是:在Web页面(或其它类型的文档)中显示的信息在设计页面时是无效的,是基于动态数据的l        在这里,你可以在HTML(或其它要输出的文本)中加入一些特定指令,FreeMarker会在输出页面给最终用户时,用适当的数据替代这些代码l        下面是一个例子:Welcome!

Welcome${user}!

Ourlatestproduct:${latestProduct.name}! l        这个例子是在简单的HTML中加入了一些由${…}包围的特定代码,这些特定代码是FreeMarker的指令,而包含FreeMarker的指令的文件就称为模板(Template)l        至于user、latestProduct.url和latestProduct.name来自于数据模型(datamodel)l        数据模型由程序员编程来创建,向模板提供变化的信息,这些信息来自于数据库、文件,甚至于在程序中直接生成l        模板设计者不关心数据从那儿来,只知道使用已经建立的数据模型l        下面是一个可能的数据模型:(root)|+-user="BigJoe"|+-latestProduct|+-url="products/greenmouse.html"|+-name="greenmouse"l        数据模型类似于计算机的文件系统,latestProduct可以看作是目录,而user、url和name看作是文件,url和name文件位于latestProduct目录中(这只是一个比喻,实际并不存在)l        当FreeMarker将上面的数据模型合并到模板中,就创建了下面的输出:Welcome!

WelcomeBigJoe!

Ourlatestproduct: greenmouse! (2)数据模型l        典型的数据模型是树型结构,可以任意复杂和深层次,如下面的例子:(root)|+-animals|||+-mouse|||||+-size="small"|||||+-price=50|||+-elephant|||||+-size="large"|||||+-price=5000|||+-python|||+-size="medium"|||+-price=4999|+-test="Itisatest"|+-whatnot |+-because="don'tknow"l        类似于目录的变量称为hashes,包含保存下级变量的唯一的查询名字l        类似于文件的变量称为scalars,保存单值l        scalars保存的值有两种类型:字符串(用引号括起,可以是单引号或双引号)和数字(不要用引号将数字括起,这会作为字符串处理)l        对scalars的访问从root开始,各部分用“.”分隔,如animals.mouse.pricel        另外一种变量是sequences,和hashes类似,只是不使用变量名字,而使用数字索引,如下面的例子:(root)|+-animals|||+-(1st)|||||+-name="mouse"|||||+-size="small"|||||+-price=50|||+-(2nd)|||||+-name="elephant"|||||+-size="large"|||||+-price=5000|||+-(3rd)|||+-name="python" |||+-size="medium"|||+-price=4999|+-whatnot|+-fruits|+-(1st)="orange"|+-(2nd)="banana"l        这种对scalars的访问使用索引,如animals[0].name(3)模板l        在FreeMarker模板中可以包括下面三种特定部分:Ø        ${…}:称为interpolations,FreeMarker会在输出时用实际值进行替代Ø        FTL标记(FreeMarker模板语言标记):类似于HTML标记,为了与HTML标记区分,用#开始(有些以@开始,在后面叙述)Ø        注释:包含在<#--和-->(而不是)之间l        下面是一些使用指令的例子:Ø        if指令<#ifanimals.python.pricePythonsarecheaperthanelephantstoday.<#else>Pythonsarenotcheaperthanelephantstoday. Ø        list指令

Wehavetheseanimals:NamePrice<#listanimalsasbeing>${being.name}${being.price}Euros  输出为:

Wehavetheseanimals:NamePricemouse50Euroselephant5000Eurospython4999Euros Ø        include指令Testpage

Testpage

Blahblah...<#include"/copyright_footer.html"> Ø        一起使用指令

Wehavetheseanimals:NamePrice<#listanimalsasbeing><#ifbeing.size="large">${being.name}<#ifbeing.size="large"> ${being.price}Euros FreeMarker设计指南(3)   3、模板(1)整体结构l        模板使用FTL(FreeMarker模板语言)编写,是下面各部分的一个组合:Ø        文本:直接输出Ø        Interpolation:由${和},或#{和}来限定,计算值替代输出Ø        FTL标记:FreeMarker指令,和HTML标记类似,名字前加#予以区分,不会输出Ø        注释:由<#--和-->限定,不会输出l        下面是以一个具体模板例子:[BR][BR]  Welcome![BR][BR][BR]  <#-- Greet the user with his/her name -->[BR]  

Welcome ${user}!

[BR]  

We have these animals:[BR]  

    [BR]  <#list animals as being>[BR]    
  • ${being.name} for ${being.price}Euros[BR]  [BR]  
[BR] [BR] l        [BR]是用于换行的特殊字符序列l        注意事项:Ø        FTL区分大小写,所以list是正确的FTL指令,而List不是;${name}和${NAME}是不同的Ø        Interpolation只能在文本中使用Ø        FTL标记不能位于另一个FTL标记内部,例如:<#if<#include'foo'>='bar'>...Ø        注释可以位于FTL标记和Interpolation内部,如下面的例子:

Welcome ${user<#--Thenameofuser-->}!

[BR]

We have these animals:[BR]

    [BR]<#list <#--somecomment...-->animalsas <#--again...-->being>[BR]... Ø        多余的空白字符会在模板输出时移除(2)指令l        在FreeMarker中,使用FTL标记引用指令l        有三种FTL标记,这和HTML标记是类似的:Ø        开始标记:<#directivenameparameters>Ø        结束标记:Ø        空内容指令标记:<#directivenameparameters/>l        有两种类型的指令:预定义指令和用户定义指令l        用户定义指令要使用@替换#,如<@mydirective>...(会在后面讲述)l        FTL标记不能够交叉,而应该正确的嵌套,如下面的代码是错误的:
      <#listanimalsasbeing>
    • ${being.name}for${being.price}Euros<#ifuse="BigJoe">(exceptforyou)<#--WRONG!-->
     l        如果使用不存在的指令,FreeMarker不会使用模板输出,而是产生一个错误消息l        FreeMarker会忽略FTL标记中的空白字符,如下面的例子: <#list[BR]  animals       as[BR]     being[BR]>[BR]${being.name} for ${being.price} Euros[BR] l        但是,<、a&{{xCode4位16进制Unicode代码n        有一类特殊的字符串称为raw字符串,被认为是纯文本,其中的和{等不具有特殊含义,该类字符串在引号前面加r,下面是一个例子:${r"${foo}"}${r"C:foobar"} 输出的结果是:${foo}C:foobar Ø        数字n        直接输入,不需要引号n        精度数字使用“.”分隔,不能使用分组符号n        目前版本不支持科学计数法,所以“1E3”是错误的n        不能省略小数点前面的0,所以“.5”是错误的n        数字8、+8、08和8.00都是相同的Ø        布尔值n        true和false,不使用引号Ø        序列n        由逗号分隔的子变量列表,由方括号限定,下面是一个例子:<#list["winter","spring","summer","autumn"]asx>${x} 输出的结果是:winterspringsummerautumnn        列表的项目是表达式,所以可以有下面的例子:[2+2,[1,2,3,4],"whatnot"]n        可以使用数字范围定义数字序列,例如2..5等同于[2,3,4,5],但是更有效率,注意数字范围没有方括号n        可以定义反递增的数字范围,如5..2Ø        散列(hash) n        由逗号分隔的键/值列表,由大括号限定,键和值之间用冒号分隔,下面是一个例子:{"name":"green mouse","price":150}n        键和值都是表达式,但是键必须是字符串l        获取变量Ø        顶层变量:${variable},变量名只能是字母、数字、下划线、$、@和#的组合,且不能以数字开头Ø        从散列中获取数据n        可以使用点语法或方括号语法,假设有下面的数据模型:(root)|+-book|||+-title="Breedinggreenmouses"|||+-author|||+-name="JuliaSmith"|||+-info="Biologist,1923-1985,Canada"|+-test="title" 下面都是等价的:book.author.namebook["author"].namebook.author.["name"]book["author"]["name"]n        使用点语法,变量名字有顶层变量一样的限制,但方括号语法没有该限制,因为名字是任意表达式的结果Ø        从序列获得数据:和散列的方括号语法语法一样,只是方括号中的表达式值必须是数字;注意:第一个项目的索引是0Ø        序列片断:使用[startIndex..endIndex]语法,从序列中获得序列片断(也是序列);startIndex和endIndex是结果为数字的表达式Ø        特殊变量:FreeMarker内定义变量,使用.variablename语法访问l        字符串操作 Ø        Interpolation(或连接操作)n        可以使用${..}(或#{..})在文本部分插入表达式的值,例如:${"Hello${user}!"}${"${user}${user}${user}${user}"} n        可以使用+操作符获得同样的结果${"Hello"+user+"!"}${user+user+user+user}n        ${..}只能用于文本部分,下面的代码是错误的:<#if${isBig}>Wow!<#if"${isBig}">Wow!应该写成:<#ifisBig>Wow!Ø        子串n        例子(假设user的值为“BigJoe”):${user[0]}${user[4]}${user[1..4]}结果是(注意第一个字符的索引是0):BJigJ l        序列操作Ø        连接操作:和字符串一样,使用+,下面是一个例子:<#list["Joe","Fred"]+["Julia","Kate"]asuser>-${user}输出结果是:-Joe-Fred-Julia-Katel        散列操作Ø        连接操作:和字符串一样,使用+,如果具有相同的key,右边的值替代左边的值,例如:<#assignages={"Joe":23,"Fred":25}+{"Joe":30,"Julia":18}>-Joeis${ages.Joe} -Fredis${ages.Fred}-Juliais${ages.Julia} 输出结果是:-Joeis30-Fredis25-Juliais18 l        算术运算Ø        +、-、×、/、%,下面是一个例子:${x*x-100}${x/2}${12%10}输出结果是(假设x为5):-752.52 Ø        操作符两边必须是数字,因此下面的代码是错误的:${3*"5"}<#--WRONG!--> Ø        使用+操作符时,如果一边是数字,一边是字符串,就会自动将数字转换为字符串,例如:${3+"5"} 输出结果是:35Ø        使用内建的int(后面讲述)获得整数部分,例如:${(x/2)?int}${1.1?int}${1.999?int}${-1.1?int}${-1.999?int}输出结果是(假设x为5):211-1 -1l        比较操作符Ø        使用=(或==,完全相等)测试两个值是否相等,使用!=测试两个值是否不相等Ø        =和!=两边必须是相同类型的值,否则会产生错误,例如<#if1="1">会引起错误Ø        Freemarker是精确比较,所以对"x"、"x"和"X"是不相等的Ø        对数字和日期可以使用<、<=、>和>=,但不能用于字符串Ø        由于Freemarker会将>解释成FTL标记的结束字符,所以对于>和>=可以使用括号来避免这种情况,例如<#if(x>y)>Ø        另一种替代的方法是,使用lt、lte、gt和gte来替代<、<=、>和>=l        逻辑操作符Ø        &&(and)、||(or)、!(not),只能用于布尔值,否则会产生错误Ø        例子:<#ifx<12&&color="green">Wehavelessthan12things,andtheyaregreen.<#if!hot><#--herehotmustbeaboolean-->It'snothot. l        内建函数Ø        内建函数的用法类似访问散列的子变量,只是使用“?”替代“.”,下面列出常用的一些函数Ø        字符串使用的:n        html:对字符串进行HTML编码n        cap_first:使字符串第一个字母大写n        lower_case:将字符串转换成小写n        upper_case:将字符串转换成大写n        trim:去掉字符串前后的空白字符Ø        序列使用的:n        size:获得序列中元素的数目Ø        数字使用的:n        int:取得数字的整数部分(如-1.9?int的结果是-1)Ø        例子(假设test保存字符串"Tom&Jerry"):${test?html}${test?upper_case?html}输出结果是:Tom&JerryTOM&JERRY l        操作符优先顺序 操作符组操作符后缀[subvarName][subStringRange].(methodParams)一元+expr、-expr、!内建?乘法*、/、%加法+、-关系<、>、<=、>=(lt、lte、gt、gte)相等==(=)、!=逻辑and&&逻辑or||数字范围..(4)Interpolationl        Interpolation有两种类型:Ø        通用Interpolation:${expr}Ø        数字Interpolation:#{expr}或#{expr;format}l        注意:Interpolation只能用于文本部分l        通用InterpolationØ        插入字符串值:直接输出表达式结果Ø        插入数字值:根据缺省格式(由#setting指令设置)将表达式结果转换成文本输出;可以使用内建函数string格式化单个Interpolation,下面是一个例子:<#settingnumber_format="currency"/><#assignanswer=42/>${answer}${answer?string}<#--thesameas${answer}-->${answer?string.number}${answer?string.currency}${answer?string.percent} 输出结果是:$42.00$42.0042$42.004,200%Ø        插入日期值:根据缺省格式(由#setting 指令设置)将表达式结果转换成文本输出;可以使用内建函数string格式化单个Interpolation,下面是一个使用格式模式的例子:${lastUpdated?string("yyyy-MM-ddHH:mm:sszzzz")}${lastUpdated?string("EEE,MMMd,''yy")}${lastUpdated?string("EEEE,MMMMdd,yyyy,hh:mm:ssa'('zzz')'")} 输出的结果类似下面的格式:2003-04-0821:24:44PacificDaylightTimeTue,Apr8,'03Tuesday,April08,2003,09:24:44PM(PDT)Ø        插入布尔值:根据缺省格式(由#setting指令设置)将表达式结果转换成文本输出;可以使用内建函数string格式化单个Interpolation,下面是一个例子:<#assignfoo=true/>${foo?string("yes","no")}输出结果是:yesl        数字Interpolation的#{expr;format}形式可以用来格式化数字,format可以是:Ø        mX:小数部分最小X位Ø        MX:小数部分最大X位Ø        例子:<#--IfthelanguageisUSEnglishtheoutputis:--><#assignx=2.582/><#assigny=4/>#{x;M2}<#--2.58-->#{y;M2}<#--4-->#{x;m1}<#--2.6-->#{y;m1}<#--4.0-->#{x;m1M2}<#--2.58-->#{y;m1M2}<#--4.0--> FreeMarker设计指南(4)    4、杂项(1)用户定义指令l        宏和变换器变量是两种不同类型的用户定义指令,它们之间的区别是宏是在模板中使用macro指令定义,而变换器是在模板外由程序定义,这里只介绍宏l        基本用法Ø        宏是和某个变量关联的模板片断,以便在模板中通过用户定义指令使用该变量,下面是一个例子:<#macrogreet>HelloJoe! Ø        作为用户定义指令使用宏变量时,使用@替代FTL标记中的#<@greet>Ø        如果没有体内容,也可以使用:<@greet/>l        参数Ø        在macro指令中可以在宏变量之后定义参数,如:<#macrogreetperson>Hello${person}! Ø        可以这样使用这个宏变量:<@greetperson="Fred"/>and<@greetperson="Batman"/> 输出结果是:HelloFred!andHelloBatman! Ø        宏的参数是FTL表达式,所以下面的代码具有不同的意思:<@greetperson=Fred/>Ø        这意味着将Fred变量的值传给person参数,该值不仅是字符串,还可以是其它类型,甚至是复杂的表达式Ø        宏可以有多参数,下面是一个例子:<#macrogreetpersoncolor>Hello${person}! Ø        可以这样使用该宏变量:<@greetperson="Fred"color="black"/>  Ø        其中参数的次序是无关的,因此下面是等价的:<@greetcolor="black"person="Fred"/>Ø        只能使用在macro指令中定义的参数,并且对所有参数赋值,所以下面的代码是错误的:<@greetperson="Fred"color="black"background="green"/><@greetperson="Fred"/>Ø        可以在定义参数时指定缺省值,如:<#macrogreetpersoncolor="black">Hello${person}! Ø        这样<@greetperson="Fred"/>就正确了Ø        宏的参数是局部变量,只能在宏定义中有效l        嵌套内容Ø        用户定义指令可以有嵌套内容,使用<#nested>指令执行指令开始和结束标记之间的模板片断Ø        例子:<#macroborder><#nested> 这样使用该宏变量:<@border>Theborderedtext输出结果:Theborderedtext Ø        <#nested>指令可以被多次调用,例如:<#macrodo_thrice><#nested><#nested><#nested> <@do_thrice>Anything. 输出结果:Anything.Anything.Anything. Ø        嵌套内容可以是有效的FTL,下面是一个有些复杂的例子:<@border>
      <@do_thrice>
    • <@greetperson="Joe"/>
     输出结果:
    • HelloJoe! 
    • HelloJoe! 
    • HelloJoe! 
      Ø        宏定义中的局部变量对嵌套内容是不可见的,例如:<#macrorepeatcount><#localy="test"><#list1..countasx> ${y}${count}/${x}:<#nested><@repeatcount=3>${y?default("?")}${x?default("?")}${count?default("?")}输出结果:test3/1:???test3/2:???test3/3:???Ø         l        在宏定义中使用循环变量Ø        用户定义指令可以有循环变量,通常用于重复嵌套内容,基本用法是:作为nested指令的参数传递循环变量的实际值,而在调用用户定义指令时,在<@…>开始标记的参数后面指定循环变量的名字Ø        例子:<#macrorepeatcount><#list1..countasx><#nestedx,x/2,x==count><@repeatcount=4;c,halfc,last>${c}.${halfc}<#iflast>Last! 输出结果:1.0.52.13.1.54.2Last! Ø        指定的循环变量的数目和用户定义指令开始标记指定的不同不会有问题n        调用时少指定循环变量,则多指定的值不可见n        调用时多指定循环变量,多余的循环变量不会被创建(2)在模板中定义变量l        在模板中定义的变量有三种类型: Ø        plain变量:可以在模板的任何地方访问,包括使用include指令插入的模板,使用assign指令创建和替换Ø        局部变量:在宏定义体中有效,使用local指令创建和替换Ø        循环变量:只能存在于指令的嵌套内容,由指令(如list)自动创建;宏的参数是局部变量,而不是循环变量l        局部变量隐藏(而不是覆盖)同名的plain变量;循环变量隐藏同名的局部变量和plain变量,下面是一个例子:<#assignx="plain">1.${x}<#--weseetheplainvar.here--><@test/>6.${x}<#--thevalueofplainvar.wasnotchanged--><#list["loop"]asx>7.${x}<#--nowtheloopvar.hidestheplainvar.--><#assignx="plain2"><#--replacetheplainvar,hidingdoesnotmaterhere-->8.${x}<#--itstillhidestheplainvar.-->9.${x}<#--thenewvalueofplainvar.--> <#macrotest>2.${x}<#--westillseetheplainvar.here--><#localx="local">3.${x}<#--nowthelocalvar.hidesit--><#list["loop"]asx>4.${x}<#--nowtheloopvar.hidesthelocalvar.-->5.${x}<#--nowweseethelocalvar.again--> 输出结果:1.plain2.plain3.local4.loop 5.local6.plain7.loop8.loop9.plain2 l        内部循环变量隐藏同名的外部循环变量,如:<#list["loop1"]asx>${x}<#list["loop2"]asx>${x}<#list["loop3"]asx>${x}${x}${x}输出结果:loop1loop2loop3loop2loop1 l        模板中的变量会隐藏(而不是覆盖)数据模型中同名变量,如果需要访问数据模型中的同名变量,使用特殊变量global,下面的例子假设数据模型中的user的值是BigJoe:<#assignuser="JoeHider">${user}<#--prints:JoeHider-->${.globals.user}<#--prints:BigJoe--> (3)名字空间l        通常情况,只使用一个名字空间,称为主名字空间 l        为了创建可重用的宏、变换器或其它变量的集合(通常称库),必须使用多名字空间,其目的是防止同名冲突l        创建库Ø        下面是一个创建库的例子(假设保存在lib/my_test.ftl中):<#macrocopyrightdate>

    Copyright(C)${date}JuliaSmith.Allrightsreserved.
    Email:${mail}

     <#assignmail="jsmith@acme.com"> Ø        使用import指令导入库到模板中,Freemarker会为导入的库创建新的名字空间,并可以通过import指令中指定的散列变量访问库中的变量:<#import"/lib/my_test.ftl"asmy><#assignmail="fred@acme.com"><@my.copyrightdate="1999-2002"/>${my.mail}${mail} 输出结果:

    Copyright(C)1999-2002JuliaSmith.Allrightsreserved.
    Email:jsmith@acme.com

    jsmith@acme.comfred@acme.com 可以看到例子中使用的两个同名变量并没有冲突,因为它们位于不同的名字空间l        可以使用assign指令在导入的名字空间中创建或替代变量,下面是一个例子:<#import"/lib/my_test.ftl"asmy>${my.mail}<#assignmail="jsmith@other.com"inmy>${my.mail} l        输出结果:jsmith@acme.comjsmith@other.com l        数据模型中的变量任何地方都可见,也包括不同的名字空间,下面是修改的库:<#macrocopyrightdate>

    Copyright(C)${date}${user}.Allrightsreserved.

    <#assignmail="${user}@acme.com"> l        假设数据模型中的user变量的值是Fred,则下面的代码:<#import"/lib/my_test.ftl"asmy><@my.copyrightdate="1999-2002"/>${my.mail} l        输出结果:

    Copyright(C)1999-2002Fred.Allrightsreserved.

    Fred@acme.com  Freemarker-几个比较实用的例子--                                      用Freemarker做模本语言有一段时间了,列出几个和JSP或者Velocity相比起来比较方便的用途,目的是引诱更多的人跳上Freemarker这个贼船,1.String内置的JavaScript转换:js_string用途:用于JavaScript转义,转换',",换行等特殊字符模板: 输出:2.内置的默认值处理:default用途:用于处理默认值模本:User:${userLogin.name?default("Anonymous")}${(employee.department.manager.name)?default(" ")}输出:User:Anonymous  注,可以对整个对象树加上(),再用内置处理器这种方便的做法,偶也是最近刚学会的,以前一直用很傻的方法做.....3.Sequence内置的计数器:xxx_index用途:显示序号模板:<#listemployeesase>${e_index}.${e.name}输出:1.Readonly2.Robbin4.Sequence内置的分段器:chunk用途:某些比较BT的排版需求模板: <#assignseq=['a','b','c','d','e','f','g','h','i','j']><#listseq?chunk(4)asrow>
    • <#listrowascell>${cell}
    <#listseq?chunk(4,'-')asrow><#listrowascell>${cell}输出:
    • a
    • b
    • c
    • d
    • e
    • f
    • g
    • h
    • i
    • j
    abcdef ghij--

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭