News-SHOW

了解我们这个行业也了解我们!

ASP中Server.Execute和Execute实现动态包含(include)脚本的区别

时间:2012-10-26 15:13来源:网络整理 作者:采集侠 点击:

最近规划实行一下在ASP中实现MVC架构,必定有人问我:ASP都裁减了,为什么还研究?这点我也知道,自从微软放弃ASP 3.0转向ASP.NET后,ASP已经远远落伍于和它险些同时开始的PHP和JSP,开源比闭源的甜头就像PHP和ASP一样,ASP说裁减就裁减,谁也救不了,可是值得留意的是ASP在中国市场照旧蛮普及的,尤其是一些中小企业的一些应用,简朴的CMS不在话下,并且陈设简朴,在一些老旧的Windows体系上,不必要安装.NET Framework根基上就可以直接运行了,以是筹备一个框架,照旧有须要的,不外我这个是尝试性框架,只是验证ASP毕竟能不能实现相同PHP的MVC架构。
好了,说了这么多,下面直接转入正题吧。这个题目的缘由是由于我必要动态包括ASP文件,各人知道在ASP中只有一种include要领,那就是SSI(Server Side Include),根基上分为以下两种:

复制代码 代码如下:


<!-- #include file="sample.asp" -->
<!-- #include virtual="sample.asp" -->


这两种根基上各人第一种用得多一些,#include virtual包括的是假造路径,一样平常假造目次会用获得。可是这两种都属于静态的,假如我们但愿是动态包括,但不行以写成:

复制代码 代码如下:


<!-- #include file="<%=MyVar%>" -->
<!-- #include virtual="<%=MyVar%>" -->


上面的写法是错误的,可以领略为,#include指令是在ASP启动剧本引擎执行ASP<% %>标志之间剧本之前执行的,也就是说#include不是ASP的事变,而是处事端措施,如IIS的翻译事变,以是就不会分析你的ASP代码了。
怎样实现相同于PHP的include、include_once、require、require_once动态包括剧本要领呢?下面再来看ASP Server工具的一个要领:Server.Execute ,搜刮全部的ASP特征,网站制作,可以发明这个成果最相同于动态include,东台网站建设,我们可以做个尝试:
Sample.inc.asp

复制代码 代码如下:


<%
Response.Write "Hello World!"
%>


test.asp

复制代码 代码如下:


<%
Server.Execute "Sample.inc.asp"
Response.Write "I am test.asp!"
%>


现实输出应该是“Hello World!I am test.asp!”,声名Server.Execute在动态包括方面可以事变得很好,可是假如我想包括类可能函数呢?接下来做下面这个尝试:
Sample.class.asp

复制代码 代码如下:


<%
Class Sample
End Class
%>


test.asp

复制代码 代码如下:


<%
Server.Execute "Sample.class.asp"
Response.Write TypeName(Eval("New Sample"))
%>


直接运行,呈现错误“Microsoft VBScript 运行时错误 错误 '800a01fa' 类没有被界说: 'Sample'”,功效很令人扫兴,为什么会呈现这种环境呢?查阅了MSDN,找到这段描写:“If a file is included in the calling page by using #include, the executed .asp will not use it. For example, you may have a subroutine in a file that is included in your calling page, but the executed .asp will not recognize the subroutine name. ” 貌似和我碰着的题目有些纷歧样,莫非Server.Execute是代码断绝的?再举办下面这个尝试:
Sample.inc.asp

复制代码 代码如下:


<%
Dim MyVar
MyVar = "I am Sample!"
%>


test.asp

复制代码 代码如下:


<%
Dim MyVar
MyVar = "I am test!"
Server.Execute "Sample.inc.asp"
Response.Write MyVar
%>


功效输出的是“I am test!”,盐城网站制作,极端扫兴!看来Server.Execute是变量、函数、类这类代码断绝的,也就是说挪用端和被挪用端在代码级别上互不滋扰,看来Server.Execute只能用于包括.asp模板了。
下面谨慎进场的是VBScript的剧本特征Execute,传给Execute的必需是有用的VBScript剧本代码,并且Execute是上下文相干的,这点看来很靠近于我们必要的动态include。
test.asp

复制代码 代码如下:


<%
Execute "Class Sample : End Class"
Response.Write TypeName(Eval("New Sample"))
%>


上面的代码乐成输出我们所必要的范例名称Sample。证明Execute确实可以做到上下文相干,可是题目是操作Execute包括asp文件没有Server.Execute利便,Execute是VBScript剧本自带的,起首只能用来执行代码文本,以是必要读取一次文件内容,其次不能用来辨认ASP的一些标签,好比<% %>尚有一种相同于<%=MyVar %>的挪用要领,以是要过滤掉<% %>,然后要转换<%=MyVar %>为Response.Write MyVar。因为我必要的是包括类文件,不会呈现<%=MyVar %>,只要简朴的Replace掉<% %>就可以了。关于读取文件内容和简朴解除<% %>可以参考下面这个函数:

复制代码 代码如下:


Function file_get_contents(filename)
Dim fso, f
Set fso = Server.CreateObject("Scripting.FilesystemObject")
Set f = fso.OpenTextFile(Server.MapPath(filename), 1)
file_get_contents = f.ReadAll
f.Close
Set f = Nothing
Set fso = Nothing
End Function
Function class_get_contents(filename)
Dim contents
contents = file_get_contents(filename)
contents = Replace(contents, "<" & "%", "")
contents = Replace(contents, "%" & ">", "")
class_get_contents = contents
End Function


有了上面的函数我们可以直接测试下面的代码:
Sample.class.asp

复制代码 代码如下:


<%
Class Sample
End Class
%>


test.asp

复制代码 代码如下:


<%
Execute class_get_contents("Sample.class.asp")
Response.Write TypeName(Eval("New Sample"))
%>


功效输出我们所祈望的Sample范例名称,看来Execute照旧很强盛的,确实很强盛,由于常常有不怀盛意者用来做“小马”,最简朴的ASP一句话木马的写法预计是下面这句了:

复制代码 代码如下: