AsWing 與 Java 之間的交互
Web2.0 成就了AJAX,也促進(jìn)了新技術(shù)在 RIA 行業(yè)的不斷演進(jìn),這之后出現(xiàn)的Adobe Flex 、AIR 與Microsoft 的 SilverLight尤為突出,至于這兩種技術(shù)之間的優(yōu)劣在此不做比較。
作為實用主義者,在我看來能更快速、更好地幫助客戶解決問題的技術(shù),那就是好的技術(shù)。07年2月的一個時間萌生了重新架構(gòu)IMX即時通訊客戶端的想法,技術(shù)選型上我很看好Adobe Apollo 可人家還未發(fā)任何版,好在老朱幫我從Adobe 內(nèi)部拿到了一份正在開發(fā)中的Apollo版本,試用后效果還是很不錯的,那會,估計我該是國內(nèi)最早看到Apollo 真身的幾個外部開發(fā)人員之一吧。
呵呵,就這樣有意無意的開始了AS3的開發(fā)了, Java 程序員來做 AS3 的開發(fā),初學(xué)的人們問的最多的那句,便是二者之間該如何進(jìn)行交互,如果您也關(guān)心于這個部分,OK,那這篇文章就是為您而生。
demo
圍繞氣象服務(wù),支持 http 、hessian 、amf3 多種接口實現(xiàn),UI部分采用 AsWing 來開發(fā),至于什么是AsWing ,詳情見《AsWing 簡介》。
package {
import c2s.Amf3ServiceInvoker;
import c2s.HessianServiceInvoker;
import c2s.HttpServiceInvoker;
import flash.display.Sprite;
import hessian.events.HessianErrorEvent;
import hessian.events.HessianResultEvent;
import org.aswing.AsWingManager;
import org.aswing.FlowLayout;
import org.aswing.JButton;
import org.aswing.JFrame;
import org.aswing.JOptionPane;
import org.aswing.JTextField;
import org.aswing.event.AWEvent;
public class aswing2java extends Sprite
{
private var myFrame:JFrame;
private var myAmf3Button:JButton;
private var myHessianButton:JButton;
private var myHttpButton:JButton;
private var myInput : JTextField;
public function aswing2java()
{
AsWingManager.initAsStandard(this);
myAmf3Button = new JButton(“amf3″);
myAmf3Button.addActionListener(__amf3buttonClicked);
myHessianButton = new JButton(“hessian”);
myHessianButton.addActionListener(__hessianbuttonClicked);
myHttpButton = new JButton(“http”);
myHttpButton.addActionListener(__httpbuttonClicked);
myInput = new JTextField(“合肥“,15);
myFrame = new JFrame(this, “氣象服務(wù)“);
myFrame.getContentPane().setLayout(new FlowLayout());
myFrame.getContentPane().append(myInput);
myFrame.getContentPane().append(myAmf3Button);
myFrame.getContentPane().append(myHessianButton);
myFrame.getContentPane().append(myHttpButton);
myFrame.setSizeWH(300, 200);
myFrame.show();
}
public function amf3Result(event : Object) : void {
JOptionPane.showMessageDialog(“amf3 “, String(event));
}
public function amf3Error(event : Object) : void {
}
public function hessianResult(event :HessianResultEvent):void{
JOptionPane.showMessageDialog(“hessian “, String(event.result));
}
public function hessianError(event :HessianErrorEvent):void{
}
public function httpResult(event : Object) : void {
JOptionPane.showMessageDialog(“http “, String(event));
}
public function httpError(event : Object) : void {
}
private function __amf3buttonClicked(e:AWEvent):void {
var amf3ServiceInvoker: Amf3ServiceInvoker = new Amf3ServiceInvoker(amf3Result, amf3Error);
amf3ServiceInvoker.getWeather2(myInput.getText());
}
private function __hessianbuttonClicked(e:AWEvent):void {
var hessianServiceInvoker : HessianServiceInvoker = new HessianServiceInvoker(hessianResult, hessianError);
hessianServiceInvoker.getWeather2(myInput.getText());
}
private function __httpbuttonClicked(e:AWEvent):void {
var httpServiceInvoker : HttpServiceInvoker = new HttpServiceInvoker(httpResult, httpError);
httpServiceInvoker.getWeather2(myInput.getText());
}
}
}
注:為降低復(fù)雜度,demo 中的 Java 服務(wù)端所有 Service 實現(xiàn)在此都不做敘述,我們已將服務(wù)部署到外網(wǎng)中,大家可通過aswing2java.zip 中的 code 來完成測試。
flash.net簡介
在 AS3 中,有關(guān)于網(wǎng)絡(luò)操作的類全部內(nèi)置在 flash.net 中,理解這個 lib 將有利于我們更好的完成交互。
URLLoader :用于從網(wǎng)絡(luò)或者本地讀取文件,可以通過設(shè)置他的 dataFormat 屬性改變收到的文本類型。默認(rèn)值為 URLLoaderDataFormat.TEXT 純文本格式。
URLLoader 部分事件。
complete :使用 URLLoader.load() 方法后,數(shù)據(jù)完全加載完畢時觸發(fā),說明程序加載完成。
ioError : 使用 URLLoader.load() 方法時, 發(fā)生致命I/O錯誤時觸發(fā)。
open : 使用 URLLoader.load() 方法后,開始從服務(wù)器下載數(shù)據(jù)時觸發(fā)。
progress :使用 URLLoader.load() 方法后,在從服務(wù)器下載數(shù)據(jù)的過程中持續(xù)觸發(fā), 通過偵聽此事件我們可以很方便的做信息加載狀態(tài)的顯示。
securityError :FlashPlayer 的安全異常, 比如跨域加載錯誤。
URLRequest : 用于傳遞變量到服務(wù)器,以及 URLLoader 要 load 的目標(biāo)路徑。 可以通過設(shè)置他的 contentType 屬性改變發(fā)送到服務(wù)器的變量類型。
URLVariables :鍵/值對, 如user=zhuam&password=111,
URLLoaderDataFormat :用于設(shè)置讀取文件的類型,有 TEXT (純文本), VARIABLES (鍵/值對),BINARY (二進(jìn)制格式),URLLoader 會根據(jù)類型不同來進(jìn)行解碼操作。
URLRequestMethod : 設(shè)置用哪種方式來傳遞數(shù)據(jù), POST 或者 GET。
URLReqeustHeader : URL HTTP 頭部。
一、HTTP(AS3 Remoting)
由于 Flash 對跨域訪問有嚴(yán)格的權(quán)限限制,故而獲取其他站點的頁面信息,我都是在服務(wù)端做了一層 Proxy。
package c2s
{
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.SecurityErrorEvent;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
import flash.net.URLRequestMethod;
import flash.net.URLVariables;
import flash.utils.ByteArray;
public class HttpServiceInvoker
{
protected var resultCallbackFunction : Function;
protected var errorCallbackFunction : Function;
// 請求地址
private const urlAddress : String = “http://gcc.cuscstar.com:8080/weatherHttpProxy.jsp”;
public function HttpServiceInvoker(resultCallback : Function, errorCallback : Function)
{
resultCallbackFunction = resultCallback;
errorCallbackFunction = errorCallback;
super();
}
public function getWeather2(city: String): void {
// 建立 URLRequest 對象 設(shè)置 GET 方法調(diào)用
var request : URLRequest = new URLRequest(urlAddress);
request.method = URLRequestMethod.GET;
var cityVar : URLVariables = new URLVariables();
cityVar.city = city;
request.data = cityVar;
// URLLoader DATA FORMAT 設(shè)置 BINARY 格式用于做Response字符集的轉(zhuǎn)換
var loader : URLLoader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.BINARY;
loader.addEventListener(Event.COMPLETE, resultCallback);
loader.addEventListener(IOErrorEvent.IO_ERROR, errorCallback);
loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, errorCallback);
loader.load(request);
}
private function resultCallback(event:Event):void {
/// 將接收的數(shù)據(jù)轉(zhuǎn)換為 ByteArry ,通過 readMultiByte 來轉(zhuǎn)換編碼格式
var ba:ByteArray = ByteArray(URLLoader(event.target).data);
var rhtml:String = ba.readMultiByte(ba.length, “gb2312″);
resultCallbackFunction(rhtml);
}
private function errorCallback(event:Event):void {
}
}
}
二、Hessian
Hessian ( http://hessian.caucho.com/ria/ )是Caucho公司制定的一個 RPC 協(xié)議,雖然它也是通過 HTTP協(xié)議傳輸 RPC 封包,但是它的 RPC 封包卻是以二進(jìn)制形式編碼的,而且能夠表現(xiàn)對象模型和異常體系,這使得 Hessian 比 XML-RPC 更有效率。
1、 首選需要我們?nèi)?http://hessian.caucho.com/#Flash/Flex 下載Hessian的最新Flash 版本 hessian-flash-3_1-snap.swc(30k)。
2、 引用該 swc 到您的 AsWing 項目中,下面這段代碼是通過AS3來調(diào)用 Java后臺的一個Hessian氣象信息服務(wù),注:Java 部分的 Hessian 服務(wù)的開發(fā)與實現(xiàn)在此就不做敘述,有心之人皆可 Google ,講解的文章很多。
3、 AS3 通過 Hessian 與 Java 交互 Code ( 獲取城市天氣信息 )
package c2s
{
import flash.events.IOErrorEvent;
import hessian.client.HessianAsyncToken;
import hessian.client.HessianProxy;
import hessian.events.HessianErrorEvent;
import hessian.events.HessianResultEvent;
public class HessianServiceInvoker {
protected var resultCallbackFunction : Function;
protected var errorCallbackFunction : Function;
private var proxy:HessianProxy = new HessianProxy(“http://gcc.cuscstar.com:8080/hessian/service.do”);
public function HessianServiceInvoker(resultCallback:Function, errorCallback:Function) {
resultCallbackFunction = resultCallback;
errorCallbackFunction = errorCallback;
super();
}
public function resultCallback(data:Object):void {
resultCallbackFunction(data);
}
public function errorCallback(data:Object):void {
}
public function getWeather2(city: String):void
{
var token:HessianAsyncToken = proxy.getWeather2(city);
token.addEventListener(HessianErrorEvent.HESSIAN_ERROR, errorCallback);
token.addEventListener(HessianResultEvent.HESSIAN_RESULT, resultCallback);
}
}
}
三、AMF3 ( Action Message Format )
Adobe就提出AMF(Action Message Format)技術(shù),即將Java等語言的對象轉(zhuǎn)換為ActionScript對象的技術(shù)規(guī)范。AMF是將數(shù)據(jù)對象高度壓縮,編碼后作為2進(jìn)制來傳輸?shù)?,比?/span>WebService、HTTPService、XML在效率上的確是有很大的提升。
Adobe AMF協(xié)議及Java版本的AMF實現(xiàn)Blazeds也已經(jīng)開放,
http://labs.adobe.com/technologies/blazeds/
服務(wù)端Java 的AMF服務(wù)的實現(xiàn),在此不做敘述,下面這兩個部分的代碼一個是用純AS3完成服務(wù)的調(diào)用,另一個采用Flex3 Framework 來完成服務(wù)的調(diào)用。
AS3 利用 Adobe AMF3 協(xié)議與 Java 交互 (Pure AS3)
package c2s
{
import flash.net.NetConnection;
import flash.net.ObjectEncoding;
import flash.net.Responder;
public class Amf3ServiceInvoker
{
private var nc : NetConnection = new NetConnection();
private var responder : Responder = null;
private const amf3URL : String = “http://gcc.cuscstar.com:8080/messagebroker/amf”;
public function Amf3ServiceInvoker(result : Function, error : Function)
{
responder = new Responder(result, error);
super();
}
public function getWeather2(city: String) : void{
nc.objectEncoding = ObjectEncoding.AMF3;
nc.connect(amf3URL);
nc.call(“amf3ServiceInvoker.getWeather2″, responder, city);
}
}
}
結(jié)束語
……
下載資源
- AsWing http://www.aswing.org/
- Hessian http://hessian.caucho.com/
- Blazeds http://labs.adobe.com/technologies/blazeds/
- AsWing2Java http://gcc.cuscstar.com:8080/aswing2java.rar
- Hessian Flash-only (不需要Flex框架支持):
posted on 2008-08-11 18:35 gembin 閱讀(701) 評論(0) 編輯 收藏 所屬分類: ActionScript3