台灣最大程式設計社群網站
線上人數
752
 
會員總數:244988
討論主題:188956
歡迎您免費加入會員
討論區列表 >> 專欄文章 >> Windows 2000之ASP新增功能(周世雄)
[]  
[我要回覆]
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
Windows 2000之ASP新增功能(周世雄)
價值 : 0 QP  點閱數:3836 回應數:0

樓主

站務人員 站長
門外漢
0 1580
542 9
發送站內信

捐贈 VP 給 站務人員
Windows 2000之ASP新增功能

作者 喬篷科技 周世雄
刊登於RUN!PC 2000年4月號
筆者為微軟台北廳、TechNet等研討會講師,和微軟之友、RUN!PC雜誌專欄作者,著作有「IIS 5.0超級網站速成班」(新書)、「ASP網站熱門應用技術」、「微軟熱門Web技術速成班」等網站網頁設計十幾本電腦書籍。現任「喬篷科技」公司總經理,從事WebFlow、網站熱門應用精選等Web資料庫應用設計等服務。
IIS示範網站:http://www.asp.com.tw/

連絡E-mail:jackchou@asp.com.tw。

於IIS伺服器端執行的指令檔語言ASP (Active Server Pages),可以用來建立動態的網頁內容。

Windows 2000的IIS(Internet Information Services) 5.0中,所提供的ASP (Active Server Pages)有甚麼樣的新功能呢?

IIS 5.0於ASP方面新增加了幾項功能,包括新的轉向方法(Server.Transfer與Server.Execute方法)、新的錯誤處理功能(Server.GetLastError方法)、無指令.asp的執行速度增快、可安裝元件的效能調升、Scriptlet支援、使用cookie取得瀏覽器資訊、自動增減執行緒(executing threads)、SRC伺服器端包含功能、Script Encoder編碼保護等。

本文詳細介紹其中數個ASP新增功能:

1.新的轉向方法:新的轉向方法Server.Transfer與Server.Execute,直接由IIS 5.0於網站伺服器端直接轉向到另一個網頁,不需像Response.Redirect先傳送到瀏覽器再要求網站伺服器轉向,如此會減少一次用戶端與網站伺服器之間的來回通訊時間。
2.新的錯誤處理功能:使用新的Server.GetLastError方法來顯示有用的錯誤資訊。
3.Scriptlet支援:ASP支援新指令技術Scriptlet(指令元件),可以從.asp檔案以將Scriptlet當成COM元件的方式來呼叫。您可以用VBScript或Jscript的語言(不需要使用Visual Basic、C++、或者Java語言來編寫程式)編寫Scriptlet,儲存成.sct副檔名,註冊為元件成後,即可當成COM元件(Component Object Model)般來呼叫使用。
4.使用cookie取得瀏覽器資訊:現在於IIS 5.0,多了一項新的判斷瀏覽器功能方法,方法為使用cookie儲存於瀏覽器DHTML語法所偵測到的資訊傳回IIS,以後透過Browser Capabilities元件得知cookie回報的瀏覽器資訊。
如何使用Server.Transfer與Server.Execute呢?

新的轉向方法

以前於IIS 4.0網站,將一個網頁轉向到另一個網頁的ASP轉向的方法,為使用Response.Redirect指令,譬如:
<% Response.Redirect "http://www.asp.com.tw" %>
此方法需要由IIS網站先傳送到瀏覽器,瀏覽器再向將IIS網站要求轉向到另一個網頁www.asp.com.tw,如此會增加一次用戶端與網站伺服器之間的來回通訊時間。那麼,為什麼不於網站伺服器端直接轉向到另一個網頁呢?
現在於IIS 5.0,可以直接由IIS 5.0於網站伺服器端直接轉向到另一個網頁,不需先傳送到瀏覽器再要求網站伺服器轉向。
方法為使用IIS 5.0新增加的兩個新轉向方法:Server.Transfer與Server.Execute,譬如:

<% Server.Transfer ("http://www.asp.com.tw") %>
Server.Transfer與Server.Execute相異之處
Server.Transfer與Server.Execute不同的地方,為執行Server.Transfer後就不會回原呼叫程式;而執行Server.Execute後仍然會繼續執行原呼叫程式Server.Execute下一行的指令。
Server.Transfer與Response.Redirect比較相類似;而Server.Execute與#include用法比較相接近。
譬如execute1a.asp一行顯示指令後,使用Response.Redirect指令轉向到另一個網頁execute1b.asp:
<%  
Response.Write("A1 (原呼叫程式)<BR>")
Server.Execute "execute1b.asp"
Response.Write("A2 (原呼叫程式)<BR>")
%>

