ASP動態include文件
經常有這樣的要求,根據不同的需求要求include不同的文件如各個人的不同設置,所以要求能動態include文件受<! #include file="filename.asp" --> 宏限制
必須存在該文件并且會預先編譯(不管前面是否加以條件)
經常有這樣的要求,根據不同的需求要求include不同的文件
如各個人的不同設置,所以要求能動態include文件。
代碼如下:
Function include(filename) Dim re,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 End Function
使用范例:
include("youinc.asp")
ASP可以動態Include文件
<% "得到用戶所在的省份 Dim Province Province = Request.form("Province") "下面顯示這個省份相關的信息 %> <!--#include virtual="/ Province/<%= Province%>"-->
你覺得上面的代碼可以工作嗎?不!簡單地使用ASP來達到動態包含,你不能達到你想要的效果。為什么?因為:Include命令先于ASP代碼而得到執行,所以,上面的代碼并沒有按照作者的意愿,先得到用戶所在的省份,再包含這個省份的信息!
如果你確實需要動態包含,你可以這樣做:
<% Select Case Province Case 1: %> <!--#include file="1.asp" <% Case 2: %> <!--#include file="2.asp" <% Case 3: %> <!--#include file="3.asp" <% End Select %>
應該說,這段代碼可以得到你想要的結果。但是,由于你的用戶可能來自于33個省,你難道包含33個文件?特別要說明的是,SSInc.dll是不知道你究竟需要哪個包含文件的(事實上,這時候Province還沒有值),所以,她把所有的文件都包含進來了!你可以想象,這時候的文件有多大!然后,ASP.DLL會去掃描這個文件中的ASP代碼,然后執行!
所以,每當這樣的時候,你應該考慮其他的思路,比如數據庫,或者采用FileSystemObject。
怎樣動態Include文件?
解答
ASP程序員經常面臨的最大挑戰之一是動態Include文件。由于#include 在ASP代碼執行之前處理,所以,看起來,動if/else的腦筋是不可能的。
真是這樣嗎?
根據你使用Include的目的,以及你將Include的文件數目,使用if/else也許可以解決問題。但這絕對不是任何時候可以奏效的,而且也不是一種有效的解決辦法,因為你需要做許多的手工工作。
假設有兩個樣本HTM文件,1.htm和2.htm,為簡化起見,假設文件的內容如下:
<!-- 1.HTM: -->
<font color=#ff0000>This is 1.htm</font>
<!-- 2.HTM: -->
<font color=#0000ff>This is 2.htm</font>
現在我們來試試動態Include:
<% if request.querystring("param")="2" then %> <!--#include file="2.htm"--> <% else %> <!--#include file="1.htm"--> <% end if %>
請注意:上面的兩個#include 實際上都得到了處理。你可以實際運行一下,看看效果:http://localhost/Test.asp?param=1
http://localhost/Test.asp?param=2
http://localhost/Test.asp
上面我們是把一個querystring作為條件。你還可以把時間、日期、瀏覽器版本等作為條件。但是,條件越復雜,這種方法的效率越差。下面提供了另外一種思路:
<% 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中,有兩種新的方法來支持“動態包含”:
<%
server.transfer filename
server.execute filename
%>
如果正好使用的是IIS5.0和ASP3.0,那么Ok! 但是IIS5.0需要運行在Windows 2000上。
Asp包含文件include動態包含方法(含變量)
很多時候,由于程序設計需要,要求在asp的include包含文件里調用動態的文件。如<!--#include file="map1.asp"-->其中的1是個動態參數,需要request獲取。但可惜的是,include語句里并不能含有變量,否則將提示找不到文件錯誤。本文將提供3種方法解決該問題。
首先,我們需要了解,包含文件的提示和警告信息:被包含的文件可以包含其他文件。只要“#include”命令不導致循環,.asp 文件也可以多次包含同一文件。例如,如果文件 First.asp 包含文件 Second.inc,則 Second.inc 不能反過來包含 First.asp。文件也不能包含其自身。ASP 檢測這樣的循環或嵌套錯誤,生成錯誤消息,并停止處理請求的 .asp 文件。
解決方法一:FSO調用方法
ASP語言是強大易用的語言,我們不要把自己的思維局限固定在一個角落里,“條條大道通羅馬”,一個思路不通,換個思路吧。
本方法采用變通的方法實現同樣的包含功能。即FSO調用。代碼如下:
<% Function getFileContents(strIncludeFile) "函數:讀取包含文件內容 Dim objFSO,objText,strPage Set objFSO = Server.CreateObject("Scripting.FileSystemObject") "調用FSO對象 Set objText = objFSO.OpenTextFile(Server.MapPath(strIncludeFile)) getFileContents = objText.ReadAll objText.Close Set objText = Nothing Set objFSO = Nothing End Function dim p p=request("p") "2種方式:request.form ,request.querystring response.write getFileContents("map"&p&".asp") %>
這樣,利用fso函數讀取包含文件的內容,然后用response.write把包含文件的內容輸出,即實現和include命令同樣的功能了,輕松實現自由輸出諸如 map1.asp,map2.asp… 等文件內容了。
解決方法二:if...elseif...
此方法適用于要包含的文件數量不多的情況下,也是懶人+笨人的方法,呵呵。代碼如下:
<%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
方法和第二種差不多,稍微好點。代碼如下:
<%select case p case 1%> <!--#include virtual="inc/****1.asp"--> <%case 2%> <!--#include virtual="inc/****2.asp"--> <%case 3%> <!--#include virtual="inc/****3.asp"--> <%case 4%> <!--#include virtual="inc/****4.asp"--> <%end select%>
如果你有其他更好的方法,歡迎與我們交流。您可以把你您的想法留在博客評論里,我們期待與您的探討。
補充:關于asp的include包含命令,需要注意以下方面。
ASP程序在執行腳本命令之前就已經包含文件。因此,不能使用腳本命令來建立被包含的文件名。舉例來說,因為 ASP 試圖在將文件名指派給變量 name 之前執行“#include”命令,所以下面的腳本無法打開文件 Header1.inc。
<!-- 該腳本將失敗 -->
<% name= header1.inc %>
<!-- #include file="<%= name %>" -->
腳本命令和過程必須完全包含在腳本分隔符 <% 和 %> 內,即 HTML 標簽 <SCRIPT> 和 </SCRIPT>,或 HTML 標簽 <OBJECT> 和 </OBJECT> 內部。也就是說,不能在包含 .asp 文件中打開腳本分隔符,并在被包含的文件中關閉分隔符;腳本或腳本命令必須是一個完整的單元。例如,下面的腳本將不起作用:
<!-- 該腳本將失敗 -->
<%
For i = 1 To n
主文件中的語句
<!-- #include file="header1.inc" -->
Next
%>
但下面的腳本會起作用:
<%
For i = 1 to n
主文件中的語句
%>
<!-- #include file="header1.inc" -->
<% Next %>
如果 ASP 腳本包含的文件中存在包含腳本不需要的大量函數和變量,則這些無用的結構反而會影響性能,并最終降低 Web 應用程序的伸縮性。因此,通常將包含文件分成多個小文件,并且只包含那些服務器端腳本必需的文件,而不是包含那些帶有冗余信息的一個或多個大型包含文件。
相關文章:
1. ajax請求后臺得到json數據后動態生成樹形下拉框的方法2. Vue實現動態路由導航的示例3. CSS3實現動態翻牌效果 仿百度貼吧3D翻牌一次動畫特效4. bootstrap select2 動態從后臺Ajax動態獲取數據的代碼5. Django與AJAX實現網頁動態數據顯示的示例代碼6. ASP動態網頁制作技術經驗分享7. JSP動態網頁開發技術概述8. el-table表格動態合并相同數據單元格(可指定列+自定義合并)9. python GUI庫圖形界面開發之PyQt5動態加載QSS樣式文件10. ASP.NET MVC前臺動態添加文本框并在后臺使用FormCollection接收值
