常用生成静态页面解决方案

常用生成静态页面解决方案

2007年01月27日 星期六 11:11

如果你的网站有生成静态页面的必要(个人认为如果能合理缓存定态页面性能应该比使用静态页高^_^),可以参考以下两种方案.

方案1:使用模版页关键字替换

以下是核心代码:

usingSystem;
usingSystem.Text;
usingSystem.IO;
usingSystem.Text.RegularExpressions;
usingSystem.Collections.Specialized;

///<summary>
///根据模板页生成静态页
///</summary>
publicclassStaticHtml
{
//用来存放要替换的动态数据
staticStringDictionary_data;

///<summary>
///使用动态数据替换模板内的标签
///</summary>
///<paramname="tmplatehtml"></param>
///<paramname="articleinfo"></param>
///<returns></returns>
publicstaticstringGetHtml(stringtmplatehtml,StringDictionaryarticleinfo)
{
_data=articleinfo;

//替换内容
stringresltstring;
///使用正则表达式替换捕获模板内所有标签,替换之
resltstring=Regex.Replace(tmplatehtml,"{//$(.*?)//$}",ReplaceTaget,RegexOptions.Multiline);


/*
//如果需要写文件,可参照
stringhtmlfilename=DateTime.Now.ToString("yyyyMMddHHmmss")+".html";
StreamWritersw=newStreamWriter(path+htmlfilename,false,Encoding.UTF8);
sw.Write(resltstring);
sw.Flush();
sw.Close();
*/

returnresltstring;
}

//将单个标签替换成动态数据
staticstringReplaceTaget(Matchtaget)
{
if(taget.Length>4)
{
stringtag=taget.Value.Substring(0,taget.Value.Length-2);
tag=tag.Substring(2,tag.Length-2);

///如果动态数据中包含指定数据,则将标签替换为动态数据,否则则返标签名
return(_data[tag]==null)?tag:_data[tag].ToString();
}
else
returntaget.Value;
}
}

方案2:模拟请求动态页面,获取其输出的html,保存为静态页面。

以下是核心代码:

usingSystem;
usingSystem.Data;
usingSystem.Web;
usingSystem.Net;
usingSystem.IO;
usingSystem.Text;

///<summary>
///StaticHtml2的摘要说明
///</summary>
publicclassStaticHtml2
{
publicstaticstringGetHtml(stringUrl)
{
///定义一个System.Net.WebRequest对象
WebRequestwReq=WebRequest.Create(Url);

//WebRequest请求指定url,返回WebResponse实例
WebResponsewResp=wReq.GetResponse();

//过去WebResponse里的数据流
StreamrespStream=wResp.GetResponseStream();

//定义一个StreamReader读取Response数据流里的信息
StreamReaderreader=newStreamReader(respStream,Encoding.GetEncoding("gb2312"));

stringresult=reader.ReadToEnd();

/*
//如果需要写文件,可参照
stringhtmlfilename=DateTime.Now.ToString("yyyyMMddHHmmss")+".html";
StreamWritersw=newStreamWriter(path+htmlfilename,false,Encoding.UTF8);
sw.Write(result);
sw.Flush();
sw.Close();
*/
returnresult;
}
}

测试代码:

default.aspx

<%@PageLanguage="C#"AutoEventWireup="true"CodeFile="Default.aspx.cs"Inherits="_Default"Debug="true"%>

<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<htmlxmlns="http://www.w3.org/1999/xhtml">
<headrunat="server">
<title>无标题页</title>
</head>
<body>
<formid="form1"runat="server">
<div>
模版内容<br/>
<asp:TextBoxID="temp"runat="server"BackColor="Gainsboro"BorderColor="LightSeaGreen"
BorderWidth="1px"Height="100px"TextMode="MultiLine"Width="100%"></asp:TextBox>
处理后的内容<br/>
<asp:TextBoxID="replaceed"runat="server"BackColor="Gainsboro"BorderColor="LightSeaGreen"
BorderWidth="1px"Height="100px"TextMode="MultiLine"Width="100%"></asp:TextBox></div>
</form>
</body>
</html>

Default.aspx.cs

usingSystem;
usingSystem.Data;
usingSystem.Configuration;
usingSystem.Web;
usingSystem.Web.Security;
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
usingSystem.Web.UI.WebControls.WebParts;
usingSystem.Web.UI.HtmlControls;

publicpartialclass_Default:System.Web.UI.Page
{
protectedvoidPage_Load(objectsender,EventArgse)
{
/*
//对指定地址请求方式,将动态页面生成静态
Response.Write(StaticHtml2.GetHtml("http://www.sohu.com"));
Response.End();
*/

stringtemplate="<html><title>{$title$}</title><body>{$title$}<br/>作者:{$author$}<br/>{$content$}</body></html>";
temp.Text=template;

System.Collections.Specialized.StringDictionarydic=newSystem.Collections.Specialized.StringDictionary();
dic.Add("title","测试标题");
dic.Add("author","测试作者");
dic.Add("content","测试内容");

stringresult=StaticHtml.GetHtml(template,dic);
replaceed.Text=result;

}
}

以上代码经本人测试可以正常工作,但实际应用还需根据特定需要改进并完善。祝你编码愉快~

你可能感兴趣的:(解决方案)