freemarker

1.默认值
变量不存在或者为null是常常出现的情况。我们可以给它指定一个默认值。,通过在变量名
后面跟着一个!和默认值
<h1>Welcome ${user!"Anonymous"}!</h1>
另外默认值只是针对最后一级变量而言的。如果是多级变量如
animals.python.price!"0.00",那么如果animals或者python都null的话,那么结果依然是异常。为了防止这种情况可以使用(animals.python.price)!"0"
对于??也是同样用来的处理这种逻辑的:
animals.python.price??对比(animals.python.price)??来看。
使用形式概览: unsafe_expr!default_expr 或unsafe_expr! 或
(unsafe_expr)!default_expr 或(unsafe_expr)!
这个操作符允许你为可能不存在的变量指定一个默认值。
警告:
如果在!后面有复合表达式,如1 + x,通常使用括号,像${x!(1 + y)}或${(x!1)
+ y)},这样就根据你的意图来确定优先级。由于FreeMarker 2.3.x 版本的源码中的小失误
所以必须这么来做。!(作为默认值操作)的优先级非常低。这就意味着${x!1 + y}会
被FreeMarker 误解为${x!(1 + y)},而真实的意义是${(x!1) + y}。这个源码的
错误在FreeMarker 2.4 中会得到修正。在编程中注意这个错误,要么就使用FreeMarker 2.4!
如果默认值被省略了,那么结果将会是空串,空序列或空哈希表。(这是FreeMarker 允
许多类型值的体现)如果想让默认值为0 或false,则注意不能省略它。例如:


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

2.当需要给插值或者指令参数提供值时,可以使用变量或其他复杂的表达式。例如,我们
设x 为8,y 为5,那么(x+y)/2 的值就会被处理成数字类型的值6.5
在我们展开细节之前,先来看一些具体的例子:
 当给插值提供值时:插值的使用方式为${expression},把它放到你想输出文
本的位置上然后给值就可以打印了。即${(5+8)/2}会打印”6.5”出来(如果输出
的语言不是英语,也可能打印出”6,5”)。

3.直接指定值
 字符串:"Foo" 或者 'Foo' 或者 "It's \"quoted\"" 或者
r"C:\raw\string"
 数字:123.45
序列:["foo", "bar", 123.45], 1..100
 哈希表:{"name":"green mouse", "price":150}等等。设置直接变量。

4.字符串转换成数字

${project.price?int}

5.比较
比较运算
有时我们需要知道两个值是否相等,或者哪个数的值更大一点。
为了演示具体的例子,我们在这里使用if 指令。if 指令的用法是:<#if
expression>...</#if>,其中的表达式的值必须是布尔类型,否则将会出错,模板
执行中断。如果表达式的结果是true,那么在开始和结束标记内的内容将会被执行,否则
就会被跳过。
测试两个值相等使用=(或者采用Java 和C 语言中的==,二者是完全等同的。)
测试两个值不等使用!=。例子中假设user 是”Big Joe”

6.检查值是否存在
使用形式概览:unsafe_expr??或(unsafe_expr)??
这个操作符告诉我们一个值是否存在。基于这种情况,结果是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>
访问非顶层变量的使用规则和默认值操作符也是一样的,即product.color??和
(product.color)?? 。


7.插值
插值的使用语法是:${expression},expression 可以是所有种类的表达式
(比如${100 + x})。
插值表达式的结果必须是字符串,数字或日期类型的,因为只有数字和日期类型可以自
动转换为字符串类型,其他类型的值(如布尔,序列)只能手动转换为字符串类型,否则就
会发生错误导致模板执行中止。
如果插值在文本区(也就是说,不再字符串表达式中),如果escapse 指令起作用了,
即将被插入的字符串会被自动转义。如果你要生成HTML,那么强烈建议你利用它来阻止跨
站脚本攻击和非格式良好的HTML 页面。这里有一个示例:

<#escape x as x?html>
...
<p>Title: ${book.title}</p>
<p>Description:
<#noescape>${book.description}</#noescape></p>
<h2>Comments:</h2>
<#list comments as comment>
<div class="comment">
${comment}
</div>
</#list>
...
</#escape>

这个示例展示了当生成HTML 时,你最好将完整的模板放入到escape 指令中。那么,
如果book.title 包含&,它就会在输出中被替换成&,而页面还会保持格式良好
的HTML。如果用户注释包含如<iframe>(或其它的元素)的标记,那么就会被转义成
如<iframe>的样子,使他们没有任何有害点。但是有时在数据模型中真的需要
HTML,比如我们假设上面的book.description 在数据库中的存储是HTML 格式的,
那么此时你不得不使用noescape 来抵消escape 的转义,模板就会像这样了:
<p>Title: ${book.title?html}</p>
<p>Description: ${book.description}</p>
<h2>Comments:</h2>
<#list comments as comment>
<div class="comment">
${comment?html}
</div>
</#list>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值