[ASP]动态包含方法实现(Dynamic Include Method)
[ 2007-08-13 02:15:46 | Author: 星辉一冷 ]
好久没写点技术性的文章了...
今天就ASP的动态包含实现方法作个总结与整理吧, 希望能够解决各位学习ASP时遇到的困惑.
众所周知, ASP的include指令要优先于parser, 因此在include指令中包含变量是不会被parse解析的, 而将直接导致一个HTTP 500错误.
就像下面这段代码, 我想你在看这篇文章之前, 肯定已经这么尝试过了, 并且当你运行它以前一定就天真地以为, 这样就能"行了"...
然而结果可能会令你非常沮丧, 你可能马上产生抱怨, 也可能因此而打算放弃ASP, 转投PHP, JSP或.NET的怀抱. 但是请你不要灰心, 作为一个技术狂热份子怎么能如此轻言放弃呢? 废话少说, 直接入正题吧.
1. 使用Server.Execute 方法
Server.Execute(fp)
2. 使用COM技术
点击下载
评论: 第一种方案不错, 简单灵活, 只需指定包含文件的本地URL给Server.Execute就可以. 并且这种方案实现的包含效果和你所期望的更接近一些. 但是它有一个致命缺点就是所包含和文件和宿主文件之间的变量, 包含全局变量均不能互相访问. 你可能感到疑惑. 这是因为Server.Execute将会开启一个新的线程单独去执行你所包含进来的文件. 因此, 你可以理解为有2个ASP引擎分别解析宿主文件和包含.
有一种方法, 就是使用Application或Session, 我想这样就能宿主文件和包含文件之间值的传递了.
第二种方案也不错, 只是它不够灵活, 只能将文件读取输出, 并不能解释包含文件中的任何代码, 如果你只是想做个模版页的调用, 那么推荐这个, 因为它的效率比起前者更高, 而且更节约系统所需的资源.
除了以上所提的以外, 第二种方案最主要的问题就是灵活性和可扩展性较差, 因为拥有服务器最高权限的朋友不多, 基本上都是使用的虚拟主机.
写得零零散散, 希望对你有所帮助.
另外附上一个, 我用第一种方法做的一个模版类:
http://lab.dreammx.com/smarty/default.asp
模版在这里:
http://lab.dreammx.com/smarty/template/default.html
http://lab.dreammx.com/smarty/template/header.html
http://lab.dreammx.com/smarty/template/footer.html
Comment Feed: http://www.dreammx.com/xhyl/feed.asp?q=comment&id=385
Trackback URL: http://www.dreammx.com/xhyl/trackback.asp?id=385&key=xhyl
今天就ASP的动态包含实现方法作个总结与整理吧, 希望能够解决各位学习ASP时遇到的困惑.
众所周知, ASP的include指令要优先于parser, 因此在include指令中包含变量是不会被parse解析的, 而将直接导致一个HTTP 500错误.
就像下面这段代码, 我想你在看这篇文章之前, 肯定已经这么尝试过了, 并且当你运行它以前一定就天真地以为, 这样就能"行了"...
<!--#include file="<%=filename.inc%>"-->
or
<!--#include file="xxx"+vars+".inc"-->
or
<!--#include file="xxx"+vars+".inc"-->
然而结果可能会令你非常沮丧, 你可能马上产生抱怨, 也可能因此而打算放弃ASP, 转投PHP, JSP或.NET的怀抱. 但是请你不要灰心, 作为一个技术狂热份子怎么能如此轻言放弃呢? 废话少说, 直接入正题吧.
1. 使用Server.Execute 方法
Server.Execute(fp)
Company Name
Recepción a mi Website!
--- Welcome.asp ---
<HTML>
<BODY>
<H1>Company Name</H1>
<%
AcceptLang = Request.ServerVariables("HTTP_ACCEPT_LANGUAGE")
Lang = Left(AcceptLang, 2)
Server.Execute(Lang & "Welcome.asp")
%>
</BODY>
</HTML>
--- 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!" %>
Recepción a mi Website!
--- Welcome.asp ---
<HTML>
<BODY>
<H1>Company Name</H1>
<%
AcceptLang = Request.ServerVariables("HTTP_ACCEPT_LANGUAGE")
Lang = Left(AcceptLang, 2)
Server.Execute(Lang & "Welcome.asp")
%>
</BODY>
</HTML>
--- 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"%>
<HTML>
<%
var szFile = String(Request.QueryString("file"));
if ((szFile == "undefined") || (szFile == ""))
szFile = "test1.html";
var x = Server.CreateObject("SSDI.Util");
%>
<BODY>
<P>We are about to include file: <%=szFile%></P>
<%=x.Include(Server.MapPath(szFile))%>
</BODY>
</HTML>
<HTML>
<%
var szFile = String(Request.QueryString("file"));
if ((szFile == "undefined") || (szFile == ""))
szFile = "test1.html";
var x = Server.CreateObject("SSDI.Util");
%>
<BODY>
<P>We are about to include file: <%=szFile%></P>
<%=x.Include(Server.MapPath(szFile))%>
</BODY>
</HTML>
评论: 第一种方案不错, 简单灵活, 只需指定包含文件的本地URL给Server.Execute就可以. 并且这种方案实现的包含效果和你所期望的更接近一些. 但是它有一个致命缺点就是所包含和文件和宿主文件之间的变量, 包含全局变量均不能互相访问. 你可能感到疑惑. 这是因为Server.Execute将会开启一个新的线程单独去执行你所包含进来的文件. 因此, 你可以理解为有2个ASP引擎分别解析宿主文件和包含.
有一种方法, 就是使用Application或Session, 我想这样就能宿主文件和包含文件之间值的传递了.
第二种方案也不错, 只是它不够灵活, 只能将文件读取输出, 并不能解释包含文件中的任何代码, 如果你只是想做个模版页的调用, 那么推荐这个, 因为它的效率比起前者更高, 而且更节约系统所需的资源.
除了以上所提的以外, 第二种方案最主要的问题就是灵活性和可扩展性较差, 因为拥有服务器最高权限的朋友不多, 基本上都是使用的虚拟主机.
写得零零散散, 希望对你有所帮助.
另外附上一个, 我用第一种方法做的一个模版类:
http://lab.dreammx.com/smarty/default.asp
<%@LANGUAGE="JSCRIPT" CODEPAGE="65001"%>
<%
var myDate = new Date();
%>
<!--#include file="class/SmartyClass.asp"-->
<!--#include file="config.asp"-->
<%
theTpl.BindSource("src_default");
theTpl.Template("default");
Response.Write("<!-- Processed in " +((new Date())-myDate)+ "ms -->");
%>
<%
var myDate = new Date();
%>
<!--#include file="class/SmartyClass.asp"-->
<!--#include file="config.asp"-->
<%
theTpl.BindSource("src_default");
theTpl.Template("default");
Response.Write("<!-- Processed in " +((new Date())-myDate)+ "ms -->");
%>
模版在这里:
http://lab.dreammx.com/smarty/template/default.html
http://lab.dreammx.com/smarty/template/header.html
http://lab.dreammx.com/smarty/template/footer.html
Comment Feed: http://www.dreammx.com/xhyl/feed.asp?q=comment&id=385
Trackback URL: http://www.dreammx.com/xhyl/trackback.asp?id=385&key=xhyl