#include命令是一個(gè)SSI(Server-Side Include)指令,用于在腳本中的當前位置插入另一個(gè)文件中的內容。解釋一個(gè)ASP文件時(shí),服務(wù)器首先檢查要處理的#include,將包含文件找出來(lái),然后將文件中的代碼包含進(jìn)來(lái),再繼續處理后面的#include命令,最后從頭到尾解釋執行ASP代碼。
如果有人不清楚這些,就會(huì )造成一些困擾,如:被包含文件中使用了@或Option Explicit(強制聲明變量)等命令,程序執行時(shí)將會(huì )出現錯誤,因為@或Option Explicit指令都要在A(yíng)SP文件的最前面,所以包含文件中出現此類(lèi)指令,會(huì )導致程序出錯。
另外,會(huì )經(jīng)常遇到Server.Mappath取得的路徑不對。如文件A包含了子目錄inc中的文件B,文件B中有Server.Mappath指令就會(huì )以文件A所在目錄的路徑為參照執行,也就是相當于文件A中的Server.Mappath所取得的路徑。因為文件B的內容被包含到文件A中作為文件A的源代碼執行,所以像Server.Mappath之類(lèi)的命令取得的路徑就是文件A的路徑,并不是文件B所在的路徑。
在A(yíng)SP中include命令的語(yǔ)法如下:
<!--#include virtual/file=Path|File-->
其中virtual表示虛擬路徑,為相對于服務(wù)器上Web站點(diǎn)根目錄路徑中的文件,如為了引用在物理地址為"d:\interpub\wwwroot\samples\"的一個(gè)文件(其中"d:\interpub\wwwroot\"為站點(diǎn)根目錄),則virtual="/samples/samples.asp"。而file則表示相對于當前的ASP文件,如站點(diǎn)根目錄下有兩個(gè)目錄:PathA和PathB。PathA中的文件想包含PathB中的fileb.asp則,file="../PathB/fileb.asp",“..”表是上級目錄,如"../../"表示上上級目錄。
在實(shí)際應用中,我們常常會(huì )將創(chuàng )建數據庫連接的代碼放在一個(gè)單獨的文件中,需要連接數據庫了就將其包含進(jìn)來(lái),為了解決Server.Mappath引來(lái)的問(wèn)題,我們可以將這段代碼封裝在一個(gè)Sub中,這樣只要將路徑作為參數傳給Sub就可以解決這個(gè)問(wèn)題了。
如果需要動(dòng)態(tài)包含ASP文件的話(huà),在ASP3.0中已經(jīng)提供了相應的方法,如:Server.Execute("filename.asp")。#include命令中的virtual="<%=sFileName%>"或file="<%=sFileName%>"這種方法是不允許的,所以#include只能是靜態(tài)包含文件。
曾經(jīng)看到一些人寫(xiě)了如下的代碼來(lái)包含文件:
<%If 條件=true Then%>
<!--#include file="fileA.asp"-->
<%Else%>
<!--#include file="fileB.asp"-->
<%End If%>
還有:
<%
Select Case 條件
Case "條件1"
%>
<!--#include file="file1.asp"-->
<%Case "條件2"%>
<!--#include file="file2.asp"-->
......
<%End Select%>
寫(xiě)上面這些代碼的人的本意應該是想實(shí)現動(dòng)態(tài)包含吧,由于對include指令的不了解,造成了這些錯誤的代碼。實(shí)現動(dòng)態(tài)包含的代碼可以看看秋水寫(xiě)的代碼(詳見(jiàn)《ASP動(dòng)態(tài)include文件》)。前不久我用它來(lái)包含UTF-8編碼的ASP文件時(shí),無(wú)法正確運行,于是我就改了一下,用Adodb.Stream來(lái)實(shí)現utf-8編碼的文件包含。
<%
‘包含文件
Sub Include(a_sFileName)
Dim sASPCode,sFileName,sContent
Dim oStream,oReg
Dim iAspStart,iAspEnd
sFileName = Trim(a_sFileName)
Set oStream = server.createobject("ADODB.Stream")
oStream.Charset = "utf-8"
oStream.Open
oStream.LoadFromFile sFileName
sContent=oStream.ReadText
oStream.Close
Set oStream = Nothing
Set oReg=new RegExp
oReg.pattern="^\s*="
iAspEnd=1
iAspStart=inStr(iAspEnd,sContent,"<%")+2
Do while iAspStart>iAspEnd+1
iAspEnd = InStr(iAspStart,sContent,"%\>")+2
Execute(oReg.Replace(Mid(sContent,iAspStart,iAspEnd-iAspStart-2),"Response.Write "))
iAspStart=inStr(iAspEnd,sContent,"<%")+2
Loop
Set oReg=nothing
End Sub
%>

