import 指令

<#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 命名空间。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号