跳轉到內容

活動伺服器頁面/伺服器端包含

來自 Wikibooks,開放世界中的開放書籍
上一頁:使用 ADO 訪問資料庫 索引 下一頁:附錄 A:語言參考

在本章中,我們將討論使用伺服器端包含 (SSI) 來簡化構建和維護網站的過程。為了獲得最大的靈活性,我將 SSI 用於網站模板和通用程式碼模組(庫)。

伺服器端包含早在活動伺服器頁面被構思出來之前就已經存在了。基本上,它被設計為一個 Web 伺服器擴充套件,用於查詢包含在 HTML 註釋中的特殊宏。幾乎所有 Web 伺服器都至少支援伺服器端包含的某個子集。其中最有用的宏是“伺服器端包含”。

因此,當訪問一個網頁時,Web 伺服器首先會掃描訪問者請求的原始檔(或資源)。如果未找到處理宏,則該檔案將直接交付給使用者而無需修改。當找到宏時,Web 伺服器將對宏進行適當的處理(用適當的結果完全替換 HTML 註釋)。所有這些都在內容交付給使用者(或遠端主機)之前完成。

它做了什麼

[編輯 | 編輯原始碼]

我們在這裡感興趣的特定處理指令是伺服器端包含。這允許您將另一個文件的內容匯入到當前文件中。這對於重用 ASP 程式碼和 HTML 的通用塊非常有用。最常見的用途之一是建立網站模板。

另一個流行的用途是建立可以在您需要它們的網頁中包含的程式碼庫。我通常建立一個所有頁面都必須包含的通用站點庫、一個頁首和頁尾模板、一個數據庫庫、一個電子郵件庫和一個表單處理庫。透過重用通用程式碼,您可以消除在將程式碼從一個頁面複製到另一個頁面時可能發生的錯誤。

這裡我們將討論兩種不同型別的伺服器端包含:“虛擬包含”和“檔案包含”。唯一的區別在於它們訪問網站目錄結構的方式。

虛擬包含

[編輯 | 編輯原始碼]

虛擬包含將根據 Web 伺服器的文件根目錄匯入另一個檔案的內容。檔案路徑應以斜槓 (/) 開頭,它表示網站的根目錄(而不是檔案系統的根目錄)。

Internet Information Server(Microsoft Windows 的預設 Web 伺服器)可能已配置為不允許您使用檔案包含從父目錄匯入檔案的內容。在這種情況下,您需要使用虛擬包含來完成此任務。

