妄想その6 -昨日のエントリの解。FlexとJavaリモーティングをもっともっと簡単に!!!-


昨日のエントリ「BlazeDSをDisる(っていうのはうそでBlazeDSで使いにくいところ)」の自分なりの解。
それがこの妄想その6です。

BlazeDSは素晴らしいフレームワークなんですが、(いまんところ)Javaとのリモーティングだけに使いたい
自分にとっては若干重たい。あと設定ファイルはやっぱり少し面倒くさい、そういう人向けの解決方法ですw


簡単にどうやって解決したかというと、

  • BlazeDSをAMF通信のライブラリとしてのみ使う
  • リクエストを全て受け取るFilterで、AMFリクエストを解釈して適切なPOJOをみつけて呼び出す。


です。


まあモノをみてもらったほうがわかりやすいので、まずはJavaPOJOはこんな感じPageクラス

@Page("login")
public class LoginPage {

	@Amf
	public Navigation login(LoginContext loginContext) {
		if (loginContext == null) {
			throw new NullPointerException();
		}
		if (loginContext.getUsername() != null
				&& loginContext.getPassword() != null) {
			System.out.println("login successful");
			loginContext.setSuccess(true);
			return AmfResponse.to(loginContext);//AMF用レスポンスを返すときはAmfResponseを使う。
		}
		throw new NullPointerException();
	}
}

重要なポイントは

  • @Pageでアノテーション指定した値(ここではlogin)
  • AMF通信での呼び出しで呼び出したいメソッドに@Amfってつけること

です。
@AmfはAMF通信から呼び出すことを許可しますよっていうマーカーだと思ってください。
あ、LoginContextってのは単なるPOJOです。Java側とAS側で同じようなオブジェクトがいるだけです。


で、これを呼び出します。まずmxmlの抜粋。

<?xml version="1.0" encoding="utf-8"?>
<mx:Panel xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="400" height="300"
	title="従業員管理ログイン" xmlns:employee="examples.employee.*">
	<employee:LoginController id="loginController"/>
	<mx:RemoteObject id="loginRemote" destination="login" endpoint="t2"/>
	//Formの記述が、つらつらある。
</mx:Panel>


ここで、RemoteObjectの記述方法に注目です^^
重要なのはdestination部分。ここを@Pageアノテーションの値(ここではlogin)とあわせておきます。
endpoint指定は適当でいいですw ここではt2としておきます。


で、実際によびだしてみます。

	var context:LoginContext = new LoginContext();
	context.username = view.username.text;
	context.password = view.password.text;
	var token:AsyncToken = view.loginRemote.login(context);
	//リモート呼び出しの結果をごにょごにょ。


これだけ。かんたーーーーん。
設定ファイルも必要ないし、コンパイルオプションも必要なっしんぐです。
ちなみに今までの妄想と同じ枠組みの中でうごいてます。



で、んじゃあ実際何すんねんていう、開発時にやるべきことをまとめると、

  • JavaPOJOクラスを作って、呼び出したいdestinationと同じ値を@Pageの値としてセット!
  • そのクラスの呼び出したいメソッドに@Amfってつける
  • Flex側でRemoteObjectのdestination属性に@Pageでつけた値と同じのを設定!

はい、これだけ。簡単。らーくちん。



ちなみに副次的な効果として、BlazeDSのcoreとcommonしか使ってないので
依存ライブラリも少ないです。


こんなフレームワーク妄想でした。



次回の妄想はFileUploadにもどる予定です。脱線しなければw