松下客
一、動態包含文件 本文假定讀者已經熟悉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就可以方便地把兩者結合起來!
|