データサービスへのアクセスの概要

Flex のデータアクセスと他のテクノロジとの比較

Flex におけるデータソースやデータの操作は、ユーザーインターフェイスに HTML を使用しているアプリケーションとは異なります。

クライアント側の処理とサーバー側の処理

JSP とサーブレット、ASP、PHP、CFML などを使用して作成される HTML テンプレートとは異なり、Flex ではクライアントコードをサーバーコードから分離します。アプリケーションのユーザーインターフェイスは、バイナリの SWF ファイルにコンパイルされて、クライアントに送信されます。

アプリケーションがデータサービスに対して要求を行うとき、SWF ファイルは再コンパイルされず、ページ更新も不要です。リモートサービスはデータのみを返します。Flex は、返されたデータをクライアントアプリケーションのユーザーインターフェイスコンポーネントにバインドします。

例えば、Flex では、ユーザーがアプリケーションの Button コントロールをクリックすると、クライアント側のコードが Web サービスを呼び出します。Web サービスからの結果データは、ページを更新しなくてもバイナリ SWF ファイルに返されます。そのため、結果データはアプリケーションの動的コンテンツとして使用できます。

<?xm l version="1.0" encoding="utf-8"?> 
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" 
    xmlns:mx="library://ns.adobe.com/flex/halo" minWidth="1024" minHeight="768" xmlns:employeesservice="services.employeesservice.*" xmlns:valueObjects="valueObjects.*"> 
 
    <fx:Declarations> 
        <s:WebService 
            id="RestaurantSvc" 
        wsdl="http://examples.adobe.com/flex3app/restaurant_ws/RestaurantWS.xml?wsdl" /> 
        <s:CallResponder id="getRestaurantsResult" 
            result="restaurants = getRestaurantsResult.lastResult as Restaurant"/> 
    </fx:Declarations> 
 
    <fx:Script> 
        <![CDATA[ 
            import mx.controls.Alert; 
 
            protected function b1_clickHandler(event:MouseEvent):void { 
                getRestaurantsResult.token = RestaurantWS.getRestaurantss(); 
            } 
        ]]> 
    </fx:Script> 
. . . 
    <s:Button id="b1" label="GetRestaurants" click="button_clickHandler(event)"/> 
 

この Flex の例を、次に示す例と比較してください。次の例では、JSP カスタムタグを使用して Web サービスを呼び出す JSP コードを示します。ユーザーが JSP を要求すると、クライアントではなくサーバー上で Web サービスの要求が行われます。その結果を使用して HTML ページのコンテンツが生成されます。アプリケーションサーバーでは、HTML ページ全体を再生成してからユーザーの Web ブラウザーに返送します。

<%@ taglib prefix="web" uri="webservicetag" %> 
 
<% String str1="BRL"; 
String str2="USD";%> 
 
<!-- Call the web service. --> 
<web:invoke 
    url="http://www.itfinity.net:8008/soap/exrates/default.asp" 
    namespace="http://www.itfinity.net/soap/exrates/exrates.xsd" 
    operation="GetRate" 
    resulttype="double" 
    result="myresult"> 
    <web:param name="fromCurr" value="<%=str1%>"/> 
    <web:param name="ToCurr" value="<%=str2%>"/> 
</web:invoke> 
 
<!-- Display the web service result. --> 
<%= pageContext.getAttribute("myresult") %>

データソースへのアクセス

Flex と他の Web アプリケーションテクノロジとのもう 1 つの違いは、Flex ではデータソースと直接通信しないことです。リモートサービスに接続して、サーバー側のデータソースとやり取りするには、データアクセスコンポーネントを使用します。

次の例は、データソースに直接アクセスする ColdFusion ページを示しています。

... 
<CFQUERY DATASOURCE="Dsn" 
    NAME="myQuery"> 
    SELECT * FROM table 
</CFQUERY> 
...

Flex で同様の機能を実現するには、HTTPService、Web サービスまたは RemoteObject コンポーネントを使用して、データソースから結果を返すサーバー側のオブジェクトを呼び出します。

イベント、サービスの呼び出しおよびデータバインディング

Flex はイベント駆動型のテクノロジです。ユーザーのアクションまたはプログラムのイベントによって、サービスへのアクセスをトリガーできます。例えば、ユーザーによるボタンのクリックは、サービスの呼び出しをトリガーするために使用できるユーザーアクションイベントです。プログラムのイベントの例としては、アプリケーションによる DataGrid などのユーザーインターフェイスコンポーネントの作成の完了などがあります。DataGrid の creationComplete イベントを使用すると、リモートサービスを呼び出して、DataGrid に値を設定できます。

