主题 : freemarker生成静态页
级别: 秀才
UID: 29922
积分:95 加为好友
威望: 1 精华: 0
主题:19 回复:51
注册时间:2012-02-22
在线时长:0.01
1#   发表于:2013-01-28 17:00:53  IP:115.64.*.*
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>
1 共1页