S2Flexを使うと、S2Container上に登録されているコンポーネントのメソッドをFlexから簡単に呼び出せるようになります。
Seasar2と同様にJDK1.4以上が必要です。S2FlexVx.x.x.zipを解凍してできたs2flexディレクトリをEclipseで、「ファイル→インポート→既存のプロジェクトをワークスペースへ」でインポートしてください。 S2Flexのソースを確認できます。flashgateway.jarがないので、エラーになりますが、これは、Flexのjarファイルを勝手に配布できないためです。コンパイルするためには、Flexに含まれているflashgateway.jarをs2flex/libにインポートしてください。
Flexは、http://www.macromedia.com/jp/software/flex/trial/からトライアル版をダウンロードできます。サンプルは、Tomcat、Tomcat Plugin、Spindleを使うことを前提にしているので、Flexは、JRun統合モードではなく、Macromedia Flexモードでインストールしてください。Flexをインストールしたディレクトリを$FLEX_HOMEと呼ぶことにします。
サンプルはS2FlexExamleVx.x.x.jarとして別途用意されているので、ダウンロードして解凍してください。先程と同様に、Eclipseで、「ファイル→インポート→既存のプロジェクトをワークスペースへ」でインポートします。次に、Flexの環境を整えます。$FLEX_HOME/flex.warを適当なディレクトリで解凍(jar xf flex.war)してください。解凍してできたWEB-INFディレクトリをs2flex-example/WEB-INFにまるごと、インポートします。S2Containerを起動するために、web.xmlに次の内容を書き込みます。
<servlet> <servlet-name>s2servlet</servlet-name> <display-name>Seasar2 Servlet</display-name> <servlet-class>org.seasar.framework.container.servlet.S2ContainerServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet>
<servlet-mapping> <servlet-name>s2servlet</servlet-name> <url-pattern>/s2servlet</url-pattern> </servlet-mapping>
Flex1.0を使う場合、上記の内容を書き込んだファイルが、s2flex-example/WEB-INF/web-s2flex.xmlにあらかじめ用意されているので、web.xmlに上書きコピーします。Flex1.5を使う場合、同様にweb-s2flex15.xmlをコピーします。
FlexのAMFGatewayがS2Container上のコンポーネントのメソッドを呼び出せるようにするために、s2flex-example/WEB-INF/flex/gateway-config.xmlにSeasar2用のアダブタを追加します。
<service-adapters> <adapter type="stateless-class">org.seasar.flex.S2Adapter</adapter>
... </service-adapters>
Flex1.0を使う場合、上記の内容を書き込んだファイルが、s2flex-example/WEB-INF/flex/gateway-config-s2flex.xmlにあらかじめ用意されているので、gateway-config.xmlに上書きコピーします。Flex1.5を使う場合、同様にgateway-config-s2flex15.xmlをコピーします。
Flex1.0を使う場合、s2flex-example/WEB-INF/flex/jarsにあるすべてのファイルをs2flex-example/WEB-INF/libに移動します。Flex1.5を使う場合、この作業は必要ありません。
それでは、さっそく足し算するサンプルを作ってみましょう。Javaのインターフェースと実装を用意します。
examples.flex.AddLogic
package examples.flex;
public interface AddLogic {
public int calculate(int arg1, int arg2);
}
examples.flex.AddLogicImpl
package examples.flex;
public class AddLogicImpl implements AddLogic {
public int calculate(int arg1, int arg2) {
return arg1 + arg2;
}
}
コンポーネントをdiconファイルに登録します。
examples/flex/flex.dicon
<?xml version="1.0" encoding="Shift_JIS"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN" "http://www.seasar.org/dtd/components.dtd"> <components>
<component name="addLogic" class="examples.flex.AddLogicImpl"/> </components>
app.dicon
<?xml version="1.0" encoding="Shift_JIS"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN" "http://www.seasar.org/dtd/components.dtd"> <components>
<include path="examples/flex/flex.dicon"/> </components>
登録したコンポーネントをFlexから呼び出せるようにs2flex-example/WEB-INF/flex/flex-config.xmlのflex-config/remote-objects/whitelistに次のエントリを追加します。
<named> <object name="addLogic"> <use-custom-authentication>false</use-custom-authentication> <source>addLogic</source> <type>stateless-class</type> <encoding>AMF</encoding> <allow-unnamed-access>false</allow-unnamed-access> </object>
</named>
objectタグで、コンポーネントを指定します。sourceタグで指定するのが、S2Containerで定義したコンポーネント名です。name属性は、source属性とあわせたほうが分かりやすいでしょう。コンポーネントを追加する場合は、objectタグを追加します。Flex1.0を使う場合、上記の内容を書き込んだファイルが、s2flex-example/WEB-INF/flex/flex-config-s2flex.xmlにあらかじめ用意されているので、flex-config.xmlに上書きコピーします。Flex1.5を使う場合、同様にflex-config-s2flex15.xmlをコピーします。
最後は、Flexのアプリケーションのソースです。Add.mxmlファイルをプロジェクトのルートにおきます。
Add.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.macromedia.com/2003/mxml">
<mx:RemoteObject id="addLogic" named="addLogic"
fault="alert(event.fault.faultstring, 'Error')">
</mx:RemoteObject>
<mx:HBox>
<mx:TextInput id="arg1" width="100"/>
<mx:Label text="+"/>
<mx:TextInput id="arg2" width="100"/>
<mx:Label text="="/>
<mx:Label id="result" text="{addLogic.calculate.result}" width="20"/>
<mx:Button label="calculate"
click="addLogic.calculate(Number(arg1.text), Number(arg2.text))"/>
</mx:HBox>
</mx:Application>
RemoteObjectタグで、Javaのコンポーネントを指定します。named属性にflex-config.xmlのobjectタグのname属性で指定した値を記述します。id属性は、named属性とあわせたほうが分かりやすいでしょう。後は、ActionScriptの中から、コンポーネント名.メソッド名(...)で呼び出すことができます。{addLogic.calculate.result}のようにして、calculateメソッドの呼び出し結果をLabelのvalueに自動的に設定できます。
これで、完成です。Tomcatを再起動して、ブラウザから、http://localhost:8080/s2flex-example/Add.mxmlにアクセスしてください。 |