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のマニュアルも合わせてご覧ください。
Seasar2のドキュメントを参考にS2Containerに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");
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つ目の数字を入れても動作します)
|