印刷用ページ       送信     
クリックして評価とフィードバックをお寄せください
MSDN
MSDN ライブラリ
テクニカルドキュメント
コラム
Scripting Clinic
 Remote Scripting
Remote Scripting

Andrew Clinick
Program Manager
Microsoft Corporation

April 12, 1999
日本語版最終更新日 1999 年 12 月 6 日

この記事は、MSDN Online Voices Scripting Clinic に掲載された記事を転載したものです。

どのくらい多くの人が、「ページ全体を更新しなくても Web サーバーと通信できればよいのに」と思っていることでしょう。私はそれが Web ページのフォーム デザインを実際に制限しているということを知っています。私は、自分自身が作成したアプリケーションのユーザインターフェイスを完全に制御することが可能であり、結果として、画面を更新するタイミングも制御できることを期待しています。これは、多くのアプリケーション開発者にとって、ユーザインターフェイスを HTML に移行することを考慮する際の悩みの種となっています。その決定を容易にするために、我々は Remote Scripting というテクノロジーを開発しました。本質的に、Remote Scripting は、ページを更新しなくても、サーバーサイド Active Server Pages (ASP) スクリプトの呼び出しを可能にします。この "Scripting Clinic" のインストールによって、どのように Remote Scripting が動作するか、Web アプリケーションでどのように使用できるか、そして将来どんな方向に向かうのかを説明します。

どのように動作するか

Remote Scripting が、どのように動作するかを説明する前に、通常の HTML ページの動作を簡単に説明しておくことにしましょう。一般に、Web ページは、ユーザーがフォームの [送信] ボタンをクリックしたときにサーバーと通信します。[送信] をクリックすると、ブラウザはフォーム フィールドの値を取得して、HTTP 要求を作成し、それをサーバーに送信します。サーバーは、情報を受け取り、必要なこと (たとえばデータベースへの問い合わせなど) を行い、通常は HTML 形式でデータを返します。これがインターネットでうまく働いている理由は、HTTP がコネクションレス型のプロトコルであり、結果的にネットワークやサーバーへの負荷が少なく抑えられているからです。

Remote Scripting は、このメカニズムに基づいています。すなわち、ポート 80 上でサーバーへの HTTP 要求を使用します。これは、多くのファイヤウォールを通過できるという意味で有利です。しかし、Remote Scripting はユーザーが [送信] ボタンをクリックすることに依存するのではなく、クライアントサイドの機能を呼び出すのと同じように、サーバー上のコードを呼び出すメカニズムを提供します。このために 3 つのコンポーネントを使用します。

  1. クライアントサイドの Microsoft Jscript®
  2. クライアントサイドの Java アプレット
  3. サーバーサイドの JScript

Remote Scripting 対応の Web ページは、スクリプト ブロックをページに追加して、関数 RSEnableRemoteScripting をコールします。この関数は、実行中のブラウザを調べて (私はこれが Microsoft Internet Explorer と Netscape Navigator 上で動作するということを言ったでしょうか?) 、まずページに Java アプレットをロードします。Java アプレットは、Remote Scripting のクライアントでの鍵です。アプレットがするのは、HTTP を介してサーバーと通信するメカニズムを提供することだけです。リモート スクリプト コールが行われると、アプレットを通じてサーバーに要求が送信されます。

要求を受け取ったサーバー ASP ファイルは、通常のフォーム送信からの要求と同じように処理するので、ASP ページのプログラミング方法を大幅に変える必要はありません。主な違いは、ASP ページ全体を呼び出すのではなく、ページ上の特定の関数を呼び出すということです。さらに、関数から値を返すだけなので、HTML をクライアントに書き戻す必要がありません。関数から値が返されると、Remote Scripting は結果を XML 形式でラップして、クライアントに送り返します (詳細については、後で述べます)。

サーバーから応答を受け取ったアプレットは、その XML からスクリプト オブジェクトを作成し、プロパティに結果を入れます。主なプロパティは return_value であり、サーバー上で呼び出された関数の結果を含みます。サーバー関数の呼び出し方法に応じて、Remote Scripting は、結果が返されるまでスクリプト コードの実行をブロックするか (同期コール)、ただちにリターンして、データが返されたときに関数を再び呼び出します (非同期コール)。非同期コール機能は、UI 設計の柔軟性を高めるだけでなく、関数コールの間もユーザーのブラウザを停止させないという利点があります。マイナス面は、非同期プログラミングは従来の同期プログラミングより、少しだけ多くの労力を必要とすることです。

