分享

阳光锈了-ASP中#Include命令简介

 hongmu 2006-07-26

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
%>

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多