ASP スクリプトの記述

このトピックでは、Active Server Pages (ASP) スクリプトの基本要素について紹介します。実際の ASP スクリプトの使用例の詳細については、「チュートリアル」を参照してください。

.Asp ファイルとは ?

Active Server Pages (ASP) は、.asp というファイル名拡張子を持つファイルを中心にして実現されます。.asp ファイルはテキスト ファイルであり、次の要素を自由に記述することができます。

.asp ファイルは、既存の HTML ファイルの拡張子 .htm または .html を .asp に変えるだけで簡単に作成できます。この .asp スクリプト ファイルを Web のユーザーが利用できるようにするには、Web パブリッシュ ディレクトリに新規にそのファイルを保存します (このとき、関連する仮想ディレクトリの "実行" アクセス権を必ずオンにしておきます)。ブラウザでこのファイルを表示すると、ASP が従来とまったく同様に HTML を処理して返すのがわかります。Web のパブリッシュ、仮想ディレクトリ、およびアクセス権の設定の詳細については、Microsoft Web サーバーのオンライン マニュアルを参照してください。

実際には、HTML にスクリプトを追加する時点で既に ASP が動作しています。

スクリプトとは ?

スクリプトとは一連のスクリプト コマンドの集まりであり、たとえば次のようなことができます。

スクリプトを実行すると、一連のコマンドがスクリプト エンジンに送られます。スクリプト エンジンはそれらのコマンドを解析してからコンピュータに送ります。スクリプトは一定の規則に従った言語で記述されます。このため、スクリプト言語を使う場合は、使用しているサーバーでその言語を解析することのできるスクリプト エンジンが必ず動作している必要があります。ASP では、VBScript、および JScript というスクリプト言語用のスクリプト エンジンが提供されています。言語を特に指定しない場合に ASP が使用する言語を主要スクリプト言語と呼びますが、デフォルトでは VBScript が主要スクリプト言語になっています。ASP での各種スクリプト言語の使い方、およびデフォルトの主要スクリプト言語の変更方法の詳細については、「スクリプト言語の使用」を参照してください。

ASP の構文

ASP 自体はスクリプト言語ではなく、HTML ページに組み込まれたスクリプトを処理する動作環境を提供するものです。ASP を正しく使うためには、その動作を決める構文を理解する必要があります。

区切り記号

HTML タグとテキストとは区切り記号によって区別されます。区切り記号とは、ある情報単位の始めと終わりを示す 1 文字以上の文字の集まりのことです。HTML の場合は、小なり記号 (<) および大なり記号 (>) が区切り記号です。

同様に、ASP のスクリプト コマンドと出力式は、区切り記号によってテキストや HTML タグと区別されます。ASP では、スクリプト コマンドを囲む区切り記号として <%%> を使います。たとえば、<% sport = "climbing" %> というコマンドは、変数 sportclimbingという値を割り当てます。

また、ASP では出力式を囲む区切り記号として <%=%> を使います。たとえば、<%= sport %> という出力式は、値 climbing (変数の現在の値) をブラウザに送ります。

単一の式

ASP の区切り記号で囲まれた部分には、主要スクリプト言語として有効などのような式でも記述できます。たとえば、次の行は現在のサーバー時刻を出力するテキストを生成します。

このページの最新更新時刻は <%= Now %> です。

この例の場合、Web サーバーは VBScript の関数である Now の値をテキストといっしょにブラウザに返します。

ステートメント

VBScript などのスクリプト言語で使われるステートメントは、それ自体で 1 つの完全な動作や宣言、定義などを表す構文単位です。次の例で使われている条件ステートメント If...Then...Else は、標準の VBScript ステートメントの 1 つです。

<% 
If Time >=#12:00:00 AM# And Time < #12:00:00 PM#  Then 
  greeting = "Good Morning!" 
Else 
  greeting = "Hello!" 
End If
%> 

このステートメントは、 "Good Morning!" または "Hello!" のどちらかの値を変数 greeting に格納しますが、クライアントのブラウザに値を送ることはありません。次の行は、クライアントのブラウザに値を緑色で送ります。

<FONT COLOR="GREEN"> 
<%= greeting %> 
</FONT>

この例では、(Web サーバーのタイム ゾーンで) 午前 12:00 前までにこのスクリプトを見たユーザーには次のように表示されます。

Good Morning!

午前 12:00 を過ぎてからこのスクリプトを見たユーザーには次のように表示されます。

Hello!

ステートメント内での HTML の挿入

