freemarker 命名空间

1 简介

当运行 FTL 模板时,就会有使用 assign 和 macro 指令创建的变量的集合(可能是空的),可以从前一章节来看如何使用它们。像这样的变量集合被称为 namespace 命名空间。在简单的情况下可以只使用一个命名空间,称之为 main namespace 主命名空间。因为通常只使用本页上的命名空间,所以就没有意识到这点。

如果想创建可以重复使用的宏,函数和其他变量的集合,通常用术语来说就是引用library 库。使用多个命名空间是必然的。只要考虑你在一些项目中,或者想和他人共享使用的时候,你是否有一个很大的宏的集合。但要确保库中没有宏(或其他变量)名和数据模型中变量同名,而且也不能和模板中引用其他库中的变量同名。通常来说,变量因为名称冲突也会相互冲突。所以要为每个库中的变量使用不同的命名空间。

2 创建一个库

<#macro copyright date>
<p>Copyright (C) ${date} Julia Smith. All rights reserved.</p>
</#macro>
<#assign mail = "[email protected]">

把上面的这些定义存储在文件 lib/my_test.ftl 中(目录是你存放模板的位置)。

如 果 在 aWebPage.ftl 使 用<#include "/lib/my_test.ftl"> ,那么就会在主命名空间中创建两个变量,这样就不是很好,因为想让它们只在同一个命名空间”My Test Library”中。所以就不得不使用import 指令来代替 include 了。乍一看,这个指令和 include 很相似,但是它会为 lib/my_test.ftl 创 建 一 个 空 的 命 名 空 间 , 然 后 在 那 里 执 行 。

<#import "/lib/my_test.ftl" as my>
<#-- 被称为"my"的哈希表就会是那个"大门" -->
<@my.copyright date="1999-2002"/>
${my.mail}

import 指令不仅仅创建命名空间,而且要通过 import 的调用者(本例中的主命名空间)创建一个新的哈希表变量,这就成为进入新的命名空间的大门。

<#import "/lib/my_test.ftl" as my>
<#assign mail="[email protected]">
<@my.copyright date="1999-2002"/>
${my.mail}
${mail}
<p>Copyright (C) 1999-2002 Julia Smith. All rights reserved.
<br>Email: [email protected]</p>
[email protected]
[email protected]

3 在引入的命名空间上编写变量

偶尔想要在一个被包含的命名空间上创建或替换一个变量。那么可以使用 assign 指令在完成,如果用到了它的 namespace 变量,例如下面这样:

<#import "/lib/my_test.ftl" as my>
${my.mail}
<#assign mail="[email protected]" in my>
${my.mail}
[email protected]
[email protected]

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>
[email protected]

注意:

在通常一些应用中,你也许想在模板中创建所有命名空间都可见的变量,就像数据模型中的变量一样。但是你不能在模板中改变数据模型,却可以通过 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="[email protected]" in my>
${my.mail}, ${foo.mail}, ${bar.mail}
[email protected], [email protected], [email protected]
[email protected], [email protected], [email protected]

这里可以看到通过 my , foo 和 bar 访问相同的命名空间。

还要注意命名空间是不分层次的,它们相互之间是独立存在的。那么,如果在命名空间N1 中 import 命名空间 N2,那 N2 也不在 N1 中,N1 只是可以通过哈希表来访问 N2。这和在主命名空间中 import N2,然后直接访问命名空间 N2 是一样的过程。

每一次模板的执行过程,它都有一个私有的命名空间的集合。每一次模板执行工作都是一个分离且有序的过程,它们仅仅存在一段很短的时间,同时页面用以呈现内容,然后就和所有填充过的命名空间一起消失了。因此,无论何时我们说第一次调用 import ,一个单一模板执行工作的内容都是这样。

6 为他人编写库

为了防止和其他作者使用库的命名相冲突,而且引入其他库时要书写简单,这有一个事实上的标准,那就是指定库路径的格式。这个标准是:库的路径必须对模板和其他库可用(可引用),就像这样:

/lib/yourcompany.com/your_library.ftl

如果你为 Example 公司工作,它们拥有 www.example.com 网的主页,你的工作是开发一个部件库,那么要引入你所写的 FTL 的路径应该是:

/lib/example.com/widget.ftl

注意到 www 已经被省略了。第三次路径分割后的部分可以包含子目录,可以像下面这样写:

