ASP中#Include命令简介 #include命令是一个SSI(Server-Side Include)指令,用于在脚本中的当前位置插入另一个文件中的内容。解释一个ASP文件时,服务器首先检查要处理的#include,将包含文件找出来,然后将文件中的代码包含进来,再继续处理后面的#include命令,最后从头到尾解释执行ASP代码。
如果有人不清楚这些,就会造成一些困扰,如:被包含文件中使用了@或Option Explicit(强制声明变量)等命令,程序执行时将会出现错误,因为@或Option Explicit指令都要在ASP文件的最前面,所以包含文件中出现此类指令,会导致程序出错。 另外,会经常遇到Server.Mappath取得的路径不对。如文件A包含了子目录inc中的文件B,文件B中有Server.Mappath指令就会以文件A所在目录的路径为参照执行,也就是相当于文件A中的Server.Mappath所取得的路径。因为文件B的内容被包含到文件A中作为文件A的源代码执行,所以像Server.Mappath之类的命令取得的路径就是文件A的路径,并不是文件B所在的路径。 在ASP中include命令的语法如下: <!--#include virtual/file=Path|File--> 其中virtual表示虚拟路径,为相对于服务器上Web站点根目录路径中的文件,如为了引用在物理地址为"d:\interpub\wwwroot\samples\"的一个文件(其中"d:\interpub\wwwroot\"为站点根目录),则virtual="/samples/samples.asp"。而file则表示相对于当前的ASP文件,如站点根目录下有两个目录:PathA和PathB。PathA中的文件想包含PathB中的fileb.asp则,file="../PathB/fileb.asp",“..”表是上级目录,如"../../"表示上上级目录。 在实际应用中,我们常常会将创建数据库连接的代码放在一个单独的文件中,需要连接数据库了就将其包含进来,为了解决Server.Mappath引来的问题,我们可以将这段代码封装在一个Sub中,这样只要将路径作为参数传给Sub就可以解决这个问题了。 如果需要动态包含ASP文件的话,在ASP3.0中已经提供了相应的方法,如:Server.Execute("filename.asp")。#include命令中的virtual="<%=sFileName%>"或file="<%=sFileName%>"这种方法是不允许的,所以#include只能是静态包含文件。 曾经看到一些人写了如下的代码来包含文件: <%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%> 写上面这些代码的人的本意应该是想实现动态包含吧,由于对include指令的不了解,造成了这些错误的代码。实现动态包含的代码可以看看秋水写的代码(详见《ASP动态include文件》)。前不久我用它来包含UTF-8编码的ASP文件时,无法正确运行,于是我就改了一下,用Adodb.Stream来实现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 %> |
|