Flex3とJavaの連携
この三連休でそこそこ勉強しました。
こちらの教本はサンプルWebアプリケーションを作成しながら
Flex3とBlazeDSによるクライアントサイドとサーバサイドの開発手順を勉強することが出来ます。
結構お勧め。
ですが…
実はJavaとの連携が勉強したくてこの本買ったのですが、
その設定の部分が端折られていてJava初心者のワタクシとしては少し消化不良。
やっぱり勉強不足は否めません。
連携部分をいろいろ調査
というわけで、連携部分の根本から調べ始めました*1(順番が違いますね)。
まず、連携の方式から。
- HTTPService を利用
- RemoteService を利用
- MessageService を利用
1.のHTTPServiceでは、XMLやRESTといったフォーマットでやりとりします。
2.のRemoteServiceでは、AMFというフォーマットでやりとりします。
S2Flex2やBlazeDSを利用する場合はこの形式です。自前で実装も可能。
HTTPServiceよりもパフォーマンスはいいらしいです。
3.のMessageServiceは、いわゆるサーバプッシュ型を提供します。
BlazeDSを利用している場合に使えます。詳細は割愛。
基本的にはRemoteObject形式の連携が一般的っぽいのでこれを採用。
またBlazeDSを利用することによりさらにパフォーマンスも向上するという事で
BlazeDSを検討していました*2。
作業フローは以下のような感じ。
- Java:サーバサイドで公開するサービスクラスと、リクエストを受け取るDTOを作成
- Java:Flexにサービス公開するためのBlazeDS設定ファイル「remoting-config.xml」を編集
- Flex:サーバで公開されたサービスを参照するためのRemoteObjectを記述
- Flex:リモーティング機能で送受信するオブジェクトをActionScriptで記述
ここでちょっと備忘録も兼ねて、ポイントをかいつまんでみます。
サーバサイド
まず、1.のクラスは「サービスインタフェース」と、
それを継承した「サービスクラス」で構成するようです。
試しに以下のような構成でremoting-config.xmlを記述してみます。
サービスインタフェース | flexJavaService |
サービスクラス | flexJavaServiceImpl |
<destination id="flexJavaService"> <properties> <source>examples.test.service.flexJavaServiceImpl</source> </properties> </destination>
上記の例ではdestinationのidに「flexJavaService」を設定しています。
これがFlexと連携するためのサービス名になります。
ちなみにseasar2のS2Factoryを使用する場合はsourceもflexJavaServiceになるようです。
この辺りの詳しい説明は上記書籍をご参照ください。
クライアントサイド
まず、mxml側にRemoteObjectとController(ここでは仮にflexMainController)の定義を追加します。
destinationタグには、サーバサイドで指定したサービス名(flexJavaService)を記述します。
... xmlns:test="examples.test.*" ... <test:flexMainController id="flexMainController "/> <mx:RemoteObject id="fjService" destination="flexJavaService" />
あとはControllerでサービスの結果をこねくりまわせばOKです。
var token:AsyncToken = サービス名.メソッド名([引数]); token.addResponder(new AsyncResponder(TRUEイベントリスナ,FALSEイベントリスナ));
たとえば、サーバサイドJavaで定義されている
「flexJavaServiceクラス」の「findAllメソッド」を
パラメータ付きで呼び出すときは以下のようになりますでしょうか。
public function flexFindAll():void { var token:AsyncToken = document.fjService.findAll("2008", "10"); token.addResponder(new AsyncResponder( flexFindAllSuccessHandler, flexFindAllFaultHandler)); } //成功時 private function flexFindAllSuccessHandler(e:ResultEvent, obj:Object=null):void { ... } //失敗時 private function flexFindAllFaultHandler(e:ResultEvent, obj:Object=null):void { ... }
さらに、DTOで直接クラス定義(型)をやり取りする場合の注意点。
とにかくFlexとJavaを紐付けしなさいって事ですね。
そういえばJavaクラスのResultがエンティティクラスの場合はどうなんだろう?DTOと同じ?
これも要調査ですね。
BlazeDSの連携はこんなもんですかねー。
しかしここまで説明しておいてなんですが、
現状はBlazeDSよりもS2Flex2の方が興味アリアリです。
理由はまた次回。
BlazeDSとS2BlazeDSの違いや、S2Flex2の説明もしたいと思います。
というかこれから勉強ですw