一、動態包含檔案
本文假定讀者已經熟悉HTML、ASP和ActiveX對象的使用。在這裡,我們將使用FileSystemObject和TextStream對象實現“動態包含”功能,即實現動態include指令。
通常我們所設想的動態包含是:用一個變數儲存待包含檔案的名字,然後把該變數傳入include指令。相信我們之中的許多人都曾經想要在自己的ASP應用中使用動態包含的檔案,但最終卻探索服務器並不直接支援動態包含。
首先應該搞清楚下面的代碼是無法實現動態包含的:
<%
' 聲明用來儲存檔案名稱字的變數
Dim MyFile
' 在變數中儲存包含檔案的名字
MyFile = Request("SomeFileName")
' 將儲存有檔案名稱字的變數傳遞給include指令
%>
<!--#include file=<%=MyFile%>-->
上面的代碼之所以不能實現動態包含,是因為ASP對include指令的處理早於指令碼代碼。如果我們執行上述代碼,系統將提示錯誤說找不到包含檔案。
使用包含檔案的動機之一是讓它作為靜態HTML內容的容器,然後通過include指令來引用這個檔案。包含檔案中的靜態HTML通常不作改動,比如標準的頁頭和頁尾。但有些時候我們卻需要根據使用者的輸入或其他條件提供不同的內容。為了不至於為每一種可能的情形分別建立完整的頁面,“動態包含”檔案這一概念就出現了。然而,正如上面說明的,表面上看起來最為合理的實現方法其實是沒有用的。
為瞭解決這個問題,我們可以用FileSystemObject對象讀入目標包含檔案並儲存到字串變數,然後將這個字串變數插入到發送給客戶瀏覽器的頁面。下面這個getFileContents函數協助實現這個處理過程,它讀入參數中指定的檔案,然後將其內容作為字串返回。
<%
' 把檔案名稱字傳遞給函數
Function getFileContents(strIncludeFile)
Dim objFSO
Dim objText
Dim strPage
' 初始化FileSystemObject對象
Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
'開啟檔案並把它傳遞給TextStream對象(objText)。Server對象的
'MapPath函數用於獲得檔案的實體路徑
Set objText = objFSO.OpenTextFile(Server.MapPath(strIncludeFile))
'讀取並以字串形式返迴文件內容
getFileContents = objText.ReadAll
objText.Close
Set objText = Nothing
Set objFSO = Nothing
End Function
%>
使用這個函數即可實現動態地包含檔案。首先,我們讀入首頁面(即包含頁面配置和所有靜態內容的模板檔案)並把它儲存到字串變數;然後再讀入包含檔案並儲存為字串變數;最後,把儲存包含檔案內容的變數插入到首頁面的內容之中。
<b>二、應用執行個體</b>
首先我們來看一下模板檔案。下面的程式碼封裝含了一個HTML注釋“<!-- INCLUDE FILE HERE -->”,我們將用包含檔案的內容來取代這個HTML注釋。
<html>
<body>
<h2>歡迎到訪!</h2>
<table width="500" border="1">
<tr>
<td>
<!-- INCLUDE FILE HERE -->
</td>
</tr>
</table>
</body>
</html>
下面再來看一下本例所用的幾個包含檔案。第一個包含檔案是預設的包含檔案。預設包含檔案是一個表單,允許使用者選擇開啟其他三個包含檔案中的其中一個。注意這個表單沒有指定“action”屬性,這表示表單將提交給它自己(即重新開啟dynamicin3.asp)。
<!-- BEGIN DEFAULT INCLUDE -->
<form method="post">
<h3>請選擇一個您希望開啟的檔案</h3>
<p>
<select id=cboFile name=cboFile>
<option value="includefile1.inc">檔案 #1</option>
<option value="includefile2.inc">檔案 #2</option>
<option value="includefile3.inc">檔案 #3</option>
</select>
<input type="submit" value="Submit">
</p>
</form>
<!-- END DEFAULT INCLUDE -->
為簡單計,其他三個包含檔案的內容都很簡單:
<!-- BEGIN INCLUDE FILE #1 -->
<h2 style="color:red">檔案 #1 </h2>
<br>
<a href="dynamicinc3.asp">返回預設頁面</a>
<!-- END INCLUDE FILE #1 -->
<!-- BEGIN INCLUDE FILE #2 -->
<h2 style="color:green">檔案 #2 </h2>
<br>
<a href="dynamicinc3.asp">返回預設頁面</a>
<!-- END INCLUDE FILE #2 -->
<!-- BEGIN INCLUDE FILE #3 -->
<h2 style="color:blue">檔案 #3 </h2>
<br>
<a href="dynamicinc3.asp">返回預設頁面</a>
<!-- END INCLUDE FILE #3 -->
下面是dynamicinc3.asp頁面的代碼及其說明。
<%
'-------------------------------------------------------------
'getFileContents函數放到ASP檔案的最前面
'-------------------------------------------------------------
'聲明存放首頁面和包含檔案內容的變數
Dim strMain, strInclude
'讀取首頁面的內容並儲存到strMain變數
strMain = getFileContents("maintemplate.inc")
'檢查cboFile選擇框是否已經選擇。如是,讀取所要求的檔案
'否則,讀取預設的包含檔案
If Request.form("cboFile") = "" Then
strInclude = getFileContents("includedefault.inc")
Else
strInclude = getFileContents(Request.form("cboFile"))
End If
'把合適的包含檔案讀入到變數strInclude之後
'使用Replace函數將它插入到strMain檔案
strMain = replace(strMain,"<!-- INCLUDE FILE HERE -->",strInclude)
'將結果發送到用戶端
Response.Write strMain
%>
本例能夠正常運行,而且從效果上看達到了動態包含檔案的目的。但它沒有使用include指令,而是使用了FileSystemObject來替代。
運行這個例子,右擊頁面並查看源檔案,可以發現頁面中插入的是預設的包含檔案。然後,從挑選清單選擇一個包含檔案。提交表單重新裝載頁面之後,再查看頁面的源檔案,可以發現此時插入的是剛才選擇的包含檔案。
當我們想要分離頁面的布局和它的內容時,這種技術是很有用的。我們可以建立描述網站布局的模板,再以包含檔案形式製作網站的內容,最後使用ASP就可以方便地把兩者結合起來!