この特集のトップページへ
Chapter 8:プレゼンテーション層の構築

8.2.1 基本的なASPプログラム
●クライアントへの出力

○バッファ出力
 IIS 5.0は,デフォルトでバッファ出力が有効になっている。バッファ出力が有効になっている場合,ASPファイルに含まれるすべてのスクリプトの実行が完了しないと,その出力はクライアント側に送信されない。

 バッファ出力が有効になっているメリットとして、一度書き込んだ出力を取り止めることができるという点が挙げられる。バッファ出力が有効である場合には,(1)Response.Clearメソッドを用いて出力した内容を消去する,(2)Response.Endメソッドを用いることでASPスクリプトの実行を終了し,その時点でバッファに溜まっている出力をクライアントに返す,という2つの処理をすることができる。

 Response.ClearメソッドやResponse.Endメソッドは,実行時エラーが発生したときなど,条件に応じて出力を変更したいときに便利である。具体例としては,List 8-8のように実行時エラーをトラップする場合を挙げることができる。

 List 8-8において,Resonnse.ClearメソッドとResponse.Endメソッドを使っているのは,10〜15行目である。9行目ではErrオブジェクトのNumberプロパティが0かどうか――すなわち,実行時エラーが発生したかどうか――を調べ,実行時エラーが発生していた場合には,10〜15行目を実行するようにしてある。

 実行時エラーが発生していないときには,List 8-8の出力は次のようになる。

<HTML>
<BODY>
<H1>タイトル</H1>
正常終了
</BODY>
</HTML>

 一方,実行時エラーが発生したときには,11行目にあるResponse.Clearメソッドの呼び出しによって,そのまえに出力していた内容がクリアされる。このとき,8行目にあるResponse.Writeメソッドの出力のみがクリアされるのではなく,1〜3行目にあるような静的なHTML出力の内容もクリアされるので注意したい。

 出力がクリアされたあとは,12行目にある“<HTML><BODY>”,13行目にある“サーバー障害が発生しました”,14行目にある“</BODY></HTML>”が,順に出力される。

 そして15行目にはResponse.Endメソッドの呼び出しがあるため,ここでスクリプトの処理は終了する。よって,16行目以降が処理されることはなく,18行目にある“</BODY>”,19行目にある“</HTML>”は出力されない。

 まとめると,実行時エラーが発生したときには,11行目にあるResponse.Clearメソッドを呼び出した直後から,15行目にあるResponse.Endメソッドを呼び出す直前までの部分のみが出力されることになる。つまり,クライアント側への出力は次のようになるのである。

<HTML>
<BODY>
サーバー障害が発生しました
</BODY>
</HTML>

 このように,バッファ出力が有効であると,いったん書き出した出力をResponse.Clearメソッドで消去したり,Response.Endメソッドで出力を中止したりすることができるので,条件に応じてユーザーに返す内容を大きく変更したい場合には便利である。

 とはいえ,アプリケーションを構築していると,バッファ出力を無効にしたいこともときにはある。たとえば,長い時間がかかる処理をしている最中に,その経過を逐次クライアントに出力したいようなときである。

 例として,その時点の日時を表示する処理を10秒おきに3回くり返すList 8-9を考えてみる。

 List 8-9は,7行目で日時を取得して8行目で表示,そののち,10〜11行目で10秒間待つという処理を3回くり返すものである。実際のアプリケーションでは,10〜11行目の処理が,時間のかかる何らかの処理に相当することになるだろう。

 バッファ出力が有効になっている場合,List 8-9は,「その時点の日時を表示するという処理を10秒ごとに3回くり返す」のではなく,「10秒ごと3回の日時を30秒後にまとめて表示する」という処理になる。なぜなら,Response.Writeの出力がバッファに格納され,スクリプトの処理がすべて終わった段階で一気にクライアントに出力されるからである。実際にList 8-9を適当な仮想ディレクトリに置き,Webブラウザから参照して実行すると,その動作を確認できる(Fig.8-32)。

