經(jīng)常有這樣的要求,根據(jù)不同的需求要求include不同的文件如各個(gè)人的不同設(shè)置,所以要求能動(dòng)態(tài)include文件受<! #include file="filename.asp" --> 宏限制
必須存在該文件并且會(huì)預(yù)先編譯(不管前面是否加以條件)
經(jīng)常有這樣的要求,根據(jù)不同的需求要求include不同的文件
如各個(gè)人的不同設(shè)置,所以要求能動(dòng)態(tài)include文件。
代碼如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | Functioninclude(filename) Dimre,content,fso,f,aspStart,aspEnd set fso=CreateObject("Scripting.FileSystemObject") set f=fso.OpenTextFile(server.mappath(filename)) content=f.ReadAll f.close set f=nothing set fso=nothing set re=new RegExp re.pattern="^s*=" aspEnd=1 aspStart=inStr(aspEnd,content,"<%")+2 do while aspStart>aspEnd+1 Response.write Mid(content,aspEnd,aspStart-aspEnd-2) aspEnd=inStr(aspStart,content,"%>")+2 Execute(re.replace(Mid(content,aspStart,aspEnd-aspStart-2),"Response.Write ")) aspStart=inStr(aspEnd,content,"<%")+2 loop Response.write Mid(content,aspEnd) set re=nothing EndFunction |
使用范例:
include("youinc.asp")
1 2 3 4 5 6 7 | <% "得到用戶所在的省份 DimProvince Province = Request.form("Province") "下面顯示這個(gè)省份相關(guān)的信息 %> <!--#include virtual="/ Province/<%= Province%>"--> |
你覺(jué)得上面的代碼可以工作嗎?不!簡(jiǎn)單地使用ASP來(lái)達(dá)到動(dòng)態(tài)包含,你不能達(dá)到你想要的效果。為什么?因?yàn)椋篒nclude命令先于ASP代碼而得到執(zhí)行,所以,上面的代碼并沒(méi)有按照作者的意愿,先得到用戶所在的省份,再包含這個(gè)省份的信息!
如果你確實(shí)需要?jiǎng)討B(tài)包含,你可以這樣做:
1 2 3 4 5 6 7 8 9 | <% SelectCaseProvince Case1: %> <!--#include file="1.asp" <%Case2: %> <!--#include file="2.asp" <%Case3: %> <!--#include file="3.asp" <%EndSelect%> |
應(yīng)該說(shuō),這段代碼可以得到你想要的結(jié)果。但是,由于你的用戶可能來(lái)自于33個(gè)省,你難道包含33個(gè)文件?特別要說(shuō)明的是,SSInc.dll是不知道你究竟需要哪個(gè)包含文件的(事實(shí)上,這時(shí)候Province還沒(méi)有值),所以,她把所有的文件都包含進(jìn)來(lái)了!你可以想象,這時(shí)候的文件有多大!然后,ASP.DLL會(huì)去掃描這個(gè)文件中的ASP代碼,然后執(zhí)行!
所以,每當(dāng)這樣的時(shí)候,你應(yīng)該考慮其他的思路,比如數(shù)據(jù)庫(kù),或者采用FileSystemObject。
解答
ASP程序員經(jīng)常面臨的最大挑戰(zhàn)之一是動(dòng)態(tài)Include文件。由于#include 在ASP代碼執(zhí)行之前處理,所以,看起來(lái),動(dòng)if/else的腦筋是不可能的。
真是這樣嗎?
根據(jù)你使用Include的目的,以及你將Include的文件數(shù)目,使用if/else也許可以解決問(wèn)題。但這絕對(duì)不是任何時(shí)候可以奏效的,而且也不是一種有效的解決辦法,因?yàn)槟阈枰鲈S多的手工工作。
假設(shè)有兩個(gè)樣本HTM文件,1.htm和2.htm,為簡(jiǎn)化起見(jiàn),假設(shè)文件的內(nèi)容如下:
<!-- 1.HTM: -->
<font color=#ff0000>This is 1.htm</font>
<!-- 2.HTM: -->
<font color=#0000ff>This is 2.htm</font>
現(xiàn)在我們來(lái)試試動(dòng)態(tài)Include:
1 2 3 4 5 6 7 8 9 10 11 | <% if request.querystring("param")="2" then %> <!--#include file="2.htm"--> <% else %> <!--#include file="1.htm"--> <% end if %> |
請(qǐng)注意:上面的兩個(gè)#include 實(shí)際上都得到了處理。你可以實(shí)際運(yùn)行一下,看看效果:http://localhost/Test.asp?param=1
http://localhost/Test.asp?param=2
http://localhost/Test.asp
上面我們是把一個(gè)querystring作為條件。你還可以把時(shí)間、日期、瀏覽器版本等作為條件。但是,條件越復(fù)雜,這種方法的效率越差。下面提供了另外一種思路:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <% if request("param")="2" then filespec ="2.htm" else filespec ="1.htm" end if filespec = server.mapPath(filespec) scr ="scripting.fileSystemObject" set fs = server.createobject(scr) set f = fs.openTextFile(filespec) content = f.readall set f = nothing set fs = nothing response.write(content) %> |
在IIS5.0/ASP3.0中,有兩種新的方法來(lái)支持“動(dòng)態(tài)包含”:
<%
server.transfer filename
server.execute filename
%>
如果正好使用的是IIS5.0和ASP3.0,那么Ok! 但是IIS5.0需要運(yùn)行在Windows 2000上。
很多時(shí)候,由于程序設(shè)計(jì)需要,要求在asp的include包含文件里調(diào)用動(dòng)態(tài)的文件。如<!--#include file="map1.asp"-->其中的1是個(gè)動(dòng)態(tài)參數(shù),需要request獲取。但可惜的是,include語(yǔ)句里并不能含有變量,否則將提示找不到文件錯(cuò)誤。本文將提供3種方法解決該問(wèn)題。
首先,我們需要了解,包含文件的提示和警告信息:被包含的文件可以包含其他文件。只要“#include”命令不導(dǎo)致循環(huán),.asp 文件也可以多次包含同一文件。例如,如果文件 First.asp 包含文件 Second.inc,則 Second.inc 不能反過(guò)來(lái)包含 First.asp。文件也不能包含其自身。ASP 檢測(cè)這樣的循環(huán)或嵌套錯(cuò)誤,生成錯(cuò)誤消息,并停止處理請(qǐng)求的 .asp 文件。
解決方法一:FSO調(diào)用方法
ASP語(yǔ)言是強(qiáng)大易用的語(yǔ)言,我們不要把自己的思維局限固定在一個(gè)角落里,“條條大道通羅馬”,一個(gè)思路不通,換個(gè)思路吧。
本方法采用變通的方法實(shí)現(xiàn)同樣的包含功能。即FSO調(diào)用。代碼如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <% FunctiongetFileContents(strIncludeFile)"函數(shù):讀取包含文件內(nèi)容 DimobjFSO,objText,strPage SetobjFSO = Server.CreateObject("Scripting.FileSystemObject")"調(diào)用FSO對(duì)象 SetobjText = objFSO.OpenTextFile(Server.MapPath(strIncludeFile)) getFileContents = objText.ReadAll objText.Close SetobjText =Nothing SetobjFSO =Nothing EndFunction dim p p=request("p")"2種方式:request.form ,request.querystring response.write getFileContents("map"&p&".asp") %> |
這樣,利用fso函數(shù)讀取包含文件的內(nèi)容,然后用response.write把包含文件的內(nèi)容輸出,即實(shí)現(xiàn)和include命令同樣的功能了,輕松實(shí)現(xiàn)自由輸出諸如 map1.asp,map2.asp… 等文件內(nèi)容了。
解決方法二:if...elseif...
此方法適用于要包含的文件數(shù)量不多的情況下,也是懶人+笨人的方法,呵呵。代碼如下:
1 2 3 4 5 6 7 | <%if a=1 then%> <!--#include file="map1.asp"--> <%elseif a=2 then%> <!--#include file="map2.asp"--> <%elseif a=3 then%> <!--#include file="map3.asp"--> <%end if%> |
解決方法三:select case
方法和第二種差不多,稍微好點(diǎn)。代碼如下: