ASP+與ASP有什麼不同 - 中國WEB開發者網絡 (http://www.webasp.net) -- 技術教程 (http://www.webasp.net/article/) --- ASP+與ASP有什麼不同 (http://www.webasp.net/article/9/8217.htm) |
| -- 作者:未知 -- 發佈日期: 2004-03-12 |
| ASP+與ASP有什麼不同
編譯:http://www.aspcn.com 飛刀 原文出自http://www.asptoday.com 看到翻譯就頭疼,而且這篇文章還很長啊,本來這篇文章很早就會寫完,不過為了不爭氣的中國隊又耽誤了幾天,跑到工體,還是輸了。。。。。。。 在以前的文章中我們認識到ASP+是一個完整的操作系統的一部分。但是為什麼ASP+不同於以前版本的ASP?他們之間到底有什麼不同?如果你僅僅是運行一些頁面或應用程序,那麼你可能完全不會注意到他們之前的區別。 一旦你打開ASP+SDK或者幫助文件,你就會發現這個新產品幾乎沒有一點像以前的版本。 當然不必驚慌,我們下一步就會看看一些主要的不同點。我們先看看為什麼微軟公司會認為我們需要一個新版本的ASP,它能幫助我們幹什麼。作為一名開發者,我們也得知道它有哪些新的特性來幫助我們建立站點和應用。 我們真的需要一種新的ASP!? 微軟公司開發ASP+動機我們在上一篇文章已經討論了。ASP已經取得了巨大的成功,為什麼我們還需要一個新的版本!?我們可以從下面四點考慮: 現在的ASP的只能使用非結構語言編寫,比如VBscript和JScript(如果用其它的語言就還需要單獨的解釋器)。而且當ASP在第一次執行時,它解析並在cache中儲存這些代碼,這樣的局限性就是不允許其它結構性語言比如VB和C++的使用,從而限制了它們的優越性。而ASP+真正提供了中層語言執行結構,允許各種語言的使用。 使用HTML,文本,對像混合的ASP很容易建立一個大型的頁面。但是很難重複利用這些代碼,除非你把一些代碼放在一個include文件中.這不是最好的解決方法。在很多的場合中,開發一個網絡應用需要廣泛的專業技能,比如,你寫程序,另外一些人做美工,還有一些人設計網頁的內容,如果僅僅使用ASP很難把這些人聯繫起來來完成同一件事。但是ASP+真正允許了單獨的代碼與內容共存. 在以前版本中的ASP中,你必須為幾乎每件事情寫代碼。為了保持在form中的數據,寫代碼。為了確認用戶寫入的數據,寫代碼。為了發送一些簡單的數據,寫代碼。而在ASP+中引入了一種真正的組件模式,通過這種服務器端的控制以及事件觸發,我們似乎感覺是好像是在操作VB中"FORM".這種ASP+中的新組件控制是宣告性質的(也就是說,你如果想使用這些組件控制來作一些事情,你只需要聲明一下就行了,其它的不用管了,哈哈,是不是覺得有些傻瓜啊?!?),因此你實際上只需寫很少的代碼了.實際上,在很多情況下,你完全不用寫任何的代碼. 外面的世界時刻都在變化,已經有相當比例的用戶是通過"互聯網設備"來訪問你的站點了,比如說WAP手機,PDA,置頂盒,以及其它的一些,也許不久的將來使用這些上網的用戶比用PC的還多。這就意味著我們可能要在服務器上做更多的事以與不同的設備相適應。我們也不得不在使用不同格式輸出,比如WML。同時,新的互聯設備和商業應用也需要有能力從網絡應用中發送或讀取WML.現在使用ASP做這些,需要你使用XML解析器,使用XML轉換數據。而ASP+網絡服務會用更簡單的方式使用你做出的頁面能夠適應不同的設備。 除了上面的這些,快速發展的分佈是應用也需要開發地更加快速,更加模塊化,重複利用性更強,更容易操作,讓更多的平台支持。像SOAP(Simple Object Access Protocol)這樣的新標準以及B2B的商業需要,需要一種新的技術來適應不同的系統。網絡應用和網站需要提供一種更加強大的可升級的服務,ASP+能夠適應上面的要求,並且能夠在發生錯誤、緩衝區溢出時重新啟動應用程序。 因此為了適應這些需要,ASP已經對基礎甚至是開發環境進行了修補。Visual Studio 7.0將會對ASP+應用進行完成的支持(包括ASP和ASP+),儘管現在還只有很少的工具能夠獲得其支持。這種豐富的,組件模式程序開發模塊被設計得相當友好,同時它也支持所有Visual Studio 語言,包括VB,C++以及C#,特別注意一下第三種語言,它流行的日子離我們不太遙遠了。 ASP+怎樣讓你的生活更加簡單? 對於今天的WEB程序員來說最大的挑戰就是不斷變化地瀏覽器的兼容性,以及它們不斷升級的複雜性。在保證頁面能在所有流行瀏覽器下工作的同時又得盡量地使用每個瀏覽器最新屬性來建立更加具有交互式的頁面,這簡直就是一場惡夢。 更加可怕的就是對於不同的用戶設備建立不同的網頁。當然,在WAP手機和傳統的瀏覽器上建立同等水平的頁面是不可能,因為由於帶寬的原因,在很多WAP手機中一次只能顯示12字3行的文本信息。 一個最簡單的解決辦法就是動態地對不同的用戶生成不同的輸出,或者就是對不同的用戶寫多個頁面。第二種方法沒有效率,我想大多數地開發者都會選擇第一種方法。但是這就意味著用戶的每次點擊都會讓服務器判斷應該向用戶顯示什麼. 如果這一切可能,為什麼不把這些過程自動化!?為了結束這一切,ASP+引入了一個新的服務控制的概念,它封裝了一些普通的任務,提供了一種清晰的編程模塊。他們同樣幫助管理處理不同的用戶類型。 服務器端HTML控制使得我們減少了不少的代碼 ASP已經提供了一種在服務器上執行組件的能力,這些組件能夠產生一些代碼用以返回給用戶。ASP+通過服務控制繼承了這一概念。轉換HTML元素到服務控制的需要僅僅是一個附加的屬性:runat="server"(這個我們在ASP也見到過) 頁面中的任何HTML元素都能使用這種方法標注,ASP+會在服務器上執行這些元素,並且對不同的用戶產生不同的代碼。 這種讓HTML元素在服務器上執行的概念第一次看來有些奇怪,但是當你發現在它在這個頁面變得完全功能化,你還有什麼好想的了。 保持狀態的問題 在我們建立交互頁面和應用時最煩人的一個問題就是處理從客戶端傳來的數據,然後保持這些數據加以控制。ASP+的一個核心目標就是簡化這一過程。這不會給程序員帶來任何的困惑,而且能在大多數的瀏覽器上工作正常。 我們先來看看下面的代碼。這段代碼製作了一個簡單的頁面讓用戶輸入電腦的名字和選擇操作系統。OK,它本身不是個很煩人也不是令人興奮的例子,但是它反映了我們常常做的一些事。當這個頁面提交後,使用request.form集來取得相應的數據,然後用request.write顯示它們. <HTML> <BODY> <% If Len(Request.Form("selOpSys")) > 0 Then strOpSys = Request.Form("selOpSys") strName = Request.Form("txtName") Response.Write "You selected '" & strOpSys _ & "' for machine '" & strName & "'." End If %> <FORM action="pageone.asp" method="post"> Machine Name: <INPUT type="text" name="txtName"> <P /> Operating System: <SELECT name="selOpSys" size="1"> <OPTION>Windows 95</OPTION> <OPTION>Windows 98</OPTION> <OPTION>Windows NT4</OPTION> <OPTION>Windows 2000</OPTION> </SELECT> <P /> <INPUT type="submit" value="Submit"> </FORM> </BODY> </HTML> 儘管這是一個ASP文件(後綴名是.asp不是.aspx,但是如果我們把它的文件後綴改為.aspx,它同樣能夠在ASP+工作正常。請記住,這兩個系統能夠在一個機器上很好的共存,這個後綴名只是在判斷,這個解析工作是ASP來做,還是ASP+來做。 下面的快照中我們看到了在IE5中執行的結果,當用戶點擊這個提交按鈕,將會把數據傳向服務器,這個頁面將會被刷新,同時顯示我們選擇的結果。當然,在真正的應用中我們可以將這些數據存入數據,或者做一些其它的事,這裡為了簡便,我們只是讓它顯示出來。 這個頁面的問題便是它不能保持狀態,換句話說就是它只能返回默認值,用戶在重新此頁時不得不重新輸入數據。如下圖: 為了實現上面的要求,我們不得不在這個代碼中加入一些數據,如下: <FORM action="pageone.asp" method="post"> Machine Name: <INPUT type="text" name="txtName" value="<% = Server.HTMLEncode(Request("txtName")) %>"> <P /> Operating System: <select name="selOpSys" size="1"> <OPTION <% If strOpSys = "Windows 95" Then Response.Write " selected" %>> Windows 95</OPTION> <OPTION <% If strOpSys = "Windows 98" Then Response.Write " selected" %>> Windows 98</OPTION> <OPTION <% If strOpSys = "Windows NT4" Then Response.Write " selected" %>> Windows NT4</OPTION> <OPTION <% If strOpSys = "Windows 2000" Then Response.Write " selected" %>> Windows 2000</OPTION> </SELECT> <P /> <INPUT type="submit" value="Submit"> </FORM> 看看上面的代碼,那麼多的if .....then ,很煩人吧(其實在ASP中這一些是可以簡化,可能是原作者想突出ASP+比ASP更簡潔,故意把這個代碼寫得很長)下面的圖是我們修改後的代碼結果: 自動保持狀態的控制 那麼ASP+是怎樣處理這個問題的了!?下面的代碼讓我們看到了ASP+的優點給我們帶來的變化。我們來仔細看看下面的代碼吧。這次這個頁面中的一些元素加上了runat="server"的屬性。當ASP+看到這些元素,它將會在服務器上執行這些代碼,並且產生正確的輸出: <FORM runat="server"> Machine Name: <INPUT type="text" id="txtName" runat="server"> <P /> Operating System: <select id="selOpSys" size="1" runat="server"> <OPTION>Windows 95</OPTION> <OPTION>Windows 98</OPTION> <OPTION>Windows NT4</OPTION> <OPTION>Windows 2000</OPTION> </SELECT> <P /> <INPUT type="submit" value="Submit"> </FORM> 現在你就能看到ASP+如何比ASP簡單了。下面是執行的結果,和ASP編寫的沒有區別: 服務器是怎樣工作的?!? 這些數據是怎樣獲得的呢!?這裡的關鍵是runat="server" 屬性.為了有一個感性認識,我們先看看這個頁面的HTML源代碼: <HTML> <BODY> You selected 'Windows 98' for machine 'tizzy'. <FORM name="ctrl0" method="post" action="pageone.aspx" id="ctrl0"> <INPUT type="hidden" name="__VIEWSTATE" value="a0z1741688109__x"> Machine Name: <INPUT type="text" id="txtName" name="txtName" value="tizzy"> <P /> Operating System: <SELECT id="selOpSys" size="1" name="selOpSys"> <OPTION value="Windows 95">Windows 95</OPTION> <OPTION selected value="Windows 98">Windows 98</OPTION> <OPTION value="Windows NT4">Windows NT4</OPTION> <OPTION value="Windows 2000">Windows 2000</OPTION> </SELECT> <P /> <INPUT type="submit" value="Submit"> </FORM> </BODY> </HTML> 我們使用下面的代碼在ASP+創建<form>: <FORM runat="server"> ... </FORM> 當這個頁面被ASP+執行後,輸出到瀏覽器上的代碼是: <FORM name="ctrl0" method="post" action="pageone.aspx" id="ctrl0"> ... </FORM> 你現在看到ASP+自動加上了action和method方法,因此這個頁面將會以post方式進行提交。ASP+同時也給form加上了一個唯一值的id和name值,而這些我們根本就沒有指定(不過你也可以指定,指定後以你指定的為準) 如果你在加了"GET"屬性,這個form就會以querystring方式被接收,就和以前的ASP一樣,這個自動狀態也不會工作的。 在這個頁面中我們使用下面的代碼建立text項: <INPUT type="text" id="txtName" runat="server"> 在瀏覽器中的結果是: <INPUT type="text" id="txtName" name="txtName" value="tizzy"> 你也能看到ASP+自動加上了value屬性以及它的值。同時也加上了name屬性,此值與id的值一樣. 下面是<select>代碼: <SELECT id="selOpSys" size="1" runat="server"> <OPTION>Windows 95</OPTION> <OPTION>Windows 98</OPTION> <OPTION>Windows NT4</OPTION> <OPTION>Windows 2000</OPTION> </SELECT> ASP+因為在<option>元素中有了selected屬性,所以有了下面的代碼: <SELECT name="selOpSys" id="selOpSys" size="1"> <OPTION value="Windows 95">Windows 95</OPTION> <OPTION selected value="Windows 98">Windows 98</OPTION> <OPTION value="Windows NT4">Windows NT4</OPTION> <OPTION value="Windows 2000">Windows 2000</OPTION> </SELECT> 這裡,id屬性又一次被建立了,<option>中的value元素的值也被自動匹配。(如果你提供了自個的value屬性,那麼系統還是依你的) 因此,正如你看到的,這裡實在是沒有什麼鬼把戲,這裡是標準的HTML,沒有任何客戶端的腳本庫,也沒有ActiveX或者Java Applets. ASP+的服務器代碼 為了在頁面中顯示這些值,我們使用和上面ASP例子中相近的代碼: ... If Len(Request.Form("selOpSys")) > 0 Then strOpSys = Request.Form("selOpSys") strName = Request.Form("txtName") Response.Write("You selected '" & strOpSys _ & "' for machine '" & strName & "'.") End If ... ASP+和服務控制的另外一個巨大的好處就是能夠在服務器上執行代碼並且創建輸出。ASP+強調每一個元素只有一個唯一的id屬性,因此服務控制(也就是說有runat="server"的元素)必須依賴原始代碼。這也就是說我們不需要使用request集合去訪問客戶端傳來的值,只要使用唯一的id就行了. ... If Len(selOpSys.value) > 0 Then Response.Write("You selected '" & selOpSys.value _ & "' for machine '" & txtName.value & "'.") End If ... ASP+中的VB代碼 在我們剛才看到的ASP頁面中,腳本語言是使用的vbscript(它不是唯一的,但是如果沒有別的設定,那麼它就是被默認的語言).在ASP+中,它再也不支持VBscript了,它的默認語言是Visual Basic(VB),因此我們的代碼會被編譯成為IL(Intermediate Language). 在新的VB7.0中vb的編譯器已經包括了ASP+(哈哈,是不是一個好消息了,我們不需要重新買東東了)。在這個新版本中,一個最值得注意的就是在VB7中所有方法都必須有以圓括號包含的參數列表。而這個要求在VBscript和以前的VB版本中是不需要的。 服務器事件的執行。 當然,如果你想讓一些HTML元素在服務器上執行,那麼為什麼不把這個概念再擴展一下?!ASP+已經將每一個頁面變成了一個服務器對象,同時提供了很多屬性,方法和事件,這一切能夠在你的頁面中很好的利用。每個頁面變成了COM+對像上的一個節點,當它們被請求時能夠獨立的運行和編寫。 使用服務器端的控制事件 好好看一下下面的代碼,看看,我們是如何利用ASP+的優點來完美地結構化我們的頁面。 <HTML> <BODY> <SCRIPT language="VB" runat="server"> Sub ShowValues(Sender As Object, Args As EventArgs) divResult.innerText = "You selected '" _ & selOpSys.value & "' for machine '" _ & txtName.value & "'." End Sub </SCRIPT> <DIV id="divResult" runat="server"></DIV> <FORM runat="server"> Machine Name: <INPUT type="text" id="txtName" runat="server"> <P /> Operating System: <select id="selOpSys" size="1" runat="server"> <OPTION>Windows 95</OPTION> <OPTION>Windows 98</OPTION> <OPTION>Windows NT4</OPTION> <OPTION>Windows 2000</OPTION> </SELECT> <P /> <INPUT type="submit" value="Submit" runat="server" onserverclick="ShowValues"> </FORM> </BODY> </HTML> 首先請注意我們在<script>中指定VB是當前語言,並且有一個runat="server"的屬性.在裡面我們寫了一個名叫showValues的VB的函數(在ASP+中,函數和子程序必須得放在<script>中,並不是<% ....%>之間) 我們也添加了一個有著runat="server"的HTML標籤<div>。因此這個元素會在服務器上創建。當這個VB子程序被執行時,它將使用<div>元素的innerText屬性. 同樣我們也得注意一下它是如果取得請求值的。因為這個text box以及<select>列表也是在服務器上執行的,我們的程序能夠直接通過訪問這些控制的value屬性獲取它們的值,這個<div>元素執行後的代碼會是下面的樣子: <DIV id="divResult">You selected 'Windows NT4' for machine 'lewis'.</DIV> 聯接服務控制事件 到目前為此,你可能會問這個VB子程序是怎樣執行的!?很簡單,我們在<input>元素中建立了一個submit按鈕,並且加上了兩個新的屬性: <INPUT type="submit" value="Submit" runat="server" onserverclick="ShowValues"> 這個runat="server"屬性轉換HTML成服務控制,它是"可見的"。這個onserverclick="showValue"屬性告訴runtime它將會在被點擊後執行ShowValues子程序. 這個代碼執行的結果和前面的例子沒有什麼兩樣,但是ASP+的代碼便比以前更結構化了,這樣就增加了文件的可讀性。 有時間,我們下面幾篇文章將介紹,ASP+一些更加具體的問題。現在,很忙,沒有時間啦. |
| webasp.net |