轉向後execute1b.asp只有一行顯示指令:

<% Response.Write("B1 (轉向後)<BR>") %>

執行結果,執行一行顯示指令後,再執行轉向後execute1b.asp顯示指令,仍然會繼續執行原呼叫程式Server.Execute下一行的指令。

若將execute1a.asp使用Response.Redirect指令改變為Server.Transfer指令,如下transfer1a.asp:

<%  
Response.Write("A1 (原呼叫程式)<BR>")

Server.Transfer "execute1b.asp"

Response.Write("A2 (原呼叫程式)<BR>")

%>

則執行後,就不會執行Server.Transfer指令後的程式了。

Server.Transfer與Response.Redirect相異之處

雖然Server.Transfer與Response.Redirect都會轉向,但是Server.Transfer方法會將Session和Application變數值帶到轉向後之URL位址,Response.Redirect則不會。

譬如/iis5samp1/transfer2aa.asp設定Application("test")變數值後,使用Response.Redirect指令轉向到另一個網頁/iis5samp2/transfer2b.asp:
<%  

Application("test") = "Transfer前的Application值"

Response.Redirect "/iis5samp2/transfer2b.asp"

%>

另一個網頁transfer2b.asp僅顯示Application("test")變數值:

<% Response.Write "Transfer後的Application值: " & Application("test") %>

因為轉向前的iis5samp1與轉向後的iis5samp2屬於不同的應用程式,因此iis5samp1應用程式的Application("test")變數值不會傳到iis5samp2應用程式,執行結果發現Application("test")為空的。

若將Response.Redirect指令改為使用Server.Transfer指令:
<%  

Application("test") = "是Transfer前的Application值"

Server.Transfer "/iis5samp2/transfer2b.asp"

%>

則因Server.Transfer方法會將Session和Application變數值帶到轉向後之URL位址,因此轉向後執行結果Application("test")為轉向前程式所設定的值。

轉向前程式之Session和Application變數值是暫時帶到轉向後的程式,不會影響轉向後應用程式的Session和Application變數值。因此若再單獨執行轉向後的程式/iis5samp2/transfer2b.asp,並不會保留轉向前程式所帶來之Session和Application變數值。


Server.Execute與#include相異之處

雖然Server.Execute與#include指令都是於原程式當中包含另外一個網頁來執行,但是不一樣的地方是#include僅將所包含的程式插入原程式當中,而Server.Execute係單獨執行所包含的程式。

譬如include1a.asp使用#include指令包含另一個網頁include1b.asp,第一行加入@ Transaction=Required,表示整個網頁要有transaction功能:

<% @ Transaction=Required %>

<!-- #include file="include1b.asp" -->

<%

Sub OnTransactionCommit

Response.Write("原呼叫程式OnTransactionCommit副程式<BR>")

End Sub

Sub OnTransactionAbort

Response.Write("原呼叫程式OnTransactionAbort副程式<BR>")

End Sub

%>

包含網頁include1b.asp於第一行加入@ Transaction=Required,表示整個網頁也要有transaction功能,如下:

<% @ Transaction=Required %>

<% ObjectContext.SetAbort %>

因此#include僅將所包含的程式插入,造成兩行的@ Transaction=Required指令,因ASP內只可使用一次@命令,執行後將顯示錯誤。


Server.Execute與transaction關係

Server.Execute會將轉向後之URL位址之transaction結果(OnTransactionAbort和OnTransactionCommit),帶回原呼叫程式而影響其transaction結果。
譬如execute2a.asp使用Response.Redirect指令轉向到另一個網頁execute2b.asp,第一行加入@ Transaction=Required,表示整個網頁要有transaction功能:
<% @ Transaction=Required %>

<%

Server.Execute "execute2b.asp"

Sub OnTransactionCommit

Response.Write("原呼叫程式OnTransactionCommit副程式<BR>")

End Sub

Sub OnTransactionAbort

Response.Write("原呼叫程式OnTransactionAbort副程式<BR>")

End Sub

%>

轉向後execute2b.asp於第一行加入@ Transaction=Required,表示整個網頁也要有transaction功能,並加入一行ObjectContext.SetAbort強制放棄,如下:

<% @ Transaction=Required %>

<%

ObjectContext.SetAbort

Sub OnTransactionCommit

Response.Write("轉向後OnTransactionCommit副程式<BR>")

End Sub

Sub OnTransactionAbort

Response.Write("轉向後OnTransactionAbort副程式<BR>")

End Sub

%>

