上个月25号,Adobe正式发布了万众期待的Flex builder 3.0( ,偶就是其中一员哦),同时还将Blazeds开源了。BlazeDS 为Adobe 的一个新的关于远程(Remoting)与网络信息系统(Web Messaging,类似于JMS)的开源项目。BlazeDS 是以前的LCDS ES 的一部分变为开源的。BlazeDS高效简洁完美的远程调用,flex(UI)+BlazeDS(数据通信)+java(后台)一个完美的组合。
说来也巧,目前我所在的公司的一个电力项目被迫改用JAVA开发,(在此之前是决定用.NET + FLEX的,但是过年一来公司负责人非要改用JAVA )要知道我在过年期间抽时间把框架精心设计了,基础类库都写好了。这时叫我放弃真有点舍不得,再说我之前一直搞.NET开发,对于JAVA可以说是新手呢。
好了,言归正传,回到我们如何使用Blazeds与JAVA开发的议题上来。首先我们要准备的工具以及类库有:1.eclipse 3.2或3.2以上版本;2.下载相关插件(告诉大家一个好地方,将我们常用的插件全部集中了http://www.easyeclipse.org/site/distributions/server-java.html,当然你也可以下载它帮你集成好的-easyeclipse, 个人认为比myeclipse厚道多了 ,既免费而且也很全。 );3.下载APACHE TOMCAT5.5或5.5以上版本;4.Blazeds;5. Flex builder 3.0插件版。
我们全部准备好之后,我们首先安装apache tomcat,然后解压eclipse到你指定的目录,接着将你下载的插件依次安装到eclipse(包括flex builder 3.0插件版),最后我们双击打开eclipse设置好你的工作目录后(如果发现你的eclipse不能启动,那么要么你没有安装JAVA环境或者JAVA环境变量有问题,网上有很多此类问题的解决方案。)。
打开eclipse后,我们点击window菜单选择preference选项,在左边的目录中选择tomcat,指定你所安装的tomcat的目录。如下图

设置好之后,我们点击OK。接着点击file菜单选择new选项新建一个flex project项目,
接着我们点击next,输入你的项目名同时选择你的服务器类型为J2EE,并且将use remote object access选中,

做好之后,我们点击next进入下一步,我们在j2ee设置中指定targe runtime为你所安装的apache tomcat,同时我们将我们下载的blazeds_bin_3-0-0-544.zip解压,然后将Flex WAR file一栏中指定到你刚才所解压出的WAR文件,
做完这一步后,我们就可以直接点击finish了,当然你也可以点击next进入下一步设置你需要的东东哦。
至此,我们点击flex输出目录中(我的是bin-debug)html文件,选择工具栏上的debug按钮就可以看到flex页面了(要注意的是,如果发现404错误的话,请重新启动你的tomcat服务器),至于如何在flex中通过remoteobject对象调用服务端的方法,我将在下一遍日志中展现给大家。
Flex的Remoting采用AMF通信协议(Flex3已经升级为了AMF2了),这种协议最大的一个优势就是由于采用了二进制的传输方式,其传输效率非常高,可以让我们在复杂的网络环境获得良好的性能。根据国外一个很牛的老外写的在线测试工具,AMF协议的效率要远远高于webservice以及采用JSON格式承载数据的AJAX方式。 Flex的另一种方式通信就是PollingChannel,它的特点就是它可以多批次的去服务端取数据,而不是长时间保持连接直到所有数据取回之后才关闭我们宝贵的HTTP连接。
首先我们在WEB-INF下面的Class目录中添加一个JAVA类,如下:
public class HelloWorld { private String userSaid; public String repeat(String said) { this.userSaid = "Reply from server: " + said; return this.userSaid; } public String sayHello() { Date now = new Date(); return "Hello World " + now; } }
然后我们打开Remoting-Config.xml文件,在service中添加一个目的地指向我们服务端的JAVA类(destination节点),具体如下:
<service id="remoting-service" class="flex.messaging.services.RemotingService"> <adapters> <adapter-definition id="java-object" class="flex.messaging.services.remoting.adapters.JavaAdapter" default="true"></adapter-definition> </adapters> <destination id="Hello"> <properties> <source>HelloWorld</source> </properties> </destination> <default-channels> <channel ref="my-amf"> </channel> </default-channels> </service>
添加完成之后,我们打开一个flex页面,在上面添加一个RemotObject标签,当然你也可以在可视化状态下拖一个上去,然后添加我们刚才在HelloWorl类中定义的两个方法,并在AS代码块中定义两个回调方法用来异步接收返回的结果或发生的异常,具体代码如下:
<mx:application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" backgroundcolor="#FFFFFF" viewsourceurl="srcview/index.html"> <mx:remoteobject id="myservice" fault="faultHandler(event)" showbusycursor="true" destination="Hello"> <mx:method name="sayHello" result="resultHandler(event)"> <mx:method name="repeat" result="resultHandler(event)"> </mx:method> <mx:script> <!–[CDATA[ import mx.managers.CursorManager; import mx.rpc.events.ResultEvent; import mx.rpc.events.FaultEvent; private function faultHandler(fault:FaultEvent):void { CursorManager.removeBusyCursor(); result_text.text = "code:n" + fault.fault.faultCode + "nnMessage:n" + fault.fault.faultString + "nnDetail:n" + fault.fault.faultDetail; } private function resultHandler(evt:ResultEvent):void { result_text.text = evt.message.body.toString(); // same as: evt.result.toString(); } ]]–> </mx:script> <mx:button x="250" y="157" label="sayHello" width="79" click="myservice.getOperation(’sayHello’).send();"> <mx:button x="250" y="187" label="Repeat" click="myservice.getOperation(’repeat’).send(myText.text); "> <mx:textarea x="10" y="36" width="319" height="113" id="result_text"> <mx:label x="10" y="10" text="Result:"> <mx:textinput x="82" y="187" id="myText" text="Sent to server"> </mx:textinput> </mx:label>
</mx:textarea></mx:button></mx:button></mx:method></mx:remoteobject></mx:application>
做好之后,激动人心的时刻来临了, F11运行,现在你就可以尽情的与服务端发消息了。注意,JAVA类的序列化与反序列化对我们来说都是透明的,这一切都是FLEX与Blazeds为我们做的。这就是它们带给我们的好处,让我们将重点放在业务逻辑与用户更好的操作性与体验上。
|