WebClass實現動態WEB編程之理論篇

WebClass實現動態WEB編程之理論篇
(作者:蘇紅超 2001年01月10日 15:50)

在前一段時間,我曾經在“用VB ActiveX DLL實現ASP編程”一文中詳細探討過如何使用ActiveX DLL技術替代簡單的純ASP來實現核心代碼和商業邏輯的封裝。適當的利用ActiveX DLL技術在構建動態WEB站點的時候的確能夠帶來很多的好處,這是顯而易見的,但是仍然需要一個單獨的ASP文件來創建和銷燬我們所編寫的ActiveX DLL組件,在ASP中大量使用ActiveX DLL是不現實的,並且我們的ASP編程仍然不可以像往常的應用程序那樣進行編寫,因爲凌亂的ASP代碼和HTML代碼交織在一起,並且,無論是單純的ASP程序還是封裝了ActiveX DLL的ASP程序,一個最大的弊端就是在項目開發過程中的調試困難,比如很難設置斷點並隨時暫停程序來察看某些變量的值。那有沒有兩全其美的方法呢,既保證開發WEB程序的高效率,又可以向平常的應用程序那樣可以方便的調試和編寫呢?答案當然是肯定的,微軟公司在VB6版本之後就引入了“WebClass”的概念,並且在新建項目中增添了名叫“IIS應用程序”的項目類型。WebClass正是微軟公司提出的用來使得程序員可以像開發普通應用程序那樣來開發WEB程序的解決方案!
  說起“IIS應用程序”,大家會認爲這和ASP程序有何區別呢?ASP不就是運行在IIS上面的WEB應用程序嗎?其實這是微軟命名上面的一點小錯誤,使得大家在名稱上面比較容易混淆。我們現在應該清楚,“IIS應用程序”就是採用WebClass技術用來實現和ASP同樣功能的應用程序,它避免了ASP的種種缺點,比如源代碼是透明的、解釋執行帶來的速度慢。其實WebClass應用程序也是一種VB組件,使用他完成的WEB應用程序將會是編譯之後的,其運行速度有很大提高,同時也避免了源代碼和核心技術及商業機密被泄漏。

  WebClass 在實質上是一個VB組件,確切一點說來講WebClass是一個ActiveX DLL。他使得你可以編寫服務器端代碼以響應來自用戶的瀏覽器請求。對用戶來說,一個 IIS 應用程序好象是由一系列的HTML頁面組成;對開發者來說,一個 IIS 應用程序是由一些被稱爲 webclass 的特殊類型對象組成。WebClass可以直接訪問所有的ASP內置對象(request、response、application、session、server)。任何使用ASP開發的WEB項目都可以在WebClass中實現。由於在WebClass中引入了HTML模版的概念,從而有效的避免了ASP中的程序代碼和HTML代碼相互交織帶來的缺陷,很好的實現了商業邏輯層和最終表現層的分離(有些類似當前XML和XSL的形式),極大的提高了WEB項目的開發效率。

  IIS 應用程序在表面上和 Active Server Pages 應用程序相似。這兩種應用程序都顯示動態的 Web 站點,並且都是在服務器上而不是在客戶端上執行它們的處理。但是,每一種都有自己獨特的優點:

  (1)Active Server Pages 適合於對製作 Web 頁面感興趣的腳本開發者,它提供了將腳本和 HTML 混合起來的獨特能力。

  (2)IIS 應用程序適合於構造基於 Web 應用程序而不是 Web 頁面的 Visual Basic 開發者。IIS 應用程序允許複雜的事務處理,並且幾乎任何的瀏覽器或平臺都可以很容易地訪問它。

  使用IIS應用程序來開發WEB項目可以有如下優點:

  (1)熟悉的開發環境和模型。可以利用 Visual Basic向工程添加類(Class)、模塊(Model)或任何 Visual Basic ActiveX 部件,因而易於調試和編寫。

  (2)使用的廣泛性。可以被大多數的瀏覽器支持。

  (3)可重複使用的部件。類似於面向對象編程;各個對象之間可互相訪問。

  (4)代碼和 HTML 相分離:和編寫ASP 應用程序不同,Server 端處理程序和Client端程序分離,便於維護和修改。

  (5)可自定義處理事件,因而編寫方法靈活

  接下來我們來看看WebClass的具體組成部分是什麼:

  Webclass 由html模板和自定義 Webitem 組成。( html模板和自定義 Webitem統稱Webitem)當然不是必須包含模板和自定義的Webitem。

  (1)一個 HTML 模板文件是與 webclass 相關聯的HTML頁面。當 webclass 收到一個請求時,它可以向瀏覽器發送用於顯示的HTML頁面。模板和常規HTML頁面的不同僅在於向瀏覽器發送頁面之前,它常常包含 webclass 可以處理的替換區域(通常是用"WC@"標籤定義的範圍)。這樣就允許自定義自己的響應。

  (2)一個自定義的 webitem 是由一個或多個事件處理程序組成的程序資源。在頁面加載或用戶選擇一個 HTML 元素時,這些事件處理程序被瀏覽器調用。這些事件處理程序可以對瀏覽器產生一個響應或將處理傳遞到另一個 webclass 的 webitem。

  一個完整的WebClass應用程序的大致流向如下所示:

  A.指定某一個WebClass(比如Test1)作爲首先啓動的項目

  B.激活這個WebClass(Test1)的WebClass_Start事件

  C.在Test1的WebClass_Start事件中調用某一個HTML模板的WriteTemplate方法,比如Check. WriteTemplate這裏的Check就是一個屬於Test1這個WebClass的一個HTML模板

  D.在你的這個Check模板中如果有<FORM>存在,那就會觸發這個<FORM>的ACTION屬性,比如<form action=xxx.asp?WCI=ddd>,那麼就會調用屬於名爲'xxx'的這個WebClass的'ddd'項目(Item);當然這個'xxx'可以是你剛纔操作的WebClass本身,即"Test1",同樣,這個"ddd"可以是一個HTML模板或者一個WebItem。

  E.觸發屬於"xxx"這個WebClass的項目"ddd"將會激活"ddd"本身的ddd_Respond()事件,你就可以在這裏進行一些處理了,比如檢索數據庫資料;然後可以再調用其它HTML模板的WriteTemplate方法,比如就調用本身的ddd.WriteTemplate方法

  F.然後將會調用ddd的ProcessTag事件,進行卷標的處理過程,當然你的這個叫ddd的HTML模板中就要有相應的WC@卷標了。

  我們再來看看Webclass中的事件響應。

  1. .Webclass中預定義的事件有3個 : response , processtag , userevent

  .response 事件響應用戶端請求。

  .processtag 事件是作爲 WriteTemplate 方法處理的一部分自動發生的。不能單獨被觸發或用來處理響應。

  .userevent 事件: 一個 UserEvent 過程處理 webitem 的所有用戶事件。UserEvent 事件是由URLFor 方法在運行時產生的。所以只有使用了URLFor 方法動態產生的超鏈接纔會觸發UserEvent 事件。

  2. Webclass_start() 事件類似於VB中的Sub Main()。

  所以可以指定一個project 開始的webclass。也可在model 模塊中用Sub Main() 來啓動。

  3. 發送html 到瀏覽器: 將頁面反饋回瀏覽器有兩種方法。

  A.對html模板使用 "writetemplate" 方法。此方法激活"ProcessTag"事件,從而對模板中相應的內容(用WC@符號標記的部分) 進行替換。

  B.在Customwebitem 事件中動態生成反饋頁面。

