サーバーとの通信
第4回 RemoteObject を利用する(1)

RemoteObject - データをサーバーから受け取る

RemoteObject タグを使ってサーバーと通信をするための考え方、および方法を説明します。

 


目次

RemoteObject を利用する

プロキシ( リモートゲートウェイ)について

Java クラスの作り方と保存場所

リクエストのタイミング

セッションの維持、ステートレスセッションBean と ステートフルセッションBean

データの送り方、結果の受け取り方(型変換とレスポンス処理)

ユーザー定義クラスでサーバーと通信する (作成中)

名前つき RemoteObject サービス (作成中)

エラーハンドリング (作成中)

ユーザー認証、SSL通信 (作成中)

様々な問題と解決策 (作成中)

RemoteObject を利用する

(※注意: ここで紹介するサンプルプログラムは flex-config.xml に適切が設定されていない場合はセキュリティーエラーになると思います。 flex-config.xml の編集方法は後ほど「プロキシ(リモートゲートウェイ)について」で説明します。ここではまず、基本的な考え方をおさえてください)

RemoteObject タグを使えば、Flex プレゼンテーションサーバーに配置されている Java のクラスを、Flex クライアントプログラムから呼び出し、処理結果を取得することができます。

例えば次のような Java クラスがあるとします。(クラスの保存場所は、「Javaクラスの作り方と保存場所」で説明します。)


  myfirst.MyRemoting1.java

package myfirst;

public class MyRemoting1 {

  public MyRemoting1() {

    System.out.println("MyRemoting1 object is created....");
  }

  public String myMethod1(String in) {

    System.out.println("MyRemoting::myMethod1 called...  param: " + in);
    return new java.util.Date().toString() + ":" +in;
  }
}

この Java クラスを呼び出し、myMethod1 メソッドを呼び出す Flex アプリケーションは例えば次のようになります。

 remoting_basic1.mxml

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.macromedia.com/2003/mxml">
<mx:TextInput id="inp_txt" />
<mx:Button label="invoke myMethod1" click="myRo.myMethod1(inp_txt.text)"/>
<mx:Label text="Result:{myRo.myMethod1.result}" />
<mx:RemoteObject id="myRo" source="myfirst.MyRemoting1" />
</mx:Application>

このアプリケーションの実行結果は次の通りです。テキストフィールドに適当な文字を入力し、[invoke myMethod1]ボタンを押します。 サーバー上にある myfirst.MyRemoting1 クラスがの myMethod1 が実行されます。 myMethod1 は渡された文字列とサーバーの現在時刻をクライアントに返します。 Flex クライアントアプリケーションはサーバーからの結果を画面に表示します。

<mx:RemoteObject> タグがサーバーにアクセスをするためのMXMLタグです。 id="myRo" はこのタグに対する識別名を定義しています。ここで記述された RemoteObject タグは "myRo" という名前で別の場所からアクセスできます。source プロパティーは呼び出すクラス名を指定します。 <mx:Button> タグはボタンを表示しています。 click イベントハンドラーでは myRo.myMethod1(inp_txt.text) と定義されています。これは "myRo" に定義されている Java クラスの myMethod1 メソッドを呼び出すということを意味しています。(inp_txt.text) の部分はメソッド引数で、ここでは、テキストフィールドに入力されたテキストデータを myMethod1 メソッド呼び出しの引数として渡すようにしています。 メソッド呼び出しの結果は RemoteObjectタグ識別名.メソッド名.result の中に格納されます。 ここの例では myRo.myMethod1.result を <mx:Label> タグの text プロパティーの中でバインディングしていますのでサーバーから取得した結果はラベルテキストとして画面に表示されることになります。

<mx:RemoteObject> タグはクライアントにアプリケーションがロードされたあとに実行され、サーバーと通信をするということを確実に理解してください。 mxml はサーバーでコンパイルされ、swf ファイルとしてクライアントに送られます。RemoteObject によるサーバーへのアクセスはクライアントで swf の実行が開始された後に行われます。 この動きを図式化すると次のようになるでしょうか。

これまでに出てきた RemoteObject タグのプロパティー/ファンクションをまとめます。

  • id プロパティー: 識別名(ほかの場所から参照するための名前、任意に設定します)
  • source プロパティー: 呼び出す Java クラス。 パッケージ名も含めた完全修飾名で指定します。
  • メソッド名.result プロパティー: サーバーから取得したデータを保存しています。

このセクションの一番最初に書きましたが、ここで示したサンプルプログラムは flex-config.xml に適切な設定がされていなければ正しく動作してくれません。 flex-config.xml の設定方法についてはこのつきのセクション、「プロキシ(リモートゲートウェイ)についてで説明します。

ここまででは、次のような疑問が残ります。これらについても後ほど説明します。

プロキシ( リモートゲートウェイ)について

Flexクライアントアプリケーションからの RemoteObject によるリモートクラスへのアクセス要求はプロキシ(リモートゲートウェイ)機能が受け取り、プロキシはJavaクラス・オブジェクトの生成やメソッドの呼び出し、クライアントへの応答を行います。もし無制限で Java のクラスを呼び出せるとすると、これはサーバーのセキュリティーを脆弱にする可能性があります。 RemoteObject により通信は AMF というマクロメディア独自のプロトコルで行われますが、このプロトコルに乗せて悪意のあるクラス呼び出し要求が行われるか知れません。 RemoteObject で何を呼び出せるかということは flex-config.xml のホワイトリスト(whitelist) で設定されています。 この設定により、許可設定のされていないクラスへのアクセスは拒否されるようになっています。 Flex インストール直後のデフォルト設定ではすべてのリクエストは拒否されます。ですから RemoteObject を使う場合適当なレベルでこの制限を解除してあげる必要があります。

