FreeMarker 练习
1.建立java工程
2.建立JAVA包,存放模版文件.ftl文件夹templates ,及存放生成.shtml文件夹shtmls
3.在templates文件夹下建一个1.ftl文件。内容如下。
<html>
<head>
<title>${person.description} </title>
</head>
<body>
<table width="100%" border="0" cellpadding="0" cellspacing="0" bgcolor="#FFFFFF">
<tr><td>
hello!${person.name}</br>
now date is:${person.nowTime?string('yyyy-MM-dd hh:mm:ss')}</br>
your age is:${person.age}</br>
用户定义指令:</br>
<#macro greet person>
<font size="2">Hello! ${person}!</font>
</#macro>
<@greet person="wyong"></@greet>
</td>
</tr>
</table>
</body>
</html>
4.建立需要输入的VO对象。Person 类
内容如下 :
package com.example.demo;
import java.util.Date;
public class Person {
private String name;
private Date nowTime;
private String age;
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getNowTime() {
return nowTime;
}
public void setNowTime(Date nowTime) {
this.nowTime = nowTime;
}
}
5。导入所用模版引擎的freemarker2.3.13的jar包。
6.建立处理模版类 Demo
内容如下:
package com.example.demo;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
public class Demo {
private Configuration freemarker_cfg = null;
/**
* 获取freemarker的配置. freemarker本身支持classpath,目录和从ServletContext获取.
*
* @throws IOException
*/
protected Configuration getFreeMarkerCFG() throws IOException {
if (null == freemarker_cfg) {
// Initialize the FreeMarker configuration;
// - Create a configuration instance
freemarker_cfg = new Configuration();
// - FreeMarker支持多种模板装载方式,可以查看API文档,都很简单:路径,根据Servlet上下文,classpath等等
// htmlskin是放在classpath下的一个目录
// freemarker_cfg.setClassForTemplateLoading(this.getClass(),
// "/htmlskin");
// 调用文件系统中的路径 模版文件.ftl 的根目录.
freemarker_cfg.setDirectoryForTemplateLoading(new File(
"E://space5.5//FreeMarkerDemo//templates"));
}
return freemarker_cfg;
}
/**
* 生成静态文件.
*
* @param templateFileName
* 模板文件名,相对templates路径,例如"/templates/1.ftl"
* @param propMap
* 用于处理模板的属性Object映射
* @param htmlFilePath
* 要生成的静态文件的路径,相对设置中的根路径,例如 "/shtmls/1/2005/4/"
* @param htmlFileName
* 要生成的文件名,例如 "1.htm"
*/
public boolean geneHtmlFile(String templateFileName, Map propMap,
String htmlFilePath, String htmlFileName) {
// @todo 从配置中取得要静态文件存放的根路径:需要改为自己的属性类调用
String sRootDir = "E:/space5.5/FreeMarkerDemo/shtmls";
try {
String prefix = templateFileName.substring(0, templateFileName
.indexOf("."));
Template t = getFreeMarkerCFG().getTemplate(templateFileName);
java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat(
"yyyyMMddHHmmss");
htmlFileName = prefix + "_" + sdf.format(new java.util.Date())
+ "_" + Math.round(Math.random() * 100) + htmlFileName;
// 如果根路径存在,则递归创建子目录
creatDirs(sRootDir, htmlFilePath);
File afile = new File(sRootDir + "/" + htmlFilePath + "/"
+ htmlFileName);
Writer out = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(afile)));
t.process(propMap, out);
} catch (TemplateException e) {
System.out.println("Error while processing FreeMarker template "
+ templateFileName + " \n" + e);
return false;
} catch (IOException e) {
System.out.println("Error while generate Static Html File "
+ htmlFileName + "\n " + e);
return false;
}
return true;
}
/**
* 创建多级目录
*
* @param aParentDir
* String
* @param aSubDir
* 以 / 开头
* @return boolean 是否成功
*/
public static boolean creatDirs(String aParentDir, String aSubDir) {
File aFile = new File(aParentDir);
if (aFile.exists()) {
File aSubFile = new File(aParentDir + aSubDir);
if (!aSubFile.exists()) {
return aSubFile.mkdirs();
} else {
return true;
}
} else {
return false;
}
}
/**
* 2008-5-19 author :wangyong
*
* @param args
*
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Person person = new Person();
person.setAge("22");
person.setName("Jacke");
person.setNowTime(new java.util.Date());
person.setDescription("这是第一次使用freemarker测试!");
Demo test = new Demo();
Map root = new HashMap();
root.put("person", person);//把此时的vo对象person放到map中,传值
String sGeneFilePath = "/example/";
String sFileName = ".htm";//生成的文件后缀名
boolean bOK = test.geneHtmlFile("1.ftl", root, sGeneFilePath,
sFileName);
}
}
运行此程序,可以在工程目录的shtmls/example/下看到生成的一个根据日期时间生成的.htm文件。