如:   with response

.write "<html">

.write"<head>"

.write"</head>"

.write"<body>"

.write"<p>Hello! Universe!</p>"

.write"</body></html>"

end with

  4. 從HTML 的<form>中獲取信息:

  使用Request 對象在一個 HTML <form>中獲取用戶輸入的信息。但必須將 <form action...> 標記屬性和webclass中的一個事件連接,提交一個form 就可以激發 webclass 中的這個事件。因此,就可以使用這個事件蒐集和操作信息。

  5. 動態替換html 模板文件中的內容:使用3中的writetemplate 方法。

  6. 自定義webitem 事件。

  兩種方法和自定義webitem 事件關聯起來:

  A.用action=webclass.asp?wci=webitem&wce='自定義事件'的方法。

  B.用URLFor (Webitem,自定義事件)方法。

  7. 其他使用方法(如: Cookie,Session對象等) 和 ASP 應用程序中相同。

  WebClass中在傳回給用戶的HTML中可以使用兩種方法建立超級鏈接,很容易造成混淆,這裏我就詳細講解一下這兩種方法:

  方法一.

  一種是直接使用類似於這樣的格式<A Href="xxx.asp?WCI=sss&WCE=ddd">,這樣當用戶點擊這個超級連接的時候,就會傳跳到xxx這個WebClass的sss項目的sss_UserEvent事件當中來,你就可以在這個事件中進行一些處理,而且這種生成超級連接的方法可以在自己的後面帶許多的自定義的參數,比如<A href="xxx.asp?WCI=sss&WCE=ddd&Test=www&Me=rrr...">其中的Test,Me都是我們自定義的參數,可以在轉跳之後頁面中使用Request("Test")方法取出其中的值,這樣就提供了一種在頁面之間傳遞值的解決方法;

  如果你沒有指定WCE參數,比如<A href="xxx.asp?WCI=sss">那麼將會轉跳到xxx這個WebClass的sss項目(Item)的sss_Respond事件,而不是他的sss_UserEvent事件中!

  方法二.

  第二種方法是使用URLFor方法,URLFor(WebItem_Name,UserEvent_Value)。比如,<a href=""" & URLFor(Check, CStr(recCheck("QTFTBN"))) & """>" 注意,在這裏要使用兩個雙引號代替一個雙引號。

這樣,就會轉跳到本頁(就是本身的WebClass)中的Check項目(Item)中的Check_UserEvent事件中去。URLFor方法只會觸發UserEvent事件,而不會觸發Respond事件!在Check_UserEvent事件中你可以使用這個事件的EventName參數獲取上面傳來的' CStr(recCheck("QTFTBN"))'這個值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章