freemarker 自定义指令

来源:互联网 发布:app store下载mac os 编辑:程序博客网 时间:2024/05/18 00:17

1 简介

自定义指令可以使用 macro 指令来定义,这是模板设计者所关心的内容。 Java 程序员若不想在模板中实 现定义指令 ,而是在 Java 语言中实现指令 的定义,这时 可以使用freemarker.template.TemplateDirectiveModel 类来扩展


2 基本内容

macro 指令自身不打印任何内容,它只是用来创建宏变量,所以就会有一个名为greet 的变量。在 <#macro greet> 和 </#macro> 之间的内容(称为宏定义体)当使用它作为指令时将会被执行。

<#macro greet><font size="+2">Hello Joe!</font></#macro>
可以在 FTL 标记中通过 @ 代替 # 来使用自定义指令。使用变量名作为指令名。

<@greet></@greet>
<@greet/>

3 参数

宏名称的后面位置是用来定义变量的。

<#macro greet person><font size="+2">Hello ${person}!</font></#macro>
那么就可以这样来使用这个宏:
<@greet person="Fred"/> and <@greet person="Batman"/>
使用预定义指令时,参数的值( = 号后边的值)可以是 FTL 表达式。这样,不像 HTML, "Fred"和 "Batman" 的引号就可以不用要了。 <@greet person=Fred/> 也意味着使用变量的值 Fred 作为 person 参数,而不是字符串 "Fred" 。

也可以在 = 号左边使用复杂表达式(比如someParam=(price + 50)*1.25 )。

可以有多个参数。

<#macro greet person color>    <font size="+2" color="${color}">Hello ${person}!</font></#macro>
宏就可以这样来使用:

<@greet person="Fred" color="black"/>
<@greet color="black" person="Fred"/>
你仅仅可以使用在 macro 指令中定义的参数,同 时 也 必 须 给 出 在 宏 中 定 义 所 有 参 数 的 值 。

指定默认值:

<#macro greet person color="black"><font size="+2" color="${color}">Hello ${person}!</font></#macro>
<@greet person="Fred"/> ,因为它和<@greet person="Fred" color="black"/> 是相同的

如 果 想 给 color 设 置 为 ”red” , 那 么 就 写 成 : <@greet person="Fred" color="red"/>


someParam=foo 和someParam="${foo}" 是不同的。如果指令需要 someParam是一个数字值,那么就不要用第二种方式。

4 嵌套内容

<#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>
nested 指令也可以多次被调用
<#macro do_thrice>   <#nested>   <#nested>   <#nested></#macro><@do_thrice>   Anything.</@do_thrice>
就会输出:
Anything.Anything.Anything.

嵌套的内容可以是任意有效的 FTL,包含其他的用户自定义指令,这样也是对的:
<@border> <ul>  <@do_thrice>   <li><@greet person="Joe"/>  </@do_thrice> </ul></@border>
<table border=4 cellspacing=0 cellpadding=4><tr><td><ul> <li><font size="+2">Hello Joe!</font> <li><font size="+2">Hello Joe!</font> <li><font size="+2">Hello Joe!</font></ul></tr></td></table>
在嵌套的内容中,宏的局部变量是不可见的。
<#macro repeat count> <#local y = "test"> <#list 1..count as x>  ${y} ${count}/${x}: <#nested> </#list></#macro><@repeat count=3>${y!"?"} ${x!"?"} ${count!"?"}</@repeat>
test 3/1: ? ? ?test 3/2: ? ? ?test 3/3: ? ? ?
局部变量的设置是为每个宏自己调用的
<#macro test foo>${foo} (<#nested>) ${foo}</#macro><@test foo="A"><@test foo="B"><@test foo="C"/></@test></@test>
A (B (C () C) B) A

5 宏和循环变量
循环变量的名字是已经给定的,变量值的设置是由指令本身完成的。
<#macro do_thrice> <#nested 1> <#nested 2> <#nested 3></#macro><@do_thrice ; x> <#-- 用户自定义指令 使用";"代替"as" --> ${x} Anything.</@do_thrice>
1 Anything.2 Anything.3 Anything.语法规则是为特
nested 指令(当然参数可以是任意的表达式)的参数。循环变量的名称是在自定义指令的开始标记( <@...> )的参数后面通过分号确定的。

可以使用多个循环变量(变量的顺序是很重要的):
<#macro repeat count> <#list 1..count as x>  <#nested x, x/2, x==count> </#list></#macro><@repeat count=4 ; c, halfc, last> ${c}. ${halfc}<#if last> Last!</#if></@repeat>
1.2.3.4.0.511.52 Last!

变量可以不指定,如下所示都是可以的:

<@repeat count=4 ; c, halfc, last> ${c}. ${halfc}<#if last> Last!</#if></@repeat><@repeat count=4 ; c, halfc> ${c}. ${halfc}</@repeat><@repeat count=4> Just repeat it...</@repeat>
如果在分号后面指定了比 nested 指令还多的变量,那么最后的循环变量将不会被创建(在嵌套内容中不会被定义)。





0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 网上购物已付钱迟迟不发货怎么办 有人冒充微信头像和熟人借钱怎么办 微信红包输了50多万怎么办 脖子里的绳结接口磨脖子怎么办 母比格犬生了小狗毛色变了怎么办 母比格犬生了小狗毛色很差怎么办 貂皮大衣上的暗扣掉了怎么办 呢子夹克袖子长但又不想改短怎么办 黑色的衣服熨的有点发亮怎么办 宿管阿姨工作中与学生起冲突怎么办 中通快递发的衣服不合适怎么办 加盟母婴店如果不干了货怎么办 双十一搞活动买的东西退货怎么办 天猫预售30天不发货怎么办 天猫搞活动的商品总不发货怎么办 淘宝买的东西物流把货物损坏怎么办 苹果手机5s每部存满怎么办 天猫退货分开发货退的话怎么办 淘宝优惠券电脑端显示不出来怎么办 天猫退货退款寄错了怎么办 天猫已退款货又发过来了怎么办 小米商城预售订单点错退款了怎么办 淘宝发布宝贝类目价格受限制怎么办 2019天猫续签评分不达标怎么办 天猫店铺动态不达标不能续签怎么办 京东自提发现货有问题怎么办 京东试用成功商家不发货怎么办 在淘宝主页搜不到我的店铺名怎么办 淘宝发货单号填到别人那去了怎么办 买家申请淘宝介入后同意退款怎么办 淘宝卖家手机版购买装修模块怎么办 天猫店铺和淘宝店铺想要装修怎么办 支付宝转账银行卡卡号错误怎么办 淘宝图片空间照片全部删除了怎么办 我把淘宝图片空间照片删除了怎么办 淘宝发布宝贝怎么没知道品牌怎么办 淘宝提前确认收货了怎么办已经发货 苹果支付安全提示问题忘记了怎么办 没有在规定日期交首付款怎么办 淘宝申请退款又不想退了怎么办 淘宝申请退款后又不想退了怎么办