本文更新日期:2019年10月14日
通常情况,freemarker只使用一个命名空间,称为主命名空间,但为了创建可重用的宏或其它变量的集合(通常称库),必须使用多命名空间,其目的是防止同名冲突。
1、创建库
下面是一个创建库的例子(假设保存在lib/my_test.ftl中):
<#macro copyright date>
<p>Copyright (C) ${date} FreeMarker中文官网. All rights reserved.
<br>Email: ${mail}
</p>
</#macro>
<#assign mail = "admin@freemarker.cn">
代码说明:上面的库定义了一个宏变量和一个普通变量mail。
2、导入库
使用import指令导入库到模板中,Freemarker会为导入的库创建新的名字空间,并可以通过import指令中指定的散列变量访问库中的变量,如下所示:
<#import "/lib/my_test.ftl" as my>
<#assign mail="root@freemarker.cn">
<@my.copyright date="2000-2020"/>
${my.mail}
${mail}
输出结果:
<p>Copyright (C) 2000-2020 FreeMarker中文官网. All rights reserved.
<br>Email: admin@freemarker.cn
</p>
admin@freemarker.cn
root@freemarker.cn
可以看到例子中使用的两个同名变量并没有冲突,因为它们位于不同的名字空间。还可以使用assign指令在导入的命名空间中创建或替代变量,下面是一个例子:
<#import "/lib/my_test.ftl" as my>
${my.mail}
<#assign mail="root@other.com" in my>
${my.mail}
输出结果:
admin@freemarker.cn
root@other.com
3、数据模型中的变量
数据模型中的变量任何地方都可见,也包括不同的命名空间,如下所示:
<#macro copyright date>
<p>Copyright (C) ${date} ${user}. All rights reserved.</p>
</#macro>
<#assign mail = "${user}@freemarker.cn">
假设数据模型中的user变量的值是admin,则下面的代码:
<#import "/lib/my_test.ftl" as my>
<@my.copyright date="2000-2020"/>
${my.mail}
输出结果:
<p>Copyright (C) 2000-2020 admin. All rights reserved.</p>
admin@freemarker.cn