Fig.8-32 List 8-9の実行例
fig8_32

 「10秒ごと3回の日時を30秒後にまとめて表示する」のではなく,「その時点の日時を表示するという処理を10秒ごとに3回くり返す」ためには,Response.Flushメソッドを用いる。Response.Flushメソッドを呼び出すと,その時点でバッファに溜められている出力がクライアントに送信される。List 8-9の例であれば,8行目にあるResponse.Writeメソッドの呼び出しの直後にでも“Response.Flush”と記述すればよい。

 もう1つの方法としては,Response.Flushメソッドを用いるのではなく,バッファ出力そのものを無効化してしまうという方法もある。バッファ出力を無効にするには,次の2通りの方法がある。

  1. サイトや仮想ディレクトリのプロパティで設定する
     サイトや仮想ディレクトリのプロパティにより,バッファを無効にする方法である。Fig.8-15に示した[アプリケーションのオプション]ページで[バッファ処理を有効にする]のチェックを解除すれば,バッファ出力は無効になる。

  2. Response.Bufferプロパティを使う
     スクリプトの先頭にResponse.BufferプロパティをFalseにするよう,次のような文を記述する。
    <% Response.Buffer = False %>
     すると,そのスクリプトに関してはバッファ出力が無効になる。なお,このとき注意したいのは,必ず何らかの出力をするまえに上記の文を記述しなければならないという点である。すでに出力してからResponse.BufferプロパティをFalseにすると,「バッファリングがすでにオンになっている場合はオフにはできません」という実行時エラーが発生する。ここでいう「出力」には,Response.Writeメソッドによる出力だけではなく,ASPに記載されたスクリプト以外の部分によるHTML出力も含まれる。よって,実際にスクリプトに記述する場合には,Response.Bufferプロパティの設定はスクリプトファイルの行頭に置くということになるだろう。
     なお,Response.BufferプロパティにFalseを設定するのではなく,Response.BufferプロパティにTrueを設定すれば,バッファ出力を有効にすることもできる。この方法は,先の1.の方法で仮想ディレクトリ全体のバッファ出力を無効にしておいて,一部のスクリプトにだけバッファ出力を有効にしたい場合に利用する。


One Point! IIS 4.0は,デフォルトでバッファ出力が無効である。そして,IIS 4.0からアップデートしたIIS 5.0も,デフォルトではバッファ出力が無効になっている。よって,それらの環境では,サイトや仮想ディレクトリのプロパティを変更するか,明示的に“<% Response.Buffer=True %>”と記述しない限り,バッファ出力は有効にならない。

 なお,バッファ出力を無効にすると,先に説明しておいたResponse.ClearメソッドやResponse.Flushメソッドは利用できなくなる(Response.Endメソッドは利用できる)。

○その他の出力
 以上で説明したことがASPによる出力の基本だが,それ以外にもいくつかの出力をサポートしている。主立ったものとしては,文字セットの設定,コンテンツタイプの設定,追加ヘッダの設定などがある。また,テキストではなくバイナリデータを出力することもできるようになっている。これらは,Responseオブジェクトを通じて操作できる。


One Point! バッファ出力が無効である場合に,文字セットの設定,コンテンツタイプの設定,追加ヘッダの設定をしたいならば,文字列の出力(Response.Writeメソッドによる出力だけでなくスクリプト以外の部分のHTML出力も含む)をするまえに,それらを設定しなければならない。

 一般にASPから出力するのは,HTMLデータ(コンテンツタイプが“text/html”)である。しかし,たとえばコンテンツタイプを“text/xml”としてXML形式のデータをクライアントに返したり,または“image/gif”としてGIFの画像を返したりすることもできる(ただしGIFの画像を返すためには,GIF画像を扱えるCOMコンポーネントが必要である。ASPから直接GIFの画像ファイルを操作できるわけではない)。

 詳細はIISのヘルプ(http://localhost/IISHelp/)で[Active Server Pagesガイド]の項目を参照していただきたい。

Prev 14/43 Next