《freemarker学习笔记(一)入门》

mac2025-09-15  17

转载至:http://freemarker.foofun.cn/dgui_quickstart_template.html,手写的可能会有些错误的地方,建议大家去看原文。

一、入门

${…}:Freemarker将会输出真实的值来替换大括号内的表达式,这样的表达式被称为interpolation(插值)。 FTL标签(Freemarker Template Lanage):与HTML标签有一些相似之处,但是他们是FreeMarker的标签,是不会输出中打印的,这西恩标签名以#开头。(用户自定义的FTL标签则需要使用@来代替#,但这属于更高级的话题了)。 注释:注释和HTML的注释很相似,但是它们使用<#-- and --> 来标识。并且FreeMarker的注释不会出现在输出中(不会出现在访问者的页面中),因为FreeMarker会跳过他们。

其他任何不适FTL标签,插值或注释的内容将被视为静态文本,这些东西不会被FreeMarker所解析,会按照原样输出出来。 FTL标签页被称为指令。这些指令在HTML的标签(比如:

和 )和HTML元素(比如:table元素)中的关系是相同的。(如果现在还没感觉它们的不同,那么把"FTL标签"和“指令”看做是同义词即可) 1、基本标签 <#if ${a} == 0> a等于0; </#if> 如果a = 0,那么在页面上将会输出a等于0;

<#if ${a} == 0> a等于0; <#else> a不等于0; </#if> 如果a=0,页面输入a等于0,否则页面输出a不等于0。

<#if ${a == 0}> a等于0; <elseif ${a == 1}> a等于1; <#else> a不等于0,也不等于1; </#if> 以此类推,与java的条件语句类似。

2、list标签 当需要列表显示内容时,list标签是必须的。模板与输出对应如下。 TEMPLATE

We have these animals:

<#list animals as animal> ${animal.name}${animal.price} Euros

OUTPUT

We have these animals:

mouse50 Euros elephant5000 Euros python4999 Euros

list标签的一般格式为:<#list sequence as loopVariable> repeatThis</#list> repeatThis部分将会在给定的sequence遍历时取出对应的值。在所有遍历中,loopVariable将持有当前遍历项的值。这个变量仅存在于<#list …>和<#list>标签内。

sequence可以是任意的表达式,比如我们可以列表显示示例数据模型中的水沟,就像这样: TEMPLATE

<#list misc.fruits as fruit> ${fruit}

上面示例中的一个问题是如果我们有0个水果,它仍然会输出一个空的

,而不是上面都没有。要避免这样的情况,可以这么来使用list: TEMPLATE <#list misc.fruit>

<#items as fruit> ${fruit}

另一个列表相关的常见任务是:使用一些分隔符来列出水果,比如逗号: TEMPLATE

Fruits:<#list misc.fruits as fruit>${fruit}<#sep>,

再次回到这个话题,如果我们有0个水果,会怎么样?只是打印“Fruits:”也没有什么不方便。 list变迁,也像if标签那样,可以有else部分,如果列表中有0个元素时就会被执行: TEMPLATE

Fruits: <#list misc.fruits as fruit>${fruit}<#sep>, <#else>None

所有这些标签(list, items, sep, else)可以联合起来使用: TEMPLATE <#list misc.fruits>

Fruits:

<#items as fruit> ${fruit}<#sep> and

3、include标签 使用include标签,我们可以再模板中插入其他文件的内容。

假设要在一些页面中显示版权声明的信息。那么可以创建一个文件来单独包含这些版权声明,之后在需要它的地方插入即可。比方说,我们可以将版权信息单独存放在页面copyright_footer.html中: TEMPLATE


Copyright (c) 2000 Acmee Inc, All Rights Reserved.

当需要用到这个文件时,可以使用标签来插入: TEMPLATE

Test page

Test page

Blah blah... <#include "/copyright_footer.html">

此时,输出的内容为: OUTPUT

Test page

Test page

Blah blah...


Copyright (c) 2000 Acmee Inc, All Rights Reserved.

当修改了copyright_footer.html文件,那么访问者在所有页面都会看到版权声明的新内容。 i NOTE 重用代码片段的一个更有力的方式是使用宏,但是只是更为高级的话题了, 将会在 后续讨论。

使用联合标签

在页面上也可以多次使用便签,而且标签之间也可以很容易的相互嵌套,比如在list指令中嵌套if指令: TEMPLATE <#list animals as animal> <div<#if animal.protected> class=“protected”</#if>> ${animal.name} for ${animal.price} Euros </#list> 请注意,FreeMarker并不解析FTL便签以外的文本、插值和注释,上面示例在HTML属性中使用FTL标签页不会又问题。

使用内建函数

内建函数很像子变量(如果了解java术语的话,也可以说像方法),它们并不是数据模型中的东西,是FreeMarker在数值上添加的。为了清晰子变量是哪部分,使用?问好代替.点来访问它们。常用内建函数的示例: user?html 给出 user 的HTML转义版本, 比如 & 会由 & 来代替。 user?upper_case 给出 user 值的大写版本 (比如 “JOHN DOE” 来替代 “John Doe”) animal.name?cap_first 给出 animal.name 的首字母大写版本(比如 “Mouse” 来替代 “mouse”) user?length 给出 user 值中 字符的数量(对于 “John Doe” 来说就是8) animals?size 给出 animals 序列中 项目 的个数(我们示例数据模型中是3个) 如果在 <#list animals as animal> 和对应的 </#list> 标签中: animal?index 给出了在 animals 中基于0开始的 animal的索引值 animal?counter 也像 index, 但是给出的是基于1的索引值 animal?item_parity 基于当前计数的奇偶性,给出字符串 “odd” 或 “even”。在给不同行着色时非常有用,比如在 中。 一些内建函数需要参数来指定行为,比如: animal.protected?string(“Y”, “N”) 基于 animal.protected 的布尔值来返回字符串 “Y” 或 “N”。 animal?item_cycle(‘lightRow’,‘darkRow’) 是之前介绍的 item_parity 更为常用的变体形式。 fruits?join(", ") 通过连接所有项,将列表转换为字符串, 在每个项之间插入参数分隔符(比如 “orange,banana”) user?starts_with(“J”) 根据 user 的首字母是否是 “J” 返回布尔值true或false。 内建函数应用可以链式操作,比如user?upper_case?html 会先转换用户名到大写形式,之后再进行HTML转义。(这就像可以链式使用 .(点)一样)。

处理不存在的变量

数据模型中经常会有可选变量(也就是说有时并不存在)。除了一些典型的认为原因导致失误外,FreeMarker绝对不能容忍应用不存在的变量,除非明确的告诉它当变量不存在时如何处理。这里来介绍两种典型的处理方法。

这部分对程序员而言:一个不存在的变量和一个是null值的变量,对于FreeMarker来说是一样的,所以这里所指的"丢失"包含这两种情况。

不论在哪里引用变量,都可以指定一个默认值来避免变量丢失这种情况,通过在变量名后面跟着一个!(叹号)和默认值。就像下面的这个例子,当user不存在于数据模型时,模板将会将user的值标识为字符串"visitor"。(当user存在时,模板就会变现出${user}的值): TEMPLATE

Welcome ${user!"visitor"}!

也可以在变量名后面通过放置??来询问一个变量是否存在。将它和if指令合并,们如果user变量不存在的话将会忽略整个问候的代码段: TEMPLATE <#if user??>

Welcome ${user}!

最新回复(0)