執行後,因轉向後execute2b.asp之transaction結果(ObjectContext.SetAbort強制放棄導致執行轉向後之OnTransactionAbort副程式),會帶回原呼叫程式execute2a.asp而影響其transaction結果,所以原呼叫程式也會執行其OnTransactionAbort副程式。

若移除轉向後execute2b.asp之ObjectContext.SetAbort程式成execute3b.asp,則轉向後execute3b.asp之transaction結果(執行OnTransactionCommit副程式),會帶回原呼叫程式execute3a.asp而影響其transaction結果,所以原呼叫程式也會執行其OnTransactionCommi副程式。


如何使用Server.GetLastError呢?

現在於IIS 5.0,可以使用新的Server.GetLastError方法來顯示有用的錯誤資訊。

譬如執行一個錯誤的ASP程式如下,其中nxt應該為Next:

<%
for i=1 to 1
nxt
%>
每當有錯誤發生時,IIS預設執行500-100.asp程式,此程式中相關ASP程式如下:

Set objASPError = Server.GetLastError

'Microsoft VBScript 編譯階段錯誤 (0x800A03FC)

Response.Write Server.HTMLEncode(objASPError.Category)

If objASPError.ASPCode > "" Then Response.Write Server.HTMLEncode(", " & objASPError.ASPCode)

Response.Write Server.HTMLEncode(" (0x" & Hex(objASPError.Number) & ")" ) & "<br>"

'必須要有 'Next'

If objASPError.ASPDescription > "" Then

Response.Write Server.HTMLEncode(objASPError.ASPDescription) & "<br>"

elseIf (objASPError.Description > "") Then

Response.Write Server.HTMLEncode(objASPError.Description) & "<br>"

end if

'/iis5samp/error1.asp, line 25

Response.Write Server.HTMLEncode(objASPError.File)

If objASPError.Line > 0 Then Response.Write ", line " & objASPError.Line

If objASPError.Column > 0 Then Response.Write ", column " & objASPError.Column

首先由Set objASPError = Server.GetLastError取得錯誤資訊,接著由以下屬性取得相關錯誤資訊,如下:

l objASPError.Category:Microsoft VBScript 編譯階段錯誤

l objASPError.Number:0x800A03FC

l objASPError.ASPDescription:必須要有 'Next'

l objASPError.File:/iis5samp/error1.asp

l objASPError.Line:25


您可以用您自訂的錯誤訊息 .asp 檔案來找出或顯示錯誤。


ASP如何支援Scriptlet呢?

ASP支援新指令技術Scriptlet(指令元件),您可以用VBScript或Jscript的語言(不需要使用Visual Basic、C++、或者Java語言來編寫程式)編寫Scriptlet,儲存成.sct副檔名,註冊為元件成後,即可當成COM元件(Component Object Model)般來呼叫使用。

Scriptlet可以從.asp檔案或其他COM來呼叫,呼叫方式與呼叫一般COM元件相同。

如何編寫Scriptlet呢?首先使用 [記事本] 輸入以下程式碼,定義兩個函數Add與Minus:
<SCRIPTLET>

<Registration Description="Scriptlet test" ProgID="test.scr1" Version="1.00">

</Registration>

<implements id=Automation type=Automation>
<method name=Add>
<PARAMETER name=A/>
<PARAMETER name=B/>
</method>

<method name=Minus>

<PARAMETER name=C/>
<PARAMETER name=D/>
</method>

</implements>
<SCRIPT LANGUAGE=VBScript>
Function Add(A, B)
Add = A - B
End Function
Function Minus(C, D)
Minus = C - D
End Function
</SCRIPT>
</SCRIPTLET>

接著將這個檔案儲存成.sct副檔名,然後於 [檔案總管] 中,在這個.sct檔案上按下滑鼠右鍵選取 [註冊]。

即可註冊為元件成功。
註冊成功後,asp程式如何呼叫此Scriptlet呢?asp程式使用Server.CreateObject("test.scr1")呼叫此Scriptlet後,即可使用所定義的兩個函數Add與Minus,asp程式SCRIPTLET1.ASP如下:

<%

Set obj1 = Server.CreateObject("test.scr1")

Response.Write "<BR>3 + 5 = " & obj1.Add(3,5)

Response.Write "<BR>10 - 5 = " & obj1.Minus(10,5)

%>


如何使用cookie取得瀏覽器資訊?

在以前的IIS版本,使用Browser Capabilities元件取得用戶端瀏覽器的功能資訊,方法為當瀏覽器連線到IIS時會自動傳送一個HTTP User Agent header,IIS收到後再與由其Browscap.ini對照表中找到此瀏覽器類型的詳細資訊。

