NewsItem .java
package freemarker;
/**
* @author terrychan
*
*/
public class NewsItem {
public String title;
public String addTime;
public String showContent;
public String getAddTime() {
return addTime;
}
public void setAddTime(String addTime) {
this.addTime = addTime;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getShowContent() {
return showContent;
}
public void setShowContent(String showContent) {
this.showContent = showContent;
}
public void loadData(){
this.title=”测试内容”;
this.showContent=”测试freemarker生成静态页面”;
this.addTime=”2007-09-10″;
}
}
FreeMarkerTest.java
package freemarker;
import java.io.*;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import freemarker.template.*;
/**
* 测试FreeMarker.
*
* @author Terry.Chan
*
*/
public class FreeMarkerTest {
private final Log logger = LogFactory.getLog(getClass());
private Configuration freemarker_cfg = null;
static String sGeneFilePath = “d:\\test\\”;
static String sGeneFileName = “freemarker.htm”;
static String sTempPlateFilePath = “d:\\test\\”;
public static void main(String[] args) throws IOException {
// @todo 创建一个类,然后创建instance
NewsItem aItem = new NewsItem();
aItem.loadData();
FreeMarkerTest test = new FreeMarkerTest();
Map root = new HashMap();
root.put(”newsitem”, aItem);
boolean bOK = test.geneHtmlFile(”template.ftl”, root, sGeneFilePath,
sGeneFileName);
}
/**
* 获取freemarker的配置. freemarker本身支持classpath,目录和从ServletContext获取.
*/
protected Configuration getFreeMarkerCFG() {
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”);
// freemarker_cfg.setTemplateLoader(arg0)
// freemarker_cfg.set
try {
freemarker_cfg.setDirectoryForTemplateLoading(new File(
sTempPlateFilePath));
} catch (Exception ex) {
ex.printStackTrace();
}
}
return freemarker_cfg;
}
/**
* 生成静态文件.
*
* @param templateFileName
* 模板文件名,相对htmlskin路径,例如”/tpxw/view.ftl”
* @param propMap
* 用于处理模板的属性Object映射
* @param htmlFilePath
* 要生成的静态文件的路径,相对设置中的根路径,例如 “/tpxw/1/2005/4/”
* @param htmlFileName
* 要生成的文件名,例如 “1.htm”
*/
public boolean geneHtmlFile(String templateFileName, Map propMap,
String htmlFilePath, String htmlFileName) {
// @todo 从配置中取得要静态文件存放的根路径:需要改为自己的属性类调用
try {
Template t = getFreeMarkerCFG().getTemplate(templateFileName);
// 如果根路径存在,则递归创建子目录
creatDirs(htmlFilePath);
File afile = new File(htmlFilePath + “/” + htmlFileName);
Writer out = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(afile)));
t.process(propMap, out);
} catch (TemplateException e) {
logger.error(”Error while processing FreeMarker template ”
+ templateFileName, e);
return false;
} catch (IOException e) {
logger.error(”Error while generate Static Html File ”
+ htmlFileName, e);
return false;
}
return true;
}
/**
* 创建多级目录
*
* @param aParentDir
* String
* @param aSubDir
* 以 / 开头
* @return boolean 是否成功
*/
public static boolean creatDirs(String path) {
File aFile = new File(path);
if (!aFile.exists()) {
return aFile.mkdirs();
} else {
return true;
}
}
}
template.ftl
<html>
<head>
<title>查看文章: ${newsitem.title} </title>
</head>
<body>
<table width=”100%” border=”0″ cellpadding=”0″ cellspacing=”0″ bgcolor=”#FFFFFF”>
<tr><td>
<table width=”95%” border=”0″ align=”center” cellpadding=”2″ cellspacing=”6″ >
<tr>
<td height=”10″ align=”left” colspan=2 ></td>
</tr>
<tr>
<td align=”left” width=”538″ >
<strong>${newsitem.title}</strong> ( ${newsitem.addTime} )
</td>
<td align=”right”>
<a href=”index.jsp” mce_href=”index.jsp”>返回</a>
</td>
</tr>
<tr>
<td align=”left” valign=top colspan=2>
<hr align=”left” width=”95%” size=”1″ noshade color=”#cc0000″ >
</td>
</tr>
<tr>
<td colspan=2>${newsitem.showContent}
</td>
</tr>
</table>
<br>
</td></tr>
</table>
</body>
</html> |
|