ASP.NET的GreeterLogic
微軟本來(lái)只需要對(duì)Web應(yīng)用平臺(tái)ASP作稍加改進(jìn),比方提供一個(gè)功能更強(qiáng)的服務(wù)器端腳本編程語(yǔ)言或者頁(yè)面編譯功能就可以保持或者甚至提高ASP的流行度。實(shí)際上ASP.NET提供了這兩個(gè)功能--但是它還提供了更多的東西。簡(jiǎn)單的說(shuō),ASP.NET是一場(chǎng)革命。在本文中,我將討論ASP.NET對(duì)于Web編程所做的提高。
在ASP模型中,一個(gè)頁(yè)面是通過(guò)HTML定義然后是通過(guò)嵌入的腳本擴(kuò)展的。在ASP.NET中,不同的是,一個(gè)頁(yè)面是一個(gè)生成HTML的類。這個(gè)模型被稱為WebForm。如果這個(gè)名字讓你想起VB6的表單控件或者.Net WinForms,那么你摸到點(diǎn)邊了。對(duì)于WebForms來(lái)說(shuō),Web服務(wù)器控件都放在一個(gè)頁(yè)面上。當(dāng)這個(gè)頁(yè)面被訪問(wèn)的時(shí)候,這些控件自動(dòng)將它們以HTML的方式實(shí)現(xiàn)。瀏覽器和服務(wù)器之間的復(fù)雜過(guò)程對(duì)程序員來(lái)說(shuō)是透明的,由服務(wù)器自動(dòng)完成,并允許事件處理,就和WinForms一樣。
歡迎頁(yè)面
讓我們馬上開始創(chuàng)建一個(gè)叫Greeter(歡迎者)的例子然后看看它是如何工作的。我在學(xué)習(xí)一個(gè)新技術(shù)的時(shí)候喜歡將它們拆開然后再湊成一整塊。Greeter僅僅是要求用戶輸入一個(gè)名字然后發(fā)出一條問(wèn)候消息,但是它演示了ASP.NET的幾個(gè)主要特點(diǎn)。
Greeter頁(yè)面定義在兩個(gè)文件中:Greeter.aspx,在列表A中,和Greeter.aspx.cs,在列表B中。.aspx文件定義了頁(yè)面的UI(用戶界面),而C#文件(你也可以使用Visual Basic.Net或者 JScript.Net)在GreeterLogic類里實(shí)現(xiàn)了這個(gè)頁(yè)面的邏輯。Greeter.aspx文件***行的@Page指令通過(guò)繼承將UI綁定在程序邏輯上。這個(gè)指令中的ClassName屬性將UI類的名字指定為CreeterUI。而Inherits屬性指定GreeterUI是從GreeterLogic繼承而來(lái)的。
Web服務(wù)器端控件
在這個(gè)頁(yè)面的<form>置標(biāo)中申明了幾個(gè)Web服務(wù)器端控件。Web服務(wù)器端控件是標(biāo)準(zhǔn)HTML置標(biāo)的WebForm抽象化。它們與標(biāo)準(zhǔn)的HTML相比能夠提供事件處理并生成更多的功能。Web服務(wù)器端控件在一個(gè)引用asp命名空間的XML置標(biāo)里被申明。.aspx文件中的每一個(gè)Web服務(wù)器控件在頁(yè)面被執(zhí)行的時(shí)候會(huì)導(dǎo)致控件的一個(gè)實(shí)例被創(chuàng)建。對(duì)每個(gè)實(shí)例的引用在其相應(yīng)的基類中被保持。這便使得基類能夠訪問(wèn)這些控件并能夠讓它用程序控制這些控件并處理這些控件產(chǎn)生的事件。每個(gè)Web服務(wù)器端控件指定屬性runat="server"來(lái)表明這個(gè)控件在Web服務(wù)器端運(yùn)行以便為目標(biāo)Web瀏覽器生成合適的HTML。
最開始的三個(gè)Web服務(wù)器端控件是相當(dāng)直觀的:標(biāo)簽控件(label),文本框,和一個(gè)提交按紐。***的一個(gè)控件,<asp:RequiredFieldValidator>,是不同的。一個(gè)驗(yàn)證控件檢查另一個(gè)控件的狀態(tài)并且當(dāng)目標(biāo)控件沒(méi)有處于正確狀態(tài)的時(shí)候會(huì)阻止這個(gè)表單被提交。在Greeter這個(gè)程序中,RequiredFieldValidator控件被用來(lái)驗(yàn)證一個(gè)數(shù)據(jù)是否已經(jīng)被輸入到了文本框控件里。它并不關(guān)心這個(gè)數(shù)據(jù)的值是多少。初始狀態(tài)下,RequiredFieldValidator控件是不可見的。如果在按紐被單擊的時(shí)候文本框是空的,那么就不會(huì)產(chǎn)生單擊消息,而且RequiredFieldValidator控件會(huì)顯示ErrorMessage屬性的屬性值,如圖B。對(duì)于高版本的瀏覽器來(lái)說(shuō),RequiredFieldValidator控件生成JavaScript以在客戶端進(jìn)行數(shù)據(jù)驗(yàn)證。而對(duì)于低版本的瀏覽器來(lái)說(shuō)則需要在服務(wù)器端進(jìn)行驗(yàn)證。ASP.NET除了RequiredFieldValidator控件外還提供了幾個(gè)驗(yàn)證控件。
GreeterLogic類
GreeterLogic從類System.Web.UI.Page繼承而來(lái)。它申明了幾個(gè)protected數(shù)據(jù)域來(lái)保存對(duì)Greeter.aspx文件中創(chuàng)建的控件的引用。GreeterLogic定義了兩個(gè)方法。OnInit方法重載了方法Page.OnInit來(lái)為m_Button單擊事件添加一個(gè)m_Button_Click方法的代理。m_Button_Click方法處理由m_Button Web服務(wù)器端控件生成的單擊事件。這個(gè)單擊事件觸發(fā)一個(gè)到服務(wù)器端的數(shù)據(jù)發(fā)送過(guò)程。在服務(wù)器端,ASP.NET重新生成這個(gè)頁(yè)面然后恢復(fù)WEb服務(wù)器控件的狀態(tài)。現(xiàn)在文本框的值就可以通過(guò)訪問(wèn)TextBoxText屬性得到了。
配置Greeter程序
要配置Greeter應(yīng)用程序,你可以遵循下面的步驟:
創(chuàng)建一個(gè)應(yīng)用程序的目錄。
在應(yīng)用程序的目錄里創(chuàng)建一個(gè)bin子目錄。
把Greeter.aspx放在應(yīng)用程序目錄里。
使用命令csc /t:library /out:Greeter.dll Greeter.aspx.cs把Greeter.aspx.cs編譯成一個(gè)庫(kù)文件然后把Greeter.dll放在應(yīng)用程序的bin子目錄里。
創(chuàng)建一個(gè)指向應(yīng)用程序目錄的IIS虛擬目錄。
.aspx類的生成
ASP.NET應(yīng)用程序是由IIS ISAPI過(guò)濾器aspnet_isapi.dll處理的。在***次訪問(wèn)的時(shí)候,ISAPI過(guò)濾器在ASP命名空間下從Greeter.aspx生成一個(gè).NET類然后把它編譯成一個(gè)二進(jìn)制庫(kù)文件。IIS會(huì)自動(dòng)搜索應(yīng)用程序的bin子目錄來(lái)尋找GreeterLogic基類。圖D顯示了生成的類的繼承關(guān)系。生成的二進(jìn)制文件會(huì)放在一個(gè)根據(jù)應(yīng)用程序的虛擬目錄而生成的一個(gè)存放臨時(shí)ASP.NET文件的目錄里。例如,如果Greeter的虛擬目錄被命名被IntroASPNET,那么Greeter.aspx可能會(huì)生成一個(gè)名字為effla-hh.dll的二進(jìn)制文件,并且放在諸如C:\WINNT\Microsoft.NET\Framework\v1.0.3328\Temporary ASP.NET Files\introaspnet\b5d8b0af\51648ab7這樣的一個(gè)目錄里。
如果Greeter.aspx被修改了,那么ISAPI過(guò)濾器會(huì)在下一次頁(yè)面訪問(wèn)的時(shí)候自動(dòng)重新生成二進(jìn)制文件。
ASP.NET是實(shí)打?qū)嵜嫦驅(qū)ο蟮?BR>那么所有這些意味著什么呢?ASP.NET提供了一個(gè)真正的面向?qū)ο蟮木幊棠P?。WebForms能夠讓頁(yè)面的UI完全獨(dú)立于頁(yè)面的邏輯而被創(chuàng)建然后通過(guò)繼承而結(jié)合起來(lái)。不會(huì)再有夾雜著HTML和VBScript的頁(yè)面了。頁(yè)面的邏輯是使用一種全功能的.NET語(yǔ)言,比方C#, Visual Basic.NET, 或者 Jscript.NET實(shí)現(xiàn)的。更進(jìn)一步的說(shuō),頁(yè)面邏輯的實(shí)現(xiàn)過(guò)程可以隨意使用所有的.NET基類類庫(kù)。Web服務(wù)器控件封裝了不同Web瀏覽器之間的區(qū)別并允許你從更高的級(jí)別來(lái)設(shè)計(jì)Web頁(yè)面。所有的一切都會(huì)被編譯成微軟中間語(yǔ)言(MSIL)并且能夠在運(yùn)行時(shí)同步轉(zhuǎn)化成機(jī)器碼。不會(huì)再有解釋性頁(yè)面中存在的那種性能損失了。如果這還不能叫做一種革命的話,我就真的需要一本新的字典了。
【編輯推薦】


















