《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 下面是一个例子:
Ourlatestproduct: Ourlatestproduct: Wehavetheseanimals: Wehavetheseanimals: Blahblah...<#include"/copyright_footer.html"> Ø 一起使用指令 Wehavetheseanimals: We have these animals:[BR] We have these animals:[BR] Copyright(C)${date}JuliaSmith.Allrightsreserved. Copyright(C)1999-2002JuliaSmith.Allrightsreserved. Copyright(C)${date}${user}.Allrightsreserved. Copyright(C)1999-2002Fred.Allrightsreserved. 此文档下载收益归作者所有WelcomeBigJoe!
Name Price<#listanimalsasbeing> ${being.name} ${being.price}Euros#list> 输出为: Name Price mouse 50Euros elephant 5000Euros python 4999Euros Ø include指令 Testpage
Name Price<#listanimalsasbeing> <#ifbeing.size="large">#if>${being.name}<#ifbeing.size="large">#if> ${being.price}Euros#list> FreeMarker设计指南(3) 3、模板(1)整体结构l 模板使用FTL(FreeMarker模板语言)编写,是下面各部分的一个组合:Ø 文本:直接输出Ø Interpolation:由${和},或#{和}来限定,计算值替代输出Ø FTL标记:FreeMarker指令,和HTML标记类似,名字前加#予以区分,不会输出Ø 注释:由<#--和-->限定,不会输出l 下面是以一个具体模板例子:[BR][BR] #macro> 这样使用该宏变量:<@border>Theborderedtext@border>输出结果:Welcome ${user}!
[BR] [BR] <#list animals as being>[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][BR]<#list <#--somecomment...-->animalsas <#--again...-->being>[BR]... Ø 多余的空白字符会在模板输出时移除(2)指令l 在FreeMarker中,使用FTL标记引用指令l 有三种FTL标记,这和HTML标记是类似的:Ø 开始标记:<#directivenameparameters>Ø 结束标记:#directivename>Ø 空内容指令标记:<#directivenameparameters/>l 有两种类型的指令:预定义指令和用户定义指令l 用户定义指令要使用@替换#,如<@mydirective>...@mydirective>(会在后面讲述)l FTL标记不能够交叉,而应该正确的嵌套,如下面的代码是错误的:
<#listanimalsasbeing>
l 如果使用不存在的指令,FreeMarker不会使用模板输出,而是产生一个错误消息l FreeMarker会忽略FTL标记中的空白字符,如下面的例子: <#list[BR] animals as[BR] being[BR]>[BR]${being.name} for ${being.price} Euros[BR]#list > l 但是,<、和指令之间不允许有空白字符(3)表达式l 直接指定值Ø 字符串n 使用单引号或双引号限定n 如果包含特殊字符需要转义,如下面的例子:${"It's"quoted"andthisisabackslash:\"} ${'It's"quoted"andthisisabackslash:\'} 输出结果是:It's"quoted"andthisisabackslash: It's"quoted"andthisisabackslash: n 下面是支持的转义序列:转义序列含义"双引号(u0022)'单引号(u0027)\反斜杠(u005C) 换行(u000A)rReturn(u000D)tTab(u0009)bBackspace(u0008)fFormfeed(u000C) l<#nested> Ø <#nested>指令可以被多次调用,例如:<#macrodo_thrice><#nested><#nested><#nested>#macro> <@do_thrice>Anything.@do_thrice> 输出结果:Anything.Anything.Anything. Ø 嵌套内容可以是有效的FTL,下面是一个有些复杂的例子:<@border>Theborderedtext <@do_thrice>
@border> 输出结果: Ø 宏定义中的局部变量对嵌套内容是不可见的,例如:<#macrorepeatcount><#localy="test"><#list1..countasx> ${y}${count}/${x}:<#nested>#list>#macro><@repeatcount=3>${y?default("?")}${x?default("?")}${count?default("?")}@repeat>输出结果:test3/1:???test3/2:???test3/3:???Ø l 在宏定义中使用循环变量Ø 用户定义指令可以有循环变量,通常用于重复嵌套内容,基本用法是:作为nested指令的参数传递循环变量的实际值,而在调用用户定义指令时,在<@…>开始标记的参数后面指定循环变量的名字Ø 例子:<#macrorepeatcount><#list1..countasx><#nestedx,x/2,x==count>#list>#macro><@repeatcount=4;c,halfc,last>${c}.${halfc}<#iflast>Last!#if>@repeat> 输出结果: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.-->#list>9.${x}<#--thenewvalueofplainvar.--> <#macrotest>2.${x}<#--westillseetheplainvar.here--><#localx="local">3.${x}<#--nowthelocalvar.hidesit--><#list["loop"]asx>4.${x}<#--nowtheloopvar.hidesthelocalvar.-->#list>5.${x}<#--nowweseethelocalvar.again-->#macro> 输出结果:1.plain2.plain3.local4.loop 5.local6.plain7.loop8.loop9.plain2 l 内部循环变量隐藏同名的外部循环变量,如:<#list["loop1"]asx>${x}<#list["loop2"]asx>${x}<#list["loop3"]asx>${x}#list>${x}#list>${x}#list>输出结果:loop1loop2loop3loop2loop1 l 模板中的变量会隐藏(而不是覆盖)数据模型中同名变量,如果需要访问数据模型中的同名变量,使用特殊变量global,下面的例子假设数据模型中的user的值是BigJoe:<#assignuser="JoeHider">${user}<#--prints:JoeHider-->${.globals.user}<#--prints:BigJoe--> (3)名字空间l 通常情况,只使用一个名字空间,称为主名字空间 l 为了创建可重用的宏、变换器或其它变量的集合(通常称库),必须使用多名字空间,其目的是防止同名冲突l 创建库Ø 下面是一个创建库的例子(假设保存在lib/my_test.ftl中):<#macrocopyrightdate>
Email:${mail}
Email:jsmith@acme.com${(employee.department.manager.name)?default(" ")} 输出:User:Anonymous 注,可以对整个对象树加上(),再用内置处理器这种方便的做法,偶也是最近刚学会的,以前一直用很傻的方法做.....3.Sequence内置的计数器:xxx_index用途:显示序号模板:<#listemployeesase>${e_index}.${e.name}#list>输出:1.Readonly2.Robbin4.Sequence内置的分段器:chunk用途:某些比较BT的排版需求模板: <#assignseq=['a','b','c','d','e','f','g','h','i','j']><#listseq?chunk(4)asrow>
#list><#listseq?chunk(4,'-')asrow> #list>输出:<#listrowascell>${cell}#list> a b c d e f g h i j - -
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
最近更新
更多
大家都在看
近期热门
举报
文档下载
请先输入手机号