ASP動的インクルードファイル
人それぞれ異なる設定など、異なるニーズに応じて異なるファイルをインクルードする必要がある場合が多いので、動的にファイルをインクルードできるようにする要件は、<! #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つまたは複数の大きなインクルードファイルを含めるのではなく、インクルードファイルを小さなファイルに分割して、サーバーサイドスクリプトに必要なものだけを含めることが一般的です。
関連
-
Visual studio 2019 初心者向けサードパーティライブラリ追加チュートリアル(入門編)
-
ASP + ajaxはトップを達成するために、同じサポートと反対側のコードのステップ
-
ASPでよく使われる22のFSOファイル操作関数が整理されています。
-
asp 文字列連結 &, 複数の文字列の合計, 文字列スプライシングクラス
-
aspで仮想ディレクトリのルートパスを取得するコード
-
OpenとConn.Executeの詳細と相違点と&H0001の説明。
-
C言語による配列への要素の追加と削除
-
数字を漢数字(大文字の金額)に変換するASP機能
-
ASPとPHPのファイル操作速度の比較
-
ASPでのServer.HTMLEncodeの使用方法(カスタム関数あり)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Net coreのホットプラグ機構とアンインストールに関する問題点ヘルプガイド
-
提案内容を改善するために、データベースを実行するaspプログラムの効率化
-
ASP RecordSet OpenとConnection.Executeのいくつかの違いと共有すべき詳細な内容
-
one.asp 複数のプロジェクト、関数ライブラリ、クラスライブラリを1つのバージョンのメソッドに統合
-
JSONデータを扱うASP実装コード
-
Webform 組み込みオブジェクト セッションオブジェクト、アプリケーショングローバルオブジェクト、ViewState 詳細
-
Python データ解析 JupyterNotebook3 マジックコマンドの解説と例題
-
aspで文字列を数値に変換する関数のまとめ
-
ASPでフォルダーの存在を検出し、存在しない場合は自動的に作成する方法
-
従来のいくつかの方法によるASPエラーの捕捉