本文更新日期: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