.net framework所提供的資料庫存取物件稱為ado+(active data object+),雖然有不少觀念與ado相類似,但卻是全新的物件,為什麼已經有ado了,還要再提供ado+呢?筆者覺得原因可能有幾:
- 採用xml做為資料交換格式:由於xml已經成為網際網路交換資料的標準,這是個不得不的舉動。
- 延伸資料的範圍:在ado底下,任何資料都必須透過old db或odbc來存取,ado+ 並無此一限制,任何程式都可以藉助ado+ 所提供的物件讓自己成為新資料格式的提供者,這因此延伸了可存取之資料的範圍。
- 與資料控制元件的整合:以往我們撰寫asp網頁時,最不方便的地方是資料庫內容的顯示,為了顯示資料庫的內容,大概必須藉助ado的recordset物件逐筆讀取資料錄,然後再逐筆將其顯示出來,程式較冗長,在asp.net網頁中,我們只要佈置好datagrid、datalist或repeater這一類資料控制元件,然後與ado+ 進行繫結,datagrid等控制元件就會自動顯示資料庫的內容。參閱圖-5及圖-6就是分別使用datagrid及datalist控制元件顯示資料庫內容的網頁。
為了提升執行效能,asp.net網頁會先被編譯成msil儲存在硬碟中,而下次當該網頁再度被瀏覽時,就可以直接執行被儲存下來的msil(細節請參閱「執行效能的質疑」段落的說明),除了此一強化執行效能的動作之外,asp.net所提供的cache(快取記憶體)功能亦可提升執行效能。asp.net提供的cache功能分成output cache及data cache兩種。
參閱圖-7,所謂output cache,是在執行msil之後,先將結果寫入output cache,然後再將output cache下傳到瀏覽器,而將來如果瀏覽同一網頁,asp.net會先判斷該網頁是否有output cache存在,如果有,則直接將output cache下傳到瀏覽器,不會經過編譯 .aspx及執行msil的過程,故能提升執行效能。
要啟用output cache的方法十分簡單,只要在 .aspx網頁的最前面加上以下標示即可:
<%@ outputcache duration="秒數" %>
其中duration表示output cache保留在系統中的秒數,例如:
<%@ outputcache duration="10" %>
結果網頁的output cache將會保留在系統中10秒鐘,而凡是在這10秒內瀏覽此一網頁,asp.net就會直接將output cache下傳給瀏覽器,省略了編譯的動作。
除了將整個網頁儲存於output cache之外,我們也可以將局部資料儲存於data cache(以下簡稱cache)。cache的用法與application物件很類似,例如:
' 將資料或物件存放在application物件中
application("key1") = "這是字串"
application("key2") = obj
' 將資料或物件存放在data cache中
cache("key1") = "這是字串"
cache("key2") = obj
不過筆者必須說明的是data cache所佔用的記憶體隨時可能會被釋放(視系統記憶體當時使用的情況),所以每當我們要讀取data cache時,要先判斷cache("key") 是否等於nothing,若不等於nothing,表示cache("key") 還存在於系統中,方可讀取。
在撰寫程式的過程中,難免會有錯誤產生,如何除錯對任何一個程式設計師來說,都是很重要而且是無可避免的工作。asp的偵錯工具十分欠缺,為了改善此一缺失,asp.net提供以下幾種偵錯方法:
- 設定config.web的customerrors節區
- 使用追蹤(trace)功能
- 偵錯工具程式(debugger)
當網頁產生錯誤而無法進一步編譯或執行時,asp.net會顯示如圖-8之畫面,此一畫面只告訴我們程式有錯,至於哪一行程式錯誤,則未顯示。為了讓asp.net顯示進一步的錯誤訊息,可在config.web檔案中增加customerrors節區的設定,如下:
<configuration>
<customerrors mode="off"/>
</configuration>
結果瀏覽之後可看到更詳細的錯誤指示畫面(如圖-9)
圖-8 asp.net網頁編譯或執行錯誤的畫面 (圖略)
圖-9 asp.net網頁編譯或執行錯誤的畫面(錯誤訊息較詳細)(圖略)
所謂trace功能是在網頁的最前面加上以下標示:
<%@ page trace="true" %>
結果網頁被瀏覽之後,將會額外顯示一些資訊,如圖-10,而這些資訊有助於我們研判程式的狀況,做為偵錯時的參考。
圖-10 trace功能啟用之後的網頁(圖略)
在圖-10畫面中,除了網頁正常顯示的內容之外,額外顯示的資訊可分成以下區段:
- request details:透過request方式向瀏覽器所讀取之資料。
- trace information:事件發生或程式執行的過程。
- control tree:網頁所使用之控制元件及控制元件之間的階層關係。
- cookies collection:網頁所使用的cookie。
- headers collection:瀏覽器的表頭資訊。
- server variables:server變數,也就是我們可以透過request. servervariables() 所讀取的資訊。
除了讓asp.net自動顯示以上訊息之外,我們也可以將程式執行過程中的資料顯示在trace information區段中,方法是呼叫trace.write或trace.warn,例如:
trace.write("uploadfile()", "進入uploadfile事件程序")
trace.warn ("uploadfile()", "進入for迴圈")
結果可將訊息輸出到trace information區段,供我們做為偵測程式的參考。
asp.net提供的debugger程式很像vb的操作介面,可以讓我們設定中斷點、逐步執行程式、觀察變數及堆疊的情況…等,是偵錯的利器。使用debugger之前,須在config.web檔案中增加以下的設定:
<compilation debugmode="true"/>
接下來啟動c:/program files/microsoft.net/frameworksdk/guidebug目錄的dbgurt.exe,然後利用以下步驟即可偵測 .aspx網頁:
1. 選取dbgurt.exe功能表的「debug -> processes」,待出現「processes」交談窗時,核取「show system processes」及「show processes in all sessions」,然後在「available processes」欄位的最下面找到xspwp.exe(註:如果沒有看到xspwp.exe,請先啟動瀏覽器瀏覽任意 .aspx網頁,然後再按下「refresh」鈕),選取之後,再按下「attach」鈕,過程如圖-11。
圖-11 dbgurt.exe的「process」交談窗(圖略)
2. 接下來會出現「attach to process」交談窗(如圖-12),請按下「ok」鈕。
圖-12 attach to process 交談窗(圖略)
3. 接下來回到步驟1的「processes」交談窗,請按下「close」鈕。
4. 選取dbgurt.exe功能表的「file -> open -> file」選取您想偵測的 .aspx檔案,在此您可以選取多個想要偵測的檔案。
由於asp.net以vb7為程式語言,所以vb7所有物件導向的功能也都能夠發揮在asp.net網頁製作中,而除了程式語言所提供物件導向功能之外,asp.net可以開發一種網頁專用的物件 -- pagelet(網頁小配件)。
何謂pagelet(網頁配件)?以生活中的實例來看,當我們裝飾耶誕樹時,往往會買些小配件,然後將它們佈置在喜歡的位置,pagelet的觀念也是相類似的,某些常用的配件,我們可以將它們設計pagelet,讓其他網頁來使用,舉個更實際的例子,例如我們網頁中佈置一個label控制元件及一個textbox控制元件,其作用就是在網頁中插入了一個label類型的pagelet及一個textbox類型的pagelet。
本文讓筆者先展示一個簡單的pagelet,此一pagelet命名為footer.ascx,如下:(註:pagelet須以 .ascx 為副檔名)
<div align="right">
<hr>
<a href="http://www.kj.com.tw" target="_top">
學 visual basic 找王國榮</a>
</div>
檢視footer.ascx的內容,您會發現其中只有html標示,完全沒有asp.net的程式,這樣的 .ascx檔案也能構成pagelet嗎?答案是肯定的,最簡單的pagelet就是只含有html標示的 .ascx檔案,接著讓我們來看看使用這個這個pagelet的網頁usefoot.aspx:
<%@ register tagprefix="kj" tagname="footer" src="footer.ascx" %>
<html>
<body bgcolor="white">
<h3>使用最簡單的 pagelet -- usefoot.aspx<hr></h3>
<blockquote>
檢視 footer.ascx 的內容,您會發現其中只有 html 標示,完全沒有
asp+ 的程式,這樣的 .ascx 檔案也能構成 pagelet 嗎?答案是肯定
的,最簡單的 pagelet 就是只含有 html 標示的 .ascx 檔案。
</blockquote>
<kj:footer id="footer1" runat="server"/>
</body>
</html>
網頁瀏覽的結果如圖-13。
圖-13 usefoot.aspx瀏覽的結果
除了只含有html標示最簡單的pagelet之外,pagelet也可以含有屬性及方法,對於含有屬性及方法的pagelet來說,其用法與server控制元件完全相同。當我們覺得 .net framework 所提供的server控制元件不夠用時,可以利用製作pagelet的功能來建立我們自己的server控制元件。
不像asp網頁只能存取本機資料庫,asp.net則提供了web services功能讓我們跨越網際網路存取遠端的資源。在vb6時代,微軟發表了rds(remote data service),也可以讓我們存取網際網路上另一部server的資料庫,但它仍有兩大缺點:(1) 一般使用者上手不易 (2) 無法跨越平台:使用rds跨越網際網路存取資料庫,不管server端或client端,都必須使用windows作業系統。
web services(web服務)改良了rds的缺點,除了變得比較容易上手之外,web services採用xml為資料傳輸的格式,使得資料得以跨越平台,而更重要的是,asp.net網頁也可以享用這種服務,也可以提供這種服務。
在作業模式上,讓筆者舉個實例來說明,請參閱圖-14,假設瀏覽器會存取server a的網頁,但server a的資料庫來自serverx,那麼server x要提供一存取資料庫之web service,另一方面server a則要建立web資料庫代理程式,然後透過web資料庫代理程式與web service的資料交換(採用xml格式),進而達到存取server x資料庫的目的。
圖-14 存取web資料庫(跨越網際網路的資料庫)
也許過去兩三年電子商務真的被高估了,但網頁製作技術卻已成為資訊人必備的知識。雖然自從微軟發表iis以來,asp一直被低估了,所以只是iis的附屬品,現在很高興asp.net終於從iis之中獨立出來,而且功能與vb、c#…等程式語言看齊,相信未來的asp網頁製作將進入另一個嶄新的世紀。
新闻热点
疑难解答
图片精选