0
点赞
收藏
分享

微信扫一扫

【FreeMarker模板引擎】3.freemarker命名空间


上一篇我们讨论了freemarker的数据结构、控制语句的基础知识和使用技巧,本篇我们介绍一下
freemarker的命名空间。

一、命名空间简介和使用
对于“命名空间”来说,即是开发中经常遇到的“namespace”。几乎每个编程语言都有自己
的namespace,例如Java里的“包”就是一个namespace的概念。namespace一般是用来解决重名
问题的,我们可以在不同的namespace下创建相同名称的东西。

在freemarker中我们需要如何使用namespace呢?

上一篇讲到,我们可以使用assign给某个变量赋值:

<#assign name="张三"/><#-- 给后台传来的name变量赋值 -->

或者使用macro指令创建“自定义指令”:


<#macro sayHello name>
欢迎您光临,${name}
</#macro>

后面调用<#macro "张三"></#macro>即可打印出“欢迎您光临,张三”。



上面的分别assign与macro是自定义的“变量”和“宏”。当我们想要在其它的模板文件中使用


这些变量和宏的时候,就要将定义“变量”和“宏”的ftl文件路径作为其命名空间引入至需要


它们的其它模板文件中。



例如以下样例:


<#macro pageFoot date>
<p>Copyright (C) ${date} 某某直播平台.</p>
</#macro>
<#assign mail="xxxxxx@126.com"/>

上面定义了一个自定义指令“pageFoot”,用来在网页的尾部放置网站版权信息,其中日期


作为参数引入,动态显示在版权信息中。下面的assign定义了一个网站管理员的邮箱,用于放置在


所有网站的底部。上面的指令放置在b.ftl文件中:


【FreeMarker模板引擎】3.freemarker命名空间_赋值


然后在a.ftl文件中引入上面的b.ftl的命名空间(即其对于a.ftl的相对路径),并使用相关指令


与变量:


<#import "b.ftl" as bb/>
<@bb.pageFoot date="2007-2018"/>
${bb.mail}
${mail}
<#assign mail="cccccc@126.com"/>
${mail}
<#assign mail="dddddd@126.com" in bb/>
${bb.mail}

我们在测试类中,在动态参数中放置页面自己的mail变量:


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

import freemarker.template.Configuration;
import freemarker.template.Template;

public class Test1 {
public static void main(String[] args) throws Exception {
//创建Freemarker配置实例
Configuration cfg = new Configuration();

cfg.setDirectoryForTemplateLoading(new File("templates"));

//创建数据模型
Map<String,Object> root = new HashMap<String,Object>();
root.put("mail", "yyyyyy@126.com");

//加载模板文件
Template t1 = cfg.getTemplate("a.ftl");

//显示生成的数据,将合并后的数据打印到控制台
Writer out = new OutputStreamWriter(System.out);
t1.process(root, out);
out.flush();
out.close();
}
}

运行测试程序,在控制台中打印一下结果:


【FreeMarker模板引擎】3.freemarker命名空间_java_02


可以看到,第一个结果打印出了b.ftl中定义的公用页脚信息,并将“2007-2018”变量嵌入。


第二个结果则拿到了b.ftl中定义mail变量,而第三个结果拿到的是该模板自己的mail变量。


第四个结果是使用assign为模板自己的mail变量赋了新值“cccccc@126.com”,第五个结果


使用“in 命名空间代号”将引入的b.ftl中的mail变量赋了新值“dddddd@126.com”。



二、命名空间命名规则

对于命名空间,其也是有规则的。假设公司名为example,其主页为www.example.com,如果你


需要为公司编写一个部件库,则引入你所写的FTL的路径应该是:/lib/example.com/widget.ftl。



第三次路径分割后的部分可以包含子目录,可以像下面这


样写:/lib/example.com/commons/string.ftl 


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


wml_form(而不是 wmlForm)。 



如果你的工作不是为公司或组织开发库,也要注意,你应该使用项目主页的 URL,比如


/lib/example.sourceforge.net/example.ftl或/lib/geocities.com/jsmith/example.ftl。

举报

相关推荐

0 条评论