1. ホーム
  2. Web プログラミング
  3. ASP プログラミング
  4. ASPの基本

ASP動的インクルードファイル

2022-01-18 08:01:48

 人それぞれ異なる設定など、異なるニーズに応じて異なるファイルをインクルードする必要がある場合が多いので、動的にファイルをインクルードできるようにする要件は、<! #include file="filename.asp" --> マクロの制限事項
    ファイルが存在し、プリコンパイルされる必要があります(前記の条件の有無にかかわらず)。

    要件によって、異なるファイルをインクルードする必要がある場合が多い

    コードは以下の通りです。

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 はファイルを動的にインクルードすることができる

<% 
'Get the user's province 
Dim Province 
Province = Request.form("Province") 
'Display information about this province below 
%> 
<! --#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を使用するなど、他のアイデアを検討する必要があります。

ファイルを動的にインクルードするには?

解決方法
ASPプログラマがしばしば直面する最大の問題の1つは、動的インクルードファイルです。ASP コードが実行される前に #include が処理されるため、if/else 脳の移動は不可能なようです。

本当にそうなのでしょうか?
Includeを何に使うか、何個のファイルをIncludeするかにもよりますが、if/elseを使えば問題が解決するかもしれません。しかし、常にうまくいくわけではありませんし、多くの手作業が必要なため、効果的な解決策とは言えません。

1.htmと2.htmの2つのサンプルHTMファイルがあり、簡単のために、ファイルは次のようなものだとします。

<! -- 1.HTM: -->
<font color=#ff0000>これは1.htm</font>である。
<! -- 2.HTM: -->
<font color=#0000ff>これは2.htm</font>です。

では、dynamic 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

上記では、クエリ文字列を条件として入れています。時間、日付、ブラウザのバージョンなどを条件として使うこともできます。しかし、条件が複雑になればなるほど、この方法は効率的ではありません。以下は、別の考え方を示しています。

<% 
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) 
%>

IIS 5.0/ASP 3.0 では、"dynamic includes" をサポートするための新しい方法が 2 つあります。

<ブロッククオート

<%となります。
server.transferファイル名
server.executeファイル名
%>

たまたまIIS5.0とASP3.0を使っているならば、Ok! しかし、IIS5.0はWindows2000で動作している必要があります。

Asp インクルードファイル インクルード動的インクルードメソッド (変数付き)

プログラミングの必要性から、aspのインクルードファイルで動的なファイルを呼び出すことが必要になることが多々あります。例えば、<! --#include file="map1.asp"--> ここで、1はリクエストによって取得する必要のある動的なパラメータです。しかし、残念なことに、include文は変数を含んでいません。この記事では、この問題を解決するための3つの方法を提供します。

まず、インクルードファイルのヒントと警告メッセージを理解する必要があります:インクルードされるファイルには他のファイルを含めることができます。.asp ファイルは、"#include" コマンドがループを引き起こさない限り、同じファイルを複数回含むことも可能です。例えば、First.asp が Second.inc を含んでいる場合、Second.inc は First.asp を含むことはできません。asp はこのような循環やネストしたエラーを検出し、エラーメッセージを生成し、要求された .asp ファイルの処理を停止します。
回避策1:FSO呼び出し方法

ASP言語は強力で使いやすい言語なので、世界の片隅に限定しないでおこう。

この方法は、同じインクルード機能を実現するための回避策を使用します。つまり、FSOの呼び出しです。コードは以下の通りです。

<%
Function getFileContents(strIncludeFile) 'Function: Read the contents of the include file
Dim objFSO,objText,strPage
Set objFSO = Server.CreateObject("Scripting.FileSystemObject") 'Call FSO object
Set objText = objFSO.OpenTextFile(Server.MapPath(strIncludeFile))
getFileContents = objText.ReadAll
Close
Set objText = Nothing
Set objFSO = Nothing
End Function
dim p
p=request("p") '2 ways: request.form ,request.querystring
response.write getFileContents("map"&p&".asp")
%>

このように、fso関数でインクルードファイルの内容を読み込み、includeコマンドと同じようにresponse.writeで出力することで、map1.asp、map2.asp...などのファイルの内容を自由に出力しやすくなっています。

解決策2: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%>

解決策3:ケースを選択する

この方法は2番目の方法と似ていますが、少し優れています。コードは以下の通りです。

<%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プログラムは、scriptコマンドを実行する前にファイルをインクルードします。そのため、script コマンドでインクルードされるファイルの名前を作成することはできません。たとえば、ASP は、ファイル名を変数名に代入する前に "#include" コマンドを実行しようとするため、次のスクリプトは、ファイル Header1.inc を開くことができません。

<! -- the script will fail -->
<% name= header1.inc %>
<! -- #include file="<%= name %>" -->

スクリプトコマンドとプロシージャは、スクリプトセパレータ <% および %> 内、つまり HTML タグ <SCRIPT> および </SCRIPT> 内、または HTML タグ <OBJECT> および </OBJECT> 内に完全に収まっていなければなりません。つまり、インクルードされた .asp ファイルでスクリプトのセパレータを有効にし、インクルードされたファイルでセパレータを無効にすることはできません;スクリプトやスクリプトコマンドは完全なユニットでなければなりません。例えば、次のようなスクリプトは動作しません。

<! -- スクリプトは失敗します -->
<%。
For i = 1 To n
メインファイル内のステートメント
<! -- #include file="header1.inc" -->
次のページ
%>
ただし、以下のスクリプトは動作します。
<%.
For i = 1 to n
メインファイル内のステートメント
%>
<! -- #include file="header1.inc" -->
<%次へ %>

ASPスクリプトのインクルードファイルに、インクルードスクリプトが必要としない関数や変数が大量に含まれていると、これらの無駄な構造はかえってパフォーマンスに影響を与え、最終的にはWebアプリケーションのスケーラビリティを低下させることになりかねません。このため、冗長な情報を含む1つまたは複数の大きなインクルードファイルを含めるのではなく、インクルードファイルを小さなファイルに分割して、サーバーサイドスクリプトに必要なものだけを含めることが一般的です。