flex-config.xml による RemoteObject 呼び出しの許可設定は <remote-objects> 要素の <whitelist> -> <unnamed> 要素の中で設定します。 <unnamed> 要素の中に <source> という要素を設け、この要素の中にアクセスを許可するクラス名を完全修飾クラス名で設定します。 記法では * (アスタリスク) 記号によるワイルドカード記法を許可しています。例えば完全修飾クラス名が myfirst か mytest.ro から始まるあるすべてのクラスについて RemoteObject による呼び出しを許可したい場合次のように記述します。


              :                    :
		
    <remote-objects>

                  :                    :

        <whitelist>
            <!-- whitelist config for unnamed objects -->
            <unnamed>
                <source>myfirst.*</source>
                <source>mytest.ro.*</source>

            </unnamed>
            <!-- whitelist config for named objects -->
            <named>

                  :                    :

            </named>
        </whitelist>
    </remote-objects>


              :                    :

	

 

Java クラスの作り方と保存場所

Java クラスの作り方

Java クラスの作り方は通常のJava クラスと同じです。 .java という拡張子でJava プログラム・ソースコードをテキストエディタなどで作成し、 javac コマンドを使ってコンパイルし、.class ファイルを生成します。 マシンに J2SE SDK がインストールされていなければ javac コマンドは使えないでしょう。 J2SE SDK はサン・マイクロシステムズのWebサイトからダウンロードします 。なお Flex は現行(2005年3月28日時点)J2SE 1.5 には対応していません。 J2SE 1.4.2 をダウンロード、導入します(http://java.sun.com/j2se/1.4.2/ja/download.html)。

作成する Java クラスについて、必須継承クラスや必須メソッドなどの制限はありません。次のルールだけ守ってください。

  • 引数なしコンストラクターが呼び出せること (引数なしコンストラクターが private で定義されていないこと)

Java クラスはRemoteObject で要求されたとき引数なしコンストラクターが呼び出されオブジェクトが生成されます。オブジェクトの生成と破棄のタイミング(ライフサイクル)について詳しくは「セッションの維持、ステートレスセッションBean と ステートフルセッションBean」で説明します。

Javaクラスの保存場所

Java クラスは Flex プレゼンテーションサーバーが配置されている J2EE サーバ、Webアプリケーションサーバーでクラスパスの通っている場所に保存します。典型的には

{Flexインストールディレクトリ}/WEB-INF/classes の下に保存します。

例えばすでにでてきた myfirst.MyRemoting1 クラス (myfirst パッケージの MyRemoting1 クラス) では
WEB-INF/classes ディレクトリの中に myfirst ディレクトリを作成し、ここに、MyRemoting1.java と MyRemoting1.class を保存します。

リクエストのタイミング

先ほどの例では[サーバーへアクセス]ボタンを押すことでサーバーにアクセスしました。 アプリケーションによっては、起動直後に自動的にサーバーにアクセスして欲しい場合があります。

Flexコンポーネントには初期化に関連するイベントがいくつかあります。 例えば creationComplete イベントがあります。 このイベントはそのコンポーネントの初期化が終了した時点で発生します。 Application タグの creationComplete イベントは内包するコンポーネントの初期化が終了してから発生します。 例えば先ほどの例を次のように書き換えるとアプリケーションの起動直後にサーバーにアクセスし、データを取得します。

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.macromedia.com/2003/mxml" creationComplete="myRo.myMethod1('server time')"> <mx:Label text="Result:{myRo.myMethod1.result}" /> <mx:RemoteObject id="myRo" source="myfirst.MyRemoting1" /> </mx:Application>

セッションの維持、ステートレスセッションBean と ステートフルセッションBean

サーバーサイドで生成されるJavaクラス・オブジェクトは、クライアントから要求される度に生成されるか、または一つの Webブラウザーのためにそれに対応するオブジェクトが生成され、同一ブラウザーからの継続するリクエストにはこれが応えるかのいずれかの振る舞いをします。リクエストの度に生成される Java クラス・オブジェクトを「ステートレスセッションBean」といい、一つのブラウザーのために一つの Javaクラス・オブジェクトが生成され、継続するリクエストにこれが応える Javaクラス・オブジェクトを「ステートフルセッションBean」といいます。 Java クラスが 「ステートフルセッションBean」となるか、「ステートレスセッションBean」となるかは RemoteObject タグの type プロパティーで指定します。 type プロパティーには “stateless-class” か“stateful-class” のいずれかを指定します。 “stateless-class” を指定したとき、このタグからのリクエストで生成される Java クラス・オブジェクトは「ステートレスセッション Bean」で振る舞い、“stateful-class” を指定したときは「ステートフルセッションBean」で振舞います。 type プロパティーを指定しなかったときは “stateless-class” と解釈されます。

「ステートフルセッションBean」では、一つのクライアントのために一つの Javaクラス・オブジェクトとなりますので、クライアントの情報をサーバー側で管理するような場面で利用することができます。

続く


ご意見・ご感想

技術レポート一覧へ

トップページ


作成日:2005年3月30日
更新日:2005年4月4日