介绍
FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写 FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序
环境
学习工具:Myeclipse8.5
在开发工具见好项目,如果要用freemark必须要导入包-----freemarker-2.3.16.jar(版本自己定,可以直接到网上搜,如果用下过struts,在它的lib下面也有这个包)
先给小白看一个最简单的程序,如果是高手请别喷,现在俺也是小白(运行TestFreemark.java文件中的test01方法,由于项目持续更新,小白可以只运行test01方法例子)
目录结构,这个大家注意一下ftl目录在哪个位置就可以了
文件内容 TestFreemark.java
package com.freemark; import java.util.Arrays; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import org.junit.Before; import org.junit.Test; import com.freemark.model.User; public class TestFreemark { FreemarkerUtil fu = null; Map<String, Object> root = null; @Before public void setUp(){ fu = new FreemarkerUtil(); root = new HashMap<String, Object>(); } @Test public void test01() { root.put("username", "张三"); fu.print("01.ftl", root);//调用控制台打印输出,在控制台打印 fu.filePrint("01.ftl", root, "ggyy.html");//写到D盘file目录下面 fu.filePrint("02.ftl", root, "ggyy.html");//写到D盘file目录下面 } @Test public void test03(){ root.put("user", new User(1, "张三", 19)); fu.print("03.ftl", root);//调用控制台打印输出,在控制台打印 fu.filePrint("03.ftl", root, "03.html");//写到D盘file目录下面 } @Test public void test04(){ List<User> users = Arrays.asList(new User(1, "张三", 16),new User(2, "李四", 18),new User(3, "王武", 24),new User(4, "小二", 12)); root.put("users", users); fu.print("04.ftl", root);//调用控制台打印输出,在控制台打印 fu.filePrint("04.ftl", root, "04.html");//写到D盘file目录下面 } @Test public void test05(){ List<User> users = Arrays.asList(new User(1, "张三", 16),new User(2, "李四", 18),new User(3, "王武", 24),new User(4, "小二", 12)); root.put("users", users); root.put("username", "管理员"); fu.print("05.ftl", root);//调用控制台打印输出,在控制台打印 fu.filePrint("05.ftl", root, "05.html");//写到D盘file目录下面 } @Test public void test06(){ //现在group没有复制为空,freemark不会自动对空值做处理,必须在模版进行设置(${user.group!"无值"}) root.put("user", new User(1, "张三", 19)); fu.print("06.ftl", root);//调用控制台打印输出,在控制台打印 fu.filePrint("06.ftl", root, "06.html");//写到D盘file目录下面 } @Test public void test07(){ //<#assign username="张三" > 使用assign自定义变量、变量的转型、date类型处理 root.put("now", new Date()); fu.print("07.ftl", root);//调用控制台打印输出,在控制台打印 fu.filePrint("07.ftl", root, "07.html");//写到D盘file目录下面 } @Test public void test08(){ //序列操作 fu.print("08.ftl", root);//调用控制台打印输出,在控制台打印 fu.filePrint("08.ftl", root, "08.html");//写到D盘file目录下面 } }注意:这里我用的了junit,选中方法名右击运行即可,你们也可以使用main方法运行,如果使用junit可以直接把junit包导入项目,myeclispe自带可以直接导入,就不在这里详细介绍
文件内容 FreemarkerUtil.java
package com.freemark; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.util.HashMap; import java.util.Map; import com.freemark.model.User; import freemarker.template.*; public class FreemarkerUtil { public Template getTemplate(String name){ try { Configuration cfg = new Configuration(); cfg.setClassForTemplateLoading(this.getClass(),"/ftl"); Template temp = cfg.getTemplate(name); System.out.println("获取Template完成"); return temp; } catch (IOException e) { e.printStackTrace(); System.out.println("获取Template失败"); } return null; } public void print(String name,Map<String, Object> root){ try { Template temp = this.getTemplate(name); temp.process(root, new PrintWriter(System.out)); System.out.println("打印控制台"); } catch (TemplateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public void filePrint(String nameFtl,Map<String, Object> root,String fileName){ FileWriter out = null; try { out = new FileWriter(new File("D://file//"+fileName));//写入D盘目录下,地址可以自己定 Template temp = this.getTemplate(nameFtl); temp.process(root, out); System.out.println("输出流"); } catch (IOException e) { e.printStackTrace(); } catch (TemplateException e) { e.printStackTrace(); } } }
文件内容 01.ftl
你好:${username}
文件内容 02.ftl 显示一个参数
<html> <head> <title>小白学习FreeMark</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> </head> <body> 你好:<h1>${username}</h1> </body> </html>
文件内容 03.ftl 显示对象,通过if判断年龄
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE>小白学习FreeMark</TITLE> <META NAME="Generator" CONTENT="EditPlus"> <META NAME="Author" CONTENT=""> <META NAME="Keywords" CONTENT=""> <META NAME="Description" CONTENT=""> </HEAD> <BODY> <h1>${user.id} ------------- ${user.name} -------------- ${user.age}</h1> <#if user.age lt 12> ${user.name}还是一个小孩 <#elseif user.age lt 18> ${user.name}快成年了 <#else> ${user.name}已经成年 </#if> </BODY> </HTML>
使用条件判断,效果展示
文件内容 04.ftl 显示list集合
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE>小白学习FreeMark</TITLE> <META NAME="Generator" CONTENT="EditPlus"> <META NAME="Author" CONTENT=""> <META NAME="Keywords" CONTENT=""> <META NAME="Description" CONTENT=""> </HEAD> <BODY> <#list users as user> <h1>${user.id} ------------- ${user.name} -------------- ${user.age}</h1> </#list> </BODY> </HTML>
文件内容 05.ftl include引用top页面
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE>小白学习FreeMark</TITLE> <META NAME="Generator" CONTENT="EditPlus"> <META NAME="Author" CONTENT=""> <META NAME="Keywords" CONTENT=""> <META NAME="Description" CONTENT=""> </HEAD> <BODY> <#include "top.ftl"> <hr/> <#list users as user> <h1>${user.id} ------------- ${user.name} -------------- ${user.age}</h1> </#list> </BODY> </HTML>
文件内容 06.ftl 数据为空设置
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE>小白学习FreeMark</TITLE> <META NAME="Generator" CONTENT="EditPlus"> <META NAME="Author" CONTENT=""> <META NAME="Keywords" CONTENT=""> <META NAME="Description" CONTENT=""> </HEAD> <BODY> <h1>${user.id} ------------- ${user.name} -------------- ${user.group!"无值"}</h1> <#--${user.group.name!"无值"}这样写freemark只会判断name是否为空,不会判断group 所以会报错 --> ${(user.group.name)!"无值"}<#--加上括号则会判断user、group、name是否为空,惊叹号后面可以不谢“无值”将是什么都不显示 --> ${(a.b)!"不存在的对象处理"} <#if (a.b)??><#--在if中可以使用??判断是否为空 --> 不为空 <#else> 为空 </#if> <#if (user.name)??> 不为空${(user.name)!} <#else> 为空 </#if> </BODY> </HTML>注意:${(user.group.name)!"无值"} 处理空值最好加上括号
文件内容 07.ftl 使用assign自定义变量、变量的转型、date类型处理
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE>小白学习FreeMark</TITLE> <META NAME="Generator" CONTENT="EditPlus"> <META NAME="Author" CONTENT=""> <META NAME="Keywords" CONTENT=""> <META NAME="Description" CONTENT=""> </HEAD> <BODY> <#--自定义变量 如果声明变量名相同,会直接覆盖不会报错 --> <#assign username="张三" > ${username!} <#--不使用引号则是数值类型 --> <#assign num=10 > ${num+11} <#--使用引号则是字符串类型 --> <#assign str="10" > ${str+11} <#--往字符串插值这两种想过是一样的 --> ${"hello"+username} ${"hello${username}"} <#--不能输出字符串以为类型,例如boolean型就会报错,必须转成字符串行才能输出。转换格式:XXX?string --> <#assign boo=true > <#--${boo} --> ${boo?string} ${(a.b)???string} <#--还可以 --> ${(a.b)???string("真","假")} <#--时间类型也必须要转换才能输入 --> ${now?string("yyyy-MM-dd HH:mm:ss:sss")} <#--字符串类型转换成date类型转换日期 --> <#assign bir="2012-08-22 12:22:33"?date("yyyy-MM-dd HH:mm")> ${bir} <#--字符串类型转换成datetime类型转换日期和时间 --> <#assign bir="2012-08-22 12:22:33"?datetime("yyyy-MM-dd HH:mm")> ${bir} <#--转换html代码,这样可以直接将html代码显示到页面 --> ${"<br/>"?html} <#--left_pad函数用法,主要是为了填充 --> [${"abced"?left_pad(3)}] [${"abced"?left_pad(10,"--")}] <#--相关用法 四舍五入和取整 --> ${1.4?string(0)} ${1.5?string(0)} ${1.4?int} ${1.5?int} </BODY> </HTML>
文件内容 08.ftl 序列表和hash表
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE>小白学习FreeMark</TITLE> <META NAME="Generator" CONTENT="EditPlus"> <META NAME="Author" CONTENT=""> <META NAME="Keywords" CONTENT=""> <META NAME="Description" CONTENT=""> </HEAD> <BODY> <#--显示序列所有序列元素 --> <#assign nums=[1,2,3,4,5,6,7,8,9,10,9,8,7,6,5,4,3,2,1] > <#list nums as num> ${num} </#list> <#--1..100 还可以这样表示,一下定义不能使用[],不然会报错 --> <#assign nums=1..100 ><#--或者这样--> <#list 1..100 as num > ${num} </#list> <br/> <#assign num1=nums[0..10] > <#list num1 as num > ${num} </#list> <#--使用map集合 --> <#assign maps = {"1":"张三","2":"李四","3":"王武","4":"俅俅"}> ${maps["1"]}${maps["2"]}${maps["3"]}${maps["4"]} <#--便利map集合 --> <#assign keys = maps?keys> <#list keys as key> ${key}---${maps[key]} </#list> <#-- ${maps."1"} 不能这样遍历map,除非第一个key不是整数类型,像下面一样--> <#assign users = {"username":"张三","password":"123","sex":"22"}> ${users.username} </BODY> </HTML>
…………………………………………………………
未完结,还在更新中。。。
…………………………………………………………