FreeMaker实现静态化技术(5)【生成静态文件】

网站不可缺少的一部分就是新闻发布部分,而对于新闻发布的内容一般都是发布完成以后很少去改动的。

如果采取每次点击新闻从服务器数据库去读取数据然后显示在JSP页面上,肯定是要消耗系统的性能的。

对于这种需求,freemaker可以通过首先从后台数据库中取到数据,然后结合模板,生成一个静态的html文件,而我们将生成文件的文件名保存在数据库中,当用户点击新闻的时候,直接根据新闻所对应的HTML文件名,去取得静态文件。

1.Java文件

FreeMarkerTest.java

package com.test;

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 org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

public   class  FreeMarkerTest
{

       private   final  Log logger  =  LogFactory.getLog(getClass());
     
       private  Configuration freemarker_cfg  =   null ;
     
     
     
       public   static   void  main(String[] args)
        {
           // @todo 自己的一个类 
           NewsItem aItem  =   new NewsItem() ;
         
           // @todo 装入新闻
           // NewsItem = loadNewsItem(1); 
              
          FreeMarkerTest test  =   new  FreeMarkerTest();
         
          Map root  =   new  HashMap();
          root.put( "newsitem" , aItem);

          String sGeneFilePath  =   "/tpxw/" ;
         
          String sFileName  =   "2.htm" ;

           boolean  bOK  =  test.geneHtmlFile( "view.ftl " ,root, sGeneFilePath,sFileName);
         
      } 
     

       /** */ /** 
       * 获取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 " );
               try {
    freemarker_cfg
      .setDirectoryForTemplateLoading(new File(
        "D://workspace//FreeMaker//WebRoot//WEB-INF//templates"));
   } catch (Exception e) {
    e.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 从配置中取得要静态文件存放的根路径:需要改为自己的属性类调用 
           String sRootDir  =   "e:/htmlfile"  ; //这就是保存所生成静态文件的文件夹
          
           try 
            {
              Template t  =  getFreeMarkerCFG().getTemplate(templateFileName);

               // 如果根路径存在,则递归创建子目录 
               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)
            {
              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 aParentDir, String aSubDir)
        {
       System.out.println(aParentDir+":"+aSubDir);
          File aFile  =   new  File(aParentDir);

          if(!(aFile.exists()))
          {
           aFile.mkdir();
          }
           if  (aFile.exists())
            {
              File aSubFile  =   new  File(aParentDir  +  aSubDir);
               if  ( ! aSubFile.exists())
                {
                   return  aSubFile.mkdirs();
              } 
               else 
                {
                   return   true ;
              } 
          } 
           else 
            {
               return   false ;
          } 
      }    
}  

 

编写一个bean

package com.test;

public class NewsItem {
 
 private String title="free maker题目";

 public String getTitle() {
  return title;
 }

 public void setTitle(String title) {
  this.title = title;
 }

}

2.在/FreeMaker/WebRoot/WEB-INF/templates/view.ftl路径下新建view.ftl文件

<html>
     <head>
          <title> 查看文章: ${newsitem.title}   </title>
     </ head >
     <body >
      
     </ body>
 </ html>

 

 

你可能感兴趣的:(java,apache,freemarker,Web,bean)