asp 动态包含

众所周知, ASP的include指令要优先于parser, 因此在include指令中包含变量是不会被parse解析的, 而将直接导致一个HTTP 500错误.
就像下面这段代码, 我想你在看这篇文章之前, 肯定已经这么尝试过了, 并且当你运行它以前一定就天真地以为, 这样就能”行了”…

or

然而结果可能会令你非常沮丧, 你可能马上产生抱怨, 也可能因此而打算放弃ASP, 转投PHP, JSP或.NET的怀抱. 但是请你不要灰心, 作为一个技术狂热份子怎么能如此轻言放弃呢? 废话少说, 直接入正题吧.

1. 使用Server.Execute 方法
Server.Execute(fp)
Company Name
Recepción a mi Website!

— Welcome.asp —


Company Name


<%
AcceptLang = Request.ServerVariables(“HTTP_ACCEPT_LANGUAGE”)
Lang = Left(AcceptLang, 2)
Server.Execute(Lang & “Welcome.asp”)
%>

— EnWelcome.asp —
<% Response.Write "Welcome to my Website!" %>

— DeWelcome.asp
<% Response.Write "Willkommen zu meinem Website!" %>

— EsWelcome.asp —
<% Response.Write "Recepción a mi Website!" %>

2. 使用COM技术
<%@language="javascript"%>

<%
var szFile = String(Request.QueryString(“file”));
if ((szFile == “undefined”) || (szFile == “”))
szFile = “test1.html”;
var x = Server.CreateObject(“SSDI.Util”);
%>

We are about to include file: <%=szFile%>


<%=x.Include(Server.MapPath(szFile))%>

评论: 第一种方案不错, 简单灵活, 只需指定包含文件的本地URL给Server.Execute就可以. 并且这种方案实现的包含效果和你所期望的更接近一些. 但是它有一个致命缺点就是所包含和文件和宿主文件之间的变量, 包含全局变量均不能互相访问. 你可能感到疑惑. 这是因为Server.Execute将会开启一个新的线程单独去执行你所包含进来的文件. 因此, 你可以理解为有2个ASP引擎分别解析宿主文件和包含.
有一种方法, 就是使用Application或Session, 我想这样就能宿主文件和包含文件之间值的传递了.

第二种方案也不错, 只是它不够灵活, 只能将文件读取输出, 并不能解释包含文件中的任何代码, 如果你只是想做个模版页的调用, 那么推荐这个, 因为它的效率比起前者更高, 而且更节约系统所需的资源.

除了以上所提的以外, 第二种方案最主要的问题就是灵活性和可扩展性较差, 因为拥有服务器最高权限的朋友不多, 基本上都是使用的虚拟主机.

以上搜集自http://www.dreammx.com/xhyl/archiver/385.html

另外,MSDN给出了Server.Execute的用法http://support.microsoft.com/kb/224363