ms974566.scripting0499-1(ja-jp,MSDN.10).gif

Remote Scripting の動作

Remote Scripting の詳細に入る前に、簡単な例を示すことにします。例として、Web ページについて、よくある不平の 1 つを解消できないか、やってみることにしましょう。私は、長いフォームに記入して、[送信] ボタンをクリックした後、特定のフィールドへの入力が間違っていることを知らせるページが表示されるというのが、嫌でたまりません。なぜ、[送信] ボタンをクリックする前にチェックできないのでしょう?

この例は、航空券の予約ページです。このフォームには、出発空港と到着空港、出発日、人数、その他の詳細を記入する必要があります。最初の例では、ページに表示されるのは、5 つのテキスト ボックスを含んだ単純なフォームです。出発空港フィールドにデータを入力して、次のテキスト フィールドに移動すると、空港を確認するためにサーバーに対するコールが行われます。これはデモにすぎないので、私の ASP コードがチェックするのはロンドンの空港だけです。入力された空港名が London の場合は、ロンドンのすべての空港名を示すデータを返します。London 以外の入力は正しいと見なされるので、London と入力しない限り、追加の情報は表示されません。

クライアント上では、空港テキスト ボックスの onblur イベントによって、かなり単純なスクリプトが呼び出されます。


                  

<script language="JScript" src="../_ScriptLibrary/rs.htm"></script>
<script language="JScript">
RSEnableRemoteScripting("../_ScriptLibrary");
</script>
<script language="JScript">
function txtDepart_onblur()
{
 var objTest
 /*  airport.asp 上の validateAirport メソッドを呼び出す
  その後、airportCallBack で再び呼び出す */
 objTest = RSExecute("airport.asp","validateAirport",txtDepart.value)

 // エラーがないかどうかをチェックする
 if (objTest.return_value != true) 
 {
  // DIV でエラーを表示する
  alert(objReturn.return_value);
 }
}
</script>

                

最初の 2 つのスクリプト ブロックによって、ページでの Remote Scripting の使用が可能になります。最初のブロックは、クライアント上で Remote Scripting を実行するために必要な JScript コードを含んでいます。2 番目のブロックは、Remote Scripting を有効にするために RSEnableRemoteScripting 関数を呼び出します。

txtDepart テキスト ボックスがフォーカスを失うと、RSExecute 関数を通じて、サーバーへのコールが行われます (なぜ、このイベントが onblur と名付けられたのか、私にはわかりません。onlosefocus の方がわかりやすいと思うのですが。Web の謎の 1 つです)。RSExecute は、クライアントサイドの要求をサーバーの呼び出しに翻訳する「マジック」です。これは、ASP ページ (airport.asp) の URL、呼び出したいメソッドの名前 (validateAirport)、メソッドの引数 (txtDepart.value と「出発空港」) を取得します。オプションとしてコールバック関数を指定することができますが、最初の例では、単純にするために、同期呼び出しにしてあります。

validateAirport メソッドは、完了すると、コールと戻り値に関する情報をオブジェクトに返します。スクリプトは戻り値を取得し、エラー メッセージとともに alert メソッドを呼び出します。この方法は確かにスマートではありませんが、とても単純であり、Internet Explorer 3.0 以上と Navigator 3.0 以上で動作します。

サーバー上で実行するコードは以下のとおりです。


                  

<%@ LANGUAGE=VBSCRIPT %>
<% 
' Define my Airport class
Class clsAirport
  public function validateAirport(strAirport)
 if lcase(strAirport) = "london" then
  validateAirport = "Which London airport?" & vbCRLF
validateAirport = validateAirport & "Heathrow (LHR)" & vbCRLF
validateAirport = validateAirport & "Gatwick (LGW)" & vbCRLF
validateAirport = validateAirport & "Stansted (LST)" & vbCRLF
 else
  validateAirport = true
 end if
  end function
end class

set public_description = new clsAirport

' Call RSDispatch to use the public_description object and make its methods available for Remote Scripting Calls
RSDispatch %>
<!--#INCLUDE FILE="../_scriptlibrary/rs.asp"-->

                

