使用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
>