Flex では、サービスの呼び出しは非同期に行われます。クライアントアプリケーションは、データが返されるのを待つ必要はありません。非同期でのサービスの呼び出しは、大きいデータセットを取得または更新するときに役立ちます。データが取得または更新されるまでクライアントアプリケーションがブロックされることはありません。

サービスの呼び出しから返されたデータは、サービスの呼び出しと関連付けられた CallResponder に格納されます。その後、ユーザーインターフェイスコンポーネントは、データバインディングを使用して、返されたデータを CallResponder から取得します。

Flex のデータバインディングを使用すると、ユーザーインターフェイスコンポーネントをデータソースで動的に更新できます。例えば、Flex コンポーネントは、text 属性を CallResponder の lastResult 属性と関連付けることができます。CallResponder のデータが変化すると、Flex コンポーネントは自動的に更新されます。

また、Flex では双方向のデータバインディングも実装されています。双方向のデータバインディングでは、Flex コンポーネントまたはデータソースでデータが変更されると、対応するデータソースまたは Flex コンポーネントが自動的に更新されます。双方向のデータバインディングは、フォームコンポーネントまたは Flex データコンポーネントに対するユーザー入力でリモートデータを更新するときに便利です。

Flash Builder でのデータサービスへのアクセス

Flex Builder 3 では、Flex データアクセスコンポーネントを使用して、データサービスへのリモートプロシージャコールを実装します。Flash Builder を使用すると、このプロセスが簡略化されます。

Flash Builder には、次のような機能を持つウィザードやその他のツールが用意されています。

  • データサービスへのアクセス

  • データサービスから返されるデータの設定

  • サービスから返されるデータのページング

  • サーバーデータに複数の更新を同期するデータ管理機能

  • データサービスにアクセスするためのクライアントコードの生成

  • サービスから返されるデータのユーザーインターフェイスコンポーネントへのバインド

サービスにアクセスするための Flash Builder のワークフロー

Flash Builder を使用して、データサービスにアクセスするアプリケーションを作成するときは、次のワークフローを使用します。

  1. 状況に応じて、先にデータサービスに接続するか、先にユーザーインターフェイスを作成するかを選択します。

    リモートサービスに接続します。リモートサービスへの接続から始める場合は、後でユーザーインターフェイスを作成します。

    ユーザーインターフェイスを作成します。ユーザーインターフェイスの作成から始める場合は、後でリモートサービスに接続します。

    注意: どちらから始めるかは個人的な好みの問題です。例えば、ユーザーインターフェイスのデザインの計画が既にある場合は、ユーザーインターフェイスを最初に作成できます。逆に、最初にデータに接続してから、Flash Builder を利用してアプリケーションのコンポーネントを生成することもできます。
  2. データ操作をアプリケーションコンポーネントにバインドします。

    Flash Builder では、様々な方法で、データ操作をアプリケーションコンポーネントにバインドできます。Flash Builder では、次の作業を行えます。

    • サービス操作から返されるデータを使用する各種のフォームを生成します。

    • ユーザーインターフェイスコンポーネントにバインドするサービス操作を選択します。

    • サービス操作から返される複雑なデータを表現するためのフォームを生成します。

  3. (オプション)データの取得と更新を管理します。

    Flash Builder のツールを使用すると、返されるデータのページングを実装し、データセットの更新を調節できます。

    大量のデータレコードを返すときは、通常、ページングを実装し、必要に応じてレコードのセットを取得します。

    複数のレコードを更新するアプリケーションの場合は、データ管理機能を実装できます。データ管理機能には、次の機能が含まれます。

    • コミット機能。変更された複数のレコードを同時に更新します。

    • 取り消し機能。サーバーに書き込まれる前に、変更を取り消します。

    • コード生成機能。レコードが追加、削除、または変更されたときにユーザーインターフェイスコンポーネントを自動的に更新するコードを生成します。

  4. アプリケーションを実行し、データフローをモニタリングします。

    アプリケーションが完成したら、アプリケーションを実行して稼働状況を確認します。Flash Builder のネットワークモニターを使用して、アプリケーションとサービスの間で受け渡されるデータを確認します。ネットワークモニターは、エラーを診断し、パフォーマンスを分析するのに役立ちます。

    また、Flash Builder には、強力なデバッグとプロファイリングの環境も用意されています。ネットワークモニターおよび Flash プロファイラーは Flash Builder Premium で使用できます。

