Cairngorm 一个简单的例子(RemoteObject)

程序是用Flex做的一个输入界面,然后点击button,请求服务器,最后显示:xxx say:Hello,Word !!!

Cairngorm <wbr>一个简单的例子(RemoteObject)图是程序的运行结果

在写程序之前,先简单说说Cairngorm的架构,它包括了三个对象:

Model Locator :承载了组件之间的所有的信息和数据的传递,这是一个Binable(可绑定)的对象;

Service Locator : 定义了数据源(Webservice, HTTPService, RemoteObject)之间通讯的数据源;

FrontController :建立广播事件(Dispatch Event)和命令层(Command)之间的对应关系(Mapping);

 

以下是相关代码:

根据Cairngorm流程图与Cairngorm类之间的关系

第一,我们要知道我们的数据(ValueObject,Model Locator)

package cairngorm.valueObject
{
 [Bindable]
 public class User
 {

  //在界面要显示的用户名
  public var userName:String;
  
  public function User() {}

 }
}

 

package cairngorm.model
{
 [Bindable]
 public class ModelLocator
 {

  //在界面绑定的用户名
  public var user:String = "";
  static private var _instance:ModelLocator = null;
  
  public function ModelLocator(){}
  
  static public function getInstance():ModelLocator
  {
   if(_instance == null){
    _instance = new ModelLocator();
   }
   
   return _instance;
  }

 }
}

 

第二,使用数据定义我们的界面(VIEWS)

<!--  一个输入框和一个发送的button  -->

InputView.mxml文件

<?xml version="1.0" encoding="utf-8"?>

<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="400" height="300">
 
 <mx:Label x="10" y="10" text="Input a userName" width="100%" fontSize="12" color="#2153E2"/>
 <mx:TextInput x="10" y="38" id="input"/>
 <mx:Button x="197" y="38" label="Send" id="sendBtn" click="sendHandler()"/>
 
 <mx:Script>
  <![CDATA[
   import cairngorm.valueObject.User;
   import cairngorm.business.event.SendEvent;
   
   private function sendHandler():void{
    var user:User = new User();
    user.userName = input.text;
    var sendEvent:SendEvent = new SendEvent(user); //Cairngorm Event
    sendEvent.dispatch();
   }
   
  ]]>
 </mx:Script>
 
</mx:Canvas>

 

<!-- 要显示username的Label -->

UserView.mxml文件

<mx:Label xmlns:mx="http://www.adobe.com/2006/mxml"/>

 

Cairngorm Event 代码:

package cairngorm.business.event
{
 import cairngorm.valueObject.User;
 
 import com.adobe.cairngorm.control.CairngormEvent;
 
 public class SendEvent extends CairngormEvent
 {
  public static var sendEvent:String = "SEND_EVENT";
  public var user:User; // ValueObject里的对象
  
  public function SendEvent(user:User)
  {
   super(sendEvent);
   this.user = user;
  }

 }
}

 

第三,使用FrontController将事件广播并映射到Command

package cairngorm.business.control
{
 import com.adobe.cairngorm.control.FrontController;
 import cairngorm.business.event.SendEvent;
 import cairngorm.business.commands.UserCommand;
 
 public class UserController extends FrontController
 {
  public function UserController()
  {
   super();
   addCommand(SendEvent.sendEvent, UserCommand);
  }

 }
}

 

第四,因为这里使用到了服务器,所以,Command映射到Delegate,delegate调用Service里的方法,此程序调用的是sayHelloWord方法

package cairngorm.business.service
{
 import cairngorm.valueObject.User;
 
 import com.adobe.cairngorm.business.ServiceLocator;
 
 import mx.rpc.IResponder;
 
 public class UserDelegate
 {
  private var service:Object;
  private var response:IResponder;
  
  public function UserDelegate(response:IResponder)
  {
   this.service = ServiceLocator.getInstance().getRemoteObject("myRemote"); //获取RemoteObject对象
   this.response = response;
  }
  
  public function displayUser(user:User):void
  {
   var call:Object = service.sayHelloWord(user.userName); // 调用服务器的方法
   call.addResponder(response);
  }

 }
}

 

<?xml version="1.0" encoding="utf-8"?>
<cairngorm:ServiceLocator xmlns:mx="http://www.adobe.com/2006/mxml"
  xmlns:cairngorm="http://www.adobe.com/2006/cairngorm">
  
 <mx:RemoteObject id="myRemote" destination="helloWord"/>
 
</cairngorm:ServiceLocator>

上面的xml定义了程序将要调用的RemoteObject RemoteObject 所调用的Destination需要和remoting_config.xml文件中的Destination相一致。在此,Destination的值为“helloword

 

以下是服务器的remoting-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<service id="remoting-service"
    class="flex.messaging.services.RemotingService">

    <adapters>
        <adapter-definition id="java-object"                          class="flex.messaging.services.remoting.adapters.JavaAdapter" default="true"/>
    </adapters>

    <default-channels>
        <channel ref="my-amf"/>
    </default-channels>
   
    <destination id="helloWord">
     <properties>
      <source>flex.samples.helloWord.HelloWord</source>
     </properties>
    </destination>

</service>

 

最后,command调用服务器(Service)传回的结果更新Model Locator

package cairngorm.business.commands
{
 import cairngorm.business.event.SendEvent;
 import cairngorm.business.service.UserDelegate;
 import cairngorm.model.ModelLocator;
 import cairngorm.valueObject.User;
 
 import com.adobe.cairngorm.commands.ICommand;
 import com.adobe.cairngorm.control.CairngormEvent;
 
 import mx.rpc.IResponder;
 import mx.rpc.events.ResultEvent;
 
 public class UserCommand implements ICommand, IResponder
 {
  public function UserCommand(){}
  
  public function execute(event:CairngormEvent):void
  {
   var user:User = (event as SendEvent).user;
   var userDelegate:UserDelegate = new UserDelegate(this);
   userDelegate.displayUser(user);
  }
  
  public function result(data:Object):void
  {
   var _model:ModelLocator = ModelLocator.getInstance();
   _model.user = (data as ResultEvent).result.toString();
  }
  
  public function fault(data:Object):void
  {
   trace("fault ..........");
  }
 }
}

 以上的构架是怎样组合起来的呢,看看主页代码:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
    xmlns:views="cairngorm.view.*" xmlns:control="cairngorm.business.control.*"
    xmlns:service="cairngorm.business.service.*">
 
 <mx:Script>
  <![CDATA[
   
   import cairngorm.model.ModelLocator;
   
   [Bindable]
   var _model:ModelLocator = ModelLocator.getInstance();
   
  ]]>
 </mx:Script>
 
 <service:UserService id="myService"/>
 <control:UserController id="myController"/>
     
 <mx:VBox y="10" height="366" width="100%" horizontalCenter="11">
  <views:InputView  height="60"/>
  <views:UserView text="{_model.user}"/>
 </mx:VBox>
 
</mx:Application>

 

最后附上服务器代码和project的架构

package flex.samples.helloWord;

public class HelloWord {
 
 public String sayHelloWord(String name){
  System.out.println(name + " say: Hello, Word !!!!");
  return name + " say: Hello, Word !!!!";
 }

}

project架构

Cairngorm <wbr>一个简单的例子(RemoteObject)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值