freemarker 自己定义指令

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.5
1
1.5
2 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 指令还多的变量,那么最后的循环变量将不会被创建(在嵌套内容中不会被定义)。

时间: 2024-10-22 16:33:57

freemarker 自己定义指令的相关文章

freemarker自己定义标签报错(七)

1.错误描写叙述 六月 09, 2014 11:11:09 下午 freemarker.log.JDK14LoggerFactory$JDK14Logger error 严重: Template processing error: "Expression a is undefined on line 27, column 23 in tag.ftl." Expression a is undefined on line 27, column 23 in tag.ftl. The pro

freemarker自己定义标签(一)

freemarker自己定义标签 1.自己定义标签说明 宏变量存储模板片段能够被用作自己定义指令macro 2.演示样例说明 <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <title>freemarker自己定义标签</title> </head> <body> &

FreeMarker 的常用指令介绍

一.数据类型: 四种基本类型:String.Number.Boolean.Date.直接指定值可以是字符串.数值.布尔值.集合及Map对象 1. 字符串 直接指定字符串值使用单引号或双引号限定.字符串中可以使用转义字符"\".如果字符串内有大量的特殊字符,则可以在引号的前面加上一个字母r,则字符串内的所有字符都将直接输出. 2. 数值 数值可以直接输入,不需要引号.FreeMarker不支持科学计数法. 3. 布尔值 直接使用true或false,不使用引号. 4. 集合 集合用中括号

AngularJS--自定义指令和模板

一.自定义指令: 1. 先创建模块    var app=angular.module("myApp",[]); 2. 创建自定义指令 (directive后面的参数一:自定义指令的名称,参数二:function 返回值是一个对象 template是模板) app.directive("shen",function(){ return { template:"<h1>这是自定义属性</h1>" } }) 3.划定模块范围,

freemarker自己定义标签报错(二)

freemarker自己定义标签 1.错误描写叙述 freemarker.core.ParseException: Unexpected end of file reached. at freemarker.core.FMParser.generateParseException(FMParser.java:4702) at freemarker.core.FMParser.jj_consume_token(FMParser.java:4573) at freemarker.core.FMPar

FreeMarker FTL常用指令(3)

1.FreeMarker的3种FTL标签 ①开始标签:<#directivename parameter>②结束标签:</#directivename>③空标签:<#directivename parameter/> 在FreeMarker中,使用FTL标签来使用指令,这和HTML标签是完全类似的.使用标签时前面的符号#也可能变成@,如果该指令是一个用户指令而不是系统内建指令时,应将#符号改成@符号. 2.FreeMarker的常用指令  FreeMarker的常用指令

freemarker之include指令

1.父页面ftl <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <title>学生信息</title> </head> <body> <#include "/inc/top.ftl"/> 姓名:${student.studentName

AnngularJS---自定义指令

AngularJS提供了一系列的内置指令,如ng开头的指令,同时AngularJS也允许用户自定义指令. 目录: 1.自定义指令 2.使用自定义指令 3.自定义指令的内嵌使用 自定义指令 AngularJS中使用directive()方法来自定义指令,directive() 方法可以接受两个参数: name(字符):指令的名字,用来在视图中引用特定的指令 factory_function(函数):这个函数返回一个对象,其中定义了指令的全部行为 例如:创建一个test指令: var app = a

使用freemarker宏定义使用树形目录的展示

使用freemarker宏定义使用树形目录的展示 1.效果展示如下 2.前端代码 <div class="kcmenu">     <div class="sidebar-wrapper" id="sidebar-wrapper">         <div class="title"><span class="pull-left ti-arrow-circle-left&q