FreeMarker的四种基本数据类型及其序列和哈希表

来源:互联网 发布:幼儿园网络培训心得 编辑:程序博客网 时间:2024/05/16 14:50

这里分两块来说:四种基本数据类型、序列和哈希表


这是我们自己写的工具类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//包中用于演示四种基本数据类型用法的dataType.ftl

<meta http-equiv="content-type" content="text/html; charset=UTF-8"><#-- 定义变量 --><#assign myname="Jadyer"/>${myname}<#-- 定义数字 --><#assign mynum=10/>${mynum + 20}<#-- 定义字符串 --><#assign mystr="55"/>${mystr + 20}<#-- 下面的变量会覆盖上面定义的同名变量,而不会顾及数据类型是否一致 --><#assign mystr=55/>${mystr + 20}<#-- 下面的两种写法是等价的,它们连接字符串的方式分别为:字符串连接方式和插值连接方式 -->${"hello,welcome:" + username}${"hello,welcome:${username}"}<#-- 定义布尔型 --><#-- 如果直接输出${myflag}则会报错,因为FreeMarker不能直接输出数字或字符串以外的东西,否则都会报错 --><#-- 此时需要将其转换为字符串才能输出:使用xxx?string可以完成对字符串的转换。另外??用于判断变量是否存在 --><#assign myflag=true/>${myflag?string}${myflag?string("isTrue","isFalse")}${(user.name)???string("user.nameIsTrue","user.nameIsFalse")}<#-- 日期类型的处理。如果直接输出${currTime}则会报错,此时仍需将其转换为字符串 -->${currTime?string("yyyy-MM-dd HH:mm:ss")}<#-- 字符串转换为日期。注意:这样输出${"2012-06-08 22:33:33"?time("HH:mm:ss")}时,会报错 --><#assign mydate="2012-06-06"?date("yyy-MM-dd")>${mydate}${myTime?date("yyy-MM-dd")}${"2012-06-08 22:33:33"?time("yyy-MM-dd HH:mm:ss")}${"2012-06-09 22:44:44"?datetime("yyy-MM-dd HH:mm:ss")}<#-- HTML的转换。补充:更多FreeMarker内建函数请参考《FreeMarker2.3.19_Manual_zh_CN.pdf》第四部分 -->${"<br/>"}${"<br/>"?html}

这是位于//src//ftl//包中用于演示序列和哈希表用法的seqHash.ftl

<meta http-equiv="content-type" content="text/html; charset=UTF-8"><#-- 定义序列 --><#assign mynums=[11,12,13,14,15,16,17,18,19]/><#list mynums as mn>${mn}</#list><#-- 拆分序列 --><#-- 这里是将mynums序列中下标从3到6之间的元素拆分出来,组成一个新的序列 --><#assign mynum01=mynums[3..6]/><#list mynum01 as mn01>${mn01}</#list><#-- 拆分序列的引申:支持字符串的拆分 --><#-- 比如说博客文章概要时,可以采用这种方式,它要比CSS方便得多 -->${"我本将心向明月,奈何明月照沟渠。"[5..9]}....<#-- 连续序列 --><#-- 从55到58:注意此时若写成[55..58]或者[66..68]则会报错 --><#assign num01=55..58/><#list num01 as num>${num}</#list><#list 66..68 as num>${num}</#list><#-- 定义哈希表 --><#-- 注意:FreeMarker中的哈希表要求其key必须是字符串,包括数据模型中的java.util.HashMap的key也要是字符串,否则报错 --><#assign maps={"1":"张起灵", "2":56, "3":"王胖子"}/>${maps["1"]}<#assign users={"username":"jadyer", "password":1234}/>${users.username}----${(users.password)?int}----${users["password"]?string(0)}----${7.5?int}----${7.5?string(0)}<#-- 遍历哈希表 --><#-- 不能直接用list遍历map,需要先将map的key转换为相应的序列 --><#assign keys=maps?keys/><#list keys as key>${key}----${maps[key]}</#list>

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

package com.jadyer.test;import java.io.File;import java.io.IOException;import java.util.Date;import java.util.HashMap;import java.util.Map;import org.junit.Before;import org.junit.Test;import com.jadyer.util.FreeMarkerUtil;import freemarker.template.TemplateException;public class FreeMarkerTest {String pathPrefix;File file;Map<String,Object> rootMap;FreeMarkerUtil fmu;@Beforepublic void setUp(){pathPrefix = "/ftl";file = new File("D:\\ftl\\my.html");rootMap = new HashMap<String,Object>();fmu = new FreeMarkerUtil();}@Testpublic void printDateType() throws TemplateException, IOException{rootMap.put("username", "张小凡");rootMap.put("currTime", new Date());rootMap.put("myTime", "2012-06-07 22:22:22");fmu.print("dataType.ftl", pathPrefix, rootMap);fmu.printFile("dataType.ftl", pathPrefix, rootMap, file);}@Testpublic void printSeqHash() throws TemplateException, IOException{fmu.print("seqHash.ftl", pathPrefix, rootMap);fmu.printFile("seqHash.ftl", pathPrefix, rootMap, file);}}

原创粉丝点击