Flex3とJavaの連携

この三連休でそこそこ勉強しました。

Adobe Flex 3 & AIRではじめるアプリケーション開発
公門 和也 大谷 晋平 堀越 悠久史
インプレスジャパン
売り上げランキング: 44806

こちらの教本はサンプルWebアプリケーションを作成しながら
Flex3BlazeDSによるクライアントサイドとサーバサイドの開発手順を勉強することが出来ます。
結構お勧め。


ですが…
実はJavaとの連携が勉強したくてこの本買ったのですが、
その設定の部分が端折られていてJava初心者のワタクシとしては少し消化不良。
やっぱり勉強不足は否めません。

連携部分をいろいろ調査

というわけで、連携部分の根本から調べ始めました*1(順番が違いますね)。
まず、連携の方式から。

  1. HTTPService を利用
  2. RemoteService を利用
  3. MessageService を利用

1.のHTTPServiceでは、XMLやRESTといったフォーマットでやりとりします。
2.のRemoteServiceでは、AMFというフォーマットでやりとりします。
S2Flex2BlazeDSを利用する場合はこの形式です。自前で実装も可能。
HTTPServiceよりもパフォーマンスはいいらしいです。
3.のMessageServiceは、いわゆるサーバプッシュ型を提供します。
BlazeDSを利用している場合に使えます。詳細は割愛。


基本的にはRemoteObject形式の連携が一般的っぽいのでこれを採用。
またBlazeDSを利用することによりさらにパフォーマンスも向上するという事で
BlazeDSを検討していました*2
作業フローは以下のような感じ。

  1. Java:サーバサイドで公開するサービスクラスと、リクエストを受け取るDTOを作成
  2. JavaFlexにサービス公開するためのBlazeDS設定ファイル「remoting-config.xml」を編集
  3. Flex:サーバで公開されたサービスを参照するためのRemoteObjectを記述
  4. 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で直接クラス定義(型)をやり取りする場合の注意点。

  1. Flex側のDTOクラスで[RemoteClass(alias="...")]タグを付ける。
  2. プロパティ名をFlex側とJava側で統一する。

とにかくFlexJavaを紐付けしなさいって事ですね。
そういえばJavaクラスのResultがエンティティクラスの場合はどうなんだろう?DTOと同じ?
これも要調査ですね。


BlazeDSの連携はこんなもんですかねー。
しかしここまで説明しておいてなんですが、
現状はBlazeDSよりもS2Flex2の方が興味アリアリです。
理由はまた次回。
BlazeDSS2BlazeDSの違いや、S2Flex2の説明もしたいと思います。
というかこれから勉強ですw

*1:初心者なので認識違いもあると思います。ツッコミ歓迎

*2:過去形