使用NVelocity0.5实现服务器端页面自动生成

地球人都知道,静态HTML页面通常会比服务器端页面如asp、aspx页面要来的快,即使这些页面没有服务器端代码。
另外要命的是,这些页面在主流的搜索引擎能中最为吃香,和那些aspx还带几个尾巴参数的页面比起来,真是天上地下。
如果那天老板发现这个问题,叫你把辛辛苦苦实现的服务器端程序向静态HTML页面靠拢,你会做何感想?
有一种URL重写的方案可以实现对搜索引擎的欺骗,除了这种方法,自动生成静态HTML页面应该是最彻底的方法了。
言归正传,开始介绍如何实现吧
1. 引用Nvelocity0.5,记得是0.5哦,NVelocity0.4我试过好久,好像不行,好像和路径有关系。
2、引用一些需要的命名空间
using NVelocity;
using NVelocity.App;
using NVelocity.Exception;
using NVelocity.Runtime;
using NVelocityTemplateEngine;
using NVelocityTemplateEngine.Interfaces;
3、初始化一些变量来使用
        INVelocityEngine fileEngine;
        IDictionary context;

        /// <summary>
        
/// 初始化NVelocity模板引擎并加载程序的配置信息e
        
/// </summary>

        protected void InitTemplateEngine()
        
{
            context 
= new Hashtable();
            
string templateDirectory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Articles");
            fileEngine 
= NVelocityEngineFactory.CreateNVelocityFileEngine(templateDirectory, true);
        }

4、页面生成代码
        public override void Execute()
        
{
            
string message = string.Format("Create the Helper class file.");
            log.Debug(message);

            
string sql = string.Format("select * from article ");
            
if (!isCreateAll)
            
{
                sql 
= string.Format("select * from article where generated =False ");
            }


            
using (IDataReader reader = xConfig.ExecuteReader(sql))
            
{
                
while (reader.Read())
                
{
                    PrepareClass(reader);
                    OutputFile();
                }

            }

            
            sql 
= "update article set generated =True ";
            
if (!isCreateAll)
            
{
                sql 
= "update article set generated =True  where generated =False ";
            }

            xConfig.ExecuteNonQuery(sql);
        }


        
/// <summary>
        
/// Prepares the class content.
        
/// </summary>

        private void PrepareClass(IDataReader reader)
        
{
            FileNameOfOutput 
= string.Format("{0}#{1}", ((DateTime) reader["datetime"]).ToString("yyyy-MM-dd"), reader["id"].ToString());

            context.Clear();
            context.Add(
"id", reader["id"].ToString());
            context.Add(
"category", reader["category"].ToString());
            context.Add(
"title", reader["title"].ToString());
            context.Add(
"content", reader["content"].ToString());
            context.Add(
"datetime", reader["datetime"].ToString());
        }


        
/// <summary>
        
///根据模板创建输出的文件
        
/// </summary>

        public virtual void OutputFile()
        
{
            
if (fileEngine != null)
            
{
                
string filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, directoryOfOutput);
                
string fileName = Path.Combine(filePath, fileNameOfOutput + fileExtension);

                DirectoryInfo dir 
= new DirectoryInfo(filePath);
                
if (!dir.Exists)
                
{
                    dir.Create();
                }

                
                log.Debug(
string.Format("Class file output path:{0}", fileName));
                
using (StreamWriter writer = new StreamWriter(fileName, false))
                
{
                    fileEngine.Process(context, writer, 
this.templateFile);
                }

            }

        }

5、界面层生成页面
            string template = "page.htm";
            
try
            
{
                HelperClassAdapter helper 
= new HelperClassAdapter(template, false);
                helper.Execute();
                Response.Write(
"<script>alert('生成成功');</script>");
            }

            
catch(Exception ex)
            
{
                Helper.ShowError(
this, ex, false);
                
return;
            }


页面生成就可以了,具体做法自己琢磨就可以了。
页面模板文件
<HTML>
<HEAD>
<TITLE>$title</TITLE>
<META http-equiv=Content-Type content="text/html; charset=UTF-8">
<META content="$title" name=description>
<META content="$title" name=keywords>
    
</HEAD>
    
<BODY>
      
<strong class="style3">$title</strong></h2>
      
<div> $content </div>
      
<hr width="98%"/>
      
<div align="right">$datetime</div>
    
</BODY>
</HTML>

posted on 2008-01-21 23:09  伍华聪  阅读(4931)  评论(14编辑  收藏  举报

导航