freemarker之模板开发(其它之命名空间)
-----------
1.简介
当运行FTL 模板时,就会有使用assign 和macro 指令创建的变量的集合(可能是空的),可以从前一章节来看如何使用它们。像这样的变量集合被称为namespace 命名空间。在简单的情况下可以只使用一个命名空间,称之为main namespace 主命名空间。因为通常只使用本页上的命名空间,所以就没有意识到这点。
如果想创建可以重复使用的宏,函数和其他变量的集合,通常用术语来说就是引用library 库。使用多个命名空间是必然的。只要考虑你在一些项目中,或者想和他人共享使用的时候,你是否有一个很大的宏的集合。但要确保库中没有宏(或其他变量)名和数据模型中变量同名,而且也不能和模板中引用其他库中的变量同名。通常来说,变量因为名称冲突也会相互冲突。所以要为每个库中的变量使用不同的命名空间。
2.创建一个库
我们来建立一个简单的库。假设你需要通用的变量copyright 和mail(在你疑问之前,宏当作是变量):
<#macro copyright date>
<p>Copyright (C) ${date} Julia Smith. All rights reserved.</p>
</#macro>
<#assign mail = "jsmith@acme.com">
把上面的这些定义存储在文件lib/my_test.ftl 中(目录是你存放模板的位置)。假设想在aWebPage.ftl 中使用这个模板。如果在aWebPage.ftl 使用<#include "/lib/my_test.ftl">,那么就会在主命名空间中创建两个变量,这样就不是很好,因为想让它们只在同一个命名空间”My Test Library”中。所以就不得不使用import 指令来代替include 了。乍一看,这个指令和include 很相似,但是它会为lib/my_test.ftl 创建一个空的命名空间, 然后在那里执行。
lib/my_test.ftl 会发现它自己在一个新的环境中,那里只有数据模型的变量可以来呈现(因为它们在那里面都是可见的),然后会在这个环境中创建两个变量。现在来看这很不错,但是如果想访问aWebPage.ftl 中的两个变量,而它们使用的是主命名空间,就不能看到其他命名空间中的变量。解决方法是import 指令不仅仅创建命名空间,而且要通过import 的调用者(本例中的主命名空间)创建一个新的哈希表变量,这就成为进入新的命名空间的大门。那么aWebPage.ftl 就像下面这样:
<#import "/lib/my_test.ftl" as my>
<#-- 被称为"my"的哈希表就会是那个"大门" -->
<@my.copyright date="1999-2002"/>
${my.mail}
要注意它是怎么访问为lib/my_test.ftl 创建的命名空间中的变量的,通过新创建的哈希表,my。那么将会打印出:
<p>Copyright (C) 1999-2002 Julia Smith. All rights reserved.</p>
jsmith@acme.com
如果在主命名空间中有一个变量,名为mail 或copyright,那么就不会引起混乱了,因为两个模板使用了不同的命名空间。例如,在lib/my_test.ftl 中修改copyright 成如下这样:
<#macro copyright date>
<p>Copyright (C) ${date} Julia Smith. All rights reserved.
<br>Email: ${mail}</p>
</#macro>
然后修改aWebPage.ftl 中的内容:
<#import "/lib/my_test.ftl" as my>
<#assign mail="fred@acme.com">
<@my.copyright date="1999-2002"/>
${my.mail}
${mail}
那么将会输出:
<p>Copyright (C) 1999-2002 Julia Smith. All rights reserved.
<br>Email: jsmith@acme.com</p>
jsmith@acme.com
fred@acme.com
3.在引入的命名空间上编写变量
偶尔想要在一个被包含的命名空间上创建或替换一个变量。那么可以使用assign 指令在完成,如果用到了它的namespace 变量,例如下面这样:
<#import "/lib/my_test.ftl" as my>
${my.mail}
<#assign mail="jsmith@other.com" in my>
${my.mail}
将会输出:
jsmith@acme.com
jsmith@other.com
4.命名空间和数据模型
数据模型中的变量在任何位置都是可见的。如果在数据模型中有一个名为user 的变量,那么lib/my_test.ftl 也能访问它,aWebPage.ftl 当然也能。
<#macro copyright date>
<p>Copyright (C) ${date} ${user}. All rights reserved.</p>
</#macro>
<#assign mail = "${user}@acme.com">
如果user 是”Fred”的话,下面这个例子:
<#import "/lib/my_test.ftl" as my>
<@my.copyright date="1999-2002"/>
${my.mail}
将会输出:
<p>Copyright (C) 1999-2002 Fred. All rights reserved.</p>
Fred@acme.com
不要忘了在模板的命名空间(可以使用assign 或macro 指令来创建的变量)中的变量有着比数据模型中的变量更高的优先级。因此,数据模型的内容不会干涉到由库创建的变量。
注意:
在通常一些应用中,你也许想在模板中创建所有命名空间都可见的变量,就像数据模型中的变量一样。但是你不能在模板中改变数据模型,却可以通过global 指令来达到相似的效果。
5.命名空间的生命周期
命名空间由使用的import 指令中所写的路径来识别。如果想多次import 这个路径,那么只会为第一次的import 引用创建命名空间执行模板。后面相同路径的import只是创建一个哈希表当作访问相同命名空间的“门”。例如,在aWebPage.ftl 中:
<#import "/lib/my_test.ftl" as my>
<#import "/lib/my_test.ftl" as foo>
<#import "/lib/my_test.ftl" as bar>
${my.mail}, ${foo.mail}, ${bar.mail}
<#assign mail="jsmith@other.com" in my>
${my.mail}, ${foo.mail}, ${bar.mail}
将会输出:
jsmith@acme.com, jsmith@acme.com, jsmith@acme.com
jsmith@other.com, jsmith@other.com, jsmith@other.com
这里可以看到通过my,foo 和bar 访问相同的命名空间。还要注意命名空间是不分层次的,它们相互之间是独立存在的。那么,如果在命名空间N1 中import 命名空间N2,那N2 也不在N1 中,N1 只是可以通过哈希表来访问N2。这和在主命名空间中import N2,然后直接访问命名空间N2 是一样的过程。
每一次模板的执行过程,它都有一个私有的命名空间的集合。每一次模板执行工作都是一个分离且有序的过程,它们仅仅存在一段很短的时间,同时页面用以呈现内容,然后就和所有填充过的命名空间一起消失了。因此,无论何时我们说第一次调用import,一个单一模板执行工作的内容都是这样。
分享到:
相关推荐
Freemarker模板生成pdf+javaFreemarker模板生成pdf+javaFreemarker模板生成pdf+javaFreemarker模板生成pdf+javaFreemarker模板生成pdf+java
freemarker根据模板生成word,freemarker根据模板生成word,freemarker根据模板生成word
Freemarker 模板开发 Freemarker 入门
基于Freemarker模板的纯Java代码实现的代码生成器工具
Java freemarker 模板生成word动态表格
通过springboot 整合freemarker模板引擎,自动发送html格式邮件
Freemarker+poi 模板生成word+导入图片 直接导入eclipse即可,希望对大家有所帮助
FreeMarker概述 FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写 FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序 虽然FreeMarker具有一些编程的能力...
大致的思路是先用office2003或者2007编辑好word的样式,然后另存为xml,将xml翻译为FreeMarker模板,最后用java来解析FreeMarker模板并输出‘.doc’ word文档。经测试这样方式生成的word文档完全符合office标准,...
freemarker生成word文档模板,配合文档使用,效果更佳。https://blog.csdn.net/xueshuiyy/article/details/86748009
在这里将通过Freemarker这个模板引擎来实现导出 Word,项目不限于Swing,SSH,SSM,Spring Boot 之类的 ————————————— Spring Boot,Freemarker 编辑好格式的Word文档 1份 将Word文档里需要填充的地方...
freemarker java模板技术 很详细的注释 适合初学者,了解思路
FreeMarker通用模板。FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款...
通过程序生成PDF文件, wkhtmltox-0.12.3.2_msvc2013-win64.exe html-url
1.这是一个在根目录下的mail.properties文件中配好发送邮件地址和接收邮箱地址的实例,利用freeMarker模板作为展示,在测试类中提供配固定接收邮箱地址和手动输入接收邮箱地址两种方法进行发送试验,结果都能实现...
附件包含了mybatis-plus自动生成代码,基于freemarker的模板。包括常规的curd。 【特点】针对每个接口都有对应的入参和出参,不公用entity。 如,add接口,则入参会自动生成为addEntityReq。具体可下载模板进行查看...
最近在做一个出卷系统,需要通过试卷模板从数据库中抽取题目,然后按照模板的样式生成完整的试卷,包括试卷格式的排版和图片的写入。这是用freemarker模板生成word文档。里面包括完整代码和所需jar包。
FreeMarker 是一款模板引擎:即一种基于模板、用来生成输出文本(任何来自于 HTML格式,pdf格式的文本用来自动生成源代码)的通用工具。它是为 Java 程序员提供的一个开发包,本教程绝对详细,叫你从精通,玩转它
FreeMarker导出模板,以及基本代码
试用于AS的模板API