<form id="hz9zz"></form>
  • <form id="hz9zz"></form>

      <nobr id="hz9zz"></nobr>

      <form id="hz9zz"></form>

    1. 明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

      ASP 3.0高級編程(108)

      [摘要]5.2.5 引用對象類型庫 在早先的ASP版本中,在腳本中使用對象或組件時,組件內定義的公共常數(如果有的話)在ASP里將不再有效。這意味著我們需要自己聲明它們(或等價物)并指定相應的值。 ...
      5.2.5 引用對象類型庫
          在早先的ASP版本中,在腳本中使用對象或組件時,組件內定義的公共常數(如果有的話)在ASP里將不再有效。這意味著我們需要自己聲明它們(或等價物)并指定相應的值。
          例如,當在早期版本的ASP中使用ActiveX數據庫對象(ADO)組件時(將在第8章進行詳細的研究),不得不用記錄集的Open方法加入預定義常數聲明。例如:
          Const adOpenKeyset = &H0001
          Const adLockPessimistic = &H0003
          Const adCmdTable = &H0002
          …
          rs.Open “Contact”,”DSN=GlobalExampleData;UID=examples;Password=;”, _
                  adOpenKeyset, adLockPessimistic, adCmdTable
          …
          另一種方法是使用#include指令在頁面插入一個名為adovbs.inc的文件。該文件由IIS/ASP提供,包含ADO所需的所有預定義常數。更新代碼時,必須確認使用的是最新版本,并檢查它對于所有的頁面請求都可用。
          對于IIS 5.0,有一個更好的方法,通過在HTML注釋元素內使用METADATA指令,可以給組件或對象的類型庫增加引用(IIS 4.0不支持這一功能)。
          <!-- METADATA TYPE=”TypeLib”
                         FILE=”path_and_name_of_file”
                         UUID=”type_library_uuid”
                         VERSSION=”major_version_number.minor_version_number”
                         LCID=”locale_id”
          -->
          其中:
          · path_and_name_of_file是某一類型庫文件(.tlb)或ActiveX DLL的絕對物理路徑,必須提供這一參數或者是type_library_uuid參數。
      · type_library_uuid是該類型庫的唯唯一標識符,必須提供這一參數或者是path_and_name_of_file參數。
          · major_version_number.minor_version_number(可選)定義了所需組件的版本。如果沒有該版本則使用最近的版本。
          · locale_id(可選)是區域標志符。如果在該區域沒有發現類型庫,計算機將使用缺省的(安裝時定義的)區域。
          因此,使用這一技術,通過使用下面的代碼,能使內置的ADO預定義常數在ASP頁面可用:
          <!-- METADATA TYPE=”TypeLib”
                      FILE=”C:\Program Files\Common Files\System\ado\msado15.dll”
          -->
          文件名msado15.dll還可用于更高版本(2.50以后)的ADO組件。
          如果ASP不能裝載類型庫,就返回一個錯誤并停止該頁的執行?赡艿腻e誤提示如表5-1所示:
      表5-1  錯誤提示代碼及說明
      錯 誤    說 明
      ASP 0222    無效的類型庫說明
      ASP 0223    未找到類型庫
      ASP 0224    類型庫不能加載
      ASP 0225    類型庫不能打包(即ASP不能從指定的類型庫中創建類型庫包裝對象)

      5.2.6 在客戶端上創建對象實例
          在ASP中討論在服務器上實例化對象和組件的技術時,值得強調的是在瀏覽器中運行客戶端頁面而完成同樣工作的方式。如果你使用ASP創建包含客戶端腳本程序的頁面,或者使用<OBJECT>元素創建客戶端組件實例,將會發現這是非常有用的。在大多數情況下,腳本運行期對象可在客戶端上實例化和使用,效果與服務器上的ASP相同。
      1.    VBScript CreateObject方法
      在客戶端使用CreateObject時,在瀏覽器的環境內創建組件或對象實例,它們與瀏覽器運行在相同的內存空間里(即進程內),除非實現的對象是帶有.exe擴展文件名的可執行文件。
      通常指定對象的ClassID,而不是使用ProgID字符串,這樣就不可能與其他安裝在客戶端的對象發生沖突。
      <SCRIPT LANGUAGE=”VBScript”>
      Dim objThis
      Set objThis = CreateObject(“clsid:892D6DA7-E0F9-00105A42AF30”)

      </SCRIPT>
      當然也可以使用ProgID,并且使用通用的對象或組件(特別是標準安裝提供的對象或組件),那么得到錯誤的組件的風險是很小的:
      <SCRIPT LANGUAGE=”VBScript”>
      Dim objThis
      Set objThis = CreateObject(“Scripting.Dictionary”)

      </SCRIPT>
      2.    Jscript ActiveXObject方法
      為了在客戶端上實例化Jscript的對象和組件,必須使用ActiveXObject方法和new操作符:
      <SCRIPT LANGUAGE=”JScript”>
          var objMyData = new ActiveXObject(‘clsid: 892D6DA7-E0F9-00105A42AF30’);
      </SCRIPT>
      或:
      <SCRIPT LANGUAGE=”JScript”>
          var objMyData = new ActiveXObject(‘this.object’);
      </SCRIPT>
      3.    <OBJECT>元素技術
      也可使用<OBJECT>元素創建客戶端對象或組件的實例。應省略RUNAT屬性或者將其設定為“CLIENT”。然而,這個屬性在客戶端上是被忽略的,因此設置這個屬性的唯一目的就是,在ASP頁面使用<OBJECT>元素實例化服務器端的組件實例時防止混淆。
      <OBJECT ID=”objThis” RUNAT=”CLIENT”
              CLASSID=”clsid: 892D6DA7-E0F9-00105A42AF30”
              CODEBASE=”http://yourserver.com/components/mycomponent.cab”>
          <PARAM NAME=”param1” VALUE=”value1”>
          <PARAM NAME=”param2” VALUE=”value2”>
      </OBJECT>
      注意,這里出現的CODEBASE屬性,表示允許下載并安裝來自URL的組件(如果該組件沒有安裝)。IE 3.0以上的版本有此功能。
      對于使用<OBJECT>元素的方法、可使用的屬性、在客戶端使用的值,可查看網站http://msdn.Microsoft.com/workshop/author/dhtml/reference/objects/OBJECT.asp,或者Windows 2000 Platform SDK文檔中的<OBJECT> tags,或者看看《IE5 Dynamic HTML Programmer’ Reference》一書,ISBN 1-861001-74-6,Wrox出版社。

      5.3 Scripting.Dictionary對象
          許多Microsoft的編程語言,如Visual Basic、VBScript和Jscript,都提供集合(collection)?梢园鸭舷胂鬄閿到M,可以使用其中內建的函數完成存儲和操縱數據等基本任務。無須擔心數據是在哪些行列,而是使用唯一的鍵進行訪問。
          VBScript和Jscript都提供類似的對象,通稱Scripting.Dictionary對象或Dictionary對象。它類似于二維數組,把鍵和相關條目的數據存放在一起。然而真正的面向對象的方法,不應直接訪問數據條目,必須使用Dictionary對象支持的方法和屬性來實現。
          本章提供了一些示例頁面,允許試驗腳本運行期對象的方法和屬性。這些實例在下載的文件的文件的Chaper05子目錄里。

      5.3.1 創建和使用Dictionary對象
          創建一個Dictionary對象的示例如下:
          ‘In VBScript:
          Dim objMyData
          Set objMyData = Server.CreateObject(“Scripting.Dictionary”)

          //In Jscript:
          var objMyData = Server.CreateObject(‘Scripting.Dictionary’);

          <!-- Server-Side with an OBJECT element -->
          <OBJECT RUNAT=”SERVER” SCOPE=”PAGE” ID=”objMyData”
                  PROGID=”Scripting.Dictionary”>
          </OBJECT>
          Dictionary對象還可用于客戶端的IE中。
      1.    Dictionary對象的成員概要
      表5-2和表5-3列出了Dictionary對象的屬性和方法及相應的說明。
      當增加一個鍵/條目對時,如果該鍵已存在;或者刪除一個鍵/條目對時,該關鍵字/條目對不存在,或改變已包含數據的Dictionary對象的CompareMode,都將產生錯誤。
      表5-2  Dictionary對象的屬性和說明
      屬 性    說 明
      CompareMode    (僅用于VBScript)設定或返回鍵的字符串比較模式
      Count    只讀。返回Dictionary里的鍵/條目對的數量
      Item(key)    設定或返回指定的鍵的條目值
      Key(key)    設定鍵值
      表5-3  Dictionary對象的方法和說明
      方 法    說 明
      Add(key,item)    增加鍵/條目對到Dictionary
      Exists(key)    如果指定的鍵存在,返回True,否則返回False
      Items()    返回一個包含Dictionary對象中所有條目的數組
      Keys()    返回一個包含Dictionary對象中所有鍵的數組
      Remove(key)    刪除一個指定的鍵/條目對
      RemoveAll()    刪除全部鍵/條目對
      2.    對Dictionary中增加和刪除條目
      一旦得到一個新的(空的)Dictionary,可以對其添加條目,從中獲取條目以及刪除條目:
      ‘ In VBScript:
      objMyData.Add “MyKey”, “MyItem”            ‘Add Value MyItem with key MyKey
      objMyData.Add “YourKey”, ”YourItem”        ‘Add value YourItem with key YourKey
      blnIsThere = objMyData.Exists(“MyKey”)        ‘Returns True because the item exists
      strItem = objMyData.Item(“YourKey”)            ‘Retrieve value of YourKey
      strItem = objMyData.Remove(“MyKey”)        ‘Retrieve and remove YourKey
      objMyData.RemoveAll                        ‘Remove all the items
      在JScript中,等價的代碼為:
      // In JScript;
      objMyData.Add (‘MyKey’, ‘MyItem’);            //Add Value MyItem with key MyKey
      objMyData.Add (‘YourKey’, ‘YourItem’);        //Add value YourItem with key YourKey
      var blnIsThere = objMyData.Exists(‘MyKey’);    //Returns True because the item exists
      var strItem = objMyData.Item(‘YourKey’);        //Retrieve value of YourKey
      var strItem = objMyData.Remove(‘MyKey’);    //Retrieve and remove YourKey
      objMyData.RemoveAll();                    //Remove all the items
      3.    修改鍵或條目的值
      可以通過修改鍵的值,或通過修改與特定的鍵關聯的條目的數據,來改變存儲在Dictionary內的數據。下面的代碼改變鍵為MyKey的條目中的數據。
      ObjMyData.Item(“MyKey”) = “NewValue”        ‘ In VBScript
      ObjMyData.Item(‘MyKey’) = ‘NewValue’;        // In JScript
      如果指定的鍵在Dictionary未找到,將在Dictionary中創建一個以MyKey為鍵,以New Value為其條目值的新的鍵/條目對。有意思的是,如果使用一個不存在的鍵來檢索條目,不僅得到一個空的字符串(這是可以想到的),而且還在Dictionary里添加一個新的鍵/條目對,鍵即是指定的鍵,但條目的數據為空。
      可以使用Key屬性僅改變鍵的值而不改變與之對應的條目的數據。將一個已存在的鍵MyKey改變為MyNewKey,可以用:
      objMyData.Key(“MyKey”) = “MyNewValue”        ‘ In VBScript
      objMyData.Item(‘MyKey’) = ‘MyNewValue’;        // In JScript
      如果指定的鍵未找到,則產生運行期錯誤。
      4.    設置比較模式
      Dictionary的CompareMode屬性僅適用于VBScript,不能在JScript中使用。當比較字符串鍵時,允許指定比較的方式。兩個允許的值為BinaryCompare(0)和TextCompare(1)。BinaryCompare(0)為二進制數對照(即區分大小寫);TextCompare(1)為文本對照(即不區分大小寫)。
      5.    遍歷Dictionary
      研究Dictionary時,有兩個方法和一個屬性需要特別注意,它們允許我們遍歷存儲在Dictionary里的所有鍵/條目對。Items方法用一個一維數組的形式返回Dictionary里所有的條目數據,而keys方法用一個一維數組返回所有已存在的鍵值?梢允褂肅ount屬性得到鍵或條目的數量。
      例如,可以使用下列代碼得到名稱為objMyData的Dictionary中所有的鍵和條目值。注意,雖然Count屬性保存了在Dictionary里的鍵/條目數量,但VBScript和JScript的數組總是從下標0開始的。因此,數組下標應從0到Count-1。
      ‘In VBScript:
      arrKeys = objMyData.Keys                    ‘Get all the keys into an array
      arrItems = objMyData.Items                    ‘Get all the items into an array

      For intLoop = 0 To objMyData.Count –1        ‘Iterate through the array
          StrThisKey = arrKeys(intLoop)            ‘This is the key value
          StrThisItem = arrItems(intLoop)            ‘This is the item (data) value
      Next

      // In JScript
      // Get VB-style arrays using the Keys() and Items() methods
      var arrKeys = new VBArray(objMyData.Keys()).toArray();
      var arrItems = new VBArray(objMyData.Items()).toArray();

      for (intLoop = 0; intLoop < objMyData.Count; intLoop++) {
          // Iterate through the arrays
          strThisKey = arrKeys[intLoop];            // This is the key value
          strThisItem = arrItems[intLoop];            // This is the item (data) value
      }
      在VBScript里也可以使用For Each … Next語句完成同樣的功能:
      ‘ Iterate the dictionary as a collection in VBScript
      For Each objItem in arrItems
          Response.Write objItem & “ = “ & arrItems(objItem) & “<BR>”
      Next




      日韩精品一区二区三区高清