<#import> 指令用来引入一个库。它将根据指定的 hash 创建一个新的空命名空间, 然后在那个命名空间中执行给定 path 参数中的模板,path 指定模板的变量 、宏、函数等放入指定的命名空间。 然后就可以使用“新命名空间.属性”的方式访问导入模版中的变量。语法:
<#import path as hash>
参数说明:
path:模板的路径如:profile.baseDir + "/menu.ftl"。模版路径可以是一个相对路径,比如 "foo.ftl" 和 "../foo.ftl",或者是像 "/foo.ftl" 一样的绝对路径。 相对路径是相对于使用 import 指令模板的目录。 绝对路径是程序员配置 FreeMarker 时定义的相对于根路径 (通常指代"模板的根目录") 的路径。通常使用 / (斜杠) 来分隔路径组成, 而不是 \(反斜杠)。如果你从你本地的文件系统中加载模板, 那么它使用反斜杠 (比如在Windows环境下),FreeMarker 将会自动转换它们。
hash:访问命名空间的哈希表变量不带引号的名字
实例1:将 path 指定的“libs/data-user.ftl”模版中定义的函数、变量等放入到 my 这个命名空间中。
<#import "libs/data-user.ftl" as my>
如果 “libs/data-user.ftl”模版定义了 username 变量,我们可以通过 ${my.username} 方式去访问。
实例2:在 “libs/data-user.ftl”文件中通过“<#assign>”指令定义变量,然后在模版中使用 <#import> 指令导入库,显示在库中定义的变量。如下:
库文件 “libs/data-user.ftl”内容如下:
<#assign username="hxstrive"> <#assign email="hxstrive@outlook.com"> <#assign url="https://www.hxstrive.com/index.html">
模版内容:
<html> <head> <title>import 指令</title> </head> <body> <#-- 加载 data-user.ftl 库,该库文件定义了用户名、邮箱和url地址--> <#import "libs/data-user.ftl" as my> <ul> <li>用户名:${my.username}</li> <li>邮箱:${my.email}</li> <li>网站地址:${my.url}</li> </ul> </body> </html>
输出结果:
<html> <head> <title>import 指令</title> </head> <body> <ul> <li>用户名:hxstrive</li> <li>邮箱:hxstrive@outlook.com</li> <li>网站地址:https://www.hxstrive.com/index.html</li> </ul> </body> </html>
如果你用同一个 path 多次调用 import,它会创建命名空间,但是只运行第一次 import 的调用。 后面的调用仅仅创建一个哈希表变量,你只是通过它来访问同一个命名空间。例如:
(1)库文件内容(libs/data-user2.ftl、libs/data-user2-2.ftl、libs/data-user2-3.ftl 三个库文件内容一样,获取当前时间):
<#assign date=.now?string["hh:mm:SS.sss"]>
(2)模版内容:
<html> <head> <title>import 指令</title> </head> <body> <#import "libs/data-user2.ftl" as my> <#import "libs/data-user2-2.ftl" as my2> <#import "libs/data-user2-3.ftl" as my3> <p>时间:${my.date}</p> <p>时间:${my2.date}</p> <p>时间:${my3.date}</p> <#import "libs/data-user2.ftl" as my21> <#import "libs/data-user2.ftl" as my22> <#import "libs/data-user2.ftl" as my23> <p>时间:${my21.date}</p> <p>时间:${my22.date}</p> <p>时间:${my23.date}</p> </body> </html>
输出结果:
<html> <head> <title>import 指令</title> </head> <body> <p>时间:10:07:328.053</p> <p>时间:10:07:351.053</p> <p>时间:10:07:354.053</p> <p>时间:10:07:328.053</p> <p>时间:10:07:328.053</p> <p>时间:10:07:328.053</p> </body> </html>
上面例子中,首先分别引入 libs/data-user2.ftl、libs/data-user2-2.ftl、libs/data-user2-3.ftl 三个库,然后打印它们;你会发现它们的日期并不一样,说明每个库文件都被加载了;然后将 libs/data-user2.ftl 引入3次,输出结果的时间是一致的,说明 libs/data-user2.ftl 只被加载了一次。
由引入的模板打印的输出内容将会被忽略 (不会在包含它的地方被插入)。模板的执行是来用变量填充命名空间, 而不是写到输出中。比如:
(1)库文件内容如下:
<#assign version="v1.0.1"> <p> 当前版本是 ${version} </p>
(2)模版内容如下:
<html> <head> <title>import 指令</title> </head> <body> <#import "libs/data-user3.ftl" as my> <p> my.version=${my.version} </p> </body> </html>
输出结果:
<html> <head> <title>import 指令</title> </head> <body> <p> my.version=v1.0.1 </p> </body> </html>
上面输出结果中,并没有把 “libs/data-user3.ftl”库中的 <p> 标签输出,只将变量赋值给了 my 命名空间。