nod::ぶろぐ:RIA::Flex/AIR/Flash

FlashやFlex,(Ajax),S2Flex2,ActionScript3,yui-frameworks,Akabanaプロジェクトなどのメモ帳

Flex2でJavaのRemoteObjectにアクセスしてみる(3)

Webアプリケーションの設定ができたら、Flex2アプリケーションとサーバアプリケーションを作成します。

サンプルは、CFAdapterのをもとに作成しました。

flex2amf.gif

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プロジェクト)

Flex2amf

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にアクセスできました。

Posted by nod at 2005年11月28日 00:41 | コメント (2) | トラックバック (0) | Clip!! | Clip!! | このエントリーを含むはてなブックマーク |digg it! |del.icio.us it!

この記事に対するコメント

Flex2とRemoteObjectのサンプルソース早いですね~。参考にさせて頂きます!

Posted by: sato-shi at 2005年11月29日 01:38

Flex User Groupにもそのうち反映しますね~

Posted by: nod at 2005年11月29日 03:19

コメントを投稿する




保存しますか?



この記事のトラックバックURL


この記事に対するトラックバック

この記事に対するトラックバックはまだありません。



Flex.org - The Directory for Flex Get Adobe Flash Player Made with dreamweaverMade with fireworksPowered by Movable Type 3.36Powered by Wandering Wind
Copyright : [Articles] (C) nod::ぶろぐ:RIA::Flex/AIR/Flash All Rights Reserved.
[Comments/Trackbacks] ... Authors of those have rights.