サーバーでの Remote Scripting の鍵は、public_description オブジェクトの作成です。このオブジェクトによって公開されるメソッドは、Web ページから呼び出すことができます。これは、ASP ページから選択的に機能を公開するためのメカニズムとなります。public_description オブジェクトの一部でない関数は Private のままであり、Remote Scripting を介して呼び出すことはできません。

今までに Remote Scripting を使用したことがある人は、私がサーバー上においても JScript に依存するのではなく、Microsoft Visual Basic® Scripting Edition (VBScript) を使用していることに気づくでしょう。今までは、こういうことはできませんでした。従来の VBScript では、内部でオブジェクトを作成することはできなかったからです。しかし、バージョン 5.0 のリリースでは、VBScript は言語に組み込まれたクラスを持つようになりました。Remote Scripting 1.0 が書かれたときには VBScript を使用することができなかったので、私はサーバー上の Remote Scripting コードにいくつかの変更を加えなければなりませんでした (実際には、2 行ほどのコード)。Remote Scripting バージョン 1.0a によって、VBScript の使用が可能になります。このバージョンは、http://www.microsoft.com/japan/msdn/scripting/remotescripting/rsdown.htmNon-MSDN Online link からダウンロードすることができます。Remote Scripting を利用する際、サーバー上で JScript だけしか使用しないという人は、今までどおり Remote Scripting 1.0 を使用してください。

非同期呼び出し

最初のスクリプト例は、Remote Scripting で何ができるかという概念を示したものですが、Web ページのユーザビリティという点では、あまり役に立ちません。ユーザーが到着空港テキスト ボックスから移動すると、ブラウザは呼び出しが完全に終了するまでフリーズします。そして、呼び出しが終了したときの警告ダイアログも優雅とは言えません。次のコード サンプルでは、メソッド コールは Remote Scripting の非同期コール機能を利用して、より直観的な方法で情報を返します。

非同期コール機能を利用するためには、リモート スクリプト コールが完了したときに呼び出される関数を用意して、その関数の名前を RSExecute コールの引数として渡す必要があります。

この機能をデモンストレーションするために、最初の例をもとに、使い勝手がより円滑になるようにしてみました。最初の例で出発空港テキスト ボックスから到着空港テキスト ボックスに移動したときには、ブラウザが応答するまでに (接続の速度によって) かなりのタイムラグがありました。そして、正しくない空港を入力した場合には、みっともない警告ダイアログが表示されました。非同期コールを使用すると、呼び出しが行われるとすぐにブラウザ UI へとリターンされるので、ブラウザのロックアップを防ぐことができます。したがって、実際は Remote Scripting が関数からの戻り値を待っている間も、ユーザーは入力を続けることができます。関数がリターンすると、コールバック関数が呼び出されて、空港が有効かどうかをチェックします。無効な場合には、error info という名前の <DIV> 要素にリターン情報が入れられます。

クライアント コードを見てみましょう (サーバー側のコードは先ほどと同じです):


                  

function txtDepart_onblur()
{
var varTest
varTest = RSExecute("airport.asp","validateAirport",txtDepart.value,"Departure Airport",airportCallBack,"divDepartError")
 }

function txtGoing_onblur()
{
 var varGoingTest
 varGoingTest = RSExecute("airport.asp","validateAirport",txtGoing.value,"Arrival Airport",airportCallBack,"divGoingError")
}

function airportCallBack(objReturn) 
{
 // Check to see if we have an error
 if (objReturn.return_value != true) 
 {
  // Display the error in the div
  window[objReturn.context].innerHTML = objReturn.return_value;
 }
 else
 {
  // It worked so set the innerHTML to be nothing 
  window[objReturn.context].innerHTML = "";
 }
}

                

このコードは最初の例とほとんど同じですが、RSExecute コールにさらに 2 つの引数が含まれています。すなわち、コールバック関数と、エラーを表示するために使用される <DIV> の名前です。最後の引数は、Remote Scripting のコンテキスト機能を利用します。コンテキスト引数がすることは、呼び出し側関数からコールバック関数に情報を渡せるようにすることだけです。Remote Scripting はコンテキスト引数を取得し、返されたオブジェクトのコンテキスト プロパティを設定します。この例では、コンテキストはエラーの詳細が書き込まれる <DIV> の名前を指定するために使用されています。私のコードは、より大きいフォームのためのスケーラビリティはありませんが、何ができるかという概念はおわかりいただけると思います。

ASP オブジェクトを返す

