| S2OpenAMFとは セットアップ 使い方 Javaのコーディング Flashのコーディング JavaBeansとActionScriptのクラスとのマッピング マッピングのルール サンプルの説明 ## S2OpenAMFとは S2OpenAMFを使うと、Seasar2とOpenAMFが連動するようになります。これによりMacromedia FlashからSeasar2のコンポーネントを簡単に呼び出す事ができるようになります。コンポーネントの呼び出しは、Flashからインターフェース名またはコンポーネント名を指定するだけで呼び出す事ができます。 ## セットアップ S2と同様にJDK1.4以上が必要です。サンプルは、TomcatとTomcat Pluginを使うことを前提にしています。あらかじめインストールして置いてください。S2OpenAMF-Vxxx.jarを解凍してできたs2openamfディレクトリをEclipseに丸ごとインポートしてください。S2OpenAMFのコンパイル環境は以上でセットアップ完了です。サンプルはS2OpenAMFExample-Vxxx.jarとして別途用意されているので、ダウンロードして解凍してください。解凍してできたs2openamf-exampleディレクトリをEclipseに丸ごとインポートしてください。s2openamf-exampleプロジェクトを右クリックしてプロパティ->Tomcatを選びます。Tomcatプロジェクトであるをチェックし(チェックがついている場合、適用ボタンをクリック)、アプリケーションURIを/S2OpenAMFとします。プロジェクトをビルド後にTomcatを再起動して、ブラウザからhttp://localhost:8080/S2OpenAMF/にアクセスすると足し算1, 足し算2, エラー発生, 汎用リモーティングテスターのサンプルを動作させることができます。 ## 使い方 下記説明はS2OpenAMFExampleに含まれる設定ファイルを使用していただく事により、省略が可能です。 Seasar2をダウンロード OpenAMFをダウンロード S2OpenAMFをダウンロード 全てのJARとプロパティファイル等をEclipseのプロジェクトに追加 OpenAMF付属のopenamf-config.xmlにS2OpenAMFのServiceInvokerを追記 OpenAMF付属のweb.xmlにSeasar2のweb.xmlの内容を追記 ### openamf-config.xml(OpenAMF付属のものに追記)
    〜略〜
    <!-- Uncomment this to enable EJB invoker
    <invoker>
        <name>EJB</name>
        <class>org.openamf.invoker.EJBServiceInvoker</class>
    </invoker>
    -->
    <invoker>
        <name>Seasar2</name>
        <class>org.seasar.extension.openamf.S2ServiceInvoker</class>
    </invoker>
    <invoker>
        <name>Java</name>
        <class>org.openamf.invoker.JavaServiceInvoker</class>
    </invoker>
    〜略〜
### web.xml(OpenAMF付属のものに追記) S2Containerを取得するサーブレットFlashから呼び出すコンポーネントが定義されたdiconファイルを指定します。
    〜略〜
    <servlet>
        <servlet-name>s2servlet</servlet-name>
        <servlet-class>org.seasar.framework.container.servlet.S2ContainerServlet</servlet-class>
        <init-param>
            <param-name>configPath</param-name>
            <param-value>s2-openamf-sample.dicon</param-value>
        </init-param>
        <load-on-startup/>
    </servlet>
    <servlet-mapping>
        <servlet-name>s2servlet</servlet-name>
        <url-pattern>/s2servlet</url-pattern>
    </servlet-mapping>
    〜略〜
あとはTomcatの設定等ですがここでは割愛します。Seasar2のマニュアルも合わせてご覧ください。 ## Javaのコーディング Seasar2のドキュメントを参考にS2ContainerにFlashから呼び出すコンポーネントを登録してください。 ## Flashのコーディング 従来どおりのFlash Remotingのコーディング方法となんら変わりません。serviceの所がコンポーネント名でも呼び出せるという所だけ違います。基本的な手順は以下の通り。Remoting Connectorを使用することもできます。
    NetServicesオブジェクトを使った例

    NetServices.setDefaultGatewayUrl(gatewayUrl);
    var serviceConnection = NetServices.createGatewayConnection();
    var serviceObject = serviceConnection.getService(service, callback);
    serviceObject.methodName(arguments1, arguments2, ...);
    Serviceオブジェクトを使った例

    var service:Service = new Service(
                                    gatewayUrl,
                                    null,
                                    serviceName,
                                    null,
                                    null);
    var pc:PendingCall = service.methodName(arguments1, arguments2, ...);
    pc.responder = new RelayResponder(methodInPath, "resultMethodName", "faultMethodName");
## JavaBeansとActionScriptのクラスとのマッピング S2OpenAMF1.0.5からの新機能で、JavaBeansとActionScriptのクラスを相互にマッピングしてJavaとFlashでデータをやり取りできます。例として次のような足し算のデータをやり取りするようなJavaBeansを定義します。
    package test.org.seasar.extension.openamf;

    import java.io.Serializable;

    public class PlusDto implements Serializable {
        private int arg1;
        private int arg2;
        private int result;

        public int getArg1() {
            return this.arg1;
        }

        public void setArg1(int arg1) {
            this.arg1 = arg1;
        }

        public int getArg2() {
            return this.arg2;
        }

        public void setArg2(int arg2) {
            this.arg2 = arg2;
        }

        public int getResult() {
            return this.result;
        }

        public void setResult(int result) {
            this.result = result;
        }
    }
