FreeMarker中引入公共文件的两种方式

来源:互联网 发布:数据分析师的一天 编辑:程序博客网 时间:2024/05/17 06:27

这里简单叙述了一下<#include/>和<#import/>的用法


首先是自定义的工具类FreeMarkerUtil.java

package com.jadyer.util;import java.io.BufferedWriter;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.io.Writer;import java.util.Map;import freemarker.template.Configuration;import freemarker.template.Template;import freemarker.template.TemplateException;public class FreeMarkerUtil {/** * 获取指定目录下的模板文件 * @param name       模板文件的名称 * @param pathPrefix 模板文件的目录 */public Template getTemplate(String name, String pathPrefix) throws IOException{Configuration cfg = new Configuration(); //通过FreeMarker的Configuration对象可以读取ftl文件cfg.setClassForTemplateLoading(this.getClass(), pathPrefix); //设置模板文件的目录cfg.setDefaultEncoding("UTF-8");       //Set the default charset of the template filesTemplate temp = cfg.getTemplate(name); //在模板文件目录中寻找名为"name"的模板文件return temp; //此时FreeMarker就会到类路径下的"pathPrefix"文件夹中寻找名为"name"的模板文件}/** * 根据模板文件输出内容到控制台 * @param name       模板文件的名称 * @param pathPrefix 模板文件的目录 * @param rootMap    模板的数据模型 */public void print(String name, String pathPrefix, Map<String,Object> rootMap) throws TemplateException, IOException{this.getTemplate(name, pathPrefix).process(rootMap, new PrintWriter(System.out));}/** * 根据模板文件输出内容到指定的文件中 * @param name       模板文件的名称 * @param pathPrefix 模板文件的目录 * @param rootMap    模板的数据模型 * @param file       内容的输出文件 */public void printFile(String name, String pathPrefix, Map<String,Object> rootMap, File file) throws TemplateException, IOException{Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8"));this.getTemplate(name, pathPrefix).process(rootMap, out); //将模板文件内容以UTF-8编码输出到相应的流中if(null != out){out.close();}}}

这是位于//src//ftl//包中用于演示最后效果的theImport.ftl

<meta http-equiv="content-type" content="text/html; charset=UTF-8"><#-- 使用<#include/>可能会出现同名变量被覆盖的问题 --><#include "/inc/top.ftl"/><#include "/inc/body.ftl"/>${myblog}<#-- 可以使用<#import/>完成导入,并且加入名称空间 --><#import "/inc/top.ftl" as mytop/><#import "/inc/body.ftl" as mybody/>${mytop.myblog}${mybody.myblog}<#-- 访问名称空间中的自定义指令 --><@mytop.myIncMacro/><#-- 也可在定义模板变量时指定其所属的名称空间,且此时就必须使用"名称空间.变量名"的方法访问了 --><#-- 另外其所指定的名称空间不能凭空捏造,在本例中只能指定mytop or mybody --><#assign age=26 in mybody/>${mybody.age}

这是位于//src//ftl//inc//包中的公共文件top.ftl

<h2>Welcome ${visitor} to visit my blog</h2><hr/><#assign myblog="http://blog.csdn.net/jadyer"/><#macro myIncMacro>hello:inc macor</#macro>

这是位于//src//ftl//inc//包中的公共文件body.ftl

<#assign myblog="MyBlog—>http://blog.csdn.net/jadyer"/>

最后是用JUnit4.x写的测试类FreeMarkerTest.java

package com.jadyer.test;import java.io.File;import java.io.IOException;import java.util.HashMap;import java.util.Map;import org.junit.Test;import com.jadyer.util.FreeMarkerUtil;import freemarker.template.TemplateException;public class FreeMarkerTest {@Testpublic void printInc() throws TemplateException, IOException{Map<String,Object> rootMap = new HashMap<String,Object>();rootMap.put("visitor", "吴邪");new FreeMarkerUtil().print("theImport.ftl", "/ftl", rootMap);new FreeMarkerUtil().printFile("theImport.ftl", "/ftl", rootMap, new File("D:\\ftl\\my.html"));}}