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