freeMarker
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
容器
这些值存在的目的是为了包含其他变量,它们仅仅作为容器。被包含的变量 通常是子变 量。容器的类型有: 哈希表(HashMap): • 每个子变量都可以通过一个唯一的名称来查找,这个名称是不受限制的 字符串。哈希表并不确定其中子变量的顺序,也就是说没有第一个变量 ,第二个变量 这样的说法,变量仅仅是通过名称来访问的。(就像Java 语言中的 HashMap一样,是实现了Hash算法的Map,不记录内部元素的顺序,仅仅 通过名称来访问。)
子程序
方法和函数
一个值是方法或函数的时候那么它就可以计算其他值,结果取决于传递给它 的参数。 这部分是对程序员来说的:方法/函数是第一类值,就像函数化的编程语言 。也就是说 函数/方法也可以是其他函数或方法的参数或者返回值,并可以把它们定义成 变量。
输出
那么方法和函数有什么区别呢?这是模板作者所关心的,它们没有关 系,但也不是一点关系都没有。方法是来自于数据模型(它们反射了 Java 对象的方法),而函数是定义在模板内的(使用了函数指令-这 也是高级主题),但二者可以用同一种方式来使用。
输出结果: <html> <head> <title>Welcome!</title> </head> <body> <h1>Welcome Big Joe!</h1> <p>Our latest product: <a href="products/greenmouse.html">green mouse</a>! </body> </html>
子程序
自定义指令
用户自定义指令(换句话说,就是FreeMarker的标签)这种类型的值也是一 种子程序,一种可以复用的模板代码段。
这部分是对程序员来说的:用户自定义指令(比如宏),也是第一类值, 就像函数/方法一样。
函数/方法或自定义指令区别
这部分内容也是对高级用户来说的(如果你还不能理解可以先忽略它)。如果要使用 函数/方法或自定义指令去实现一些东西的时候,二者之间的选择是两难的。按经验来 说, 如果能够实现,请先用自定义指令而不要用函数/方法。指令的特征如下: 输出(返回值)的是标记(HTML,XML等)。主要原因是函数的返回结果可以自 动进行XML转义(这是因为${…}的特性),而用户自定义指令的输出则不是(这是 因为<@...>的特性所致,它的输出假定为是标记,因此就不再转义)。 副作用也是很重要的一点,它没有返回值。例如一个指令的目的是往服务器日志中 添加一个条目。(事实上你不能得到自定义指令的返回值,但有些反馈的类型是有 可能设置非本地变量的) 会进行流程的控制(就像list 或if 指令那样),但是不能在函数/方法上这么做。 在模板中,FreeMarker不知道的Java 对象的方法通常是可以作为方法来使用的,而 不用考虑Java 对象方法本身的特性,因为在这里没有其他的选择。
Switch指令
<#switch value> <#case refValue1> ... <#break> <#case refValue2> ... <#break> ... <#case refValueN> ... <#break> <#default> ... </#switch> 例子: <#switch being.size> <#case "small"> This will be processed if it is small <#break> <#case "medium"> This will be processed if it is medium <#break> <#case "large"> This will be processed if it is large <#break> <#default> This will be processed if it is neither </#switch>
应用实例
Java 对象 Request.setAttribute(“user”,user); latestProduct.setUrl(“products/greenmouse.html”); latestProduct.setName(“Big Joe”); Request.setAttribute(“latestProduct”, latestProduct);
Freemaker语法
${…}:
• FreeMarker会在输出时用实际值进行替代
FTL标记(FreeMarker模板语言标记):
• 类似于HTML标记,为了与HTML标记区分,用#开始(有些以@开始)
注释:
• 包含在<#--和-->(而不是<!--和-->)之间
Freemaker常用指令
FreeMarker
优秀的模板引擎
主题
一、 FreeMarke介绍(应用实例/语法)
二、使用过程中需要注意的事项
三、FX系统中对FreeMarker的使用讲解
FreeMarker特性
使用纯Java编写 能够生成各种文本:HTML、XML、RTF、Java 源代码等 可作为一个组件用于MVC模式的view层 数据+模板=输出
if, else, elseif switch, case, default, break list, break include import
noparse compress escape, noescape
assign global local setting User-defined directive (<@...>) macro, nested, return
数据类型
支持的类型有: 标量: 字符串 数字 布尔值 日期 容器: 哈希表 序列 集 子程序: 方法和函数 用户自定义指令 其它/很少使用: 节点(节点变量代表树状结构中的一个节点,通常是配合XML格式来处理的,不介绍)
function, return flush stop ftl t, lt, rt nt attempt, recover visit, recurse, fallback
If指令
<#if condition> ... [<#elseif condition2> ... <#elseif condition3> ... ... <#else> ... ] </#if> 例子: <#if x = 1> x is 1 <#elseif x = 2> x is 2 <#elseif x = 3> x is 3 <#elseif x = 4> x is 4 <#else> x is not 1 nor 2 nor 3 nor 4 </#if>
数字:
• 例如:产品的价格。整数和非整数是不区分的,只有单一的数字类型。比如
使用了计算器,计算3/2的结果是1.5而不是1。 如果要在模板中直接给出数字的值,可以这么来写:150,ຫໍສະໝຸດ Baidu90.05,或者0.001。 (关于语法的更多细节请看后续章节)
标量
布尔值:布尔值代表了逻辑上的对或错(是或否)。例如:用户到底是否登录了。 典型的应用是使用布尔值作为if指令的条件,比如<#if loggedIn>…</#if> 或者<#if price==0>…</#if>,后面这个price==0部分的结果就是布 尔值。 在模板中可以使用保留字true和false 来指定布尔值。 日期:日期变量可以存储和日期/时间相关的数据。一共有三种变化。 精确到天的日期(通常指的是“日期”),比如April 4, 2003 每天的时间(不包括日期部分),比如10:19:18 PM。时间的存储精确到毫秒。 日期-时间(也称作“时间戳”),比如April 4, 2003 10:19:18 PM。时间部分的 存储精确到毫秒。 不幸的是,受到Java 平台的限制,FreeMarker是不能决定日期的部哪分来使用(也就 是说,是日期-时间格式,每天的时间格式等。可通过 date_format,time_format和 datetime_format的setting指令进行设置) 要记住,FreeMarker区别字符串,数字和布尔值,所以字符串”150”和数字150是完全 不同的两种数值。数字持有的是数字的值,布尔值表达的是逻辑上的对或错。字符串可以是 任意字符的序列
标量
标量是最基本,最简单的数值类型,它们可以是: 字符串:
• 简单的文本,例如:产品的名称。
如果想在模板中直接给出字符串的值,而不是使用数据模型中的变量,那么将文本 写在引号内即可,比如”green mouse”或者’green mouse’。(关于语法 的更多细节请看后续章节)
容器
序列( Sequence ): • 每个子变量通过一个整数来标识。第一个子变量的标识符是0,第二个是 1,第三个是2,这样来类推,而且子变量是有顺序的。这些数字通常被 称为是子变量的索引。序列通常比较密集,也就是所有的索引,包括最 后一个子变量的,它们和子变量都是相关联的,但不是绝对必要的。子 变量的数值类型也并不需要完全一致。 • get(int index)和int size()。 • String[] arr = new String[] {“a”, “b”, “c”};
Interpolation 插值:这部分的输出会被计算的值来替换。插值由${和}所 分隔(或者#{和},这种风格已经不建议再使用了)。
FTL tags标签:FTL标签和HTML标签很相似,但是它们却是给 FreeMarker的指示,而且不会打印在输出内容中。 Comments注释:FTL的注释和HTML的注释也很相似,但它们是由<#-和-->来分隔的。注释会被FreeMarker所忽略,更不会在输出内容中显示。
Ftl模板通过以下方式访问 ${arr[0]}, ${arr[1]}, ${arr[2]}
容器
集合( Collection ): • 从模板设计者角度来看,集是有限制的序列。不能获取集的大小,也不 能通过索引取出集中的子变量,但是它们仍然可以通过list 指令来遍历。 要注意一个数值也可有多种类型,对于一个数值可能存在哈希表和序列 这两种类型,这时,该变量就支持索引和名称两种访问方式。不过容器基本 是当作哈希表或者序列来使用的,而不是两者同时使用。 尽管存储在哈希表,序列(集)中的变量可以是任意类型的,这些变量 也可以是哈希表,序列(集)。这样就可以构建任意深度的数据结构。 数据模型本身(最好说成是它的根)也是哈希表。
应用实例
Freemarker模板flv <html> <head> <title>Welcome!</title> </head> <body> <h1>Welcome ${user}!</h1> <p>Our latest product: <a href="${latestProduct.url}">${latestProduct.name}</a>! </body> </html>
FreeMarker特性
与容器无关,不需要Servlet环境 可以应用于非Web应用程序环境 可以在模板中使用JSP标记库 强大的模板语言 通用数据模型 强大的XML处理能力 FreeMarker是免费的
数据结构
FTL=FreeMarker Templete Language 模板(FTL编程)是由如下部分混合而成的: Text文本:文本会照着原样来输出。