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

8.2.1 基本的なASPプログラム
●別のASPファイルの呼び出し
 ASPを使って開発していると,別のASPファイルを取り込んだり,処理後に別のASPファイルに記載された処理に制御を移したりしたいことがある。ここでは,その方法について説明する。

○スクリプトファイルのインクルード
 まずは,スクリプトファイルのインクルードから説明する。ASPを使っていると,いくつかのASPファイルで同じプロシージャを共用したいことがよくある。そのような場合,スクリプトファイルのインクルード機能を使うと,共用したいプロシージャを別ファイルに記述しておけば,各ファイルではそれを取り込んでプロシージャを利用することができるようになる。

 スクリプトファイルのインクルードは簡単で,次のいずれかの書式を使う。


<!-- #include 
 virtual="取り込みたいファイルのURL"
-->
または
<!-- #include 
 file="取り込みたいファイルのファイル名"
-->

※読みやすいように折り返してあるが1行に記述してもかまわない。

 virtualfileの違いは,ファイルの場所をURLで指定するのか,それともWindows NT上のディレクトリで指定するのかの違いである。virtualの場合には,URLで指定する。つまり,パスを仮想ディレクトリの形で示し,“/”で区切った形で指定することになる。一方のfileでは,ファイルをスクリプトファイルが存在するフォルダからの相対フォルダ名で指定する。パスの区切りは“\”になる。fileの指定では相対パスである点に注意したい。たとえば,あるスクリプトファイルがC:\testフォルダに保存されていた場合,次のインクルード指定は,C:\test\subfolder\mylib.incというファイルをインクルードするという意味になる。


<!-- #include 
 file="subfolder\mylib.inc"
-->

 fileの指定では,絶対パスを用いることはできない。たとえば,次のような指定はエラーになる。


<!-- #include
 file="C:\test\subfolder\mylib.inc"
-->

 なお,“<!-- include -->”を使ったファイルのインクルードは,ASPファイルだけでなく,HTMLファイル内で利用することもできる。

○リダイレクトする
 ファイルをインクルードしてプロシージャを利用するのではなく,処理が終わった段階で別のURLに飛ばしたいということもよくある。たとえば,ログインページでクッキー情報を保存したあと,別のURLに飛ばしたい(リダイレクトしたい)という場合である。

 そのような場合には,ResponseオブジェクトのRedirectメソッドを使う。使い方は簡単で,引数にリダイレクト先となるURLを指定するだけである。


<% Response.Redirect "リダイレクト先のURL" %>

One Point! バッファ出力が無効になっている場合,情報の出力まえ(Response.Writeメソッドによる出力だけでなくスクリプト以外のHTML要素も含む)でないとResponse.Redirectメソッドを呼び出すことはできない。

 なお,Response.Redirectメソッドは,呼び出した時点で指定されたURLに飛ぶわけではない。単に,ASPファイルに記載されたすべての処理を終えた時点で,クライアント側に次のようなステータス行ならびにヘッダ情報を返すだけである。

HTTP 1.1 302 Object Moved
Location: 引数に指定したURL

 このヘッダを受け取ったWebブラウザは,Locationヘッダで記述されたURLに再接続することになる。

 よって,Response.Redirectメソッドを呼び出しても,即座に引数に指定されたURLに飛ぶというわけではなく,ASPファイルに記載された処理はすべて実行されるので,十分に注意したい。

TransferメソッドとExecuteメソッド
 IIS 5.0では,ServerオブジェクトのTransferメソッドとExecuteメソッドを用いることで,ほかのASPファイルに記載されたスクリプトを実行することもできる。


One Point! IIS 4.0以前ではTransferメソッドとExecuteメソッドはサポートされていない。

 Server.Transferメソッドは,先に説明したResponse.Redirectメソッドと似ていて,引数に指定されたASPファイルのURLに処理が移る。たとえば,次のようにすると,処理がmyasp2.aspに移るのである。

<% Server.Transfer "myasp2.asp" %>

 Server.Transferメソッドを呼び出したときには,引数に指定されたASPファイルに対して,即座に処理が移る。つまり,Server.Transferメソッドの呼び出しよりも後ろの行は,実行されない点に注意したい。

<% Server.Transfer "myasp2.asp" %>
<!-- 
これよりあとの行は,myasp2.aspを
実行したあとには実行されない
-->

 一方,ServerオブジェクトのExecuteメソッドは,Server.Transferメソッドと似ているが,引数に指定されたASPファイルを実行したあと,Server.Executeメソッドの後ろにある行以降を実行するという点が異なる。ただし,Server.Executeメソッドには,Server.Transferメソッドとは違い,同じ仮想ディレクトリ内に存在するASPファイルしか呼び出すことができないという制限がある。

<% Server.Execute "myasp2.asp" %>
<!-- 
これよりあとの行はmyasp2.aspを
実行したあとに実行される
-->

 Server.TransferメソッドもServer.Executeメソッドも,別のASPファイルを呼び出すときに,その時点の変数の設定情報やトランザクション状況などを引き継ぐ。

 Server.Transferメソッドは,Response.Redirectメソッドの代わりに使われることも多い。Response.Redirectメソッドの場合には,Locationヘッダがクライアントに送信されて,それからクライアントが指定されたURLに再接続する形になる。一方,Server.Transferメソッドでは,サーバー側で直接別のASPファイルを実行するためにクライアント側から再接続することがないため,処理が高速になる。

 Server.TransferメソッドをResponse.Redirectメソッドの代わりに用いたいのであれば,次のようにResponse.Clearメソッドを呼び出して送信した情報をクリアしてから,Server.Transferメソッドを呼び出すようにすればよい。

<%
  Response.Clear
  Server.Transfer _
    "実行したいASPファイル名"
%>

 Response.Clearメソッドの呼び出しは必須ではない。しかし,Server.Transferメソッドを呼び出しても,すでに出力した情報は破棄されない。そのため,もしスクリプトで何らかの出力をしている場合には,その出力のあとに引き続き,Server.Transferメソッドの引数に指定されたASPファイルの結果が出力されることになる。

 ただし,Server.Transferメソッドで呼び出した場合には,Response.Redirectメソッドとは違い,変数の設定状況やトランザクション状況などが引き継がれる。そのため,両者は完全に同じ動作をするわけではない。よって,高速化のためだけに既存のWebアプリケーションのResponse.Redirectメソッドの呼び出しを単純にServer.Transferメソッドの呼び出しに変更してしまうと,誤動作のおそれがあるので注意したい。

Prev 21/43 Next