先談一下本文會用到的三種網頁格式,分別是HTML、SHTML、ASPX。它們各有特點:
HTML即為本文的主角:靜態頁面。如果瀏覽器從服務器上請求一個HTML頁面,服務器把該頁面原封不動地發送給瀏覽器。因此它的反應速度是最快的,而且對于cpu、內存等等的要求比較低。
ASPX是目前比較流行的動態網頁格式。ASP .NET頁面的擴展名為 .aspx。如果瀏覽器請求的是一個ASP .NET頁面,服務器在把它回送到瀏覽器之前會處理頁面中的所有可執行代碼。動態網頁的一個特點是信息交互、及時更新、頁面文件少、開發速度比較快。但是它的一個嚴重的問題是在訪問量比較大,而服務器的配置和資源比較有限的情況下,一些頻繁的讀寫數據庫、程序邏輯等等,會使得服務器負擔不起而當機。
因此對于訪問量比較大的網站,網頁靜態化是一個比較可靠的解決方案。但是靜態頁面重復的內容比較多,在信息量比較大的網站,全HTML可以說是無論對于開發者或者使用者,都是缺乏人性化的工作。例如我有一個顯示內容的頁面,它有左右兩塊,右邊是文章內容,可能是長時間甚至永遠不會變動的,左邊是包含公告、新聞等的一些導航,更新速度比較快。那如果左邊的公告有了新的內容,為了讓每個頁面的信息都準確,那所有的頁面都要重新制作,這操作起來明顯很不方便。于是就有了SHTML的存在。SHTML的一個特點就是在服務器會做一定的預處理,使得它可以用include file的方式,把若干個文件包含進來。例如上例的頁面,可以拆分為a.html和b.html,然后用c.shtml把這兩個文件包含進來,那在更新的時候只需要更新a.html,而b.html不需要更新,這樣可以減少大量的制作工作。可能動態網頁就是根據這個而產生的。在asp.net中,這是最基本的控件思想。以下是c.shtml的頁面代碼:
<div class=”contaier”>
<div id=”left”><!-- #include file=”a.html”--></div>
<div id=”right”><!-- #include file=”b.html”--></div>
</div>
因此,對于asp.net,可以采用輸出shtml頁面的方式,動態生成靜態頁面,來解決性能問題。如何動態生成靜態頁面,目前有兩種主流的方式,一種是做一些靜態頁面模板,然后把內容填充替換,最后輸出文件。一種是利用HtmlTextWriter重寫AttributeCollection.Render。這兩種方法都可以在網上搜到相關的文章。但是在這里我要引發更深入的問題:
(1)靜態頁面怎么更新?能不能自動更新?
(2)一些動態的元素,如登陸、搜索、訪客,在靜態頁面中如何實現。
這里很可能就會用到ajax或者直接用Microsoft.XMLHTTP來做一些異步操作,最終可以解決上面的兩個問題,但是以我的經驗來說,總會覺得處理起來,特別別扭,特別艱難,很難保證能形成一種健壯的程序結構,以適應隨時變化的客戶需求。
因此,我們回歸到asp.net,看aspx頁面能不能給靜態化一種解決方案,也就是我的目標:動態靜態化。為此,先介紹作為這個思路的支持,需要用到asp.net的以下幾個特點:
(1)aspx支持類似shtml的的語法,如果一個aspx頁面沒有帶代碼,那它跟shtml和html的靜態頁面的速度和效果是基本一致的。
(2)aspx支持前置代碼,即完全不要aspx.cs的后置代碼,只要在頂部把聲明后置代碼的那一段去掉,即<%@ Page Language="C#"%>用來聲明文件。然后直接把代碼寫在頁面:
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
if(!IsPostBack)
{
this.funcInit();
}
}
</script>
這樣代碼就會執行,即不需要預先編譯,動態編譯。
(3)aspx支持以ascx命名的各種用戶控件。
有了以上三點的支持,我們就可以實現動態靜態化。首先。按動態網站的開發方式,開發出一個網站。網站中的所有頁面的內容都是由ascx的控件組成,.aspx中只有簡單的html框架和用戶控件引用。做一個頁面或者一個winform工具實現以下靜態發布功能:
(1)錄入ascx控件信息,包括引用路徑、參數等等。
(2)點擊生成,則會自動將上面錄入的控件信息,寫入一個跟它同名的aspx頁面上。訪問這個動態生成的aspx頁面,可以得到他生成的文本內容。
(3) 根據獲得的文本內容,在指定目錄下生成.html或者.txt文件。
(4)自動或手動(頁面比較復雜的用手動)把aspx頁面中的這個ascx控件,改成的引用方式。
最后看一下結果:在開發環境下,依然是動態頁面,一點都沒有改變。這對于后期維護修改有很大的幫助。由于增加了一個靜態發布的過程,在發布環境下,同是index.aspx的頁面,會被全部或者部分改成包含文件的shtml的模式。然后由于是aspx頁面,所以某些不需要靜態化的控件功能可以繼續正常使用。而所需要做的工作就是在前期錄入那些頁面控件的相關信息,以后修改完,就直接按發布就完成。以上就解決了aspx中的靜態化問題。
新聞熱點
疑難解答
圖片精選