asp具備管理不同語言指令碼程式的能力,能夠自動呼叫合適的指令碼引擎以解釋指令碼**和執行內建函式。
asp開發環境提供了兩種指令碼引擎,即vbscript(預設)和jscript。不過,開發者並沒有被限制於只能使用這兩種語言,只要能夠提供合適的activex指令碼引擎就能使用任何指令碼語言。
指令碼語言的選擇往往基於許多不同原因:它可能是開發者最為熟悉的語言,可能是對給定工程來說能夠提供最多特色支援的,也有可能是最具效率的。不同的環境和要求使得我們在選擇指令碼語言時注重不同的因素,同時也使得我們在某些時候面臨選定的指令碼語言不能直接提供其它語言固有的函式這一問題,或某個指令碼已經寫成但用的卻是另外一種指令碼語言。
此時應該怎麼辦?是否需要用當前所用的指令碼語言重寫這些指令碼?或者說,是否有可能在一種指令碼語言中呼叫其它指令碼語言的內建函式?本文要說明的就是在
asp應用中如何讓vbscript指令碼和jscript指令碼
互動以最大限度地獲得兩種指令碼語言的特色支援。
一、vbscript和jscript的內建函式
在vbscript和jscript中,有大量的內建函式功能是相同或類似的。然而,在一種指令碼語言中內建的函式並非總是在另外一種指令碼語言中也有對應的函式。例如,vbscript提供了許多用於操作字串和格式化資料的函式,這些函式在jscript中並不存在。這些函式包括strreverse()、filter()以及formatcurrency()等。在另一方面,jscript所提供的用於管理陣列、字串編碼等的函式在vbscript中也沒有定義,如join()、reverse()、pow()、位操作、escape()和unescape()等。
那麼,如果在jscript程式中需要乙個vbscript函式該怎麼辦呢?
二、異種指令碼的互相呼叫
如果需要在jscript指令碼中呼叫乙個vbscript中內建的函式,則應該寫乙個vbscript使用者定義函式(在這裡呼叫vbscript內建函式),然後在jscript指令碼中象呼叫公用jscript函式一樣呼叫這個使用者定義函式。
例如,如果要呼叫的vbscript內建函式是formatcurrency(),則可以宣告如下自定義函式:
< script language="vbscript" runat="server">
function formatvalue(value)
formatvalue = formatcurrency(value)
end function
< /script>
接下來在jscript**中就可以象普通jscript函式一樣呼叫formatvalue()了。用類似的方法也可以實現vbscript**呼叫jscript函式。
應用同樣的規則,我們可以在任何指令碼內呼叫任何使用者定義函式。不過,從jscript指令碼內呼叫乙個不帶引數的vbscript過程(sub)時應略加注意,此時在jscript中應該象呼叫乙個不帶引數的jscript函式一樣呼叫它,如用foo()呼叫vbscript sub foo過程。
三、資料共享
在某些情形下混合運用vbscript和jscript函式是非常有用的,但在不同語言指令碼之間共享資料也可能很有用。實現這種共享的方法很簡單:不管使用的是什麼語言,只要是在頁面級宣告的變數就可以任意引用。
物件的使用方法也相似,可以任意選用合適的語言讀取、修改屬性或呼叫物件的方法。當然給定物件的屬性和方法是由建立該物件例項的語言所定義的。正如上例vbscript的過程呼叫,當從jscript中呼叫乙個不帶引數的vbscript物件的方法時,其呼叫方法也遵從jscript的呼叫規則,反之亦然。
四、陣列管理
陣列共享問題稍微複雜一點。雖然陣列也象其它變數一樣可以在不同語言指令碼之間共享,但必須注意相容方面的問題。
vbscript陣列在jscript下可以用vbscript的符號引用,即用myarray(2)引用陣列元素而不是jscript的陣列元素引用符號myarray[2>。此外,還可以使用乙個特殊的jscript物件——vbarray物件將vbscript陣列轉換為jscript陣列。下面的**從vbscript陣列myvbarray建立jscript陣列myjsarray:
var temp = new vbarray(myvbarray)
var myjsarray
myjsarray = temp.toarray()
上述**首先建立乙個臨時的vbarray物件,然後使用它的toarray()方法將自己轉換為jscript陣列。此後就可以象普通jscript陣列一樣使用myjsarray,如myjsarray[1>。但應當注意的是,toarray()方法將把乙個多維的vbarray轉換為一維的jscript陣列。
從vbscript中引用jscript陣列更為複雜。雖然在vbscript中我們可以直接訪問jscript陣列相關的方法和屬性,但沒有直接訪問jscript陣列的單個元素的方法。也就是說,我們可以在vbscript指令碼中讀取jscript陣列的長度屬性,如下所示:
x = myjsarray.length
但無法直接讀取該陣列的單個元素,下面的vbscript**是不正確的:
x = myjsarray(3)
解決該問題的乙個可行的方法是執行乙個轉換過程,如下面的**所示,此處假定vbscript是預設的指令碼語言:
< %
dim temp
dim myvbarray
temp = myjsarray.join(", ")
myvbarray = split(temp, ", ")
%>
此處的jscript join()方法將陣列myjsarray元素轉換到乙個以逗號為分割符的字串,vbscript split()函式將字串轉換為vbscript陣列。注意這裡我們是在vbscript環境下呼叫jscript的join方法。依照此例,我們可以通過自定義vbscript函式來模擬jscript的vbarray物件的toarray()方法以實現jscript陣列到vbscript陣列的轉換。
五、小結
在同乙個
asp工程內靈活選用不同指令碼語言具有許多優點,這些指令碼之間的
互動能力更為開發者整合不同語言所提供的內建函式和其它功能帶來了更多的機會,同時也使得實現既可用於vbscript也可用於jscript環境的通用指令碼庫成為可能。
ASP的 VBScript 類基礎
關於asp的 vbscript 類 首先asp的 vbscript 類是由事件和方法 它們就是構成類的成員了 構成的 在 class 塊中,成員通過相應的宣告語句被宣告為 private 私有成員,只能在類內部呼叫 或 public 公有成員,可以在類內外部呼叫 被宣告為 private 的將只在 ...
ASP判斷來路頁面
位址 response.write 進入站點首頁 url 恭喜,你的url通過 頁面來路 上面的東東很重要 如果有這樣的網頁 http www.abc.com aaa.asp?id 7,那麼,我以後可以直接在瀏覽器中鍵入http www.abc.com aaa.asp?id 7或http www.a...
asp頁面快取問題
今天開發遇到個問題關於頁面快取的技術,通俗的講就是怎麼使asp.net頁面不被快取即 頁面總是顯示的最新的內容 禁用客戶端快取 html asp response.expires 1 response.expiresabsolute now 1 response.cachecontrol no ca...