ステートメントの内部に HTML テキストを挿入することができます。たとえば、次のスクリプトでは If...Then...Else ステートメントの内部に HTML を記述していますが、前のスクリプト例とまったく同じ結果が得られます。
<FONT COLOR="GREEN">
<% If Time  > = #12:00:00 AM# And Time < #12:00:00 PM#  Then %> 
Good Morning!
<% Else %>
Hello!
<% End If %> 
</FONT>

条件が真、つまり時刻が真夜中以降かつ正午前である場合、Web サーバーは条件ステートメントの後に記述されているテキスト ("Good Morning") をブラウザに送ります。条件が偽の場合には、Else ステートメントの後に記述されているテキスト ("Hello") をブラウザに送ります。

スクリプト タグ

スクリプト区切り記号の内部で使用するステートメント、式、コマンド、およびプロシージャは、デフォルトの主要スクリプト言語で有効なものを使用する必要があります。ASP では、デフォルトの主要スクリプト言語として VBScript が設定されています。しかし、ASP ではこれ以外の主要スクリプト言語の指定も可能であり、これには HTML スクリプト タグである <SCRIPT> および </SCRIPT> を使います。使用するスクリプト エンジンに対応する言語で完全なプロシージャを記述し、それらを <SCRIPT> および </SCRIPT> で囲み、さらに LANGUAGE 属性と RUNAT 属性を使います。

たとえば、次の .asp ファイルは JScript のプロシージャである MyFunction を処理します。

<HTML>
<BODY>
<%Call MyFunction%>
</BODY>
</HTML>

<SCRIPT RUNAT=SERVER LANGUAGE=JSCRIPT>
  function  MyFunction ()
  {
      Response.Write("MyFunction が呼び出された")
  }  
</SCRIPT>


重要   <SCRIPT> タグの内部には、完全なプロシージャの一部とはなり得ない出力式やスクリプト コマンドは記述しないでください。

デフォルトの主要スクリプト言語で記述したプロシージャを、ASP 区切り記号の内部に挿入することもできます。詳細については、「スクリプト言語の使用」を参照してください。

他のファイルの挿入

サーバーサイド インクルードは、処理前のファイルに情報を挿入するための機構です。ASP ではこの機構の前処理疑似命令である #INCLUDE だけが実装されています。この疑似命令を使うと、ASP が .asp ファイルを処理する前に、その .asp ファイルに別のファイルの内容を挿入することができます。これには、次の構文を使います。

<!--#INCLUDE VIRTUAL|FILE="filename"--> 

ここでは、VIRTUAL または FILE のどちらかを入力する必要があります。これらはファイルの挿入に使用するパスの種類を示すキーワードです。filename は、挿入するファイルのパスとファイル名です。

インクルードするファイルには特にファイル名拡張子を付ける必要はありませんが、ほかの種類のファイルと区別できるように .inc という拡張子を付けるようにしてください。

仮想キーワードの使用

仮想ディレクトリで始まるパスを示すには、キーワード Virtual を使います (仮想ディレクトリの使用の詳細については、Microsoft Web サーバーのオンライン マニュアルを参照してください)。たとえば、Footer.inc というファイルが /Myapp という仮想ディレクトリにある場合、次の行はこの行のあるファイルに Footer.inc の内容を挿入します。

<!--#INCLUDE VIRTUAL="/myapp/footer.inc"--> 

ファイル キーワードの使用

相対パスを示すには、キーワード File を使います。相対パスは、インクルード先のファイルのあるディレクトリで始まります。たとえば、インクルード先のファイルが Myapp というディレクトリにあり、Myapp\Headers の中に Header1.inc というファイルがある場合、次の行は Header1.inc をインクルード先のファイルに挿入します。

<!--#INCLUDE FILE="headers/header1.inc"-->

インクルード元のファイル Headers/header1.inc へのパスはインクルード先のファイルからの相対パスであることに注意してください。この Include ステートメントのあるスクリプトが /Myapp ディレクトリになければ、ステートメントは正常に動作しません。

レジストリ エントリ EnableParentPaths が 1 に設定されていれば、FILE パラメータで ../ を使うことで、親ディレクトリ、またはより上位のディレクトリからファイルを挿入することもできます。詳細については、「レジストリ エントリの設定」を参照してください。

ファイル挿入時の注意

インクルード元のファイルに別のファイルを挿入することもできます。.asp ファイルには同じファイルをいくつも挿入できます。ただし、<INCLUDE> ステートメントが無限ループにならないことが条件です。たとえば、ファイル First.asp にファイル Second.inc を挿入する場合、Second.inc に First.asp を含めることはしないでください。また、ファイルに自分自身をインクルードしないようにしてください。ASP はこのようなループやネストのエラーを検出するとエラー メッセージを出し、要求された .asp ファイルの処理を中止します。