Flash Builder でサポートされるサービスの拡張

Flash Builder のウィザードとツールは、次の種類のサービス実装へのアクセスをサポートします。

  • PHP サービス

  • ColdFusion サービス

  • BlazeDS

  • LiveCycle Data Services

  • HTTP(REST 形式)サービス

  • Web サービス(SOAP)

  • 静的な XML ファイル

Ruby on Rails などの他の種類のサービスをツールでサポートする必要がある場合は、Flash Builder の実装を拡張できます。Flash Builder Extensibility Referenceを参照してください。

データアクセスコンポーネント

データアクセスコンポーネントを使用すると、クライアントアプリケーションからネットワーク上の操作およびサービスを呼び出すことができます。データアクセスコンポーネントでは、リモートプロシージャコールを使用してサーバー環境とやり取りをします。データアクセスコンポーネントには、RemoteObject コンポーネント、HTTPService コンポーネント、WebService コンポーネントの 3 つがあります。

データアクセスコンポーネントは、外部データへのアクセス手段として呼び出しと応答モデルが適切な選択肢となるクライアントアプリケーション向けに設計されています。これらのコンポーネントを使用して、クライアントはリモートサービスに非同期要求を発行できます。リモートサービスでは要求を処理した後、データをアプリケーションに返します。

データアクセスコンポーネントはリモートサービスを呼び出します。その後、サービスからの応答データを、ActionScript オブジェクトまたはサービスから返されたその他のフォーマットに格納します。クライアントアプリケーションではデータアクセスコンポーネントを使用して次の 3 種類のサービスを操作できます。

  • リモートオブジェクトサービス(RemoteObject)

  • Web サービス(WebService)

  • HTTP サービス(HTTPService)

Adobe® Flash® Builder™ には、データアクセスコンポーネントの実装をサービスラッパーにラップするためのウィザードとツールが用意されています。サービスラッパーはデータアクセスコンポーネントの機能をカプセル化します。そのため、低レベルの実装の大部分はユーザーからは見えません。これにより、サービスの実装とサービスにアクセスするクライアントアプリケーションの構築に集中することができます。Flash Builder を使用してデータサービスにアクセスする方法について詳しくは、Flash Builder によるデータ中心型アプリケーションの構築を参照してください。

サービスへのアクセスの提供

Adobe Flash Player のデフォルトでは、アプリケーションの読み込みに使用されたものと完全には一致しないホストへのアクセスがブロックされます。要求をプロキシする際に Adobe LiveCycle® Data Services を使用しない場合は、アプリケーションをホストするサーバー上で HTTP サービスまたは Web サービスを実行するか、HTTP サービスまたは Web サービスをホストするリモートサーバーで crossdomain.xml ファイルを定義する必要があります。crossdomain.xml ファイルは、サーバーのデータとドキュメントをどのドメインの SWF ファイルが利用できるかを示す XML ファイルで、特定のドメインのみを指定することも、すべてのドメインを指定することもできます。crossdomain.xml ファイルは、アプリケーションの接続先になるサーバーの Web ルートに存在している必要があります。

HTTPService コンポーネント

HTTPService コンポーネントを使用すると、HTTP の GET 要求または POST 要求を送信でき、HTTP 応答のデータをクライアントアプリケーションに含めることもできます。Flex を使用してデスクトップアプリケーションを構築している場合(Adobe AIR® で実行している場合)は、HTTP PUT と DELETE がサポートされます。

Adobe LiveCycle Data Services または BlazeDS を使用している場合は、HTTPProxyService を使用して、追加の HTTP メソッドを使用できます。HTTPProxyService を使用すると、GET、POST、HEAD、OPTIONS、PUT、TRACE、DELETE 要求を送信できます。

HTTP 要求を受け入れて応答を送信する任意の HTTP URI を HTTP サービスとして使用できます。一般に、この種のサービスは REST 形式の Web サービスとも呼ばれます。REST は Representational State Transfer の略で、分散されたハイパーメディアシステムのためのアーキテクチャによる形式です。

