gembin

          OSGi, Eclipse Equinox, ECF, Virgo, Gemini, Apache Felix, Karaf, Aires, Camel, Eclipse RCP

          HBase, Hadoop, ZooKeeper, Cassandra

          Flex4, AS3, Swiz framework, GraniteDS, BlazeDS etc.

          There is nothing that software can't fix. Unfortunately, there is also nothing that software can't completely fuck up. That gap is called talent.

          About Me

           

          AsWing 與 Java 之間的交互

          Web2.0 成就了AJAX,也促進(jìn)了新技術(shù)在 RIA 行業(yè)的不斷演進(jìn),這之后出現(xiàn)的Adobe Flex 、AIR Microsoft SilverLight尤為突出,至于這兩種技術(shù)之間的優(yōu)劣在此不做比較。

          作為實用主義者,在我看來能更快速、更好地幫助客戶解決問題的技術(shù),那就是好的技術(shù)。072月的一個時間萌生了重新架構(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 頭部。

           

          一、HTTPAS3 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.swc30k)。

           

          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é)束語

          ……

          下載資源

          posted on 2008-08-11 18:35 gembin 閱讀(701) 評論(0)  編輯  收藏 所屬分類: ActionScript3

          導(dǎo)航

          統(tǒng)計

          常用鏈接

          留言簿(6)

          隨筆分類(440)

          隨筆檔案(378)

          文章檔案(6)

          新聞檔案(1)

          相冊

          收藏夾(9)

          Adobe

          Android

          AS3

          Blog-Links

          Build

          Design Pattern

          Eclipse

          Favorite Links

          Flickr

          Game Dev

          HBase

          Identity Management

          IT resources

          JEE

          Language

          OpenID

          OSGi

          SOA

          Version Control

          最新隨筆

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          free counters
          主站蜘蛛池模板: 保靖县| 休宁县| 大埔县| 黑山县| 张家港市| 合山市| 西藏| 萨嘎县| 明水县| 南乐县| 兴文县| 阿勒泰市| 中超| 汤阴县| 渑池县| 潜江市| 深州市| 新河县| 莎车县| 中西区| 平罗县| 施甸县| 嘉祥县| 慈溪市| 波密县| 紫阳县| 乐陵市| 滨海县| 曲松县| 陆河县| 托克托县| 大荔县| 屏山县| 巴林右旗| 灵寿县| 砀山县| 大英县| 岑巩县| 新营市| 乾安县| 甘南县|