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