定义宏和使用宏
#macro指令用于定义一个VTL模板的重复代码块——宏。下面是一个简单的定义宏的例子:
#macro( d ) <tr><td></td><tr> #end
这段代码定义了一个宏,名字为d,没有参数。下面是使用这个宏的代码:
#d()
Velocity在遇到#d()的时候,会用"<tr><td></td></tr>"替代上面的#d()这一行。
宏的参数:
宏也可以带参数,而且是任意多个参数。不过,宏定义时有几个参数,宏调用时就要提供同样数目的参数。
#macro( d $name) <tr><td>$name</td></tr> #end
#d("name1")
宏的参数可以是以下VTL元素中的任意一种:引用、字符串字面值、数值字面值、整数范围(比如[1 .. 10]、[$start .. $end])、数组、布尔值true或者false。
宏的参数可以是方法,那么下面这个例子,需要特别注意:
#macro(test $a) $a $a $a #end #test($foo.bar())
上面这个例子中,$foo.bar()将会被调用3次,而不是一次。
内联的宏
当宏是在一个Velocity模板中定义时,这个宏(是inline的)只能被该模板使用,同一个网站下的其他模板是不能用的。如果是在一个Velocity宏模板库中定义的宏,就可以被任何同一网站下的模板使用。
和宏有关的一些Velocity属性
velocimacro.library——用逗号分隔的一组文件名,是Velocity宏模板库。默认值是VM_global_library.vm
velocimacro.permissions.allow.inline——宏是否可以在一个普通模板中定义。默认值是false。
velocimacro.permissions.allow.inline.to.replace.global——是否允许模板中的宏覆盖library中的宏。默认值是false。
velocimacro.permissions.allow.inline.local.scope——一个在普通模板中定义的宏,是否允许其他模板使用。默认是false。
velocimacro.context.localscope——在一个宏里通过#set()修改了context,此修改是否仅仅对这个宏自身,而不是永久性修改了context。默认值是false。
velocimacro.library.autoreload——Velocity宏模板库修改之后,是否自动重新加载。默认值是false。debug时可以设置为true,发布时设置为false。
其他一些注意点
宏必须在第一次使用它之前定义。当#Parse()一个模板文件时,尤其要注意这一点。