これに対応するActionScriptのクラスを作成します。
    class PlusDto {
        var _remoteClass:String;
        var arg1:Number;
        var arg2:Number;
        var result:Number;

        function PlusDto() {
            _remoteClass = "test.org.seasar.extension.openamf.PlusDto";
        }
    }
Flash Remotingの引数にFlashのPlusDtoクラスを使用し、JavaのPlusDtoクラスとして受け取り、戻り値をFlashのPlusDtoクラスとして受け取るサンプルです。
    import PlusDto;
    import mx.remoting.Service;
    import mx.remoting.PendingCall;
    import mx.rpc.RelayResponder;
    import mx.rpc.FaultEvent;
    import mx.rpc.ResultEvent;

    mx.remoting.debug.NetDebug.initialize();

    var gatewayUrl:String = "http://localhost:8080/S2OpenAMF/gateway";
    var serviceName:String = "calculatorName";
    var service:Service = new Service(
                                    gatewayUrl,
                                    null,
                                    serviceName,
                                    null,
                                    null);

    function doSubmit():Void {
        var plusDto = new PlusDto();
        plusDto.arg1 = Number(num1_txt.text);
        plusDto.arg2 = Number(num2_txt.text);

        var pc:PendingCall = service.plus(plusDto);
        pc.responder = new RelayResponder(this, "plus_Result", "plus_Fault");
    }

    function plus_Result(re:ResultEvent):Void {
        var plusDto = re.result;
        ans_txt.text = plusDto.result;
    }

    function plus_Fault(fa:FaultEvent):Void {
        trace("faultstring = " + fa.fault.faultstring);
        trace("faultcode = " + fa.fault.faultcode);
        trace("type = " + fa.fault.type);
        trace("detail = " + fa.fault.detail);
    }
今までのFlash Remotingの引数と戻り値に、ActionScriptのクラスが使用できるようになっただけです。ポイントは次の通り。 _remoteClassというプロパティを定義する事。 コンストラクタで_remoteClassにマッピングするJavaBeansのクラス名を代入する事。 ## マッピングのルール 通常は特に意識する必要はありませんが、意図しない挙動に遭遇した時のために、S2OpenAMFの内部動作を詳しく記述します。 サーバサイドのメソッドの引数がList以外の場合(ObjectやJavaBeans) オーバーロードされていないメソッドを呼び出す場合、ActionScriptのクラスに_remoteClassを指定していなくても正しくJavaBeansへマッピングされます。 オーバーロードしているメソッドに、_remoteClassを指定していないActionScriptのクラスを渡す場合、正しくJavaBeansにマッピングされる保証がありません。メソッドの定義順や、定義している引数の型によってマッピング結果が変わります。オーバーロードされているメソッドを呼び出す場合は、必ずActionScriptのクラスに_remoteClassプロパティを定義するようにします。 サーバサイドのメソッドの引数がListの場合の要素の変換 _remoteClassを指定しないと要素はHashMapになります。 _remoteClassを指定していると要素はJavaBeansになります。 ActionScriptのNumber, Dateなどその他オブジェクトは正しくJavaのオブジェクトへ変換されます ## サンプルの説明 calculator.swf 計算機のサンプルです。上ふたつのテキストボックスに数字を入力し、テストボタンをクリックすると下のテキストボックスに答えが表示されます。 calculator2.swf ActionScriptのクラスとJavaBeansをマッピングして行う計算機のサンプルです。 exception.swf 独自のExceptionを使用した場合の、エラー内容を表示するサンプルです。 rmtg_tester.swf Flash Remotingのアプリケーションを汎用的にテストするサンプルです。Seasar2の場合の説明をします。
gatewayUrl | OpenAMFのゲートウェイへのURL。 通常http://domainName/contextName/gatewayとなります。
method | メソッド名 コンポーネントのメソッド名を指定します。
service | コンポーネント名、又はインターフェースのフルパッケージ名 コンポーネント定義XMLファイルで指定したname又はインターフェースのフルパッケージ名を入力します。
arguments | 引数 コンポーネントへ渡す引数を3つまで入力できます。残念ながらプリミティブ型しか渡せません。
※serviceにPOJOへのフルパッケージ名を入力すると通常のPOJOも呼び出せます。 それぞれを入力し終わったら[Trigger !]ボタンをクリックすることで、テキストエリアに結果が表示されます。戻り値が無いものは何も出ません。エラーの場合もメッセージが表示されます。右端にある[date test]、[calculator test]ボタンはそれぞれのコンポーネントを呼び出す情報を設定するボタンです。クリックすると必要な情報が自動的に入力されますので[Trigger !]ボタンを押すことにより実行できます。(実は計算機は３つ目の数字を入れても動作します) |
| © Copyright The Seasar Project and the others 2004, all rights reserved.