|
在前一篇文章中已經(jīng)討論過Microsoft 在設(shè)計(jì)和開發(fā)ASP+時(shí)的主要?jiǎng)訖C(jī)。ASP非常成功,為什么 還要一個(gè)新版本?有4個(gè)問題需要考慮:
● 目前,ASP腳本主要是用基本的non-typed 語言,例如VBScript 和JScript來寫的(除非你安裝了一 個(gè)獨(dú)立的語言解釋程序)。盡管ASP第一次執(zhí)行頁面代碼時(shí)確實(shí)進(jìn)行分解和緩存,這一局限導(dǎo)致即使 在有優(yōu)勢的時(shí)候,也不能使用那些strongly-typed 的語言,例如Visual Basic 和C++。而ASP+為 Web 應(yīng)用程序提供了真正中立于語言的執(zhí)行框架。
● 創(chuàng)建包含著一長串各種代碼、HTML、文本、對象聲明混合在一起的大型ASP頁也是非常容易的。 要再利用這些代碼是很困難的,除非你將其放在獨(dú)立的'include' 文件中,這也不是個(gè)很好的辦法。 在許多環(huán)境下,開發(fā)一個(gè)web 應(yīng)用程序需要各方面的專業(yè)人員,例如,需要程序員來寫代碼,需要 設(shè)計(jì)師來使HTML看起來漂亮。讓代碼和內(nèi)容混雜在一個(gè)雙方都需要在其上進(jìn)行操作的文件中使它們 很難在一起工作。而ASP+ 提供代碼和內(nèi)容的真正分離。
● 在以前版本的ASP中,大多數(shù)事情都要靠寫代碼來完成。想維護(hù)表單域的狀態(tài)嗎?寫代碼。想 確認(rèn)客戶輸入的數(shù)據(jù)嗎?寫代碼。想發(fā)出一些簡單的數(shù)據(jù)值嗎?寫代碼。想緩存頁面區(qū)優(yōu)化性能嗎? 寫代碼。而ASP+ 用基于服務(wù)器的控制和從概念上來說同Visual Basic 表單工作的方式相同的事件 驅(qū)動(dòng)運(yùn)行范例介紹了一種真正的組件模型。新的ASP+ 服務(wù)器控制是聲明式的(需要它們做一些事情 時(shí)才需要聲明它們),所以你就可以少寫一些代碼,實(shí)際上,大多數(shù)情況下根本就不用寫任何代碼。
● 世界是變化的。通過'Internet device' ,例如移動(dòng)電話、PDA、電視機(jī)頂盒、游戲控制臺或 其他東西訪問你的網(wǎng)站的用戶比例很快就會(huì)超過使用PC和傳統(tǒng)瀏覽器的用戶。這就意味著我們不得 不在服務(wù)器上做更多的工作,來使我們的網(wǎng)頁與這些不同的設(shè)備相兼容。我們不得不以全新的格式 創(chuàng)建輸出,例如Wireless Markup Language (WML)。另外,除了要為運(yùn)行創(chuàng)建WML,新的Internet 設(shè)備和商業(yè)應(yīng)用程序還要求能夠從Web應(yīng)用程序發(fā)送和接收XML數(shù)據(jù),F(xiàn)在用ASP做這些需要你手工 使用XML 分解,從XML 計(jì)劃轉(zhuǎn)換數(shù)據(jù),或?qū)?shù)據(jù)轉(zhuǎn)換成XML 。ASP+ Web 服務(wù)使將頁面剪裁得適應(yīng) 特定設(shè)備變得很簡單。
除此之外,分布式應(yīng)用程序迅速變化的特性要求更快地開發(fā)、更加組件化、可再利用、更易于 展開和更廣泛的平臺支持。新的標(biāo)準(zhǔn)例如簡單對象訪問協(xié)議Simple Object Access Protocol (SOAP), 新的商業(yè)需求例如business-to-business (B2B) 數(shù)據(jù)交換,要求用新技術(shù)產(chǎn)生輸出和與 其它系統(tǒng)通訊。Web 應(yīng)用程序和Web 站點(diǎn)也需要更加靈活和可升級的服務(wù),這些ASP+ 通過傾向于 積極的監(jiān)控和應(yīng)用程序失敗時(shí)的自動(dòng)重新啟動(dòng),內(nèi)存釋放等等都提供了。
所以,要想滿足這些要求,ASP必須要進(jìn)行全面的修改來變成一個(gè)全新的編程環(huán)境。盡管目前 很少有可用于此的工具,Visual Studio 7.0 可以提供全面支持使創(chuàng)建ASP+ 應(yīng)用程序簡單(包括 ASP+ 頁面和ASP+ 服務(wù))。豐富的、基于組件的、事件驅(qū)動(dòng)的編程模型特意設(shè)計(jì)成“工具友好”, 而這種支持對于所有的Visual Studio 語言,包括VB, C++和C#. 都可用。而你也可以確信第三方 的工具制造商也不會(huì)落后太多。 目前Web 開發(fā)人員面臨的最大挑戰(zhàn)是瀏覽器的兼容性問題和他們所要?jiǎng)?chuàng)建的網(wǎng)頁的復(fù)雜程度 不斷增加。要?jiǎng)?chuàng)建更加交互式的頁面,又要利用各種瀏覽器的最新特色的,同時(shí)還要確定頁面 在所有可能的瀏覽器上都能工作,簡直是揮之不去的噩夢。
當(dāng)然,使用這些正在興起或已經(jīng)在使用的新Internet 設(shè)備會(huì)使情況更糟糕。特別是,要?jiǎng)?chuàng)建 的網(wǎng)頁對移動(dòng)電話和傳統(tǒng)瀏覽器客戶提供相同用戶級別的兼容性也成為可能。只能顯示3行字符文 本的移動(dòng)電話當(dāng)然要限制創(chuàng)造性和用戶交互性。
一個(gè)顯然的解決辦法是創(chuàng)建動(dòng)態(tài)定位每個(gè)特定客戶的輸出?還是創(chuàng)建同一站點(diǎn)的多種版本,每 個(gè)客戶一種版本。第二種方法可不誘人,許多人更傾向于第一種。但是這就意味著來自于每個(gè)用戶 的每一次敲擊都需要一些服務(wù)器側(cè)的處理來指明創(chuàng)建哪種輸出。
如果是這樣,為什么不讓這一過程自動(dòng)化?到這,ASP+ 介紹了服務(wù)器控制的概念,其中包含 普通任務(wù)和提供一個(gè)清楚的編程模型。它們還幫助處理對各種不同類型客戶的定位。 ASP已經(jīng)提供了在服務(wù)器上運(yùn)行組件的機(jī)會(huì),這些組件產(chǎn)生返回給用戶的頁面部分。ASP+ 通過 服務(wù)器控制擴(kuò)展了這一概念。將任何HTML元素轉(zhuǎn)換成服務(wù)器控制所需要做的只是增加一個(gè)額外的 屬性: runat="server"。
一頁中的任何HTML元素都可以用這種方法做標(biāo)記,然后ASP+ 就在服務(wù)器上處理這些元素,然后 產(chǎn)生適合這一特定服務(wù)器的輸出。另外作為副產(chǎn)品,我們還可以特別創(chuàng)造一個(gè)額外的小竅門,用 HTML 〈 FORM 〉 和控制元素相關(guān)聯(lián)的表單創(chuàng)建代碼,在到服務(wù)器的往返旅行中維護(hù)狀態(tài)。這就使編程 的過程不那么單調(diào),更具有創(chuàng)造性。
讓HTML元素在服務(wù)器上執(zhí)行的概念開始看來有點(diǎn)奇怪,你會(huì)發(fā)現(xiàn)它為頁面的功能增加了一個(gè)全 新的層面,同時(shí)又更加容易編寫。一個(gè)程序員還會(huì)再要求什么呢? 創(chuàng)建Web 站點(diǎn)和交互式應(yīng)用程序時(shí)最討厭的任務(wù)就是管理從HTML表單控制傳遞給服務(wù)器的值, 在頁請求之間維護(hù)這些控制的值。所以ASP+ 的核心目的之一就是簡化這種編程任務(wù)。這對于程序員 來說不設(shè)計(jì)額外的工作,支持基本HTML的所有瀏覽器都能很好地完成。
看看代碼的下一部分。用HTML控制創(chuàng)建一個(gè)簡單表單,用戶可以輸入計(jì)算機(jī)名并選擇操作系統(tǒng)。 這個(gè)例子本身沒有什么了不起,但是它代表了一個(gè)相當(dāng)普遍的情況,幾乎現(xiàn)在每一個(gè)web 應(yīng)用程序 都會(huì)用到。當(dāng)表單被提交給服務(wù)器時(shí),用戶所選擇的值就會(huì)從Request.Form 集合中提取出來,并 用Response.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頁,(文件擴(kuò)展名是.asp 而不是 .aspx),如果我們將擴(kuò)展名改為.aspx的話, 在ASP+下是同樣工作的。記住這兩種系統(tǒng)在同一個(gè)機(jī)器上是自由并存的,文件的擴(kuò)展名決定是由 ASP 還是 ASP+ 來處理。
下圖顯示在Internet Explorer 5中看起來是什么樣的。當(dāng)用戶點(diǎn)擊Submit 按鈕向服務(wù)器傳遞 值時(shí),頁面被重新裝載顯示選擇的值。當(dāng)然在真正的應(yīng)用程序中,有些值要儲(chǔ)存在數(shù)據(jù)庫中,或者 用來執(zhí)行一些專用的處理。在例子中我們只是在頁面上顯示。
一個(gè)問題是頁面不維護(hù)它的狀態(tài),換句話說控制返回它們的默認(rèn)值。用戶要再次使用表達(dá)就要 重新輸入。下圖中可以看到。
要避免這種情況,就需要在頁面上增加一些額外的代碼,當(dāng)頁面重新裝載時(shí)將值插入控制中。 對文本框來說只是用內(nèi)聯(lián)ASP代碼設(shè)置value 屬性,用HTMLEncode 方法確保任何不合法的HTML字符 都被適當(dāng)編碼。但是對于〈 SELECT 〉 列表,必須要計(jì)算出所選擇的值,并將選中的屬性增加到指定的 〈 OPTION 〉元素。要求的變化如下所示:
〈 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 〉
當(dāng)頁面重新裝載時(shí),控制維護(hù)它們的狀態(tài)并顯示用戶所選擇的值。
|