ASP は、ファイルのインクルードをスクリプト コマンドの実行前に行います。このため、スクリプト コマンドを使ってインクルード先ファイルの名前を指定することはできません。たとえば、次のスクリプトでファイル Header1.inc を開くことはできません。これは、ASP はファイル名を変数 name に割り当てる前に #Include 疑似命令を実行しようとするためです。

<!-- This script will fail -->
<% name=(header1 & ".inc") %> 
<!--#include file="<%= name %>"-->

スクリプト コマンドおよびプロシージャは、全体がスクリプト区切り記号 <% および %> の間、HTML タグ <SCRIPT> および </SCRIPT> の間、または HTML タグ <OBJECT> および </OBJECT> の間に記述されている必要があります。つまり、インクルード先の .asp ファイルの中でスクリプト区切り記号を開き、インクルード元のファイルでスクリプト区切り記号を閉じる、ということはできません。スクリプトやスクリプト コマンドは必ず区切り記号内でひとまとまりになっていることが必要です。たとえば、次のスクリプトは正常に動作しません。

<!-- このスクリプトは失敗します -->
<%
For i = 1 To n
  statements in main file
  <!--#include file="header1.inc" -->
Next
%> 

次のスクリプトは正常に動作します。

<% 
For i = 1 to n
  statements in main file
%> 
<!--#include file="header1.inc" -->
<% Next %> 

サーバー スクリプトを使ったクライアント スクリプトの変更

ASP は主にサーバーサイド スクリプトの処理に使われますが、クライアントのブラウザが処理するクライアントサイド スクリプトを生成するように機能を拡張することができます。これを実現するために、ASP は、HTML のコメントで囲まれたクライアントサイド スクリプトを、区切り記号で囲まれたサーバーサイド スクリプトと組み合わせます。

<SCRIPT LANGUAGE="VBScript">	
<!--

クライアント スクリプト
<% サーバー スクリプト %>
クライアント スクリプト
<% サーバー スクリプト %>
クライアント スクリプト
...
-->
</SCRIPT>

スクリプトでこの機能を使えば、より高度な機能を持つアプリケーションを作成できます。たとえば、次のスクリプトは、ユーザーが操作を行うことにより、データベースを利用して特定のクライアント スクリプトを提供します。

その次のスクリプトでは、ASP はデータベース (この例では音楽のアーティストやアルバムに関するデータベース) からデータを取得し、各行のデータごとにサブルーチンを生成します。生成されたこれらのサブルーチンによって、クライアント ブラウザに表示されるページのリンクをユーザーがクリックしたときの動作が決まります。

注意   このスクリプトは単独では動作しません。この例は、データベース、サーバー サイド スクリプト、およびクライアントサイド スクリプトと ASP の機能との併用例として紹介したものです。

<!-- このスクリプトは未完成です。 -->
<%
Set rsAlbums = Server.CreateObject("ADODB.Recordset")
rsAlbums.Open "SELECT Artists.*, Albums.* FROM Albums INNER JOIN Artists ON
Albums.ArtistID = Artists.ArtistID", Session("Conn"), 1, 2
Do While rsAlbums.EOF = False
%>
  <SCRIPT LANGUAGE="VBScript">
  <!--Sub Enhanced_OnLoad()
	Enhanced.DrawBuffer = 500000
  End Sub
  Sub AlbumHotSpot<%=rsAlbums("AlbumID")%>_MouseEnter()
	AlbumName.Caption = "<%= rsAlbums("AlbumName")%>"
	ArtistName.Caption = "<%= rsAlbums("ArtistName")%>"
	Divider.Visible = true
  End Sub
  Sub AlbumHotSpot<%= rsAlbums("AlbumID")%>_Click()
	Window.Location.HRef = "details.asp?Albumid=<%= rsAlbums("AlbumID")%>"
  End Sub-->
  </SCRIPT>
<%	
rsAlbums.MoveNext
Loop
%>

この種のスクリプトは、ユーザーのイベントに関連するコントロールを作成するように拡張することができ、さらに動的に生成されるイベント ハンドラを持つコントロールの集まりを、高い信頼性のもとで作成できます。このようなスクリプトを記述することにより、Web の開発者はデータベース情報を操作する関数やサブルーチンを作成でき、煩雑なスクリプト プロシージャを記述する必要がなくなります。


(C) 1996-1997 Microsoft Corporation. All rights reserved.