メインコンテンツまでスキップ
バージョン: v20 R4 BETA

テンプレートページ

4D の Webサーバーでは、タグを含む HTMLテンプレートページを使用することができます。つまり、静的な HTMLコードと、4DTEXT、4DIF、4DINCLUDEなどの 変換タグ によって追加された 4D参照の組み合わせです。 これらのタグは通常、HTMLタイプのコメント (<!--#4DTagName TagValue-->) として、HTMLソースコードに挿入されます。

これらのページが HTTPサーバーから送信される際、ページは解析され、含まれているタグが実行され、結果のデータに置き換えられます。 このように、ブラウザーが受け取るページは、静的な要素と 4D の処理による値が組み合わさったものです。

たとえば、HTMLページ内にて以下のように記述すると:

<P><!--#4DTEXT vtSiteName--> へようこそ!</P>

4D変数 vtSiteName の値が HTMLページに挿入されます。

テンプレート用タグ

以下の 4Dタグを使用することができます:

  • 4DTEXT: 4D変数および式をテキストとして挿入します。
  • 4DHTML: HTMLコードを挿入します。
  • 4DEVAL: 4D式を評価します。
  • 4DSCRIPT: 4Dメソッドを実行します。
  • 4DINCLUDE: ページを他のページに含めます。
  • 4DBASE: 4DINCLUDE タグが使用するデフォルトフォルダーを変更します。
  • 4DCODE: 4Dコードを挿入します。
  • 4DIF, 4DELSE, 4DELSEIF, 4DENDIF: HTMLコードに条件式を挿入します。
  • 4DLOOP, 4DENDLOOP: HTMLコードにループを挿入します。
  • 4DEACH, 4DENDEACH: コレクション内、エンティティセレクション内、またはオブジェクトのプロパティをループします。

これらのタグについては、変換タグ のページで説明しています。

タグは混在させることが可能です。 たとえば、次のような HTMLコードが認められています:

<HTML>
...
<BODY>
<!--#4DSCRIPT/PRE_PROCESS--> (メソッド呼び出し)
<!--#4DIF (myvar=1)--> (If 条件)
<!--#4DINCLUDE banner1.html--> (サブページ挿入)
<!--#4DENDIF--> (End if)
<!--#4DIF (myvar=2)-->
<!--#4DINCLUDE banner2.html-->
<!--#4DENDIF-->

<!--#4DLOOP [TABLE]--> (カレントセレクションでのループ)
<!--#4DIF ([TABLE]ValNum>10)--> (If [TABLE]ValNum>10)
<!--#4DINCLUDE subpage.html--> (サブページの挿入)
<!--#4DELSE--> (Else)
<B>Value: <!--#4DTEXT [TABLE]ValNum--></B><br/> (フィールド表示)
<!--#4DENDIF-->
<!--#4DENDLOOP--> (End for)
</BODY>
</HTML>

タグの解析

最適化のため、".HTML" または ".HTM" を末尾に持つ単純な URL で HTMLページを呼び出した場合、4D Webサーバーは HTMLソースコードの解析をおこないません。

4D Web サーバーが送信するテンプレートページの解析は、WEB SEND FILE (.htm, .html, .sthtm, .shtml)、WEB SEND BLOB (text/html type BLOB)、または WEB SEND TEXT コマンドが呼び出されたとき、および URL を使用して呼び出されたページを送信するときにおこなわれます。 URL で呼び出す場合、".htm" と ".html" で終わるページは最適化のため解析されません。 この場合に HTMLページの解析を強制するには、末尾を ".shtm" または ".shtml" とする必要があります (例: http://www.server.com/dir/page.shtm)。 このタイプのページの使用例は、WEB GET STATISTICS コマンドの説明に記載されています。 XMLページ (.xml、.xsl) もサポートされており、常に 4D によって解析されます。

PROCESS 4D TAGS コマンドを使用すると、Webコンテキスト外でも解析をおこなうことができます。

内部的には、パーサーは UTF-16 文字列で動作しますが、解析するデータは異なる方法でエンコードされている場合があります。 タグにテキストが含まれている場合 (4DHTML など)、提供されている情報 (charset) や出所に応じて、4D は必要に応じてデータを変換します。 以下に、HTMLページに含まれるタグを 4D が解析する場合と、おこなわれる変換を示します:

動作 / コマンド送信ページの解析$シンタックスのサポート(*)タグ解析に使用される文字セット
URL で呼び出されたページ○、ただし拡張子が ".htm" または ".html" のページを除く○、ただし拡張子が ".htm" または ".html" のページを除くページの "Content-Type" ヘッダーのパラメーターに渡された文字セットに従います。 それが無い場合は、META-HTTP EQUIVタグを探します。 それも無ければ、HTTPサーバーのデフォルト文字セットを使用します。
WEB SEND FILE-ページの "Content-Type" ヘッダーのパラメーターに渡された文字セットに従います。 それが無い場合は、META-HTTP EQUIVタグを探します。 それも無ければ、HTTPサーバーのデフォルト文字セットを使用します。
WEB SEND TEXT-変換は不要です。
WEB SEND BLOB○ (BLOBが "text/html" 型の場合)-レスポンスの "Content-Type" ヘッダーに指定された文字セットを使います。 それも無ければ、HTTPサーバーのデフォルト文字セットを使用します。
<!--4DINCLUDE --> タグによる挿入ページの "Content-Type" ヘッダーのパラメーターに渡された文字セットに従います。 それが無い場合は、META-HTTP EQUIVタグを探します。 それも無ければ、HTTPサーバーのデフォルト文字セットを使用します。
PROCESS 4D TAGSテキストデータは変換しません。 BLOBデータは、互換性のために Mac-Roman 文字セットから自動変換されます。

(*) 4DHTML、4DTEXT、4DEVALタグにおいては、代替の $ベースシンタックスが利用可能です。

Webから 4Dメソッドへのアクセス

4DEACH4DELSEIF4DEVAL4DHTML4DIF4DLOOP4DSCRIPT、または 4DTEXT で Webリクエストから 4Dメソッドを実行できるか否かは、メソッドプロパティの 公開オプション: 4D タグと URL(4DACTION...) 属性の設定に依存します。 この属性がチェックされていないメソッドは、Webリクエストから呼び出すことができません。

悪意あるコードの侵入を防止

4D変換タグは様々なタイプのデータを引数として受け入れます: テキスト、変数、メソッド、コマンド名、…。 これらのデータが自分で書いたコードから提供される場合、その受け渡しを自分でコントロールできるので、悪意あるコードの侵入のリスクは無いと言っていいでしょう。 しかしながら、 データベースのコード扱うデータは多くの場合、外部ソース (ユーザー入力、読み込み、等) から導入されたものです。

この場合、4DEVAL4DSCRIPT などの変換タグは 使用しない のが賢明です。なぜならこれらのタグはこういったデータが格納された変数を直接評価するからです。

これに加え、繰り返しの原則 に従い、悪意あるコード自身が変換タグを含んでいる可能性もあります。 この場合、4DTEXT タグを使用しなくてはなりません。 例として、"Name" という名前の Webフォームフィールドがあり、ユーザーがそこに名前を入力する場合を考えます。 この名前は <!--#4DHTML vName--> タグを使用してページ内に表示されます。 もし "\" というテキストが名前の代わりに入力されたとしたら、このタグを解釈するとアプリケーションは終了してしまいます。 このリスクを避けるには、4DTEXT タグを使用することで対応できます。 このタグは特殊 HTML文字をエスケープするため、挿入された悪意ある再起的コードが解釈されることはありません。 前の例でいうと、"Name" フィールドには "<!--#4DEVAL QUIT 4D-->" が含まれることになり、これは変換されません。