您的位置:首页 > 其它

静态页面生成原理及实际应用技巧

2008-10-05 12:31 369 查看
随着互联网的发展,B/S结构的程序开发已经占据了当今软件开发非常大的比重。由于现在web程序的高访问量、大数据量、高效的用户体验效果等的要求,使静态页技术在越来越多的网站上得到了应用。
使用静态页面有如下好处:

1、 安全:使用静态页面,用户访问的使没有任何操作功能的html页面,可以说从安全性方面大大提高了程序及服务器的安全。
2、 快速:用户访问的是提前生成好的静态页面,使用户对页面的请求瓶颈只受IO的限制而不会有其他方面的影响。
3、 降低服务器,数据库负载:因为用户访问的是静态页,对承载静态页的服务器配置要求降低了许多,同时,不会因为过大的访问量,造成数据库服务器负载过重等问题。
鉴于以上种种优势,好多新闻性的网站都采用了静态页面生成技术,下面就让我来个大家介绍一个用ASP.NET生成静态页面的方法。
在介绍生成方法之前,我们要考虑一个问题。在ASP.NET中的服务器控件的代码是什么样的呢?
源代码如下所示:
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Button ID="Button1" runat="server" Text="Button" />
而以上的代码我们在通过浏览器访问后的代码是什么样呢?
<span id="Label1">Label</span>
<input name="TextBox1" type="text" id="TextBox1" />
<input type="submit" name="Button1" value="Button" id="Button1" />
通过对比我们可以看出,服务器控件被浏览器访问时已经变成了浏览器可以识别的html代码。这就是我们要说的asp.net的一个运行机制,每一个.aspx文件都继承了System.Web.Ui.Page类,这个类中的Render()方法每次都在aspx.cs文件执行完毕后,将用户请求.aspx文件直接转换成可以被浏览器读懂的html,然后将转译好的内容展示给用户。
到了这里,我们很容易想到,如果我把Render()方法转译后的内容直接以html的形式输出,不就能够生成静态页了么?事实正是如此,我们现在介绍的这个生静态页的方法就是重写了Render()方法,将本该显示给用户的内容存成.html的文件。代码很简单:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.IO;

public partial class Default7 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected override void Render(HtmlTextWriter writer)
{
TextWriter tw = new StringWriter();

//将本页要输出的可被浏览器识别的文本内容保存
base.Render(new HtmlTextWriter(tw));

tw.Close();
string html = tw.ToString();

//设定本次生成的静态页面的名字
string strFileName = Server.MapPath(".") + "/" + "default7.html";
//调用文件写出方法
writeHtml(strFileName, html);
//文件生成后页面要跳转到的地址
Response.Redirect("default7.html");
}
/// <summary>
/// 静态页面生成方法
/// </summary>
/// <param name="filmname">要生成的静态页面的全名</param>
/// <param name="html">要生成静态页面的内容</param>
public static void writeHtml(string filmname, string html)
{
//指定一个gb2312的中文编码
System.Text.Encoding code = System.Text.Encoding.GetEncoding("gb2312");

string htmlfilename = filmname;
string str = html;
StreamWriter sw = null;
// 写文件
try
{
//文件的新建
sw = new StreamWriter(htmlfilename, false, code);
//向文件中写入指定内容
sw.Write(str);
sw.Flush();
}
catch (Exception ex)
{
HttpContext.Current.Response.Write(ex.Message);
HttpContext.Current.Response.End();
}
finally
{
sw.Close();
}
}
}
以上是我们的一个default7.aspx的静态页面生成代码。
看了代码后。我们会发现其实非常简单的一句话就实现了这个功能。写两个函数就可以实现。这时我们又有了新问题,做一个页面我们要写这两个函数,做十个页面呢?我们还要每个页面都写这两个函数?那么二十个页面三十个乃至更多的页面呢?这回大家很容易想到类吧?如果我们写一个生静态页面的类,我们所有要生静态页面的页都继承这个类岂不是使用起来特别方便,既减少了重复代码量又降低了单个页面内容的复杂性。
让我们来看一下我们的生静态页面类:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.IO;

/// <summary>
/// PageCreateRenderPage 的摘要说明
/// </summary>
public class PageCreateRenderPage : System.Web.UI.Page
{
public string strFileName = "default.html";
public string redirectURL = null;
public PageCreateRenderPage(){}
protected override void Render(HtmlTextWriter writer)
{
TextWriter tw = new StringWriter();
base.Render(new HtmlTextWriter(tw));
tw.Close();
string html = tw.ToString();
strFileName = Server.MapPath(".") + "/" + strFileName;
writeHtml(strFileName, html);
Response.Redirect(redirectURL);
}
public static void writeHtml(string filmname, string html)
{
System.Text.Encoding code = System.Text.Encoding.GetEncoding("gb2312");

string htmlfilename = filmname;
string str = html;
StreamWriter sw = null;
// 写文件
try
{
sw = new StreamWriter(htmlfilename, false, code);
sw.Write(str);
sw.Flush();
}
catch (Exception ex)
{
HttpContext.Current.Response.Write(ex.Message);
HttpContext.Current.Response.End();
}
finally
{
sw.Close();
}
}
}
我们需要生成静态页的页面只需要继承我们这个静态页面生成类,同时讲要生成页面的名字和生成好该页面后本页要跳转的地址通知父类即可。一下是default.aspx.cs文件继承父类的代码:
public partial class _Default :PageCreateRenderPage //继承父类
{
protected void Page_Load(object sender, EventArgs e)
{
strFileName = "default1.html";//要生成的文件名
redirectURL = "default2.aspx";//生成后页面跳转的地址
}
}
以上就是我们的一个生成静态页面代码的实现。其实里面的方法我们基本都知道或应用过,关键点在于我们是否知道Render()方法能够将页面输出成浏览器可访问的html格式的代码。这是解决我们静态页面生成技术的原理所在。希望大家多了解我们asp.net的运行原理和机制,只有这样才能更好更灵活的开发出各种常用实用功能。 为了更加完善我们的静态页面生成,我们还可以考虑几个完善性问题。如果我们存放静态页面的服务器和我们的发布服务器不在一起时我们该如何解决呢?我们的生成程序能否自动运行呢?这些就要我们在实际应用中自己去实践、去开发了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: