公式:模板+数据=输出
模板文件即静态的html代码。数据是从后台得到的数据。
基本使用方法:
(1)导入jar包
要使用freemarker得先在程序中导入相应的jar包,2.3版本之后的freemarker是比较成熟的。这里使用freemarker2.3.16的jar包。
(2)创建配置实例
//创建Freemarker配置实例
Configuration cfg = new Configuration();
//指定模板文件从何处加载的数据源,这里设置成一个文件目录(可自定义)
cfg.setDirectoryForTemplateLoading(new File("/file/ftl"));
(3)创建数据模型
一般使用HashM
ap来构建数据,放入map中的值可以是int/String/list/自定义类的实例,等等。
//创建数据模型
Map root = new HashMap();
root.put("username", "freeMK");
(4)获得模板
典型的做法是从第二步中的配置实例中获取一个 Template 模板实例。在之前设置的目录中,用模板文件的命名,例如“ 01.ftl”来获取模板。
//加载模板文件
Template t1 = cfg.getTemplate("01.ftl");
(5)合并模板和数据模型
这里给出两种输出方式:1.以控制台打印的方式输出;2.以html文件的形式输出。
//1.控制台打印显示生成的数据
Writer out = new OutputStreamWriter(System.out);
t1.process(root, out);
//2.以html文件输出生成的数据
FileWriter out = new FileWriter(new File("html\\"+"01.html"));
t1.process(root, out);
实例:
目录结构:
//FreeMarkerUtil.java
package com.freemarker.util;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
public class FreeMarkerUtil {
public Template getTemplate(String name){
try{
//创建Freemarker配置实例
Configuration cfg = new Configuration();
//指定模板文件从何处加载的数据源,这里设置成一个文件目录(可自定义)
//这里是从ftl文件加载(如上图)
cfg.setDirectoryForTemplateLoading(new File("ftl"));
//加载模板文件
Template temp =cfg.getTemplate(name);
return temp;
}catch(IOException e){
e.printStackTrace();
}
return null;
}
//从控制台打印
public void print(String ftlName,Map data){
try {
Template temp =this.getTemplate(ftlName);
temp.process(data, new PrintWriter(System.out));
} catch (TemplateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block e.printStackTrace();
}}<p><span style="color:rgb(85,164,85)">//以html文件输出</span></p><p>public void fprint(String ftlName,Map data,String outFilename){ </p><p>FileWriter out = null; </p><p>try { </p><p>out = new FileWriter(new File("html\\"+outFilename)); </p><p>Template temp = this.getTemplate(ftlName); </p><p>temp.process(data, out); </p><p>} catch (IOException e) { </p><p> // TODO Auto-generated catch block e.printStackTrace(); </p><p>} catch (TemplateException e) { </p><p>// TODO Auto-generated catch block e.printStackTrace(); </p><p> } </p><p>}</p><p>}
</p>
</pre><p></p><pre class="java" name="code">//FreeMK022.java
package com.fremarker.second;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.freemarker.util.FreeMarkerUtil;
public class FreeMK022 {
public static void main(String[] arg){
FreeMarkerUtil fu = new FreeMarkerUtil();
Map data = new HashMap();
List list = new ArrayList();
list.add(new Country("中国","北京"));
list.add(new Country("英国","伦敦"));
list.add(new Country("美国","纽约"));
list.add(new Country("法国","巴黎"));
data.put("list",list);
fu.print("022.ftl", data);
fu.fprint("022.ftl", data, "022.html"); } }
//Country.java
package com.fremarker.second;
public class Country {
private String country;
private String city;
Country(String country,String city){
this.country = country;
this.city = city;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public String getCity() {
return city;
}
public void setCity(String city)
{ this.city = city; }}
//022.ftl
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<#list list as coun >
<b>${coun.country}的首都是${coun.city}</b> <br/>
</#list>
</body>
</html>