论坛首页 编程语言技术论坛

Mate + BlazeDs ...

浏览 3387 次
精华帖 (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 ...
   发表时间: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'"]
0 请登录后投票
   发表时间: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所适合与不适合领域的讨论.
0 请登录后投票
   发表时间:2010-01-06  
多谢楼主的回复,问题已经解决,mate的工作原理稍微了解一点儿,mate里面的sample的结构里面似乎没有services这个文件夹,其实没有楼主所用的service也可以通过,那个service楼主似乎是为了便于管理另外生成一个services文件夹,把service放到里面管理,但是在EventMpas里面直接引用的是source="com.taobao.designcenter.HelloWorld"这个类,而不是service,这里好像可以引用service的吧,这样也许更便于管理,不知道对不对!
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics