閱讀342 返回首頁    go 阿裏雲 go 技術社區[雲棲]


從 PHP 遷移到 ASP.NET

簡介

本文討論了從PHP(PHP:HypertextPreprocessor4)到ASP.NET的遷移,並對PHP和Microsoft®VisualBasic®.NET的基本語法以及基本功能和體係結構進行了對比。

盡管使用PHP和ASP.NET都可以構建複雜的Web應用程序(例如電子商務站點、Intranet和企業門戶),但兩者之間卻存在若幹重要差別。與PHP不同,ASP.NET並不是一種語言或分析器,而是Microsoft.NETFramework中的一組用於構建Web應用程序和XMLWebService的技術。同PHP一樣,MicrosoftASP.NET頁麵在服務器上執行並生成標記(例如HTML、WML或XML),標記將發送給桌麵應用程序或移動應用程序。但不同的是,ASP.NET為開發Web頁麵提供了強大的、麵向對象的以及由事件驅動的編程模型,同時仍保留了PHP開發人員所習慣的那種簡單性。

ASP.NET應用程序是基於強大的麵向對象編程(OOP)模式,而不是基於腳本模式。這樣便可以獲得更為嚴謹的OOP功能,例如繼承、封裝和反射。雖然大多數基本的簡單操作可以輕鬆地從PHP轉換到ASP.NET,但要轉換更為複雜的應用程序卻並不這麼簡單,這需要仔細的規劃和考慮,並采用更符合OOP的方法。

本文假設讀者具有PHP方麵的經驗,並且對編程和軟件開發有著基本了解。本文首先從代碼方麵對兩者的基礎體係結構的差別進行簡單比較,並簡要介紹一下OOP開發模型,然後比較兩者的功能,最後將使用PHP和ASP.NET開發Web應用程序時的語法和常見任務作以對比。

注意:如果您希望跳過有關遷移的詳細信息,而隻想嚐試ASP.NET的使用,則可以直接跳到建議的後續操作部分。
體係結構對比

閱讀完本文後,通過比較語法和語言,您將了解PHP和ASP.NET是很相似的,它們具有類似的功能和語法。但是,從更基本的體係結構層麵來講,PHP與ASP.NET卻有著很大差別。PHP基於獨立於平台的處理器/引擎,該處理器/引擎用於分析PHP腳本、提供數據庫連接、符合Internet協議以及提供大多數Web應用程序平台所常見的眾多其他任務。

ASP.NET是基於一係列技術(如CLR)構建的框架,提供了大量以很好的方式組織的類庫,這些類庫可滿足要在Web應用程序中使用的大多數功能的需要。您還可以輕鬆地創建各種組件,對該框架進行擴展。

雖然PHP也提供了類似的功能(例如PEAR庫),但PHP和ASP.NET並非完全相同,因為ASP.NET框架是完全基於OOP模式和OOP概念構建的,而PHP則不然。這種差別在PHP和ASP.NET中類和對象的訪問方式方麵表現得猶為明顯。

PHP和ASP.NET中的麵向對象編程

雖然PHP和ASP.NET都為應用程序開發提供了OOP模式,但它們對各種OOP概念(例如封裝和多態)的支持卻存在差別。例如,PHP僅支持部分封裝(例如,支持在類中聲明方法和字段)和部分多態(沒有重載和抽象)。此外,由於PHP的類中不存在私有(private)、公有(public)或受保護(protected)函數等概念以及重載,因此PHP也不支持這些概念及其訪問。OOP純粹主義者可能會說,ASP.NET以及各種語言也沒有完全支持OOP模式中的所有概念,對於使用OOP的大多數語言(如C++和Java)來說,情況確實如此。

這既有積極的一麵,也有消極的一麵。消極的一麵是:對於某些Web開發人員來說,學習ASP.NET要比學習PHP困難些,因為PHP提供的是開發人員創建Web站點時所慣用的腳本模式。但是,使用過OOP語言和/或V的開發人員會發現ASP.NET比較親切且易於學習。

ASP.NET支持OOP概念的積極的一麵是,ASP.NET應用程序的大多數部分都會得到很好的設計,並且能夠對內容、邏輯和數據進行清楚的分隔,因而從應用程序生命周期的長遠角度看,這通常更容易為其提供支持。此外,由於ASP.NET本身支持企業技術,例如消息隊列、事務(請參閱.NETFramework的System.EnterpriseServices類)SNMP和Web服務,因而可以很容易地開發具有高度可縮放性的強大的應用程序。

要大致了解麵向對象編程(從VisualBasic的角度)的主要概念,請參閱功能PHPASP.NET編碼語言具有舊ASP樣式標記的C、C++樣式腳本語言。支持某些OOP概念。支持超過25種語言,但最常用的兩種語言是VisualBasic.NET和C#。大多數開發人員都選擇一種語言,但可以使用用任何其他支持的語言編寫的組件。編譯的應用程序邏輯可編譯並且可以作為可執行程序運行。在動態編譯和預編譯模式下均支持。全部頁麵輸出緩存本身並不支持。支持,基於一個或多個URL參數、瀏覽器類型、自定義函數或任意組合來緩存頁麵的不同版本。部分頁麵輸出緩存本身並不支持。通過使用用戶控件提供內置支持。可使用緩存API和複雜的過期規則來緩存數據和其他對象。數據庫訪問為市場上的大多數數據庫以及開放源代碼的數據庫提供了驅動程序。直接支持OLE-DB和ODBC,本身還包含了MicrosoftSQLServer™和Oracle的驅動程序。數據庫輸出數據集作為PHP變量返回,並且可以像任何其他變量那樣將其輸出。以模板化的方式綁定到服務器端控件以簡化開發;如果需要,也可以手動循環。外部組件可以調用各種軟件包,並且開發人員可以直接修改Zend引擎(因為它是開放源代碼的)。負責Zend的編程人員還可以使.NET對象能夠從PHP中調用。充分支持本身的C庫和COM對象以及用任何與.NET兼容的語言(包括托管C++[ManagedC++])編寫的程序集。對CORBA對象或Java類未提供內置支持。XML/XSLT在附加軟件包和庫中支持為XMLDOM、XSLT、驗證和XML文檔的輕量級麵向流的分析提供了廣泛和易於使用的支持。XMLWebService當前正在開發PHP軟件包以支持基於ApacheAXIS引擎以及其他引擎的Web服務。當前版本提供了廣泛、靈活、符合標準的支持,使得發布和使用Web服務都非常容易。會話狀態基於Cookie的會話管理基於Cookie或無Cookie的會話狀態(使用單個服務器內存存儲、中央狀態服務器或數據庫後端)。此外,可擴展的體係結構還允許使用自定義的會話狀態模塊替換內置選項。要啟用無Cookie的會話,隻需更改配置。內置功能PHP的內置功能涵蓋了基於Web的應用程序可能需要執行的許多常見任務。通過某些額外的處理,它還可以訪問Java類庫。ASP.NET可以直接訪問整個.NETFramework類庫,這些類庫包含了大量功能。正則表達式支持POSIX和Perl兼容的正則表達式語法。支持Perl-5兼容的正則表達式,以及一些其他功能,例如從右向左匹配、預編譯表達式、命名組及完全的Unicode支持。此外,還允許用戶指定在正則表達式替換操作過程中調用的函數。調試PHP未提供廣泛的調試功能,但可以通過各種第三方產品和Zend增強調試和測試功能。包含廣泛的跟蹤和環境信息,這些信息可包含在頁麵中或在單獨的頁麵中顯示。使用MicrosoftVisualStudio®.NET除了可以調試客戶端腳本和SQLServer存儲過程外,還可以輕鬆地在執行頁麵時對其進行交互式調試。錯誤處理不支持錯誤捕獲,但提供了各種錯誤處理功能和日誌。支持結構化的異常處理(其中新增了一個“finally”代碼塊,無論是否發生錯誤,都將執行該塊),支持引發自定義異常,還支持為不同類型的不可恢複錯誤指定自定義錯誤頁麵。圖像處理無內置支持,但可以使用第三方組件。包含大量用於創建和處理圖像的工具。(請參閱.NETFramework的代碼重用用戶定義的函數、創建類的功能以及包含文件。用戶控件、服務器控件、自定義類以及包含文件。線程PHP具有很好的線程模型。完全支持。不但可以在單獨的線程中同時請求多個頁麵,而且每個頁麵(如果需要)還可以生成自己的線程以執行同步或異步操作。數據緩存具有有限的數據緩存(僅限於數據本身)。包含大量的緩存API,能夠存儲幾乎任何類型的數據(包括數據庫查詢結果),並且能夠基於時間、使用情況、文件或其他緩存項而過期。還允許在從緩存中刪除給定項時調用用戶定義的函數。國際化完全支持Unicode。支持Unicode字符串和各種字符編碼。日期、數字和貨幣函數均可區分文化環境,並根據當前文化環境的設置更改輸出(而不要求調用其他函數)。支持使用資源文件對應用程序進行動態本地化。SMTP、HTTP、FTP、POP3本身支持各種Internet協議。SMTP支持依賴於IISSMTP服務。能夠很好地支持HTTP。.NET不支持FTP和POP3,但是有一些免費的和銷售的第三方組件可用來實現此功能。集成開發環境可以使用大量提供了廣泛功能的開發工具,價格從零到幾百美元不等。Microsoft提供了一個名為VisualStudioDeveloperCenter。

其他工具(包括BorlandC#Builder和MacromediaDreamweaverMX)也支持ASP.NET。

Web服務器支持支持幾乎所有Web服務器。支持IIS以及操作係統支持支持幾乎所有常用的操作係統,包括MicrosoftWindows®、Mac、OSX、Amiga、Solaris、FreeBSD、Linux以及AIX等。當前支持Windows2000、WindowsXP和WindowsServer2003。語法和常見任務對比

以下各部分比較了PHP和.NET的語法,並介紹了如何完成某些非常常見的編程任務。

注釋

PHP允許您使用C、C++和Unixshell樣式語法在代碼中插入注釋,注釋指示器中的任何內容都不會被執行。

一般來講,要在ASP.NET中注釋出VisualBasic.Net代碼,需要使用<%--打開注釋塊,並使用--%>關閉注釋塊。

表2顯示了這兩種環境中的注釋。

表2:服務器端注釋

這是被注釋出的

文本塊

*/

<%--

這是注釋

--%>

變量

雖然PHP和VisualBasic.NET具有類似的語言構造,但語法卻截然不同。由於VisualBasic.NET是基於OOP模型構建的,因而變量的聲明要比PHP中變量的聲明更嚴謹(在PHP中聲明變量時隻需在變量名之前添加一個$符號)。

在VisualBasic.NET中聲明變量時,要指定它的變量名和特性。變量的聲明語句是Dim關鍵字。它的位置和內容決定了變量的特性。變量具有級別(例如局部變量和模塊變量)、數據類型、生存期以及可訪問性。

雖然這種方法最初看上去要比在PHP中指定變量複雜,但實際上它會給開發人員帶來方便。ASP.NET致力於幫助開發人員創建可靠的應用程序,而指定數據類型可以使諸如變量清理、調試、異常和錯誤處理以及代碼維護等任務變得更加簡單。

表3顯示了在兩種環境中聲明變量的示例。

表3:變量聲明

$foo

$X

$obj

Dimhead_countASInteger

DimfooAsString

DimXasDate

DimObjasobject

聲明數據類型

聲明語句中的AS子句用於定義所聲明變量的數據類型或對象類型。您可以為變量指定以下任意類型:基本數據類型,例如Boolean、Long或Decimal 複合數據類型,例如數組或結構 VisualBasic或其他應用程序中的對象類型或類,例如Label或TextBox

您可以在一個語句中聲明多個相同類型的變量而不必重複數據類型。下麵的語句將變量numStudents、numGTA和numProfessors聲明為Integer類型:

DimnumStudents,numGTA,numProfessorsASInteger'三個變量都是Integer類型。

有關數據類型的詳細信息,請參閱Object-OrientedProgramminginVisualBasic。

聲明生存期

變量的生存期是指變量可供使用的時間段。使用Dim語句聲明的局部變量僅在其執行過程中存在。過程終止時,該過程的所有局部變量都將消失,這些變量的值也將丟失。

生存期這個概念很有用,因為它使開發人員在創建應用程序時不必考慮在大型應用程序中出現的許多問題,例如有效的內存管理。通過為變量選擇正確的生存期,可以使.NET對未在使用的變量執行清理操作。

有關生存期的詳細信息,請參閱Scope。

聲明可訪問性

.NET支持變量的可訪問性,從而使開發人員可以控製哪些代碼能夠訪問特定的變量。例如,如果要為某個公式設置一些常數,並且要確保這些常數不會被它們所在類以外的其他代碼更改,則可以使用private按如下所示聲明該變量:

PrivatemyConstantAsInteger

變量的可訪問性由聲明語句中使用的一個或多個關鍵字Dim、Public、Protected、Friend、ProtectedFriend或Private確定。開發過程中通常隻使用public和private。

您可以使用上述任意關鍵字來聲明模塊、結構、類或實例變量。過程中隻允許使用Dim關鍵字,並且可訪問性始終為private。

輸出

PHP中輸出數據的典型方式是使用echo()語言構造。ASP.NET中與此最相似的是Response.Write()方法(或<%=%>構造,它隻是Response.Write()的簡寫形式)。表4顯示了向頁麵寫入值的基本語法。

表4:基本輸出

$hello="hihowareyou/n";

echo$hello;

?

>

<%

DimHelloAsString="Hihowareyou"&vbcrlf

Response.Write(Hello)

%>

然而,這些用於向瀏覽器發送輸出的方法主要是為了保持與傳統ASP的向後兼容性。ASP.NET提供了新的基於控件且麵向事件的模型,您隻需在服務器控件上設置屬性即可將數據輸出到瀏覽器中。通過這種技術可以將布局與代碼清楚地分開,從而簡化了維護工作,並且在複雜情況下所需的代碼要比PHP少得多。

<scriptlanguage="VB"runat="server">SubPage_Load(senderAsObject,eAsEventArgs)TheDate.Text=DateTime.NowEndSub</script>Thecurrentdateis:<asp:Labelrunat="server"/>

此示例聲明了一個名為TheDate的服務器端標簽(Label)控件,並在該頁麵的Load事件中將此標簽的Text屬性設置為當前的日期和時間。此代碼的HTML輸出與其他兩個版本相同,不同的是Label控件將自身呈現為span標記(其中包含所設置的任何標簽文本)。

條件處理

IF/ELSE

PHP具有若幹條件處理表達式,例如for、while、switch和foreach,但最常用的是if/else表達式。VisualBasic.NET有幾個非常類似的構造,其語法也很類似。表5對PHP和VisualBasic.NET中的等價條件邏輯進行了比較。

表5:基本條件邏輯

print"aisbiggerthanb";

}elseif($a==$b){

print"aisequaltob";

}else{

print"aissmallerthanb";

}

