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