記事の出典: プログラミング ノート
http://blog.csdn.net/nhconch
大規模な ASP-Web アプリケーションを設計したことのあるすべての開発者は、おそらく次のような経験があるでしょう。ASP コードとページの HTML が混同され、区別するのが難しく、ビジネス ロジックが複雑です。表示モードに縛られているため、コードの理解と変更が難しくなります。プログラミングはアートの後に作成する必要があり、これがプロジェクトのボトルネックになっています。プログラム コードと HTML 静的ページを統合する場合、取得に時間がかかります。望みどおりの効果が得られ、アートとしても機能します。確かに、スクリプト言語を使用したWebアプリケーション開発では、データ処理とデータ表示を分離するのは容易ではありませんが、複数人で連携する場合、データと表示を分離できないと、開発効率や開発効率に大きな影響を及ぼします。専門的な分業。
JSP や PHP などの他のスクリプト言語には、独自のソリューションがあり、ASP の後継製品である ASP.NET も、ASP に直接移行するのが良い選択であるようです。しかし、ASP を放棄したり、当分の間 .NET 陣営に直行したりすることを妨げる何らかの理由が常に存在します。企業の観点から見ると、言語の切り替えは、経験豊富な .NET プログラマーの雇用、既存のプログラマーのトレーニング、開発ツールの変革、開発スタイルの変革、インターフェイス スタイルの変更、インターフェイス スタイル、ソフトウェア アーキテクチャ、ドキュメント、開発プロセスを含む巨額の投資です。など。これは、最高の効果と安定性を実現するために、元のコードを新しい言語環境で書き直す必要があることを意味すると同時に、この期間中のプロジェクトの進行に直接影響を与える可能性が高くなります。個々のプログラマーの退職につながります。言語を切り替える前に、根本的な解決策を見つけるのが最善のようです。
PHP はテンプレートを通じてコードとページを実装します。FastTemplate、PHPLIB、Smarty などから選択できますが、その中で PHPLIB が最も影響力があり、最も使用されています。この場合、ページを ASP に直接移動します。これは、PHP と ASP の両方を使用する企業にとって大きなメリットがあります。 1. アーティストがページを処理するとき、PHP または ASP が使用されるかどうかにかかわらず、処理方法は同じであり、トレーニングは必要ありません。 2. プログラマーがコードを書くとき、2 つの言語間のアイデアが近いか一貫しているため、同じ機能を 2 つの言語で実装する場合、それらをコピーしてわずかな変更を加えるだけで済み、作業効率とプロジェクトが確保されます。進捗。
1. テンプレート クラスの設計では、コードのカプセル化をテンプレート クラスに実装します。これにより、PHPLIB と互換性があるだけでなく、コードの管理と拡張が容易になります。
テンプレート クラスの目的は、表示された HTML コードをテンプレート ファイルから読み取り、表示コードの動的データを必要とする部分を ASP プログラムによって計算されたデータに置き換えて、特定の順序で出力することです。このうち交換部品は自由に設定可能です。したがって、次のタスクを完了する必要があります。
・テンプレートファイルから表示用のHTMLコードを読み込みます。
・テンプレートファイルと実際に生成したデータを組み合わせて出力結果を生成します。
·複数のテンプレートを同時に処理できます。
·テンプレートのネストを許可します。
·テンプレートの個々の部分の処理を可能にします。
実装方法:
FSO を使用してテンプレート ファイルを読み取る
定期的な置換を使用してテンプレート ファイルとデータを結合する
複数のテンプレートの処理は、配列ストレージを使用して実装されます。
テンプレート ネストの実装の背後にある主なアイデアは、テンプレートと出力 (中間分析結果) を同等に扱い、両方を置き換えることができ、それだけです。
テンプレートファイルにアノテーションを設定し、定期置換時にアノテーションを組み合わせることで部分置換を実現することで、各部品の処理を制御します。
2. テンプレート クラスの実装の具体的なコードを説明する前に、まず PHPLIB を使用したことのある人ならよく知っている主要な関数をリストします。
1) Public Sub set_root(ByVal Value) はテンプレートのデフォルト ディレクトリを設定します。 2) Public Sub set_file(ByVal handle,ByVal filename) はファイルを読み取ります。 3) Public Sub set_var(ByVal Name, ByVal Value, ByVal Append) はマッピング データ置換を設定します。変数 4) Public Sub unset_var(ByVal Name) データマッピングの解除 5) Public Sub set_block(ByVal Parent, ByVal BlockTag, ByVal Name) データブロックの設定 6) Public Sub set_unknowns(ByVal knowns) 未指定マッピングのタグ処理方法の設定 7) Public Sub parse(ByVal Name, ByVal BlockTag, ByVal Append) は、テンプレートファイルとデータの組み合わせを実行します。 8) Public Sub p(ByVal Name) は、処理結果の
実装コードを出力します。
<%
'================================================ = ======================
' set_var や set_block などの命名メソッドは、phplib との互換性のためにこのオブジェクトで使用されます
'================================================ = ======================
'www.downcodes.com
クラス kktTemplate
プライベート m_FileName、m_Root、m_Unknowns、m_LastError、m_HaltOnErr
プライベート m_ValueList、m_BlockList
プライベート m_RegExp
'コンストラクタ
プライベートサブクラス_初期化
Set m_ValueList = CreateObject("Scripting.Dictionary")
Set m_BlockList = CreateObject("Scripting.Dictionary")
set m_RegExp = 新しい正規表現
m_RegExp.IgnoreCase = True
m_RegExp.Global = True
m_ファイル名 = ""
m_ルート = ""
m_Unknowns = "削除"
m_LastError = ""
m_HaltOnErr = true
エンドサブ
「デストラクター」
プライベートサブクラス_Terminate
m_RegExp = なしを設定します
m_BlockMatches = なしを設定します
m_ValueMatches = 何も設定しない
エンドサブ
パブリック プロパティ GetClassName()
クラス名 = "kktTemplate"
終了プロパティ
パブリック プロパティ Get Version()
バージョン = "1.0"
終了プロパティ
Public Sub About()
Response.Write("kktTemplate ASP ページ テンプレート クラス<br>" & vbCrLf &_
"プログラミング: 彭国輝2004-07-05<br>" & vbCrLf &_
"個人ウェブサイト: <a href='http://kacarton.yeah.net'>http://kacarton.yeah.net</a><br>" & vbCrLf &_
"メール: <a href='mailto:[email protected]'>[email protected]</a><br>")
エンドサブ
'ディレクトリが存在するかどうかを確認する
Public Function FolderExist(ByVal パス)
ディムfso
Set fso = CreateObject("Scripting.FileSystemObject")
FolderExist = fso.FolderExists(Server.MapPath(path))
fso = 何も設定しない
終了機能
'ファイルの内容を読み取る
プライベート関数 LoadFile()
Dim ファイル名、fso、hndFile
ファイル名 = m_Root
Right(Filename, 1)<>"/" かつ Right(Filename, 1)<>"" の場合、Filename = ファイル名 & "/"
ファイル名 = Server.MapPath(ファイル名 & m_ファイル名)
Set fso = CreateObject("Scripting.FileSystemObject")
If Not fso.FileExists(Filename) then ShowError("テンプレート ファイル" & m_FileName & "存在しません!")
set hndFile = fso.OpenTextFile(ファイル名)
LoadFile = hndFile.ReadAll
hndFile = なしを設定します
fso = 何も設定しない
If LoadFile = "" then ShowError("テンプレート ファイルを読み取れません" & m_FileName & "またはファイルが空です!")
終了機能
'エラーメッセージを処理する
Private Sub ShowError(ByVal msg)
m_LastError = メッセージ
Response.Write "<font color=red style='font-size;14px'><b>テンプレート エラー:" & msg & "</b></font><br>"
m_HaltOnErr の場合、Response.End
エンドサブ
'テンプレートファイルのデフォルトディレクトリを設定します
'例: kktTemplate.set_root("/tmplate")
' kktTemplate.Root = "/tmplate"
' ルート = kktTemplate.get_root()
' ルート = kktTemplate.Root
'set_root のような名前付けメソッドを使用するのは、phplib との互換性のためであり、以下では繰り返しません。
パブリックサブセットルート(ByVal値)
If Not FolderExist(Value) then ShowError(Value & "有効なディレクトリではないか、ディレクトリが存在しません!")
m_Root = 値
エンドサブ
パブリック関数 get_root()
get_root = m_Root
終了機能
Public プロパティ Let Root(ByVal Value)
set_root(値)
終了プロパティ
パブリック プロパティ GetRoot()
ルート = m_Root
終了プロパティ
'テンプレートファイルを設定
'例: kktTemplate.set_file("hndTpl", "index.htm")
'このクラスは複数のテンプレート ファイルをサポートしていません。ハンドルは phplib との互換性のために予約されています
Public Sub set_file(ByVal ハンドル、ByVal ファイル名)
m_FileName = ファイル名
m_BlockList.Add ハンドル、LoadFile()
エンドサブ
パブリック関数 get_file()
get_file = m_ファイル名
終了機能
' Public プロパティ Let File(ハンドル, ファイル名)
'set_file ハンドル、ファイル名
'終了プロパティ
'パブリック プロパティ Get File()
'ファイル = m_ファイル名
'終了プロパティ
'保持、削除、コメントなどの不特定のタグの処理方法を設定します。
Public Sub set_unknowns(ByVal 不明)
m_Unknowns = 未知数
エンドサブ
パブリック関数 get_unknowns()
get_unknowns = m_Unknowns
終了機能
Public Property Let Unknowns(ByVal 不明)
m_Unknowns = 不明
終了プロパティ
Public プロパティ Get Unknowns()
未知数 = m_Unknowns
終了プロパティ
Public Sub set_block(ByVal 親、ByVal ブロックタグ、ByVal 名)
薄暗いマッチ
m_RegExp.Pattern = "<!--s+BEGIN " & BlockTag & "s+-->([sS.]*)<!--s+END " & BlockTag & "s+-- >」
m_BlockList.Exists(Parent) でない場合は ShowError("指定されていないブロック タグ" & Parent)
set Matches = m_RegExp.Execute(m_BlockList.Item(Parent))
試合中の各試合について
m_BlockList.Add BlockTag、Match.SubMatches(0)
m_BlockList.Item(親) = Replace(m_BlockList.Item(親), Match.Value, "{" & 名前 & "}")
次
一致 = なしを設定します
エンドサブ
Public Sub set_var(ByVal 名、ByVal 値、ByVal Append)
ディム・ヴァル
If IsNull(Value) then Val = "" Else Val = Value
m_ValueList.Exists(名前) の場合
追加の場合、m_ValueList.Item(Name) = m_ValueList.Item(Name) & Val _
それ以外の場合、m_ValueList.Item(名前) = Val
それ以外
m_ValueList.Add 名前、値
終了の場合
エンドサブ
Public Sub unset_var(ByVal Name)
m_ValueList.Exists(Name) の場合、m_ValueList.Remove(Name)
エンドサブ
プライベート関数 InstanceValue(ByVal BlockTag)
暗いキー、私
InstanceValue = m_BlockList.Item(BlockTag)
キー = m_ValueList.Keys
i=0 の場合 m_ValueList.Count-1 まで
InstanceValue = Replace(InstanceValue, "{" & key(i) & "}", m_ValueList.Item(keys(i)))
次
終了機能
Public Sub parse(ByVal Name、ByVal BlockTag、ByVal Append)
m_BlockList.Exists(BlockTag) でない場合は ShowError("指定されていないブロック タグ" & Parent)
m_ValueList.Exists(名前) の場合
追加する場合 m_ValueList.Item(Name) = m_ValueList.Item(Name) & InstanceValue(BlockTag) _
それ以外の場合、m_ValueList.Item(Name) = InstanceValue(BlockTag)
それ以外
m_ValueList.Add Name、InstanceValue(BlockTag)
終了の場合
エンドサブ
プライベート関数終了(ByValコンテンツ)
ケース m_Unknowns を選択してください
ケース「キープ」仕上げ=内容
ケース「削除」
m_RegExp.Pattern = "{[^ trn}]+}"
終了 = m_RegExp.Replace(コンテンツ, "")
事例「コメント」
m_RegExp.Pattern = "{([^ trn}]+)}"
finish = m_RegExp.Replace(content, "<!-- テンプレート変数 $1 未定義 -->")
Case Else 終了 = 内容
エンドセレクト
終了機能
パブリックサブp(ByVal名)
m_ValueList.Exists(Name) でない場合は ShowError("存在しません" & Name)
Response.Write(finish(m_ValueList.Item(Name)))
エンドサブ
終了クラス
%>
3. 使用例 以下に 3 つの例を示して説明します。
1) 単純な値置換テンプレート ファイルは myTemple.tpl で、内容は次のとおりです。
<html><title>ASP テンプレートの単純な置き換え</title><body>
おめでとう! {some_color} フェラーリを獲得しました!
以下
は ASP コードです (kktTemplate.inc.asp は上記のテンプレート クラスです)。
<!--#INCLUDE VIRTUAL="kktTemplate.inc.asp"-->
<%
薄暗い私の色、kkt
my_color = "赤"
set kkt = new kktTemplate 'テンプレートオブジェクトの作成
kkt.set_file "hndKktTemp", "myTemple.tpl" 'テンプレートファイルmyTemple.tplの設定と読み込み
kkt.set_var "some_color", my_color, false 'テンプレート変数の値を設定します some_color = my_color
kkt.parse "out", "hndKktTemp", false 'テンプレート変数 out = 処理されたファイル
kkt.p "out" 'outの内容を出力
set kkt = nothing 'テンプレートオブジェクトを破棄します
%>
実行後の出力は次のとおりです。
<html><title>ASP テンプレートの単純な置き換え</title><body>
おめでとう!あなたは赤いフェラーリを獲得します!
</body>
2) ループ ブロックのデモのサンプル テンプレート ファイル myTemple2.tpl:
<html><title>ASP テンプレート ブロックのデモ</title><body>
<table cellpacing="2" border="1"><tr><td>次のどの動物が好きですか</td></tr>
<!-- BEGIN AnimalList -->
<tr><td><input type="radio" name="chk">{動物}</td></tr>
<!-- 動物リストの終了 -->
</テーブル>
</body>
ASP コード:
<!--#INCLUDE VIRTUAL="kktTemplate.inc.asp"-->
<%
薄暗い動物、kkt、私
動物 = Array("子豚","子犬","小強")
set kkt = 新しい kktTemplate
kkt.set_file "hndKktTemp"、"myTemple2.tpl"
kkt.set_block "hndKktTemp"、"AnimalList"、"リスト"
for i=0 から UBound(animal)
kkt.set_var "動物"、動物(i)、false
kkt.parse "リスト"、"AnimalList"、true
次
kkt.parse "out"、"hndKktTemp"、false
kkt.p「アウト」
kkt = 何も設定しない
%>
実行結果:
<html><title>ASP テンプレート ブロックのデモ</title><body>
<table cellpacing="2" border="1"><tr><td>次のどの動物が好きですか</td></tr>
<tr><td><input type="radio" name="chk">こぶた</td></tr>
<tr><td><input type="radio" name="chk">子犬</td></tr>
<tr><td><input type="radio" name="chk">小強</td></tr>
</テーブル>
</body>
3) ネストされたブロックのデモ テンプレート ファイル myTemple3.tpl:
<html><title>ASP テンプレート - ネストされたブロックのデモ</title>
<body><テーブル幅="400" border="1" bordercolor="#000000">
<tr><td><div align="center">{myname} のテスト</div></td></tr>
<tr><td>私の動植物園: </td> </tr>
<!-- BEGIN 動物リスト -->
<tr><td>{動物}</td></tr>
<!-- BEGIN plantList -->
<tr><td> {植物}</td></tr>
<!-- 植物リストの終了 -->
<!-- 動物リストの終了 -->
</テーブル>
</body>
</html>
ASP コード:
<!--#INCLUDE VIRTUAL="kktTemplate.inc.asp"-->
<%
薄暗い私の色、kkt、私の名前、動物、植物
set kkt = 新しい kktTemplate
myname = "kktTemplate ブロック テスト..."
動物 = 配列("動物", "植物")
plant = array(array("子豚","小白","小強"), array("バラ","ひまわり"))
kkt.set_file "hndKktTemp", "myTemple3.tpl"
kkt.set_var "私の名前"、私の名前、false
kkt.set_block "hndKktTemp"、"animalList"、"a"
kkt.set_block "animalList"、"plantList"、i=0 の "p"
から UBound(animal)
kkt.set_var "動物"、動物(i)、False
kkt.unset_var "p"
'kkt.set_var "p"、""、false
j=0 から UBound(plant(i)) まで
kkt.set_var "プラント"、プラント(i)(j)、false
kkt.parse "p"、"plantList"、true
次
kkt.parse "a"、"animalList"、true
次
kkt.parse "out"、"hndKktTemp"、false
kkt.p「アウト」
%>
実行結果:
<html><title>ASP テンプレート - ネストされたブロックのデモ</title>
<body><テーブル幅="400" border="1" bordercolor="#000000">
<tr><td><div align="center">kktTemplate ブロック テスト...テスト</div></td></tr>
<tr><td>私の動植物園: </td> </tr>
<tr><td>動物</td></tr>
<tr><td> こぶた</td></tr>
<tr><td> シャオバイ</td></tr>
<tr><td> 小強</td></tr>
<tr><td>植物</td></tr>
<tr><td> ローズ</td></tr>
<tr><td> ひまわり</td></tr>
</テーブル>
</body>
</html>
この記事で説明されているすべてのコードは、ここからダウンロードできます。