freemarker基本用法

来源:互联网 发布:系统优化的意义是 编辑:程序博客网 时间:2024/06/05 05:59

处理不存在的变量:
1、一个不存在的变量和一个是null 的变量,对于FreeMarker 来说是一样的,不论在哪里引用变量,都可以指定一个默认值来避免变量丢失这种情况,通过在变量名后面跟着一个!和默认值,例如:<h1>Welcome ${user!"Anonymous"}!</h1>

2、当然也可以在变量名后面通过放置??来询问FreeMarker 一个变量是否存在。将它和if
指令合并,那么如果user 变量不存在的话将会忽略整个问候代码段:<#if user??><h1>Welcome ${user}!</h1></#if>
3、多级访问的变:
比如animals.python.price , 书写代码:
animals.python.price!0,仅当animals.python 存在而仅仅最后一个子变
量price 可能不存在(这种情况下我们假设价格是0)。如果animals 或者python
不存在,那么模板处理过程将会以“未定义的变量”错误而停止。为了防止这种情况的发生,
可以这样来书写代码(animals.python.price)!0。这种情况下当animals 或
python 不存在时表达式的结果仍然是0。对于??也是同样用来的处理这种逻辑的:
animals.python.price??对比(animals.python.price)??来看
4、检测不存在的值:
这个操作符告诉我们一个值是否存在。基于这种情况,结果是true 或false。
示例如下,假设并没有名为mouse 的变量:
<#if mouse??>
Mouse found
<#else>
No mouse found
</#if>
Creating mouse...
<#assign mouse = "Jerry">
<#if mouse??>
Mouse found
<#else>
No mouse found
</#if>
输出为:
No mouse found
Creating mouse...
Mouse found

实例:
? 默认值:name!"unknown" 或者(user.name)!"unknown" 或者
name! 或者 (user.name)!
? 检测不存在的值:name?? 或者(user.name)??

序列:
1、也可以用start..end 定义存储数字范围的序列,这里的start 和end 是处理数
字值表达式,比如2..5 和[2, 3, 4, 5]是相同的,但是使用前者会更有效率(内存
占用少而且速度快)。可以看出前者也没有使用方括号,这样也可以用来定义递减的数字范
围,比如5..2。(此外,还可以省略end,只需5..即可,但这样序列默认包含5,6,7,8
等递增量直到无穷大)

2、序列的连接可以使用+号来进行:
<#list ["Joe", "Fred"] + ["Julia", "Kate"] as user>
- ${user}
</#list> 将会打印出:
- Joe
- Fred
- Julia
- Kate
通过这种方式进行的许多重复连接最终产生的序列读取的速度会慢

3、序列切分:
如果seq存储序列"a", "b", "c",
"d", "e", "f",那么表达式seq[1..4]将会是含有"b", "c", "d", "e"的序列(索
引为1 的项是"b",索引为4 的项是"e")。
lastindex 可以被省略,那么这样将会读取到序列的末尾。如果seq 存储序列"a",
"b", "c", "d", "e", "f",那么seq[3..]将是含有"d", "e", "f"的序列

哈希表操作:
像连接字符串那样,也可以使用+号的方式来连接哈希表。如果两个哈希表含有键相同
的项,那么在+号右侧的哈希表中的项目优先。例如:
<#assign ages = {"Joe":23, "Fred":25} + {"Joe":30, "Julia":18}>
- Joe is ${ages.Joe}
- Fred is ${ages.Fred}
- Julia is ${ages.Julia}
将会打印出:
- Joe is 30
- Fred is 25
- Julia is 18

内建函数使用:

1、字符串使用的内建函数:
? html: 字符串中所有的特殊HTML 字符都需要用实体引用来代替(比如<代替&lt;)。
? cap_first:字符串的第一个字母变为大写形式
? lower_case:字符串的小写形式
? upper_case:字符串的大写形式
? trim:去掉字符串首尾的空格
? 序列使用的内建函数:
? size:序列中元素的个数
? 数字使用的内建函数:
? int:数字的整数部分(比如-1.9?int 就是-1)
2、实例:
${test?html}
${test?upper_case?html}
${seasons?size}
${seasons[1]?cap_first} <#-- left side can by any expression -->
${"horse"?cap_first}
假设seasons 存储了序列"winter", "spring", "summer", "autumn",那
么上面的输出将会:
4
Spring
Horse


3、当生成HTML 时,你最好将完整的模板放入到escape 指令中。那么,
如果book.title 包含&,它就会在输出中被替换成&amp;,而页面还会保持格式良好
的HTML。如果用户注释包含如<iframe>(或其它的元素)的标记,那么就会被转义成
如&lt;iframe&gt;的样子,使他们没有任何有害点。但是有时在数据模型中真的需要
HTML,比如我们假设上面的book.description 在数据库中的存储是HTML 格式的,
那么此时你不得不使用noescape 来抵消escape 的转义


方法调用:
${repeat("What", 3)}

${mouse!"No mouse."}
<#assign mouse="Jerry">
${mouse!"No mouse."}
将会输出:
No mouse.
Jerry

自定义指令可以使用macro:
1、宏是有一个变量名的模板片段,例如:
<#macro greet>
<font size="+2">Hello Joe!</font>
</#macro>
macro 指令自身不打印任何内容,它只是用来创建宏变量,所以就会有一个名为
greet 的变量。在<#macro greet>和</#macro>之间的内容(称为宏定义体)当
使用它作为指令时将会被执行
<@greet></@greet>将会打印:<font size="+2">Hello Joe!</font>
2、在macro 指令中,宏名称的后面位置是用来定义变量的
(a)
<#macro greet person>
<font size="+2">Hello ${person}!</font>
</#macro>
那么就可以这样来使用这个宏:
<@greet person="Fred"/> and <@greet person="Batman"/>
这和HTML 的语法是很相似的,它会打印出:
<font size="+2">Hello Fred!</font>
and <font size="+2">Hello Batman!</font>
(b)
自定义指令可以有多个参数。如下所示,再添加一个新的参数color:
<#macro greet person color>
<font size="+2" color="${color}">Hello ${person}!</font>
</#macro>
那么,这个宏就可以这样来使用:
<@greet person="Fred" color="black"/>
(c)
自定义指令可以嵌套内容, 和预定义指令相似:
<#macro border>
<table border=4 cellspacing=0 cellpadding=4><tr><td>
<#nested>
</td></tr></table>
</#macro>
<#nested>指令执行位于开始和结束标记指令之间的模板代码段。如果这样写:
<@border>The bordered text</@border>
那么就会输出:
<table border=4 cellspacing=0 cellpadding=4><tr><td>
The bordered text
</td></tr></table>

原创粉丝点击