Remote Scripting が提供するもう 1 つの機能は、サーバー上で作成されたオブジェクトを返して、それをクライアント上で呼び出せることです。たとえば、サーバー上で Customer オブジェクトを作成して、そのメソッドをクライアント上で使用することができます。主な違いは、オブジェクトのメソッドを呼び出すと、コードはクライアント上ではなくサーバー上で実行されることです。このため、いろいろとおもしろいことができます。常に RSExecute を呼び出さなければならないわけではなく、より伝統的な方法でコード化することもできます。

オブジェクトの使い方を説明するために、空港アプリケーションを更新して、ページ上で関数を呼び出すだけでなく、オブジェクトとして airport.asp を使用するようにしました。都合がよいことに、ASP ページをオブジェクトとして使用するために、ASP コードを変更する必要はありません。すでに public_description オブジェクトがあるからです。ただし、ページの呼び出し方を変更する必要があります。

ASP ページからオブジェクトを作成するために、Remote Scripting には RSGetASPObject という気のきいた名前の関数が用意されています (よい名前の関数の 1 つだと思います)。この関数は、引数を 1 つだけ取ります。それは、ASP の URL です。この関数が呼び出されると、サーバーへの同期コールを行って、ASP ページの public_description オブジェクトに基づくプロキシ オブジェクトを返します。クライアントサイドのオブジェクトと同じように、HTML ページ上のスクリプト コードからこのプロキシ オブジェクトのメソッドを呼び出すことができます。メソッド コールを受け取ったオブジェクトは、Java プロキシ アプレットを介して、コールをサーバーにリダイレクトします。


ms974566.scripting0499-2(ja-jp,MSDN.10).gif

ASP ページをオブジェクトとして使用するクライアントサイドのコードを見てみましょう。


                  

 var aspObject;
 
 function window_onload() {
  aspObject = RSGetASPObject("airport.asp")
 }

 function txtDepart_onblur()
 {
  var varTest
  varTest = aspObject.validateAirport(txtDepart.value,"Departure Airport",airportCallBack,"divDepartError")
 }

                

このコードは、前の例とそれほど違うわけではありませんが、RSExecute コールが aspObject オブジェクトのメソッド コールに置き換えられています。validateAirport メソッドも、RSExecute とまったく同じ非同期コールとコンテキストを提供します。

では、RSExecutegetASPObject のどちらを使用すべきでしょうか? 答は、あなたのプログラミング スタイルによって違います。オブジェクトを扱い慣れている人にとっては、ASP をオブジェクトとして扱うのは魅力的でしょう。それに、プログラミングが少しだけ簡単になります。また、サーバー上の VBScript オブジェクトをクライアント上の JScript に簡単に結び付けることができるという利点もあります。オブジェクトに慣れていない人は、RSExecute を使用するとよいでしょう。

まとめ

この記事で Remote Scripting があなたの Web 開発にどのように役立つかを理解してもらえたのではないかと思います。実際、Remote Scripting を使用することで、ユーザーは、今日普及している従来型のサブミット/リフレッシュ モデルよりも一歩進んだ HTML を体験できます。元々の HTTP デザインに縛られることなく、好きなときにサーバーの機能を呼び出すことができるのです。

言うまでもなく、Remote Scripting をフルに活用するには、HTML 4.0 と DOM をサポートする Web クライアント (Internet Explorer 4.0 と 5、および Navigator 4.5) が必要ですが、それ以前のクライアントでは使用できないというわけではありません。Remote Scripting は、ECMAScript とスクリプト対応の Virtual Machine for Java をサポートするほとんどのブラウザで動作します。サーバー上にインテリジェントなスクリプトを用意すれば、HTML 3.2 をより古いクライアントに、または HTML 4.0 をより新しいクライアントに対応したコードをその都度、返送することができます。Remote Scripting の詳細については、http://www.microsoft.com/japan/msdn/scripting/default.htmNon-MSDN Online link と我々のニュースグループNon-SBN linkを参照してください。皆さんから Remote Scripting とどのように取り組んでいるかを聞けることを楽しみにしています。

Andrew Clinick は、Microsoft Script Technology Group の Program Manager であり、おそらく、スクリプトが関係している所には、彼が関わっているはずです。余暇の大半は、米国のテレビでまともなラグビー中継を見ることと、新しいアメリカ人の同僚にクリケットを説明することに費やしています。


© 2012 Microsoft. All rights reserved. 使用条件 | 商標 | プライバシー
Page view tracker