HTTPService コンポーネントは、同じ機能を SOAP Web サービスやリモートオブジェクトサービスとしては公開できない場合に役立ちます。例えば、HTTPService コンポーネントを使用すると、Web サービスまたは Remoting Service の宛先として使用できない JavaServer Pages(JSP)、サーブレットおよび ASP ページとやり取りすることができます。

HTTPService オブジェクトの send() メソッドを呼び出すと、指定した URI に対して HTTP 要求が実行され、HTTP 応答が返されます。オプションで、指定した URI に引数を渡すこともできます。

Flash Builder には、HTTP サービスにインタラクティブに接続できるようにするワークフローが用意されています。詳しくは、HTTP サービスへのアクセスを参照してください。

WebService コンポーネント

WebService コンポーネントを使用すると、SOAP Web サービスにアクセスできます。SOAP Web サービスはメソッドを備えたソフトウェアモジュールです。Web サービスのメソッドは、一般に操作と呼ばれます。Web サービスのインターフェイスは、Web Services Description Language(WSDL)を使用して定義されます。Web サービスは、様々なプラットフォーム上で実行されているソフトウェアモジュールが相互に通信するための標準規格に準拠しています。Web サービスについて詳しくは、World Wide Web Consortium の Web サイト(www.w3.org/2002/ws/)の、Web サービスのセクションを参照してください。

クライアントアプリケーションは、URL として使用可能な Web Services Description Language(WSDL)ドキュメントでインターフェイスを定義する Web サービスとやり取りできます。WSDL は、Web サービスで認識できるメッセージ、それらのメッセージへの応答の形式、Web サービスがサポートするプロトコル、およびメッセージの送信先を記述するための標準形式です。

Flex では、www.w3.org/TR/wsdlに記載されている WSDL 1.1 がサポートされています。Flex では、RPC エンコードとドキュメントリテラルの両方の Web サービスがサポートされています。

Flex では、SOAP メッセージ形式で HTTP 経由でトランスポートされる Web サービスの要求と結果がサポートされています。SOAP で提供されている XML ベース形式の定義を使用すると、Flex で構築されたアプリケーションなどの Web サービスクライアントと Web サービスの間で構造化および型指定された情報を交換できます。

Web サービスが標準として確立されている環境では、WebService コンポーネントを使用して SOAP 準拠の Web サービスに接続できます。WebService コンポーネントは、エンタープライズ環境内にあるものの、Web アプリケーションのソースパスで使用できるとは限らないオブジェクトにも役立ちます。

Flash Builder には、Web サービスにインタラクティブに接続できるようにするワークフローが用意されています。詳しくは、Web サービスへのアクセスを参照してください。

RemoteObject コンポーネント

リモートオブジェクトサービスを使用すると、REST 形式のサービスまたは Web サービスの場合とは異なり、XML としてフォーマットすることなく、ネイティブフォーマットでビジネスロジックに直接アクセスできます。これにより、既存のロジックを XML として公開するために必要な時間を節約できます。リモートオブジェクトサービスのもう 1 つの利点は、回線での通信の速度です。データの交換はやはり HTTP または https を介して行われますが、データ自体はバイナリ表現にシリアライズされます。RemoteObject コンポーネントを使用すると、回線を通過するデータが少なくなり、クライアント側でのメモリの使用量が減り、処理時間が短くなります。

サーバー上のデータにアクセスするときは、ColdFusion、PHP、BlazeDS、Adobe LiveCycle Data Services でサーバー側の型指定を使用できます。クライアントアプリケーションは、指定されたオブジェクトのメソッドのリモート呼び出しにより、Java オブジェクト、ColdFusion コンポーネント(内部的には Java オブジェクト)または PHP クラスに直接アクセスします。サーバー上のオブジェクトは、それぞれのネイティブデータ型を引数として使用し、その引数でデータベースをクエリし、ネイティブデータ型の値を返します。

サーバー側の型指定が使用できない場合、Flash Builder にはクライアント側の型指定を実装するためのツールがあります。サービスから返されるデータの型を設定および定義すには、Flash Builder を使用します。クライアント側の型指定を使用すると、クライアントアプリケーションからデータベースにクエリを送信して、適切な型のデータを取得できます。サービスによって返されるデータの型が定義されていないすべてのサービスに対し、クライアント側での型指定が必要です。

Flash Builder には、リモートオブジェクトサービスにインタラクティブに接続できるようにするワークフローが用意されています。詳しくは、データサービスへの接続を参照してください。