Seasar DI Container with AOP

S2OpenAMFとは

S2OpenAMFを使うと、Seasar2とOpenAMFが連動するようになります。これによりMacromedia FlashからSeasar2のコンポーネントを簡単に呼び出す事ができるようになります。コンポーネントの呼び出しは、Flashからインターフェース名またはコンポーネント名を指定するだけで呼び出す事ができます。

セットアップ

S2と同様にJDK1.4以上が必要です。サンプルは、TomcatTomcat 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のクラス名を代入する事。

サンプルの説明

  • 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 !]ボタンを押すことにより実行できます。(実は計算機は3つ目の数字を入れても動作します)