Server 對象用於處理服務器上的一些特殊任務,例如,創建組件實例、獲取文件路徑、執行ASP腳本文件等。
Server 對象是體現 ASP 強大功能的一個對象,之前介紹的對象都是針對獲取、請求以及簡單存儲信息而設計的,之所以說它強大,有兩個原因,第一可以通過 Server 對象創建服務器上所具有的組件的實例,從而擴展 ASP 功能;第二 Server 對象可以執行服務器上的 ASP 文件,從而使得一些大型系統的架構變得簡單。
Server 的屬性
Server 對象只有一個屬性 ScriptTimeout,設置或返回當前頁面執行的超時時間(秒)。
設定完畢后,當當前頁面在服務器上的執行時間超過這個時間,則會強制終止當前頁面的運行。因此如果某個頁面可能運行時間較長的話,就需要手動來增大這個值,來保證頁面可以正常執行完畢。
下面的例子(Server_ScriptTimeout.asp)演示如何設置及取回 ScriptTimeout 值,主要代碼如下:
<h3>如果不設定ScriptTimeout屬性,IIS中默認值為 <%=Server.ScriptTimeout%> 秒</h3> <h3>手動屬性設置為200秒,現在值為 <%=Server.ScriptTimeout%> 秒</h3>
顯示結果如下,IIS默認的 ScriptTimeout 屬性值為 90 秒。
Server 的方法
方法 | 描述 |
CreateObject(progID) | 創建由 progID 標識的對象的一個實例 |
Execute(path) | 停止當前頁面的執行,把控制轉到 path 中指定的網頁。在該頁面執行完畢后,控制傳遞回原先的頁面,並繼續執行 Execute 后面的語句。 |
GetLastError() | 返回 ASPError 對象,描述發生錯誤的原因 |
HTMLEncode(string) | 對字符串進行 HTML 轉義 |
MapPath(path) | 返回在 Path 中指定的文件或資源的完整物理路徑和文件名 |
Transfer(path) | 停止當前頁面的執行,把控制轉到 path 中指定的頁面 |
URLEncode(string) | 對字符串進行 URL 轉義 |
CreateObject 方法,用於創建服務器上的組件的實例。最常用的就是創建數據庫操作組件的ADO的實例,我們手頭剛剛創建了一個 Access 數據庫 ServerInfo.accdb,這個數據庫有一個名為 ServerMethods 的表,表里面記錄了 Server 對象的方法(Method 字段)及描述信息(Description 字段),如下圖:
我們的例子(Server_CreateObject.asp)主要是讀取出表的全部內容,部分代碼如下:
<% Dim oConn, sConnString, sDBPath, oRs, sql '數據庫文件名 sDBPath = "ServerInfo.accdb" '數據連接字符串 sConnString = "Provider=Microsoft.ACE.OLEDB.15.0;Data Source=" & Server.MapPath(sDBPath) '創建 Connection 對象的實例 oConn Set oConn = Server.CreateObject("ADODB.Connection") '調用 oConn 的 Open 方法來打開連接 oConn.Open sConnString 'SQL語句,查詢所有記錄 sql = "SELECT * FROM ServerMethods" '建立 ADODB.RecordSet 對象實例 oRs Set oRs = Server.CreateObject("ADODB.RecordSet") '通過SQL語句獲得記錄集 oRs.Open sql, oConn Do While Not oRs.EOF Response.Write("<tr>") Response.Write("<td>" & oRs("Method") & "</td>") Response.write("<td>" & oRs("Description") & "</td>") Response.Write("</tr>") oRs.MoveNext Loop oRs.Close Set oRs = Nothing oConn.Close Set oConn = Nothing %>
運行效果如下:
在這段代碼中我們用到了兩次 CreateObject,如下代碼:
...
'創建 Connection 對象的實例 oCon
Set oConn = Server.CreateObject("ADODB.Connection")
...
'建立 ADODB.RecordSet 對象實例 oRs
Set oRs = Server.CreateObject("ADODB.RecordSet")
...
在后面的介紹會詳細介紹數據庫方面的知識。
Execute、Transfer 方法
兩者的作用都是停止當前頁面的運行,並傳遞到另外一個一面,其不同在於,Execute 方法是在另外一個頁面執行完畢后回到現在的頁面繼續向下執行,而 Transfer 方法是在另外一個頁面執行完畢后即停止運行了。
我們下面的例子將說明 Execute 和 Transfer 方法的區別,我們 建立兩個 ASP 文件(File1.asp 和 File2.asp)
File1.asp 代碼如下:
... <h3>Server.Execute演示</h3> <% Response.Write("I am in File 1!<br>") Server.Execute("File2.asp") Response.Write("I am back in File 1!") %> <hr> <h3>Server.Transfer演示</h3> <% Response.Write("I am in File 1!<br>") Server.Transfer("File2.asp") Response.Write("I am back in File 1!") %> ...
File2.asp 代碼如下:
<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%> <% Response.Write("I am in File 2!<br>") %>
執行 File1.asp 后,效果如下:
Response.Redirect 和 Server.Transfer 方法比較
首先兩者都是將頁面的控制權轉移到另外的頁面進行處理。但是還是有不同的地方。
1、Redirect 方法是在HTTP頭中輸出代碼,讓瀏覽器重新請求要轉向的目標頁面,而 Server.Transfer 方法則是在服務器上直接將當前的控制權轉給目標頁面,在客戶端並不會意識到當前的頁面已經發生了變化。
2、Redirect 方法可以重定向到任何的 URL,而 Transfer 方法是在服務器上轉移控制權,因此只可以 Transfer 到本地服務器存在的頁面。
3、在使用 Transfer 方法時,會將當前頁面的事務以及 Request 各個集合相應傳遞到目標頁面,而 Redirect 方法僅僅是通知瀏覽器開啟一個新的請求。
URLEncode 和 HTMLEncode 方法
兩者都是對某個字符串進行轉義的操作。
下面的代碼(ServerEncode.asp)展示了兩個轉義方法的區別和效果:
<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%> <!doctype html> <html> <head> <meta charset="utf-8"> <title>HTMLEncode 和 URLEncode 的應用</title> </head> <body> <p> <% Response.write(Server.HTMLEncode("The image tag: <img>")) %> </p> <p> <% Response.Write(Server.URLEncode("http://www.baidu.com")) %> </p> </body> </html>

在 Firefox 中“查看頁面源代碼”中我們發現 “<img>” 之所以能正常顯示,而不被識別成 HTML 標簽,是將 “<”符號轉義為”<“,將”>”符號轉義為”>“。
而 URLEncode 則是把空格轉化為+號,非字母數字符號轉義為十六進制表示。
MapPath 方法
在上面的 CreateObject 方法講解中,有一條語句用到了 MapPath 方法,代碼如下:
'數據庫文件名
sDBPath = "ServerInfo.accdb"
'數據連接字符串
sConnString = "Provider=Microsoft.ACE.OLEDB.15.0;Data Source=" & Server.MapPath(sDBPath)
此方法用戶獲得服務器上指定文件在服務器上的物理路徑。例如上面提到的 ServerInfo.accdb 的路徑是啥?
我們通過實例(ServerMapPath.asp)展示,主要代碼如下:
<%=Server.MapPath("ServerInfo.accdb")%>
在 Firefox 中運行后,返回了服務器上的完整路徑,如下: