S2OpenAMFを使うと、Seasar2とOpenAMFが連動するようになります。これによりMacromedia FlashからSeasar2のコンポーネントを簡単に呼び出す事ができるようになります。コンポーネントの呼び出しは、Flashからインターフェース名またはコンポーネント名を指定するだけで呼び出す事ができます。
S2と同様にJDK1.4以上が必要です。サンプルは、TomcatとTomcat Pluginを使うことを前提にしています。あらかじめインストールして置いてください。S2OpenAMFVxxx.jarを解凍してできたs2openamfディレクトリをEclipseに丸ごとインポートしてください。S2OpenAMFのコンパイル環境は以上でセットアップ完了です。サンプルはS2OpenAMFExampleVxxx.jarとして別途用意されているので、ダウンロードして解凍してください。解凍してできたs2openamf-exampleディレクトリをEclipseに丸ごとインポートしてください。s2openamf-exampleプロジェクトを右クリックしてプロパティ->Tomcatを選びます。Tomcatプロジェクトであるをチェックし(チェックがついている場合、適用ボタンをクリック)、アプリケーションURIを/S2OpenAMFとします。プロジェクトをビルド後にTomcatを再起動して、ブラウザからhttp://localhost:8080/S2OpenAMF/にアクセスすると足し算, 汎用リモーティングテスターのサンプルを動作させることができます。
下記説明は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, ...);
S2OpenAMF1.0.5からの新機能で、JavaBeansとActionScriptのクラスを相互にマッピングしてJavaとFlashでデータをやり取りできます。例として次のような足し算のデータをやり取りするようなJavaBeansを定義します。
package test.org.seasar.extension.openamf;
import java.io.Serializable;
public class AddDto 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 AddDto {
var _remoteClass:String;
var arg1:Number;
var arg2:Number;
var result:Number;
function AddDto() {
_remoteClass = "test.org.seasar.extension.openamf.AddDto";
}
}
Flash Remotingの引数にFlashのAddDtoクラスを使用し、JavaのAddDtoクラスとして受け取り、戻り値をFlashのAddDtoクラスとして受け取るサンプルです。
#include "NetServices.as"
#include "NetDebug.as"
import AddDto;
NetServices.setDefaultGatewayUrl("http://localhost:8080/S2OpenAMF/gateway");
var conn = NetServices.createGatewayConnection();
var serviceName = "calculatorName";
var service = conn.getService(serviceName, this);
function doSubmit() {
var addDto = new AddDto();
addDto.arg1 = Number(num1_txt.text);
addDto.arg2 = Number(num2_txt.text);
service.plus(addDto);
}
function plus_Result(addDto:AddDto) {
ans_txt.text = addDto.result;
}
今までのFlash Remotingの引数と戻り値に、ActionScriptのクラスが使用できるようになっただけです。ポイントは次の通り。
- _remoteClassというプロパティを定義する事。
- コンストラクタで_remoteClassにマッピングするJavaBeansのクラス名を代入する事。
通常は特に意識する必要はありませんが、意図しない挙動に遭遇した時のために、S2OpenAMFの内部動作を詳しく記述します。
- サーバサイドのメソッドの引数がList以外の場合(ObjectやJavaBeans)
- オーバーロードされていないメソッドを呼び出す場合、ActionScriptのクラスに_remoteClassを指定していなくても正しくJavaBeansへマッピングされます。
- オーバーロードしているメソッドに、_remoteClassを指定していないActionScriptのクラスを渡す場合、正しくJavaBeansにマッピングされる保証がありません。メソッドの定義順や、定義している引数の型によってマッピング結果が変わります。オーバーロードされているメソッドを呼び出す場合は、必ずActionScriptのクラスに_remoteClassプロパティを定義するようにします。
- サーバサイドのメソッドの引数がListの場合の要素の変換
- _remoteClassを指定しないと要素はHashMapになります。
- _remoteClassを指定していると要素はJavaBeansになります。
- ActionScriptのNumber, Dateなどその他オブジェクトは正しくJavaのオブジェクトへ変換されます
- calculator.swf
計算機のサンプルです。上ふたつのテキストボックスに数字を入力し、テストボタンをクリックすると下のテキストボックスに答えが表示されます。
- calculator2.swf
ActionScriptのクラスとJavaBeansをマッピングして行う計算機のサンプルです。
- 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つ目の数字を入れても動作します)
|