博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
freemarker 自己定义指令
阅读量:5160 次
发布时间:2019-06-13

本文共 2967 字,大约阅读时间需要 9 分钟。

1 简单介绍

自己定义指令能够使用 macro 指令来定义,这是模板设计者所关心的内容。

Java 程序猿若不想在模板中实 现定义指令 ,而是在 Java 语言中实现指令 的定义,这时 能够使用freemarker.template.TemplateDirectiveModel 类来扩展

2 基本内容

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

<#macro greet>Hello Joe!
能够在 FTL 标记中通过 @ 取代 # 来使用自己定义指令。使用变量名作为指令名。

<@greet>
<@greet/>
3 參数

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

<#macro greet person>Hello ${person}!
那么就能够这样来使用这个宏:
<@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>    Hello ${person}!
宏就能够这样来使用:

<@greet person="Fred" color="black"/>
<@greet color="black" person="Fred"/>
你只能够使用在 macro 指令中定义的參数,同 时 也 必 须 给 出 在 宏 中 定 义 所 有 參 数 的 值 。
指定默认值:

<#macro greet person color="black">Hello ${person}!
<@greet person="Fred"/> ,由于它和<@greet person="Fred" color="black"/> 是同样的

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

someParam=foo 和someParam="${foo}" 是不同的。假设指令须要 someParam是一个数字值,那么就不要用另外一种方式。

4 嵌套内容

<#macro border>   
<#nested>
<#nested> 指令运行位于開始和结束标记指令之间的模板代码段。假设这样写:

<@border>The bordered text
那么就会输出:
The bordered text
nested 指令也能够多次被调用
<#macro do_thrice>   <#nested>   <#nested>   <#nested>
<@do_thrice> Anything.
就会输出:
Anything.Anything.Anything.
嵌套的内容能够是随意有效的 FTL,包括其它的用户自己定义指令,这样也是对的:
<@border> 
    <@do_thrice>
  • <@greet person="Joe"/>
  • Hello Joe!
  • Hello Joe!
  • Hello Joe!
在嵌套的内容中,宏的局部变量是不可见的。
<#macro repeat count> <#local y = "test"> <#list 1..count as x>  ${y} ${count}/${x}: <#nested> 
<@repeat count=3>${y!"?"} ${x!"?"} ${count!"?"}
test 3/1: ? ? ?test 3/2: ?

? ? test 3/3: ? ? ?

局部变量的设置是为每一个宏自己调用的
<#macro test foo>${foo} (<#nested>) ${foo}
<@test foo="A"><@test foo="B"><@test foo="C"/>
A (B (C () C) B) A
5 宏和循环变量
循环变量的名字是已经给定的,变量值的设置是由指令本身完毕的。
<#macro do_thrice> <#nested 1> <#nested 2> <#nested 3>
<@do_thrice ; x> <#-- 用户自己定义指令 使用";"取代"as" --> ${x} Anything.
1 Anything.2 Anything.3 Anything.语法规则是为特
nested 指令(当然參数能够是随意的表达式)的參数。

循环变量的名称是在自己定义指令的開始标记( <@...> )的參数后面通过分号确定的。

能够使用多个循环变量(变量的顺序是非常重要的):

<#macro repeat count> <#list 1..count as x>  <#nested x, x/2, x==count> 
<@repeat count=4 ; c, halfc, last> ${c}. ${halfc}<#if last> Last!
1.2.3.4.0.511.52 Last!
变量能够不指定,例如以下所看到的都是能够的:

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

转载于:https://www.cnblogs.com/mengfanrong/p/5303043.html

你可能感兴趣的文章
从.Net版本演变看String和StringBuilder性能之争
查看>>
Excel操作 Microsoft.Office.Interop.Excel.dll的使用
查看>>
解决Ubuntu下博通网卡驱动问题
查看>>
【bzoj2788】Festival
查看>>
执行gem install dryrun错误
查看>>
HTML5简单入门系列(四)
查看>>
实现字符串反转
查看>>
转载:《TypeScript 中文入门教程》 5、命名空间和模块
查看>>
苹果开发中常用英语单词
查看>>
[USACO 1.4.3]等差数列
查看>>
Shader Overview
查看>>
Reveal 配置与使用
查看>>
Java中反射的学习与理解(一)
查看>>
C语言初学 俩数相除问题
查看>>
B/S和C/S架构的区别
查看>>
[Java] Java record
查看>>
jQuery - 控制元素显示、隐藏、切换、滑动的方法
查看>>
postgresql学习文档
查看>>
Struts2返回JSON数据的具体应用范例
查看>>
js深度克隆对象、数组
查看>>