首页 > 其他分享 >【FreeMarker模板引擎】3.freemarker命名空间

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

时间:2023-03-19 11:01:28浏览次数:44  
标签:java FreeMarker freemarker import mail com ftl 模板


上一篇我们讨论了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="[email protected]"/>

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


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


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


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


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


与变量:


<#import "b.ftl" as bb/>
<@bb.pageFoot date="2007-2018"/>
${bb.mail}
${mail}
<#assign mail="[email protected]"/>
${mail}
<#assign mail="[email protected]" 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", "[email protected]");

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

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

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


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


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


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


第四个结果是使用assign为模板自己的mail变量赋了新值“[email protected]”,第五个结果


使用“in 命名空间代号”将引入的b.ftl中的mail变量赋了新值“[email protected]”。



二、命名空间命名规则

对于命名空间,其也是有规则的。假设公司名为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。

标签:java,FreeMarker,freemarker,import,mail,com,ftl,模板
From: https://blog.51cto.com/u_16012040/6131016

相关文章

  • Spring Boot Thymeleaf 模板引擎
    我们之前开发,我们需要将前端转成jsp页面,jsp好处就是当我们查出一些数据转发到JSP页面以后,我们可以用jsp轻松实现数据的显示,及交互等。jsp支持非常强大的功能,包括能写Java......
  • Vue2入门之超详细教程三-初识模板语法
    1、简介模板语法就是按照固定的模板去书写代码,分为插值语法和指令语法。差值语法:功能:用于解析标签体内容写法:{{xxxx}},xxx是js表达式,且可以读取......
  • 基础算法模板之区间离散化与合并
    区间离散化将数量很少但数值很大的区间下标有序映射到一个集中的区间内,并可以根据原下标x迅速找到(二分)新下标vector<int>alls;//存储所有可能下标sort(alls.begin(......
  • 基础算法模板之前缀和与差分
    前缀和规定数列{\(a_i\)}的前缀和为\(S_i\)=\(\sum{_{k=1}^i}a_k\),常用于使用o(1)的时间计算某段区间求和//一维前缀和S[i]=S[i-1]+a[i];//前缀和初始化,i......
  • .net6 使用iTextSharp操作PDF模板
       一、首先要通过Adobe制作好PDF模板,目前发现只能通过这个工具才能制作PDF模板Adobe自己去官网下载,不过官网是要订阅的。或者自己去找破解版也行;下载后废话不多......
  • 设计模式5——模板方法模式
    1、定义模板方法模式由两部分结构组成,第一部分是抽象父类,第二部分是具体的实现子类。2、核心在抽象父类中封装子类的算法框架,它的init方法可作为一个算法的模板,指导子......
  • 基础算法模板之二分
    二分1.算法分析对于一个有序的序列,在查找某个值时可以优先考虑中间值与待查找值的关系来缩减查找范围,每次可以缩减一半,因此称为二分。由于每次处理的数据量变为原来的......
  • 基础算法模板之归并排序
    归并排序1.算法分析归并排序是分治的思想,将一个序列分为多个子序列,先让每个子序列有序,再合并已有序的子序列。把长度为n的输入序列分成两个长度为n/2的子序列;对这两个......
  • 基本算法模板之快速排序
    快速排序1.算法描述从数列中挑出一个元素,称为"基准";重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这......
  • 泛型对象的应用:常规业务逻辑模板化,使用通用的父类来定义字段,具体字段由实现类来赋予数
    泛型对象的应用:常规业务逻辑模板化,使用通用的父类来定义字段,具体字段由实现类来赋予数据//DEMO-1publicinterfaceCommonTemplateService<T,F>{publicTbuildCa......