ASP+與ASP有什么不同
編譯:http://www.aspcn.com 飛刀 原文出自http://www.asptoday.com
在以前的文章中我們認(rèn)識(shí)到ASP+是一個(gè)完整的操作系統(tǒng)的一部分。但是為什么ASP+不同于以前版本的ASP?他們之間到底有什么不同?如果你僅僅是運(yùn)行一些頁(yè)面或應(yīng)用程序,那么你可能完全不會(huì)注意到他們之前的區(qū)別。
一旦你打開(kāi)ASP+SDK或者幫助文件,你就會(huì)發(fā)現(xiàn)這個(gè)新產(chǎn)品幾乎沒(méi)有一點(diǎn)像以前的版本。
當(dāng)然不必驚慌,我們下一步就會(huì)看看一些主要的不同點(diǎn)。我們先看看為什么微軟公司會(huì)認(rèn)為我們需要一個(gè)新版本的ASP,它能幫助我們干什么。作為一名開(kāi)發(fā)者,我們也得知道它有哪些新的特性來(lái)幫助我們建立站點(diǎn)和應(yīng)用。
我們真的需要一種新的ASP!?
微軟公司開(kāi)發(fā)ASP+動(dòng)機(jī)我們?cè)谏弦黄恼乱呀?jīng)討論了。ASP已經(jīng)取得了巨大的成功,為什么我們還需要一個(gè)新的版本!?我們可以從下面四點(diǎn)考慮:
a.. 現(xiàn)在的ASP的只能使用非結(jié)構(gòu)語(yǔ)言編寫(xiě),比如VBscript和JScript(如果用其它的語(yǔ)言就還需要單獨(dú)的解釋器)。而且當(dāng)ASP在第一次執(zhí)行時(shí),它解析并在cache中儲(chǔ)存這些代碼,這樣的局限性就是不允許其它結(jié)構(gòu)性語(yǔ)言比如VB和C++的使用,從而限制了它們的優(yōu)越性。而ASP+真正提供了中層語(yǔ)言執(zhí)行結(jié)構(gòu),允許各種語(yǔ)言的使用。
b.. 使用HTML,文本,對(duì)象混合的ASP很容易建立一個(gè)大型的頁(yè)面。但是很難重復(fù)利用這些代碼,除非你把一些代碼放在一個(gè)include文件中.這不是最好的解決方法。在很多的場(chǎng)合中,開(kāi)發(fā)一個(gè)網(wǎng)絡(luò)應(yīng)用需要廣泛的專(zhuān)業(yè)技能,比如,你寫(xiě)程序,另外一些人做美工,還有一些人設(shè)計(jì)網(wǎng)頁(yè)的內(nèi)容,如果僅僅使用ASP很難把這些人聯(lián)系起來(lái)來(lái)完成同一件事。但是ASP+真正允許了單獨(dú)的代碼與內(nèi)容共存.
a.. 在以前版本中的ASP中,你必須為幾乎每件事情寫(xiě)代碼。為了保持在form中的數(shù)據(jù),寫(xiě)代碼。為了確認(rèn)用戶(hù)寫(xiě)入的數(shù)據(jù),寫(xiě)代碼。為了發(fā)送一些簡(jiǎn)單的數(shù)據(jù),寫(xiě)代碼。而在ASP+中引入了一種真正的組件模式,通過(guò)這種服務(wù)器端的控制以及事件觸發(fā),我們似乎感覺(jué)是好像是在操作VB中"FORM".這種ASP+中的新組件控制是宣告性質(zhì)的(也就是說(shuō),你如果想使用這些組件控制來(lái)作一些事情,你只需要聲明一下就行了,其它的不用管了,哈哈,是不是覺(jué)得有些傻瓜。浚?),因此你實(shí)際上只需寫(xiě)很少的代碼了.實(shí)際上,在很多情況下,你完全不用寫(xiě)任何的代碼.
b.. 外面的世界時(shí)刻都在變化,已經(jīng)有相當(dāng)比例的用戶(hù)是通過(guò)"互聯(lián)網(wǎng)設(shè)備"來(lái)訪(fǎng)問(wèn)你的站點(diǎn)了,比如說(shuō)WAP手機(jī),PDA,置頂盒,以及其它的一些,也許不久的將來(lái)使用這些上網(wǎng)的用戶(hù)比用PC的還多。這就意味著我們可能要在服務(wù)器上做更多的事以與不同的設(shè)備相適應(yīng)。我們也不得不在使用不同格式輸出,比如WML。同時(shí),新的互聯(lián)設(shè)備和商業(yè)應(yīng)用也需要有能力從網(wǎng)絡(luò)應(yīng)用中發(fā)送或讀取WML.現(xiàn)在使用ASP做這些,需要你使用XML解析器,使用XML轉(zhuǎn)換數(shù)據(jù)。而ASP+網(wǎng)絡(luò)服務(wù)會(huì)用更簡(jiǎn)單的方式使用你做出的頁(yè)面能夠適應(yīng)不同的設(shè)備。
除了上面的這些,快速發(fā)展的分布是應(yīng)用也需要開(kāi)發(fā)地更加快速,更加模塊化,重復(fù)利用性更強(qiáng),更容易操作,讓更多的平臺(tái)支持。像SOAP(Simple Object Access Protocol)這樣的新標(biāo)準(zhǔn)以及B2B的商業(yè)需要,需要一種新的技術(shù)來(lái)適應(yīng)不同的系統(tǒng)。網(wǎng)絡(luò)應(yīng)用和網(wǎng)站需要提供一種更加強(qiáng)大的可升級(jí)的服務(wù),ASP+能夠適應(yīng)上面的要求,并且能夠在發(fā)生錯(cuò)誤、緩沖區(qū)溢出時(shí)重新啟動(dòng)應(yīng)用程序。
因此為了適應(yīng)這些需要,ASP已經(jīng)對(duì)基礎(chǔ)甚至是開(kāi)發(fā)環(huán)境進(jìn)行了修補(bǔ)。Visual Studio 7.0將會(huì)對(duì)ASP+應(yīng)用進(jìn)行完成的支持(包括ASP和ASP+),盡管現(xiàn)在還只有很少的工具能夠獲得其支持。這種豐富的,組件模式程序開(kāi)發(fā)模塊被設(shè)計(jì)得相當(dāng)友好,同時(shí)它也支持所有Visual Studio 語(yǔ)言,包括VB,C++以及C#,特別注意一下第三種語(yǔ)言,它流行的日子離我們不太遙遠(yuǎn)了。
ASP+怎樣讓你的生活更加簡(jiǎn)單?
對(duì)于今天的WEB程序員來(lái)說(shuō)最大的挑戰(zhàn)就是不斷變化地瀏覽器的兼容性,以及它們不斷升級(jí)的復(fù)雜性。在保證頁(yè)面能在所有流行瀏覽器下工作的同時(shí)又得盡量地使用每個(gè)瀏覽器最新屬性來(lái)建立更加具有交互式的頁(yè)面,這簡(jiǎn)直就是一場(chǎng)惡夢(mèng)。
更加可怕的就是對(duì)于不同的用戶(hù)設(shè)備建立不同的網(wǎng)頁(yè)。當(dāng)然,在WAP手機(jī)和傳統(tǒng)的瀏覽器上建立同等水平的頁(yè)面是不可能,因?yàn)橛捎趲挼脑颍诤芏郬AP手機(jī)中一次只能顯示12字3行的文本信息。
一個(gè)最簡(jiǎn)單的解決辦法就是動(dòng)態(tài)地對(duì)不同的用戶(hù)生成不同的輸出,或者就是對(duì)不同的用戶(hù)寫(xiě)多個(gè)頁(yè)面。第二種方法沒(méi)有效率,我想大多數(shù)地開(kāi)發(fā)者都會(huì)選擇第一種方法。但是這就意味著用戶(hù)的每次點(diǎn)擊都會(huì)讓服務(wù)器判斷應(yīng)該向用戶(hù)顯示什么.
如果這一切可能,為什么不把這些過(guò)程自動(dòng)化!?為了結(jié)束這一切,ASP+引入了一個(gè)新的服務(wù)控制的概念,它封裝了一些普通的任務(wù),提供了一種清晰的編程模塊。他們同樣幫助管理處理不同的用戶(hù)類(lèi)型。
服務(wù)器端HTML控制使得我們減少了不少的代碼
ASP已經(jīng)提供了一種在服務(wù)器上執(zhí)行組件的能力,這些組件能夠產(chǎn)生一些代碼用以返回給用戶(hù)。ASP+通過(guò)服務(wù)控制繼承了這一概念。轉(zhuǎn)換HTML元素到服務(wù)控制的需要僅僅是一個(gè)附加的屬性:runat="server"(這個(gè)我們?cè)贏SP也見(jiàn)到過(guò))
頁(yè)面中的任何HTML元素都能使用這種方法標(biāo)注,ASP+會(huì)在服務(wù)器上執(zhí)行這些元素,并且對(duì)不同的用戶(hù)產(chǎn)生不同的代碼。
這種讓HTML元素在服務(wù)器上執(zhí)行的概念第一次看來(lái)有些奇怪,但是當(dāng)你發(fā)現(xiàn)在它在這個(gè)頁(yè)面變得完全功能化,你還有什么好想的了。
保持狀態(tài)的問(wèn)題
在我們建立交互頁(yè)面和應(yīng)用時(shí)最煩人的一個(gè)問(wèn)題就是處理從客戶(hù)端傳來(lái)的數(shù)據(jù),然后保持這些數(shù)據(jù)加以控制。ASP+的一個(gè)核心目標(biāo)就是簡(jiǎn)化這一過(guò)程。這不會(huì)給程序員帶來(lái)任何的困惑,而且能在大多數(shù)的瀏覽器上工作正常。
我們先來(lái)看看下面的代碼。這段代碼制作了一個(gè)簡(jiǎn)單的頁(yè)面讓用戶(hù)輸入電腦的名字和選擇操作系統(tǒng)。OK,它本身不是個(gè)很煩人也不是令人興奮的例子,但是它反映了我們常常做的一些事。當(dāng)這個(gè)頁(yè)面提交后,使用request.form集來(lái)取得相應(yīng)的數(shù)據(jù),然后用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>
盡管這是一個(gè)ASP文件(后綴名是.asp不是.aspx,但是如果我們把它的文件后綴改為.aspx,它同樣能夠在ASP+工作正常。請(qǐng)記住,這兩個(gè)系統(tǒng)能夠在一個(gè)機(jī)器上很好的共存,這個(gè)后綴名只是在判斷,這個(gè)解析工作是ASP來(lái)做,還是ASP+來(lái)做。
下面的快照中我們看到了在IE5中執(zhí)行的結(jié)果,當(dāng)用戶(hù)點(diǎn)擊這個(gè)提交按鈕,將會(huì)把數(shù)據(jù)傳向服務(wù)器,這個(gè)頁(yè)面將會(huì)被刷新,同時(shí)顯示我們選擇的結(jié)果。當(dāng)然,在真正的應(yīng)用中我們可以將這些數(shù)據(jù)存入數(shù)據(jù),或者做一些其它的事,這里為了簡(jiǎn)便,我們只是讓它顯示出來(lái)。
這個(gè)頁(yè)面的問(wèn)題便是它不能保持狀態(tài),換句話(huà)說(shuō)就是它只能返回默認(rèn)值,用戶(hù)在重新此頁(yè)時(shí)不得不重新輸入數(shù)據(jù)。如下圖:
為了實(shí)現(xiàn)上面的要求,我們不得不在這個(gè)代碼中加入一些數(shù)據(jù),如下:
<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 ,很煩人吧(其實(shí)在ASP中這一些是可以簡(jiǎn)化,可能是原作者想突出ASP+比ASP更簡(jiǎn)潔,故意把這個(gè)代碼寫(xiě)得很長(zhǎng))下面的圖是我們修改后的代碼結(jié)果:
自動(dòng)保持狀態(tài)的控制
那么ASP+是怎樣處理這個(gè)問(wèn)題的了。肯旅娴拇a讓我們看到了ASP+的優(yōu)點(diǎn)給我們帶來(lái)的變化。我們來(lái)仔細(xì)看看下面的代碼吧。這次這個(gè)頁(yè)面中的一些元素加上了runat="server"的屬性。當(dāng)ASP+看到這些元素,它將會(huì)在服務(wù)器上執(zhí)行這些代碼,并且產(chǎn)生正確的輸出:
<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>
現(xiàn)在你就能看到ASP+如何比ASP簡(jiǎn)單了。下面是執(zhí)行的結(jié)果,和ASP編寫(xiě)的沒(méi)有區(qū)別:
服務(wù)器是怎樣工作的?!?
這些數(shù)據(jù)是怎樣獲得的呢?這里的關(guān)鍵是runat="server" 屬性.為了有一個(gè)感性認(rèn)識(shí),我們先看看這個(gè)頁(yè)面的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+創(chuàng)建<form>:
<FORM runat="server">
...
</FORM>
當(dāng)這個(gè)頁(yè)面被ASP+執(zhí)行后,輸出到瀏覽器上的代碼是:
<FORM name="ctrl0" method="post" action="pageone.aspx" id="ctrl0">
...
</FORM>
你現(xiàn)在看到ASP+自動(dòng)加上了action和method方法,因此這個(gè)頁(yè)面將會(huì)以post方式進(jìn)行提交。ASP+同時(shí)也給form加上了一個(gè)唯一值的id和name值,而這些我們根本就沒(méi)有指定(不過(guò)你也可以指定,指定后以你指定的為準(zhǔn))
如果你在加了"GET"屬性,這個(gè)form就會(huì)以querystring方式被接收,就和以前的ASP一樣,這個(gè)自動(dòng)狀態(tài)也不會(huì)工作的。
在這個(gè)頁(yè)面中我們使用下面的代碼建立text項(xiàng):
<INPUT type="text" id="txtName" runat="server">
在瀏覽器中的結(jié)果是:
<INPUT type="text" id="txtName" name="txtName" value="tizzy">
你也能看到ASP+自動(dòng)加上了value屬性以及它的值。同時(shí)也加上了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+因?yàn)樵?lt;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元素的值也被自動(dòng)匹配。(如果你提供了自個(gè)的value屬性,那么系統(tǒng)還是依你的)
因此,正如你看到的,這里實(shí)在是沒(méi)有什么鬼把戲,這里是標(biāo)準(zhǔn)的HTML,沒(méi)有任何客戶(hù)端的腳本庫(kù),也沒(méi)有ActiveX或者Java Applets.
ASP+的服務(wù)器代碼
為了在頁(yè)面中顯示這些值,我們使用和上面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+和服務(wù)控制的另外一個(gè)巨大的好處就是能夠在服務(wù)器上執(zhí)行代碼并且創(chuàng)建輸出。ASP+強(qiáng)調(diào)每一個(gè)元素只有一個(gè)唯一的id屬性,因此服務(wù)控制(也就是說(shuō)有runat="server"的元素)必須依賴(lài)原始代碼。這也就是說(shuō)我們不需要使用request集合去訪(fǎng)問(wèn)客戶(hù)端傳來(lái)的值,只要使用唯一的id就行了.
...
If Len(selOpSys.value) > 0 Then
Response.Write("You selected ’" & selOpSys.value _
& "’ for machine ’" & txtName.value & "’.")
End If
...
ASP+中的VB代碼
在我們剛才看到的ASP頁(yè)面中,腳本語(yǔ)言是使用的vbscript(它不是唯一的,但是如果沒(méi)有別的設(shè)定,那么它就是被默認(rèn)的語(yǔ)言).在ASP+中,它再也不支持VBscript了,它的默認(rèn)語(yǔ)言是Visual Basic(VB),因此我們的代碼會(huì)被編譯成為IL(Intermediate Language).
在新的VB7.0中vb的編譯器已經(jīng)包括了ASP+(哈哈,是不是一個(gè)好消息了,我們不需要重新買(mǎi)東東了)。在這個(gè)新版本中,一個(gè)最值得注意的就是在VB7中所有方法都必須有以圓括號(hào)包含的參數(shù)列表。而這個(gè)要求在VBscript和以前的VB版本中是不需要的。
服務(wù)器事件的執(zhí)行。
當(dāng)然,如果你想讓一些HTML元素在服務(wù)器上執(zhí)行,那么為什么不把這個(gè)概念再擴(kuò)展一下?!ASP+已經(jīng)將每一個(gè)頁(yè)面變成了一個(gè)服務(wù)器對(duì)象,同時(shí)提供了很多屬性,方法和事件,這一切能夠在你的頁(yè)面中很好的利用。每個(gè)頁(yè)面變成了COM+對(duì)象上的一個(gè)節(jié)點(diǎn),當(dāng)它們被請(qǐng)求時(shí)能夠獨(dú)立的運(yùn)行和編寫(xiě)。
使用服務(wù)器端的控制事件
好好看一下下面的代碼,看看,我們是如何利用ASP+的優(yōu)點(diǎn)來(lái)完美地結(jié)構(gòu)化我們的頁(yè)面。
<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>
首先請(qǐng)注意我們?cè)?lt;script>中指定VB是當(dāng)前語(yǔ)言,并且有一個(gè)runat="server"的屬性.在里面我們寫(xiě)了一個(gè)名叫showValues的VB的函數(shù)(在ASP+中,函數(shù)和子程序必須得放在<script>中,并不是<% ....%>之間)
我們也添加了一個(gè)有著runat="server"的HTML標(biāo)簽<div>。因此這個(gè)元素會(huì)在服務(wù)器上創(chuàng)建。當(dāng)這個(gè)VB子程序被執(zhí)行時(shí),它將使用<div>元素的innerText屬性.
同樣我們也得注意一下它是如果取得請(qǐng)求值的。因?yàn)檫@個(gè)text box以及<select>列表也是在服務(wù)器上執(zhí)行的,我們的程序能夠直接通過(guò)訪(fǎng)問(wèn)這些控制的value屬性獲取它們的值,這個(gè)<div>元素執(zhí)行后的代碼會(huì)是下面的樣子:
<DIV id="divResult">You selected ’Windows NT4’ for machine ’lewis’.</DIV>
聯(lián)接服務(wù)控制事件
到目前為此,你可能會(huì)問(wèn)這個(gè)VB子程序是怎樣執(zhí)行的?很簡(jiǎn)單,我們?cè)?lt;input>元素中建立了一個(gè)submit按鈕,并且加上了兩個(gè)新的屬性:<INPUT type="submit" value="Submit" runat="server" onserverclick="ShowValues">
這個(gè)runat="server"屬性轉(zhuǎn)換HTML成服務(wù)控制,它是"可見(jiàn)的"。這個(gè)onserverclick="showValue"屬性告訴runtime它將會(huì)在被點(diǎn)擊后執(zhí)行ShowValues子程序.
這個(gè)代碼執(zhí)行的結(jié)果和前面的例子沒(méi)有什么兩樣,但是ASP+的代碼便比以前更結(jié)構(gòu)化了,這樣就增加了文件的可讀性。
有時(shí)間,我們下面幾篇文章將介紹,ASP+一些更加具體的問(wèn)題,F(xiàn)在,很忙,沒(méi)有時(shí)間啦. |