|
事業仕分けによる次世代スーパーコンピューターの開発予算削減について、どうお考えですか?
|
XMLHTTPRequestを利用したクライアント側の妥当性検証はじめに私は15seconds.comの熱心な読者であり、フォームの妥当性検証に関する記事をこれまでに数多く読んできました。フォームの妥当性検証では、フィールドの内容や構造を調べるだけでなく、リアルタイムのデータルックアップも扱うべきです。本稿では、MicrosoftのXMLHTTPRequestコンポーネントを利用してフォームの妥当性検証を改良し、ユーザーにもっと快適にWebを利用してもらうための方法を説明します。 HTTPのプログラミングWin32プラットフォーム上でHTTP呼び出しを行うには、以前からいくつかの方法がありました。Visual Basic開発者とC++開発者はWinInetライブラリを使用でき、Visual BasicプログラマはVisual Basic 6.0付属のInternet Controlを使用できました。しかし、ASP開発者がこの機能を使用するためにはもう少し手間がかかりました。ASPコードと洗練されたやり取りをするには、これを独自のコンポーネント内にラップする必要があったからです。「生の」スクリプティングでは、この作業は困難です。 たいていの人は、HTTPのことを「ブラウザがWebサーバーと通信するときに使うプロトコル」と考えています。しかし、HTTPはただのプロトコルであり、そのままで強力な機能を備えているということに注意してください。HTTPは、どんなアプリケーションが別のアプリケーションやコンポーネントと通信するときにも使用できるプロトコルであり、使用するアプリケーションはブラウザやWebサーバーに限りません。我々Web開発者は、HTTPプロトコルを使用することの利点をよく知っています。たとえば、ファイアウォールを越えて利用できること、インターネット標準に従っていることなどです。 Microsoftが自社のXMLツールキットに XMLHTTPRequestとXMLHTTP XMLHTTPを使用してリアルタイムのデータ妥当性検証を実行するたとえば、あなたが自分の開発しているWebサイトでユーザー登録情報を収集したいと考えているとします。フィールドの1つは[User ID](ユーザーID)です。当然ながら、ユーザーIDはサイト内で一意でなければなりません。そこで、ユーザー登録時には、入力されたユーザーIDがサイト内にまだ存在しないIDであることを確認する必要があります。入力されたユーザーIDが既に存在する場合は、その旨をユーザーに通知し、別のIDを入力するよう求めます。 このような要件を満たすための一般的な方法は、フォームのポスト時にルックアップ処理を行うことです。しかし、ユーザーの立場からすると、これは最善の方法とは言えません。フォームを発行してみないとどの値を入力し忘れているかがわからない、という状況は非常にイライラします。ページのポスト時にルックアップをするという方法のもう1つの欠点は、「○○を訂正してください」メッセージを表示する場合に、再びサーバーや画像、スクリプトなどを通らなければならないという点です。 この問題に対処するための理想的な方法は、ユーザーがユーザーIDを入力したときに、それが一意かどうかをその場で判定して通知することです。デスクトップアプリケーションであれば、話は簡単です。テキストボックスの「フォーカス喪失」イベントにコードを記述すればよいのです。Javascriptと それでは、具体的な例を見てみましょう。ある架空企業のユーザー登録のシナリオを考えてみます。 ![]() [User ID]フィールドのHTMLコードは次のとおりです。
<input type="text" name="UserID" onblur="validateuserid(this.value);">
このonblurイベントでは、ユーザーが[User ID]テキストボックスからフォーカスを移動したときに妥当性検証ルーチンを呼び出します(注:フォーカスドリブン式の妥当性検証を好まない人は、このルーチンを[Register]ボタンのonclickイベントから呼び出してもかまいません)。 では、妥当性検証を行うJavaScriptコードを見てみましょう。 <SCRIPT TYPE="text/javascript" LANGUAGE="JavaScript"> function validateuserid(suserid) { document.body.style.cursor=’wait’; // Create an instance of the XML HTTP Request object var oXMLHTTP = new ActiveXObject( "Microsoft.XMLHTTP" ); // Prepare the XMLHTTP object for a HTTP POST to our validation ASP page var sURL = "http://mysite/mypath/validateuser.asp?username=" + suserid oXMLHTTP.open( "POST", sURL, false ); // Execute the request oXMLHTTP.send(); if (oXMLHTTP.responseText == "exists") alert("Sorry - the User ID " + suserid + " already exists."); document.body.style.cursor=’auto’; } </SCRIPT> このスクリプトで何をしているかをブロックごとに見ていきます。 document.body.style.cursor=’wait’; このスクリプトではこれからHTTP呼び出しを行いますが、その処理に数秒かかることがあるので、マウスポインタを砂時計に変更して、ユーザーにフィードバックを与えます。ユーザー側の利便性を考えると、マウスポインタの形状を変更すること以外にも、もっといろいろできることがあります。JavascriptとDHTMLを使用すれば、必要なことは何でもできます。実際、フィードバックを返すにはもっと洗練された方法がありますが、それは後で紹介します。 // Create an instance of the XML HTTP Request object var oXMLHTTP = new ActiveXObject( "Microsoft.XMLHTTP" ); ここでは
// Prepare the XMLHTTP object for a HTTP POST to our validation ASP page
var sURL = "http://mysite/mypath/validateuser.asp?userid=" + suserid
oXMLHTTP.open( "GET", sURL, false );
この 3つ目のパラメータでは、この呼び出しを非同期的に行うかどうかをオブジェクトに指示します。この例では さらに、 これで要求の準備ができたので、後はこれを送信するだけです。 // Execute the request objXMLReq.send(); この時点で、オブジェクトが実際に要求をインターネットに送出し、ターゲットページのコンテンツを取得します。ここで、コンテンツをチェックして検証結果を判別します。 if (objXMLReq.responseText == "exists") alert("Sorry - the User ID " + suserid + " already exists."); ユーザーIDが既に別のユーザーに割り当てられている場合は、ターゲットページから「exists」という単語が返されます。これは、そのユーザーIDが既にデータベース内にあることを意味します(ここで返される値は自由に定義してかまいません。たとえばASPページは数値を返すこともできます)。最後に、マウスポインタを元に戻します。 document.body.style.cursor=’auto’; 次に、前述のスクリプトがルックアップ時に参照するASPページのコードを見てみましょう。 <% Dim objConn, objRS, sUserID ’Capture the username that we need to lookup, making sure its prepared for ’our forthcoming SQL query sUserID = Replace(Trim(Request.QueryString("userid")),"’","") ’Fire up ADO - ask the database whether or not the user idexists Set objConn = Server.CreateObject("ADODB.Connection") objConn.Open CONNECTIONSTRING sSQL = "select userid from usertable where userid = ’" + sUserID + "’" Set objRS = objConn.Execute(sSQL) If Not objRS.EOF Then Response.Write "exists" ’Clean up objRS.Close objConn.Close Set objRS = Nothing Set objConn = Nothing %> これは、渡されたユーザーIDがデータベース内に存在する場合に単語「exists」を書き出す簡単なASPコードです。このページを単独で実行した場合、指定のユーザーIDが存在しないときはブラウザに何も表示されません。このページは、ユーザーIDが存在する場合に単語「exists」を返すだけだからです。この動作を利用して、検証用ASPページをクライアントスクリプトに統合する前に、ASPページをテストすることができます。 タイムアウトの処理 この方法でまず疑問に思うのは、「リモートサイトがダウンしている場合にはどうするか。タイムアウトやエラーはどう処理すればよいか」という問題でしょう。 ここで、 <!-define a div that will be our pseudo progress indicator --> <div id="divProgress">Please wait</div> <SCRIPT TYPE="text/javascript" LANGUAGE="JavaScript"> // Create an instance of the XML HTTP Request object var oXMLHTTP = new ActiveXObject( "Microsoft.XMLHTTP" ); var userid; function validateuserid(suserid) { // Prepare the XMLHTTP object for a HTTP POST to our validation ASP page userid = suserid; var sURL = " http://mysite/mypath/validateuser.asp?userid=" + userid; oXMLHTTP.open( "POST", sURL, false ); // Define an event handler for processing oXMLHTTP.onreadystatechange = managestatechange; // Execute the request try { oXMLHTTP.send(); } catch (e) { alert("Could not validate your User ID at this time."); document.all.item("FirstName").focus; } } function managestatechange() { switch (oXMLHTTP.readyState) { case 2, 3: // Display a progress indicator of some kind, informing the // user that you are checking to see if the UserID exists document.all.item("divProgress").style.display = "block"; break; case 4: if (oXMLHTTP.responseText == "exists") alert("Sorry - the User ID " + userid + " already exists."); document.all.item("divProgress").style.display = "none"; break; } } // Hide the progress indicator for now document.all.item("divProgress").style.display = "none"; </script> このスクリプトで重要なのは、イベントハンドラを設定する部分のコードです。
// Define an event handler for processing
oXMLHTTP.onreadystatechange = managestatechange;
この行では、HTTP要求の状態が変化したときに
- MSDNより 修正後のスクリプトでは、堅牢性を高めるためにエラー処理コードも追加しています。リモートサイトがダウンしている場合や、ページが存在しない場合も考えられるからです。 // Execute the request try { oXMLHTTP.send(); } catch (e) { alert("Could not validate your User ID at this time."); document.all.item("FirstName").focus; } このコールバック関数内のコードが終了すると、制御は呼び出し側ルーチンに戻ります。問題が発生した場合は、問題に対処します。ここでフォーカスを別のフィールドに設定していることに注意してください。これは重要です。そうしないと、ユーザーが[User ID]フィールドから移動できなくなるからです。 余談になりますが、ここで 本稿を通じて、Microsoftの 著者紹介Jonathan Zufi(Jonathan Zufi)
UDU World社(http://www.uduworld.com)の創立者。同社は独自のActiveInbox技術に基づくソリューションを販売しているソフトウェア会社。ActiveInboxとは、電子メールおよびモバイルテキストメッセージングによる情報アクセスを実現するためのバックエンドの情報/コンテンツ配布プラットフォームである。
ソフトウェア開発の分野で10年以上のキャリアを持つ。モナッシュ大学(オーストラリア、メルボルン)でロボット電子技術の優等学位を取得。先ごろ、オーストラリアの情報コンピュータ技術の研究開発における目覚しい業績と貢献が認められてAustralia Computer SocietyからPearcey Awardを受賞。メールの宛先はjonathanzufi@UDUworld.com。 関連記事 最新トップニュース
|
japan.internet.com 10周年記念
インターネットコムマーケティングセミナー ROI を最適化するパフォーマンスマーケティングの最前線 【12/16(水)13時〜 東京・赤坂】 申込はコチラ>>
|