Java與Flex學習筆記(9)—-用ExternalInterface實現Flex與外部容器互動

來源:互聯網
上載者:User

     

      有時候Flex需要與外部容器互動,比如和別的項目互動,調用外部資料,則可以通過ExternalInterface來實現。畢竟Flex版本還是比較“年輕”,有些地方還不完美,需要藉助外部力量去實現。

 

       ExternalInterface類是外部 API,這是一個在 ActionScript 和 Flash Player 容器之間實現直接通訊的API,例如,包含 JavaScript 的 HTML 頁。Adobe 建議使用 ExternalInterface 實現 JavaScript 與 ActionScript 之間的所有通訊。這個類主要有兩個方法:


       ●addCallback(functionName:String,closure:Function):void 將ActionScript
方法註冊為可從容器調用。成功調用addCallBack() 後,容器中的 JavaScript 或 ActiveX 代碼可以調用在 Flash Player 中註冊的函數。


        ●call(functionName:String,...arguments):*  
調用由 Flash Player 容器公開的函數,不傳遞參數或傳遞多個參數。如果該函數不可用,調用將返回null;否則,它返回由該函數提供的值


         具體用法可以查閱Flex4API,裡面講的很詳細。


         本人今天做了一個Flex與外部互動的小例子,做了之後對ExternalInterface有了更深的認識。


         建立一個mxml頁面ExternalInterfaceDemo.mxml,代碼如下所示:


<?xml version="1.0"encoding="utf-8"?><s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"              xmlns:s="library://ns.adobe.com/flex/spark"              xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" creationComplete="app_creationCompleteHandler(event)">    <fx:Script>       <![CDATA[           import mx.controls.Alert;           import mx.events.FlexEvent;                     protected function app_creationCompleteHandler(event:FlexEvent):void           {              // TODOAuto-generated method stub              ExternalInterface.addCallback("sendData",sendDataSelectHandler);              getData.addEventListener(MouseEvent.CLICK,mouseClickHandler);           }           private function mouseClickHandler(event:MouseEvent):void{              ExternalInterface.call("getData");           }           private function sendDataSelectHandler(obj:Object):void{              var name:String=obj['username'];              var pass:String=obj['passworld'];              username.text=name;              passworld.text=pass;           }       ]]>    </fx:Script>    <fx:Declarations>       <!-- Place non-visualelements (e.g., services, value objects) here -->    </fx:Declarations>    <s:Panel x="205" y="116" width="574" height="324">    <s:Button id="getData" x="261" y="196" width="134" height="42" fontSize="16" label="擷取外部資料"/>    <s:Label x="179" y="92" width="71" fontSize="19" text="姓名:"/>    <s:TextInput x="254" y="92" id="username" fontSize="16" editable="false"/>    <s:Label x="179" y="145" fontSize="18" text="密碼:"/>    <s:TextInput x="256" y="137" id="passworld" fontSize="16" editable="false"/>    </s:Panel></s:Application> 

       運行後頁面如下所示:




      接著需要建立一個JavaScript檔案用於Flex與Jsp通訊的橋樑。可是如果我們直接將JavaScript代碼寫在自動產生的ExternalInterfaceDemo.Html中的話,當我們再次修改ExternalInterfaceDemo.mxml檔案後自動產生的ExternalInterfaceDemo.Html將覆蓋原有的代碼,這樣我們的努力都會功虧與潰,那麼怎麼辦?


        查資料我才發現,每個自動產生的html頁面都是由html-template目錄下的index.template.html模板頁產生,如果我們在此頁面中添加一個JavaScript引入檔案,那麼所有的頁面都會自動引入此JavaScript檔案。問題就此解決了。


        建立一個用於向Flex傳送資料的Jsp檔案externalInterfaceJsp.jsp,代碼如下所示:



<%@ page language="java"contentType="text/html; charset=utf-8"    pageEncoding="utf-8"%><!DOCTYPE html PUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type"content="text/html; charset=ISO-8859-1"><title>測試</title><script type="text/javascript"src="../page/swf/commonJS.js"></script>  //引用建立的JavaScript檔案<style type="text/css">        table.demo{border-collapse: collapse;margin-left:50px;margin-top:10px;}        table.demo th,td {padding: 0; border: 1px solid #000;}     </style> </head><body>    <form >       <table  class="demo"  width="400px"height="150px"  id="registerTable">            <thead>               <tr style="height:10px;" >                   <th colspan="2" align="center">註冊表</th>               </tr>            </thead>            <tbody>                  <tr>                   <td style="text-align: right;">姓名:</td>                   <td><input id="username"type="text">  </td>                  </tr>               <tr>                   <td style="text-align: right;">密碼:</td>                   <td><input id="passworld"type="password" ></td>               </tr>               <tr >                   <th colspan="2" align="center"> <input type="button" value="提交" onClick="submitData()"></th>               </tr>           </tbody>          </table>       </form></body></html>

     運行效果如下所示:




       接下來建立一個JavaScript檔案commonJS.js,我是在輸出目錄下建立的一個JavaScript檔案:



/** * Flex與Jsp互動 */function getData(){    var url="../../jsp/externalInterfaceJsp.jsp";    window.open(url,"", "height=200,width=500,status=no,resizable=yes,location=no,left=95,top=110,scroll=no,help=no"); //開啟一個新視窗}function submitData(){    try{    var username=document.getElementById("username").value;    var passworld=document.getElementById("passworld").value;    var obj=new Object();    obj.username=username;    obj.passworld=passworld;    var ExternalInterfaceDemo=window.parent.opener.document.getElementById('ExternalInterfaceDemo');  //獲得一個ExternalInterfaceDemo執行個體    ExternalInterfaceDemo.sendData(obj);  //調用ActionScript中的方法    window.close(); //關閉此子視窗    }catch(e){       alert(e);    }}

       好了,開始互動,當我們在externalInterfaceJsp.jsp中輸入數值後,此頁面的資料就會自動帶回到Flex頁面。如果你實現了就說明你成功了。


       原創文章,轉載請註明出處:http://www.dianfusoft.com/




 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.