一、動態包含文件
本文假定讀者已經熟悉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
%>
使用這個函數即可實現動態地包含文件。首先,我們讀入主頁面(即包含頁面布局和所有靜態內容的模板文件)並把它保存到字符串變量;然後再讀入包含文件並保存為字符串變量;最後,把保存包含文件內容的變量插入到主頁面的內容之中。
二、應用實例
首先我們來看一下模板文件。下面的代碼包含了一個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就可以方便地把兩者結合起來!
,最大的網絡編程)教程基地(