My favorites | Sign in
t-2
Project Home Downloads Wiki Issues Source
READ-ONLY: This project has been archived. For more information see this post.
Search
for
Integration_Flex  

en , ja
Updated Mar 24, 2011 by shinpei.ohtani@gmail.com

FlexからT2を使うときの詳細ドキュメントです.

FlexとT2を使う

T2でFlexを使う場合にはAMF通信をするのがベストです.AMFでの通信はJSONの4倍程度の速度向上が見込めます.

T2ではこのAMF通信を簡単に行うための機能(T2AMF)が提供されており、ほぼ設定レス で通信することができます.

AMF通信を使うためにはT2ではライブラリとしてはBlazeDST2独自の実装を使います. どちらにするかは原則クラスパスで判断できます.例えばBlazeDSのjarを追加しておけば、BlazeDSで動きます.

お知らせ

T2のAMF通信では現在のところリモーティング機能のみサポートしています.サーバプッシュはサポートしていません.

T2AMFの概要図

サンプル

Flex側での設定

Flex側では、RemoteObjectで通信します. RemoteObjectで、destinationはPageクラスのurl名を入れます.下記のmxmlだとamdtestというURLを指定します. RemoteObjectのendpoint属性はは特に指定はありませんが必須なので何か値を入れておきます.慣習的にここでは"t2.amf"とします.

mxml

	<mx:RemoteObject id="remote" destination="amftest" endpoint="t2.amf"/>
ActionScriptでは普通にRemoteObjectを使って通信します. 下記のコードは非常にシンプルにした通信コードです.

ActionScript

		public function creationCompleteHandler(e:FlexEvent):void
		{
			document.button.addEventListener(MouseEvent.CLICK, function(e:MouseEvent):void {
				var token:AsyncToken = document.remote.findAll();
				token.addResponder(new AsyncResponder(resultHandler, faultHandler));
			});
		}
		
		public function resultHandler(e:ResultEvent, o:Object=null):void
		{
			var people:ArrayCollection = e.result as ArrayCollection;
			document.peopleGrid.dataProvider = people;
		}
		
		public function faultHandler(e:FaultEvent, o:Object=null):void
		{
			Alert.show("error : " + e.message);
		}

Java側での設定

Java側でも特に設定等は必要なく、T2のPageクラスを作れば良いだけです. Flexからのリクエストを受け取るメソッドにはアノテーションとしては@Amfをつけておきます.
@Page("amftest")
public class AmfTestPage {

	@Amf
	public Navigation findAll() {
		List<Person> ret = new ArrayList<Person>();
		//some logic here
		return AmfResponse.to(ret);
	}
}
これだけでFlex<=>Java間の通信が可能になります.非常に簡単だということがわかってもらえたのではないでしょうか.

T2AMF仕様

T2は独自でAMF解釈することが出来る機能T2AMFをもっており、BlazeDSを使わなくてもAMFを解釈して、Pageクラスのメソッドを呼び出せます. ここではT2AMFの仕様を記載します.

仕組み

AMF通信を処理するためには大きく分けて以下の部分からなります.
  • AMF通信をするためのpingポストとその返信
  • 実際のHTTPのボディ部分からAMFフォーマットをデシリアライズして、Javaのクラスに変換する
  • T2の既存の仕組みにのせて、Pageクラスのアクションメソッドの引数としてオブジェクトを渡す
  • T2のアクションメソッドの戻り値からAmfResponse#to()によって戻されたオブジェクトを再度AMFフォーマットにシリアライズして、レスポンスに書く

変換ルール

T2AMFではActionScriptとJavaの間の変換は以下のようなマッピングで行っています.

ActionScriptT2での内部変換Pageクラスで受け取れる型詳細
booleanBooleanboolean/Boolean
intintまたはIntegerint/Integer
uintintまたはIntegerint/Integer
NumberDoubleint/short/long/double/float

Integer/Short/Long/Double/Float

BigInteger/BigDecimal
StringStringString
Datejava.util.Datejava.util.Date/java.sql.Date/java.util.Calendar
ArrayObjectObject
mx.collections.ArrayCollectionjava.util.List< Object >java.util.List< Object >
カスタムクラスRemoteClassで指定された型RemoteClassで指定された型
XMLorg.w3c.dom.Documentorg.w3c.dom.Document
Mapjava.util.Map<String, Object>java.util.Map<String, Object>
flash.utils.IExternalizablejava.io.Externalizablejava.io.ExternalizableJava側にデフォルトコンストラクタが必須です.
それ以外の型org.t2framework.t2.format.amf3.type.Amf3Objectorg.t2framework.t2.format.amf3.type.Amf3ObjectAmf3ObjectはHashMapの子クラスです



拡張ポイント

T2AMFでは、以下の2つの拡張ポイントが用意されています.
  • org.t2framework.t2.format.amf.spi.AmfMessageProcessor
  • org.t2framework.t2.format.amf.spi.AmfConverter
AmfMessageProcessorはT2AMFにおけるエンジン部分です.これを置き換える事によって、大幅にAMFの処理構造を変えることが出来ます. 特に必要がない場合はこのインタフェースの実装クラスを置き換える必要は出てこないでしょう.

一方AmfConverterはActionScriptとJavaの間での型変換を司るインタフェースです. 基本的な型変換はAmfMessageProcessorがAMFフォーマットを解析するプロセスの中で行われます(上記表参照). その他のある特定のケースにのみ対応する場合に、このAmfConverterを実装する事で対応できます. デフォルトでは以下のコンバータが適用されています.
  • ActionScriptからJavaへの変換
    1. ActionScriptのNumber.NaNをnullに置き換える
    2. Mapをオブジェクトに置き換える
  • JavaからActionScriptへの変換
    1. JavaでのNaN(Double, Float型)をActionScript nullに置き換える
    2. Javaでのjava.sql.Date/java.util.CalendarをActionScript Dateに置き換える

拡張ポイントの適用

拡張クラスの適用は簡単です.お使いのDIコンテナに登録して、それ用のContainerAdapterを使うだけです. SimpleContainerAdapterを使っている場合には、web.xmlでt2.components項目に登録してください.
	<filter>
		<filter-name>t2</filter-name>
		<filter-class>org.t2framework.t2.filter.T2Filter</filter-class>
		<init-param>
			<param-name>t2.rootpackage</param-name>
			<param-value>examples.page</param-value>
		</init-param>
		<init-param>
			<param-name>t2.exclude-resources</param-name>
			<param-value>css, js, png, gif, jsp, jar</param-value>
		</init-param>
		<init-param>
			<param-name>t2.components</param-name>
			<param-value>org.yourdomain.yourservice.YourAmfConverterImpl, [other plugins or extensions here]</param-value>
		</init-param>
	</filter>

TOPに戻る

Powered by Google Project Hosting