Java与Flex学习笔记(9)----用ExternalInterface实现Flex与外部容器交互

     

      有时候Flex需要与外部容器交互,比如和别的项目交互,调用外部数据,则可以通过ExternalInterface来实现。毕竟Flex版本还是比较“年轻”,有些地方还不完美,需要借助外部力量去实现。

 

       ExternalInterface类是外部 API,这是一个在 ActionScript 和 Flash Player 容器之间实现直接通信的应用程序编程接口,例如,包含 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>
 


       运行后页面如下所示:


Java与Flex学习笔记(9)----用ExternalInterface实现Flex与外部容器交互_第1张图片


      接着需要新建一个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>


     运行效果如下所示:


Java与Flex学习笔记(9)----用ExternalInterface实现Flex与外部容器交互_第2张图片


       接下来新建一个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/




 

你可能感兴趣的:(JavaScript,java,function,Flex,actionscript)