/lib/example.com/commons/string.ftl

一个重要的规则就是路径不应该包含大写字母,为了分隔词语,使用下划线 _ ,就像wml_form (而不是 wmlForm )。

freemarker 命名空间

时间: 2024-10-09 12:10:09

freemarker 命名空间的相关文章

笔记01 登录、常用配置参数、Action访问Servlet API 和设置Action中对象的值、命名空间和乱码处理、Action中包含多个方法如何调用

Struts2登录 1. 需要注意:Struts2需要运行在JRE1.5及以上版本 2. 在web.xml配置文件中,配置StrutsPrepareAndExecuteFilter或FilterDispatcher 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <filter>     <filter-name>struts2</filter-name>     <filter-class>org.apache.struts2.di

freemarker程序开发

1.程序开发入门 1.1 创建配置实例 首先,你应该创建一个freemarker.template.Configuration的实例,然后调整它的设置.Configuration实例是存储FreeMarker应用级设置的核心部分.同时,它也处理创建和缓存预解析模板的工作.也许你只在应用(可能是servlet)生命周期的开始执行它一次: Configuration cfg = new Configuration();// 指定模板文件从何处加载的数据源,这里设置成一个文件目录.cfg.setDir

Freemarker例子

1.引入架包 2.写ftl文件 3.代码 hello.ftl 你好啊,${hello},今天你的精神不错! if else 语句测试 <#if num gt 18><#-- 不使用 >,大部分时候,freemarker会把 > 解释成标签结束!--> 及格! <#else> 不及格! </#if> 测试list <#list list as dizhi > <b>${dizhi.country}</b> <

FreeMarker笔记 第四章 其它

4.1 自定义指令 4.1.1 简介 自定义指令可以使用macro指令来定义.Java程序员若不想在模板中实现定义指令,而是在Java语言中实现指令的定义,这时可以使用freemarker.template.TemplateDirectiveModel类来扩展,后边会讲. 4.1.2 基本内容 宏是有一个变量名的模板片段.你可以在模板中使用宏作为自定义指令,这样就能进行重复性的工作.例如,创建一个宏变量来打印大号的"hello Joe!": <#macro greet> &

FreeMarker学习

FreeMarker语言 FreeMarker语言概述 Aaaaa FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写. FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序 虽然FreeMarker具有一些编程的能力,但通常由Java程序准备要显示的数据,由FreeMarker生成页面,通过模板显示准备的数据(如下图) FreeMarker不是一个Web应用框架,而适合作为Web应用框架一个组件. FreeMarker与

freemarker的简单入门程序

本文主要介绍了freemarker的常用标签<#list>   <#import>  <#assign>  <#if> <#else> <#elseif>标签,并配有相应的案例. 在这里我想先介绍freemarker一个比较重要的概念:顶层变量:所谓顶层变量就是存在数据模型中的变量. <#assign>标签的作用就是替换和创建顶层变量. 先看本项目的目录结果如下图所示: 其中FreeMarkerTest2是一个测试程序:

Freemarker与普通java

package com.sxt.test.freemarker; import java.io.File; import java.io.OutputStreamWriter; import java.io.Writer; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util

velocity freemarker比较

相比较 FreeMarker 而言,Velocity 更加简单.轻量级,但它的功能却没有 FreeMarker 那么强大. 对于大部分的应用来说,使用 FreeMarker 比 Velocity 更简单,因为 Velocity 还必须编写一些自定义的toolbox类以及一遍遍重复的编写一些比较通用的模版代码,因此也就丧失了刚开始开发时更多的宝贵时间.另外使用工具类和变通的方法在模版引擎中似乎不是一个非常有效的做法.同时,Velocity 的做法使得在Velocity的模版中大量的跟 Java 对

FreeMarker 的常用指令介绍

一.数据类型: 四种基本类型:String.Number.Boolean.Date.直接指定值可以是字符串.数值.布尔值.集合及Map对象 1. 字符串 直接指定字符串值使用单引号或双引号限定.字符串中可以使用转义字符"\".如果字符串内有大量的特殊字符,则可以在引号的前面加上一个字母r,则字符串内的所有字符都将直接输出. 2. 数值 数值可以直接输入,不需要引号.FreeMarker不支持科学计数法. 3. 布尔值 直接使用true或false,不使用引号. 4. 集合 集合用中括号