ASP程式使用Browser Capabilities元件之方法,譬如browsertype1.asp:

<%
Set obj1 = Server.CreateObject("MSWC.BrowserType")
Response.Write "browser = " & obj1.browser & "<BR>"
Response.Write "version = " & obj1.version & "<BR>"
Response.Write "frames = " & obj1.frames & "<BR>"
Response.Write "tables = " & obj1.tables & "<BR>"
Response.Write "BackgroundSounds = " & obj1.BackgroundSounds & "<BR>"
Response.Write "vbscript = " & obj1.vbscript & "<BR>"
Response.Write "javascript = " & obj1.javascript & "<BR>"
Response.Write "platform = " & obj1.platform & "<BR>"
Response.Write "width = " & obj1.width & "<BR>"
Response.Write "height = " & obj1.height & "<BR>"
Response.Write "bufferDepth= " & obj1.bufferDepth & "<BR>"
Response.Write "colorDepth = " & obj1.colorDepth & "<BR>"
Response.Write "cookies = " & obj1.cookies & "<BR>"
%>

使用瀏覽器執行browsertype1.asp結果如下,顯示瀏覽器詳細資訊。
Browser Capabilities元件方法有些缺點,譬如Browscap.ini對照表可能為未更新,或使用者於用戶端瀏覽器更改了設定時,用戶端瀏覽器的功能資訊就可能抓錯。
現在於IIS 5.0,多了一項新的判斷瀏覽器功能方法,方法為使用cookie儲存於瀏覽器所偵測到的資訊傳回IIS,以後透過Browser Capabilities元件得知cookie回報的瀏覽器資訊。

首先於ASP程式cookie1.asp加一行:

<!--METADATA TYPE="Cookie" NAME="BrowsCap" SRC="cookie1.htm"-->

告訴瀏覽器先使用cookie1.htm中的DHTML語法偵測瀏覽器的資訊,傳回IIS後透過Browser Capabilities元件得知cookie回報的瀏覽器資訊:

<% Set obj1 = Server.CreateObject("MSWC.BrowserType") %>

<%

Response.Write "browser = " & obj1.browser & "<BR>"

Response.Write "version = " & obj1.version & "<BR>"

Response.Write "frames = " & obj1.frames & "<BR>"

Response.Write "tables = " & obj1.tables & "<BR>"

Response.Write "BackgroundSounds = " & obj1.BackgroundSounds & "<BR>"

Response.Write "vbscript = " & obj1.vbscript & "<BR>"

Response.Write "javascript = " & obj1.javascript & "<BR>"

Response.Write "platform = " & obj1.platform & "<BR>"

Response.Write "width = " & obj1.width & "<BR>"

Response.Write "height = " & obj1.height & "<BR>"

Response.Write "bufferDepth= " & obj1.bufferDepth & "<BR>"

Response.Write "colorDepth = " & obj1.colorDepth & "<BR>"

Response.Write "cookies = " & obj1.cookies & "<BR>"

%>

cookie1.htm中的DHTML語法偵測瀏覽器的資訊,如下:
<Script Language="JavaScript">

function window.onload ()
{
body1.style.behavior = "url(#default#clientCaps)";
bcString = "browse=" + body1.browser;
bcString += "&version=" + body1.version;
bcString += "&frames=" + body1.frames;
bcString += "&tables=" + body1.tables;
bcString += "&BackgroundSounds=" + body1.BackgroundSounds;
bcString += "&vbscript=" + body1.vbscript;
bcString += "&javascript=" + body1.javascript;
bcString += "&platform=" + body1.platform;
bcString += "&width=" + body1.width;
bcString += "&height=" + body1.height;
bcString += "&bufferDepth=" + body1.bufferDepth;
bcString += "&colorDepth=" + body1.colorDepth;
bcString += "&cookies=" + body1.cookieEnabled;
document.cookie = "BrowsCap = " + bcString;
}
</SCRIPT>

</HEAD>

<BODY ID="body1">
</BODY><HTML>

使用瀏覽器執行cookie1.asp結果如下,顯示瀏覽器詳細資訊。

WebFlow

筆者參予設計的WebFlow辦公室自動化流程系統軟體,也推出了Windows 2000版本,運用了Windows 2000的IIS 5.0、ADSI、COM+、Certificate Services等技術,有興趣的讀者可上網www.asp.com.tw下載試用。另外,探討IIS 5.0的新書「IIS 5.0超級網站速成班」也將出版。

本篇文章發表於2000-09-19 00:00
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
目前尚無任何回覆
   

回覆
如要回應,請先登入.