Ifa>b

Response.write("aisbigger

thanb")

ElseIfa=bThen

Response.write("aisequalto

b")

Else

Response.write("aissmaller

thanb")

EndIf

切換

切換語句是大多數編程語言的常見語言構造,用於通過多個值對單個表達式進行測試。它常用於替換包含多個elseif/else塊的if語句。

圖6對PHP的switch語句與VisualBasic的SelectCase語句進行了比較。

表6:switch與selectcase語句的對比

case0:

print"iequals0";

break;

case1:

print"iequals1";

break;

case2:

print"iequals2";

break;

default:

print"iisnotequalto0,

1or2";

}

SelectCaseNumberi

Case0

description="0"

response.write("iequals0")

Case1

description="1"

response.write("iequals1")

Case2

description="2"

response.write("iequals2")

CaseElse

description="iisnotequal

to0,1or2"

response.write("iisnot

equalto0,1or2")

EndSelect

循環

另一個非常常見的控製構造是循環。PHP和.NET都支持若幹不同的常見循環類型。

表7:For循環

print$i;

}

DimsumAsInteger=0

DimcounterAsInteger

Forcounter=1To100Step5

sum+=counter

Next

Fori=1to100

Response.write(i)

NextI

在VisualBasic中,這種循環類型被稱為For...Next循環,而在PHP中則稱為For循環。在此示例中,我們使用了+=運算符作為sum=sum+counter的簡寫方式。在PHP中,可以使用Break;語句來中斷循環。而For...Next循環可以通過ExitFor語句中斷。

條件循環

隻要某個條件計算為true,條件循環便會持續重複一組指令。表8顯示了這兩種語言中的基本條件循環示例。

表8:條件循環

while($i<=10):

print$i;

$i++;

endwhile;

DimcounteriAsInteger=1

DoWhilecounteri<=10

Response.write(i)counteri+=1

Loop

在VisualBasic中,這種循環類型稱為Do...Loop語句,或while循環。PHP也支持Do...While循環,該循環與while循環非常類似,不同之處在於它是在每個循環的結尾而不是開始檢查真假表達式。Do...While循環與常規while循環的主要差別是前者會確保運行第一個循環(因為隻在該循環的結尾檢查真假表達式),而常規的while循環則不一定運行。(因為它在每個循環的開始檢查真假表達式,如果它一開始便計算為FALSE,該循環將立即結束執行。)

下麵給出了一個PHP中這種情況的示例:

$i=0;do{print$i;}while($i>0);

此循環隻運行一次,因為在第一次循環後檢查真假表達式時,表達式計算為FALSE($i不大於0),所以循環將停止執行。

在VisualBasic.NET中,您可以執行同樣的操作:

DimcounteriAsInteger=0Doresponse.write(i)counterLoopWhilecounteri>0

但是,VisualBasic.NET支持內置的循環功能,這是PHP所不支持的。該功能將對條件進行計算,直到條件為真時為止。

Foreach循環

PHP4(而非PHP3)包含一個foreach構造,它與ASP.NET以及某些其他語言中的構造非常類似。它隻是為循環數組提供了一個簡單的途徑。foreach隻適用於數組,如果試圖將其用於其他數據類型的變量或未初始化的變量,則會導致錯誤。VisualBasic.NET中與此等價的循環是ForEach...Next語句。表9顯示了在這兩種語言中循環數組的示例。

表9:Foreach循環

foreach($aas$v){

print"/$Key[$i]$v/n";

$i++;

}

foreachvina

response.writea(v)(v&vbcrlf)

next

數組

PHP中的數組的功能與VisualBasic.NET中的數組的功能截然不同。PHP中的數組實際上是關聯數組,但是可以像索引或關聯數組那樣使用。而VisualBasic.NET中的數組是索引數組。VisualBasic.NET不支持關聯數組(但您可以自己創建它們,請參閱下麵的“集合”)。其他ASP.NET語言支持這些類型的數組,但VisualBasic.NET並不支持,這可能給PHP開發人員提出了一個難題,因為他們並不習慣使用這種更常見的索引數組,並且可能會希望在VisualBasic.NET中創建關聯數組模型。表10顯示了PHP和VisualBasic.NET中的簡單數組示例。

表10:創建數組的示例

NewInteger(2){0,1,2}

與其他變量一樣,VisualBasic.NET數組中的變量也是使用Dim語句聲明的。變量名後麵帶有一對或多對括號,表明它是數組而不是標量(包含單個值的變量)。

創建VisualBasic.NET數組時,還必須將其聲明為保存特定類型的數據。如果指定的類型是Object(作為.NET中所有對象類型的基礎的普通類型),則此數組可以保存任何類型的數據,但是從數組中檢索值時,必須將值轉換為原來的類型。

VisualBasic.NET數組可以是嵌套的數組,也可以是多維數組。VisualBasic.NET中有許多與PHP相對應的用於處理數組的函數,但有一個例外。由於VisualBasic.NET不支持關聯數組,因而不存在用於根據數組的“主鍵”來訪問、索引或執行任何操作的函數。VisualBasic.NET中不存在這樣的“主鍵”。

雖然本文多次提到VisualBasic.NET不支持關聯數組,但是可以創建集合來代替數組。集合與關聯數組有些相似,可以使用集合來解決某些類似的問題。

在某些情況下,將項目存儲在集合中要比存儲在數組中更有效。

如果要處理一組小型的動態項目,則可以使用集合。要創建集合,隻需如下麵的示例代碼所示聲明並實例化一個Collection:

DimmyCollectionAsNewCollection()

然後,您可以使用Add方法向集合中添加成員。在此示例中,我們創建了四個字符串並將它們添加到集合中。您還可以選擇添加一個唯一的String值作為集合成員的主鍵。該值作為Add方法的第二個參數傳遞給集合。

Dimw,x,y,zAsStringw="key1"x="key2"y="key3"z="key4"myCollection.Add(w,"1")myCollection.Add(x,"2")myCollection.Add(y,"3")myCollection.Add(z,"4")

雖然這看起來類似於在PHP中創建關聯數組,但集合是一種截然不同的事物,因為它本身就是一個對象。對於轉到ASP的PHP開發人員,我們建議在嚐試在VisualBasic.NET中創建關聯數組模型之前先了解一下Microsoft的PHPVisualBasic.NET<?php

$value='somethingfrom

somewhere';

setcookie("TestCookie",

$value,time()+3600);/*

expirein1hour*/

?>

andtoretivethesetcookie

<?

echo$_COOKIE["TestCookie"];

?>

Dimvalueasstring="somethingfrom

somewhere"

DimmyCookieAsNewHttpCookie=New

HttpCookie("Somethingfrom

somewhereTestCookie")

DimnowasDateTime=DateTime.Now

myCookie.Value=now.ToString()value

myCookie.Expires=now.AddHour(1)

Response.Cookies.Add(myCookie)

'andtoretrievethesetcookie

Response.Write(Request.Cookies["Whatwe

setTestCookie"}.Value}

設置和檢索Session變量

ASP.NET中的Session變量與PHP中的Session變量非常類似。這兩種環境中的Session變量都為確保Web應用程序訪問中的一致性提供了相應處理和Cookie操作。

最重要的一個差別是,當從ASP.NET的Session對象中檢索值時,該值將作為普通的System.Object類型返回,而這種類型可以保存任何類型的數據。要使用該值,必須先將其重新轉換為原來的基本類型。表12顯示了一些Session變量的使用示例。

表12:Session變量的使用

session_start();

session_register('today');

$today=getdate();

?>

<?=$today?>

Session("Today")=DateTime.Now

DimtodayAsDate

today=CDate(Session("Today"))

Response.Write(today)

Response.write(session("Today"))

ASP.NET還提供了另一種形式的狀態管理,即“應用程序狀態”,它與Session變量類似,但隻是在應用程序的生存期中保持一致。這使您可以存儲各種內容,例如配置信息或數據庫連接字符串。這些內容在應用程序運行期間不會發生變化。

有關此主題的詳細信息,請參閱《.NETFrameworkDevelopmentGuide》中的.NETFrameworkRegularExpressions。

異常處理

ASP.NET框架通過一種人們所熟悉的語言構造Try/Catch提供了結構化的異常處理,從而能夠捕獲代碼中可能出現的異常。PHP沒有提供此功能,但PHP5中將添加它。

下麵的示例說明了如何在VisualBasic.NET中進行異常處理:

Try'此處是可能導致錯誤的代碼CatcheAsExceptionType'用於處理錯誤的代碼'可選:可在此處放置更多Catch塊Finally'始終執行的代碼EndTry

要注意的是,Try塊可以包含一個或多個Catch塊,或包含一個Finally塊,也可以同時包含兩者。也就是說,如果您知道無法更正錯誤,但仍需要清除某些對象而不管是否發生錯誤,則可以使用不包含Catch語句的Try...Finally塊。

查詢數據庫

在PHP中,通常可以通過兩種常見方法訪問數據庫:使用數據庫的特定擴展名或使用獨立於數據庫的PEARDB庫。

在ASP.NET中,可以通過一組稱為ADO.NET的對象來訪問數據庫,這些對象與PEARDB庫的功能基本相同。數據庫查詢實際上是通過一組連接、命令、參數和數據適配器對象完成的。其中的每個對象都有多個版本,具體情況取決於所訪問的數據庫的類型。例如,有一組對象用於具有OLE-DB驅動程序的數據庫(例如MicrosoftAccess),還有一組對象用於具有ODBC驅動程序而沒有OLE-DB驅動程序的數據庫。針對Oracle和MicrosoftSQLServer也有專門的數據提供者,它們已經過優化,可以分別為每種特定的數據庫提供高性能的訪問。某些第三方還提供了其他數據庫支持,例如MySQL。本節中的示例將使用SQLServer對象,因為它是ASP.NET最常用的數據庫。

System.Data、System.Data.SqlClient和System.Data.oledb是用於在ADO.NET中定義數據庫訪問的命名空間。要使頁麵能夠訪問這些類,您需要將System.Data和


圖13顯示了在這兩種語言中執行查詢的示例。在PHP中,我們顯示了一個使用PEAR的連接,PEAR不僅是用於連接DB的最常用方法之一,但還是與ADO.NET最為類似的方法。

表13:執行查詢

//connect

require_once('DB.PHP');

$db=DB::connect

("mysql://mydbvie

w:user@localhost/mydb");

if(DB::iserror($db)){

die($db->getMessage());

$sql="select*frommytable";

$q=$db->query($sql);

if(DB::iserror($q)){

die($q->getMessage());

}

<tr>

<td><?=$row[0]?></td>

<td><?=$row[1]?></td>

<td><?=$row[2]?></td>

</tr>

<scriptrunat="server">

SubPage_Load(SenderAsObject,EAs

EventArgs)

DimmyConnectionAsNew

SqlConnection("server=(local)/NetSDK;

database=mydb;Trusted_Connection

=yes")

DimmyCommandAsNew

SqlDataAdapter("select*from

mytable",myConnection)

DimdsAsNewDataSet()

myCommand.Fill(ds,"myDataset")

myDataGrid.DataSource=myDataset

myDataGrid.DataBind()

EndSub

</script>

<%---輸出結果---%>

<formrunat="server">

<asp:DataGrid

runat="server"/>

</form>

在PHP中,查詢結果存儲在一個稱為resultset(結果集)的變量中,而在ADO.NET中,該變量稱為Dataset對象。結果集是返回數據的隻讀視圖,而.NETDataset實際上是返回數據在內存中的讀寫視圖,這使.NET開發人員能夠輕鬆地處理從數據源返回的數據。

輸出數據時,ASP.NET提供了若幹方法,用於向用戶或客戶端顯示數據。第一種方法與PHP類似,即使用SQLDataReader對象遍曆結果集以寫出我們要通過查詢顯示的數據。更常用的方法是ASP.NET的數據綁定(PHP中沒有與此對應的方法)。通過該方法,開發人員可以構建用戶界麵並顯示可在應用程序中使用和重用的控件,還可以進一步根據數據和邏輯提取顯示內容。數據綁定的語法很靈活,您不僅可以綁定到數據源,還可以綁定到簡單的屬性、集合、表達式,甚至是方法調用返回的結果。

要使用數據綁定,您需要向某個數據識別服務器控件(例如DataGrid)的DataSource屬性指定某個數據源(例如查詢結果)。您還可以選擇為每個列提供一些附加的格式化信息並調用DataBind()方法。服務器控件將負責完成剩餘的工作。

例如,在表13中,我們使用了數據綁定語法輸出查詢結果,如下所示:

<%---在頁麵中加載事件---%>myDataGrid.DataSource=myDatasetmyDataGrid.DataBind()<%---輸出結果---%><asp:DataGridrunat="server"/>

數據識別服務器控件將提供其他功能,例如支持對顯示的數據進行分頁或內聯編輯。有關詳細信息和示例,請參閱DataBindingServerControls。

數據緩存和頁麵緩存

對經常訪問的數據進行緩存可以顯著縮短站點的響應時間,因為不需要等待數據庫查詢便可進行頁麵處理。而緩存由頁麵請求生成的HTML可以進一步縮短響應時間,因為根本就無需處理緩存的頁麵。這兩種環境均支持上述兩種緩存策略,但與PHP相比,ASP.NET提供了更多用於緩存和管理數據的方法,從而使開發人員可以針對自己應用程序的性能需要選擇相應的方法和策略。

頁麵緩存

緩存某個頁麵請求的HTML輸出是減少Web應用程序的負載的一種常用方法。PHP本身不支持頁麵緩存,但是可以通過編程的方式或下載第三方軟件包來執行此操作。通常可以在服務器上通過多種方法執行頁麵緩存,這些方法可用於緩存編譯的代碼,直至將頁麵輸出寫出到一個單獨的文件中(該文件將隨代碼的更新而更新)。

在ASP.NET中,可以通過低級別的OutputCacheAPI或高級別的@OutputCache指令來執行頁麵緩存。啟用輸出緩存後,將在對頁麵進行第一個GET請求時創建輸出緩存條目。後續的GET或HEAD請求將由輸出緩存條目支持,直到緩存的請求過期。

輸出緩存將檢查頁麵的過期策略和驗證策略。如果頁麵位於輸出緩存中並標記了過期策略(指示該頁麵自緩存時開始60分鍾後過期),則60分鍾後,該頁麵將從輸出緩存中刪除。如果在過期後收到另一個請求,將執行頁麵代碼並再次緩存該頁麵。這種過期策略稱為絕對過期,即頁麵在某個時間之前有效。

除了對整個頁麵進行輸出緩存外,ASP.NET還提供了一個簡單方法,使您可以隻緩存頁麵的特定部分。這種方法稱為拆分緩存。您可以使用CachingASP.NETPages。

數據緩存

在PHP中,可以通過多種方法以編程方式將查詢結果緩存到環境中,但PHP本身並未提供這種方法。在PHP中,可以創建數據緩存類或係統。對於少量信息,隻需使用Session變量和/或Cookie;對於大量或複雜的信息,可以創建您自己的數據緩存類。但問題是,當處理包含很多類型的複雜數據時,這種方法的效率會很低且容易出錯,在一定程度上會加大編程的難度。

ASP.NET通過Page.Cache對象提供了一個係統範圍的數據緩存方法,可用於數據集(DataSet)、數組、集合、XML對象等。對於需要更複雜功能的應用程序,ASP.NET緩存還支持三種特定類型的緩存:過期、清理以及文件和關鍵項相關性。

過期類型的緩存使開發人員可以控製緩存項目的過期時間。可以將該時間定義為特定的時間(例如01:00),也可以將其定義為相對於上次使用項目時的時間,例如自上次訪問該項目時開始20分鍾後過期。過期後的項目將從緩存中刪除,以後再試圖檢索該項目時,將返回空值(除非再次將其插入到緩存中)。 清理類型的緩存會在內存不足時嚐試刪除不經常使用或不重要的項目。開發人員可以控製清理的執行方式,並且可以在將項目插入到緩存中時向清理程序提供提示,以指示創建該項目的相對係統開銷以及為使該項目有效而必須對其進行訪問的相對頻率。 文件和關鍵項相關性類型的緩存將基於某個外部文件或另一個緩存項目確定該緩存項目的有效性。如果相關項發生變化,緩存項目將失效並從緩存中刪除。例如,假設您有一個較大的需要定期更新並下載給員工的報告,則可以在應用程序中使用此功能。應用程序處理文件和報告中的數據,然後緩存該數據並插入對該數據的來源文件(從該文件讀取數據)的相關性。當該文件更新時,數據將從緩存中刪除,應用程序可以重新讀取它並重新插入更新的數據副本。

ASP.NET數據緩存為編程人員提供了許多不同的方法來管理應用程序並提高應用程序的響應速度和效率。有關詳細信息,請參閱PHPVisualBasic.NET$to="test@atnoaddress.com";

$from=

"me@nosuchaddress.com";

$subject="hi";

$message="justwantedtosay

hi";

mail($to,$subject,$message,

$from)

DimmyMailAsMailMessage=New

MailMessage()

myMail.From="me@nosuchaddress.com"

myMail.To="test@atnoaddress.com"

myMail.Subect="hi"

myMail.Body="justwantedtosayhi"

SmtpMail.Send(myMail)

XML處理和Web服務

在PHP中,為分析和處理XML所提供的內置支持功能非常薄弱。雖然開發人員可以用它來分析和處理XML,但它不支持DOM分析(該分析盡管比PHP的SAX分析器速度慢,但更容易使用)。PHP也不支持根據DTD或XMLSCHEME對XML文檔進行本地驗證,它也不支持XSL/XSLT以及市場上許多Web應用程序常用的各種其他技術。雖然PHP可以通過很多PHP軟件包完成許多與XML相關的任務,但.NET和ASP.NET為處理XML提供了廣泛的內置支持。XML是.Net平台的核心技術之一。有關Web服務的詳細信息,請參閱


利用.NETFrameworkSDK,您可以使用命令行Web服務描述語言工具(WSDL.exe)生成代理類。要為上述示例創建一個名為HelloWorld.cs的代理類,可以輸入:

WSDLhttps://someDomain.com/someFolder/HelloWorld.asmx?WSDL

此類與前麵創建的類非常相似。它包含一個名為SayHelloWorld的方法,用於返回字符串。將此代理類編譯到應用程序中,然後調用此代理類的方法,使該代理類通過HTTP將SOAP請求打包並接收SOAP編碼的響應,該響應隨後被封裝為字符串。

對於客戶端,該代碼是非常簡單的,如以下示例所示:

DimmyHelloWorldAsNewHelloWorld()DimsReturnAsString=myHelloWorld.SayHelloWorld()

這就是創建一個簡單Web服務的全過程。有關XML的一般信息以及Web服務的特定信息,請參閱

最後更新:2017-04-02 00:06:33

  上一篇:go 使用函數傳遞參數來執行數據庫操作
  下一篇:go ASP.NET中利用cookies保持客戶端信息