Webアプリケーションの設定ができたら、Flex2アプリケーションとサーバアプリケーションを作成します。
サンプルは、CFAdapterのをもとに作成しました。
1.サンプルサーバアプリケーションの作成
サーバアプリケーションはRemoteObjectとしてアクセスする"Hello.java"とActionScript側のクラスにマッピングするクラス"Person.java"を作りました。Hello.java
package samples;import java.util.Date;
import amftest.samples.Person;
import flex.messaging.io.amf.ASObject;
public class Hello {
public String greeting(){
return "Hello!(こんにちは) ";
}
public String echo(String param){
return param;
}
public String setPerson(Person person){
return person.getName();
}
public Person getPerson(){
Person person = new Person();
person.setAge(100);
person.setName("person from JavaAdapter");
person.setBirthday(new Date());
return person;
}
public String setPerson(ASObject aso){
if(aso!=null){
return (String)aso.get("_remoteClass");
}else{
return "aso is null";
}
}
}
そしてActionScriptのクラス"Person.as"に対応した"Person.java"
package amftest.samples;import java.util.Date;
public class Person {
String name;
int age;
Date birthday;
String _remoteClass;
public Person(){
name = new String();
age=0;
birthday = new Date(0L);
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2.Flexアプリケーションの作成
次はFlex Builder2でアクセスするアプリケーションを作成します。
これは、CFAdapterに付属しているサンプル"cfdatatypes"をもとに作成しました。
ボタンひとつひとつにロジックを呼び出すようにしています。
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.macromedia.com/2005/mxml" xmlns="*"><mx:Script>
import mx.rpc.events.ResultEvent;
import mx.utils.ObjectUtil;
import mx.rpc.remoting.mxml.RemoteObject;
import amftest.samples.Person;
public var startT:Number = 0;
public function initApp()
{
}
public function DataResult(event:Event)
{
resultDump.text = mx.utils.ObjectUtil.toString( ResultEvent(event).result );
}
public function echo(){
hello.echo(inp.text);
}
public function getPerson(){
hello.getPerson();
}
public function setPerson(){
var person:amftest.samples.Person = new amftest.samples.Person();
person.setName("nod");
person.setAge(300);
person.setBirthDay(new Date());
hello.setPerson(person);
}
</mx:Script>
<mx:RemoteObject
id="hello"
destination="Hello"
result="DataResult(event)" >
</mx:RemoteObject>
<mx:HBox>
<mx:Panel label="Operations" height="100%" width="20%" >
<mx:TextInput id="inp" width="100" />
<mx:Button label="echo" width="100" click="echo();"/>
<mx:Button label="greeting" width="100" click="hello.greeting();"/>
<mx:Button label="getPerson" width="100" click="getPerson();"/>
<mx:Button label="setPerson" width="100" click="setPerson();"/>
</mx:Panel>
<mx:Panel label="Rsults" width="346">
<mx:layoutConstraints>
<mx:EdgeAnchor right="0" bottom="-137" top="1"/>
</mx:layoutConstraints>
<mx:TextArea id="resultDump" height="135" width="325" text="results:"/>
</mx:Panel>
</mx:HBox>
</mx:Application>
パラメータとして渡す、ActionScriptのクラスを作ります。
person.as
package amftest.samples {
public class Person {
var name:String;
var age:int;
var birthday:Date;
var _remoteClass:String;
public function Person(){
this._remoteClass= "amftest.samples.Person";
}
public function getName():String{
return name;
}
public function getAge():int{
return age;
}
public function getBirthday():Date{
return birthday;
}
public function setName(newName:String):Void{
this.name=newName;
}
public function setAge(newAge:int):Void{
this.age=newAge;
}
public function setBirthDay(newDate:Date):Void{
this.birthday=newDate;
}
}
}
プロジェクトのプロパティからFlex Compilerの設定を選択してパラメータを追加します。
--services=${サーバアプリケーションプロジェクトのパスス}/WEB-INF/flex/lex-services.xml
3.動作テスト
作成後に、Eclipseでtomcatを起動するとサーバアプリケーションにアクセスできる状態になります。
その後、Flex Builder 2で作成したmxmlファイルをコンパイルするとJavaのオブジェクトにアクセスすることができます。
Javaのオブジェクトを受け取ってFlex2側でdump表示することはできるのですが
ActionScriptのクラス(Person.as)をパラメータで渡したときに、Mappingするクラス(Person.java)に自動変換して受け取るということができませんでした。
setPerson(Person person) というメソッドではなく、
setPerson(ASObject aso)にアクセスします。
パラメータを自動変換してjavaのメソッドを呼び出す仕組みがあると思うのですが
今の段階では動かすことができませんでした。
参考までに、サーバ側のプロジェクト"Flex2Service"とFlex側のプロジェクト"Flex2amf"をアップしておきます。
サーバ側アプリケーション(javaプロジェクト)
Flex2Service
Flex2アプリケーション(Flexプロジェクト)
Eclipse + Flex Builder 2 Plugin環境では、Flexプロジェクトがエラーになってしまいました。
java.lang.RuntimeException: org/apache/xpath/CachedXPathAPI
が出てきます。
コンパイラオプションでサービスの指定を(--service=xx部分)削除するとエラーはなくなります。
仕方がないのでFlex2アプリケーションはFlex Builder 2 StandAloneでswf作成をしました。
これでCFAdapterを利用してFlexアプリケーションがJavaのObjectにアクセスできました。
この記事に対するコメント