下面顯示了一個虛擬包含的示例,用於將頁首頁尾模板提取到當前頁面中。在 HTML 註釋(由<!---->分隔)中,您將看到處理指令(#include virtual)。引號內的路徑和檔名是我們想要引入當前文件的資源。

<!-- #include virtual="/lib/header.asp" -->

<h1>Hello World</h1>

<!-- #include virtual="/lib/footer.asp" -->

需要注意的是,您可以將許多不同型別的檔案匯入到當前文件中。您應該意識到 Web 伺服器只是將包含檔案的內容直接替換到您的 HTML 文件中。此外,您不能在 ASP 程式碼塊(由<%%>分隔)中嵌入任何預處理宏。

包含過程是遞迴的,因此,如果您包含一個//也包含//伺服器端包含指令的檔案,那麼這些指令將被遞迴包含,以便處理所有宏。

檔案包含

[編輯 | 編輯原始碼]

另一種包含語句是#include file。此語句的工作原理與虛擬包含相同,只是檔案路徑必須相對於當前頁面所在的目錄。換句話說,您無法從文件根目錄(即網站的根目錄)開始訪問目錄結構。

下面是與之前相同的示例,其中虛擬包含已替換為檔案包含。在 IIS 下執行此指令碼時,您可能在嘗試以這種方式訪問父目錄時遇到錯誤。因此,我更喜歡儘可能使用虛擬包含。

<!-- #include file="../lib/header.asp" -->

<h1>Hello World</h1>

<!-- #include file="../lib/footer.asp" -->

伺服器端包含的替代方案

[編輯 | 編輯原始碼]

活動伺服器頁面包含幾個與伺服器端包含類似的語句。這些語句也適用於與伺服器端包含相同的用途。但是,沒有一個是另一個的替代品。它們都有不同的用途,您應該知道何時使用每個用途。

Server.Execute

[編輯 | 編輯原始碼]

這將從網站執行另一個活動伺服器頁面檔案。您可以使用If Then ... End If語法有條件地執行此操作。這與伺服器端包含語句不同,伺服器端包含語句將在其出現的位置執行。

此語句與伺服器端包含語句的另一個區別在於,在呼叫指令碼中定義的所有變數、函式和類都無法在執行的指令碼中訪問。這是將其用作包含的一個巨大障礙,也是我更喜歡伺服器端包含而不是此語句的主要原因。

If Application("ShowForum") Then
	Server.Execute("/module/forum.asp")
End If

我已成功使用此功能構建了一個模組化 Web 門戶應用程式。透過控制面板,使用者可以配置他們希望在其網站上顯示哪些模組。模板引擎檢查此配置,僅提取我們需要顯示的模組並相應地安排佈局。

Server.Transfer

[編輯 | 編輯原始碼]

Server.Transfer語句類似於Execute,因為它在 Web 伺服器上執行外部 ASP 檔案。但是,與Execute不同,此函式不會將控制權返回給呼叫指令碼。相反,控制權將轉移到指令碼,並且當指令碼完成執行時,請求的處理將終止。

這對於用作重定向很有用。基本上,您在指令碼中測試某些條件,並根據滿足哪個條件將控制權轉移到另一個指令碼。因此,您可能有一個包含表單的登入頁面,該表單釋出到自身。如果使用者登入已透過身份驗證,您可以將處理轉移到成員控制面板。

If bIsLoggedIn Then
	Server.Transfer("/account/index.asp")
End If

請注意,如果在到達Server.Transfer語句之前向瀏覽器輸出了任何HTML,則新ASP檔案的輸出將附加到已輸出的HTML中。雖然您可以使用ASP內建語句Response.Redirect執行標準重定向,但這將丟棄已輸出的任何HTML並從頭開始重建響應。

伺服器端包含提供了一種強大的機制來重用Active Server Pages中的程式碼。您可以使用它來建立網站模板、程式碼庫和HTML模組,這些模組可以在整個網站中重複使用。

兩種型別的包含語句分別是虛擬包含檔案包含。使用虛擬包含來包含ASP或HTML檔案,使用以斜槓 (/) 開頭的路徑說明符表示網站的文件根目錄。檔案包含包含檔案的內容,其路徑說明符相對於呼叫指令碼的目錄。外部檔案的內容將在處理任何ASP程式碼之前匯入到原始文件中。

伺服器端包含的替代方案包括Server.Execute語句,該語句將外部檔案作為獨立指令碼執行,然後將其輸出與呼叫指令碼的輸出組合在一起。另一種是Server.Transfer語句,它永久地將控制權傳遞給外部指令碼(控制權永遠不會返回)。

複習題

[編輯 | 編輯原始碼]
  • 伺服器端包含的作用是什麼?
  • 伺服器端包含的兩種型別是什麼?
  • 如果包含的檔案包含伺服器端包含會發生什麼?
  • 伺服器端包含的一些替代方案是什麼?
  • 解釋這些替代方案如何工作以執行外部ASP程式碼
  • 為一個非常簡單的HTML模板建立包含檔案(頁首和頁尾)。
  • 編寫一個虛擬伺服器端包含以匯入HTML模板檔案。
  • 編寫一些ASP程式碼來呼叫Server.Execute以顯示天氣模組。
  • 編寫一些ASP程式碼來呼叫Server.Transfer以登出成員區域的使用者。
上一頁:使用 ADO 訪問資料庫 索引 下一頁:附錄 A:語言參考
華夏公益教科書