浏览 3380 次
锁定老帖子 主题:Mate + BlazeDs ...
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2009-09-29
最后修改:2009-09-29
对Mate还没有了解的童鞋可以先去这里了解下..=>Mate<= 对blazeDs还没有了解的童鞋可以先去这里了解下..=>blazeDs<= 之前我总结了一下Mate + blazeDs我们走完整个框架流程应该有的步骤: views=>eventMap=>eventHandler=>remoteInvoker=>services=>remoting-config.xml=>class 我们在blazeDs端要做的事情只有从remoting-config.xml开始.. class就是我们要调用的 .. 之前的那么多步骤都是在Mate中完成. 话说当我自己画完这个流程的时候我也在想. 这样是不是值得.. 或许我沾染上了Java的恶习.. 为了让大家更加清晰地了解整个调用过程. 我分别使用的Mate 跟 blazeDs 的Helloworld 然后将他们组合.. 我们先从blazeDs说起. package com.taobao.designcenter; /** * * @author Saito */ public class HelloWorld { public HelloWorld() { } public String getHelloWorld() { return "Hello World!"; } } 写完了这个class . 将编译过后的 .class文件扔到类似如下的目录下 .. D:\Apache Software Foundation\Tomcat 6.0\webapps\blazeds\WEB-INF\classes 注意你的包名 .. 是什么包从包开始copy到目录下就ok . 写完了我们只要在下面地址寻找remoting-config.xml文件.在Service里面增加如下一段 D:\Apache Software Foundation\Tomcat 6.0\webapps\blazeds\WEB-INF\flex <destination id="helloWorld"> <properties> <source>com.taobao.designcenter.HelloWorld</source> </properties> </destination> 然后启动Tomcat就ok了.. 现在编写客户端Mate部分.. Mate一般来说划分包的结构为. views maps events由于我们要调用blazeDs的东西.所以增加一个services. 顾名思义 views是view . maps是一个events映射. events就是event .services描述service . 囧rz ... 既然是跟blazeDs交互. 那就先从services开始吧.新建一个Service.mxml. <?xml version="1.0" encoding="utf-8"?> <mx:Object xmlns="http://mate.asfusion.com/" xmlns:mx="http://www.adobe.com/2006/mxml"> <mx:RemoteObject id="helloService" destination="helloWorld" source="com.taobao.designcenter.HelloWorld"/> </mx:Object> destination是供eventHandler调用的. source就是你的blazeDs下的class的位置. 接下来在maps里面新建一个 EventMaps.mxml <?xml version="1.0" encoding="utf-8"?> <EventMap xmlns:mx="http://www.adobe.com/2006/mxml" xmlns="http://mate.asfusion.com/"> <mx:Script> <![CDATA[ import com.taobao.designcenter.events.MessageEvent; ]]> </mx:Script> <EventHandlers type="{MessageEvent.GET}"> <RemoteObjectInvoker source="com.taobao.designcenter.HelloWorld" destination="helloWorld" method="getHelloWorld"> <resultHandlers> <CallBack method="handleResult" arguments="{resultObject}"/> </resultHandlers> </RemoteObjectInvoker> </EventHandlers> </EventMap> EventHandlers type就是事件类型. 什么事件类型由我这个Handler处理.下面我们来给出这个事件的代码. RemoteObjectInvoker source destination跟上面对应. method就是我们的method .如果我们有参数 可以加 arguments这个属性. resultHandlers CallBack就是回来call谁? . method是我们自己的处理方法..以及参数.看清楚. 参数是我们的blazeDs端得返回值..这个很强大.. 事件的定义在这边.. events 里面新建MessageEvent.as package com.taobao.designcenter.events { import flash.events.Event; public class MessageEvent extends Event { public static const GET:String = "getMessage"; public var name:String; public function MessageEvent(type:String, bubbles:Boolean=true, cancelable:Boolean=false) { super(type, bubbles, cancelable); } } } 这边bubbles就是 是不是可以上溢.. 另一个是否可取消. 这边的事件定义就在上面调用. 我们现在还缺少handleResult 以及views .. 我们来创建一个views . 在views下面创建一个 MessagePanel.mxml <?xml version="1.0" encoding="utf-8"?> <mx:Panel xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:mate="http://mate.asfusion.com/" title="Message directly from event response" resizeEffect="Resize" horizontalScrollPolicy="off" verticalScrollPolicy="off"> <mx:Script> <![CDATA[ import com.taobao.designcenter.events.MessageEvent; public function handleResult(text:String):void { currentState='response'; display.text = text; } private function submitForm():void { var event:MessageEvent = new MessageEvent(MessageEvent.GET, true); event.name = inputName.text; dispatchEvent(event); } ]]> </mx:Script> <mx:HBox> <mx:Label text="Write your name:"/> <mx:TextInput id="inputName" enter="submitForm()"/> <mx:Button label="GO" click="submitForm()"/> </mx:HBox> <mx:states> <mx:State name="response"> <mx:AddChild position="lastChild"> <!-- We get the message text directly from the server response by using the response attribute in the Dispatcher's ResponseListener --> <mx:Text id="display" styleName="message" /> </mx:AddChild> </mx:State> </mx:states> </mx:Panel> 关于界面的部分就不浪费时间了. 我们主要看event处理. 我们在Button处产生了一个MessageEvent ... 然后dispatchEvent了. 之后就会被我们的Handler捕获.. 然后调用我们之前的resultHandlers .. 这个handler就写在我们上面这里handleResult 然后我们的逻辑就全部完成了.. 总结一下. button产生了一个MessageEvent..然后这个Event被捕获. 捕获完成后被处理. 处理过程中拿到了blazeDs中的提供服务的值.. 然后返回了结果. 我们把这个结果传递给了handler.. handler为我们在界面上做出响应.. so ... . .. ok .. 最后再Application里面显示我们的结果.. <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:view="com.taobao.designcenter.views.*" xmlns:maps="com.taobao.designcenter.maps.*" layout="vertical" > <maps:EventMaps /> <mx:HBox> <view:MessagePanel /> </mx:HBox> </mx:Application> 多余话我就不说了. 你还是享受这繁复过程后的兴奋结果吧.. 再来看下整个Mate + blazeDs的过程... views=>eventMap=>eventHandler=>remoteInvoker=>services=>remoting-config.xml=>class ok .. 在这里推荐几个教程. 我的东西也参考自下面的内容 .大家可以去围观一下.. Mate HelloWorld with amfphp 用一个HelloWorld例子手把手教会你使用BlazeDS god bless you ... 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-01-04
请教一下,,services的作用是什么??似乎没有任何页面引用services里面的object,,似乎没有任何作用额,,,但是没有它还出错,能解释一下吗?谢谢,,
[RPC Fault faultString="Send failed" faultCode="Client.Error.MessageSend" faultDetail="Channel.Connect.Failed error NetConnection.Call.Failed: HTTP: Failed: url: 'http://localhost:8080/HelloMateBlazeDS/messagebroker/amf'"] |
|
返回顶楼 | |
发表时间:2010-01-05
EventMaps.mxml 里面有 RemoteObjectInvoker这个东西的..
当你发起一个MessageEvent.GET的时候. 就会call Remote Class 的 method.. 对于这个示例来说就是 call helloWorld 的 getHelloWorld()方法. 然后返回的结果交给handleResult这个actionscript的function .. 其实也就是MessageEvent.GET这个事件讲前后串了起来.. EventMaps.xml其实是Mate这个框架的灵魂所在.. Mate主要就提供了事件处理 跟 依赖注入这两大特性.. 不过还是推荐你去Mate的官方网站的forum里面看看他们的讨论.. 里面有Mate所适合与不适合领域的讨论. |
|
返回顶楼 | |
发表时间:2010-01-06
多谢楼主的回复,问题已经解决,mate的工作原理稍微了解一点儿,mate里面的sample的结构里面似乎没有services这个文件夹,其实没有楼主所用的service也可以通过,那个service楼主似乎是为了便于管理另外生成一个services文件夹,把service放到里面管理,但是在EventMpas里面直接引用的是source="com.taobao.designcenter.HelloWorld"这个类,而不是service,这里好像可以引用service的吧,这样也许更便于管理,不知道对不对!
|
|
返回顶楼 | |