Cairngorm 之 三、登陆功能的实现

三、登陆功能的实现

3.1 用户实体类User

       定义用户名和密码。一般要加[Bindable]标签,标记为可绑定。

package  vo
{
	import com.adobe.cairngorm.vo.IValueObject;

	[Bindable]
	public class User implements IValueObject
	{
		public var userName:String = "";
		
		public var password:String = "";
		
		public function User()
		{
		}
	}
}

 

 

 

 

 

3.2        remoteObject服务

基于cairngorm框架里的ServiceLocator标签,它是使用单例模式,在整个项目中只有一个实例,当在此标签内部定义RemoteObject等于后台通信服务的标签时,便会被存储起来再使用时,通过getRemoteObject方法获取。

 

 

<?xml version="1.0" encoding="utf-8"?>
<cairngorm:ServiceLocator 
	xmlns:mx="http://www.adobe.com/2006/mxml" 
	xmlns:cairngorm="com.adobe.cairngorm.business.*">
	
	<mx:RemoteObject id="generalRemoteObject" 
					 destination="fluorine" 
					 endpoint="http://192.1.1.113/liWebService/Gateway.aspx" 
					 source="Li.FluorineFx.Sample" 
					 showBusyCursor="true"/>
	
</cairngorm:ServiceLocator>

  

 

 

3.3        后台代理类GeneralDelegate

首先获取到定义好的RemoteObject对象的引用,然后进行后台方法的调用。使用AsyncTokenaddResponder来进行返回结果的处理。

/**
 * 常用的代理
 */
package business
{
	import com.adobe.cairngorm.business.ServiceLocator;
	import mx.rpc.AsyncToken;
	import mx.rpc.IResponder;
	import vo.User;

	public class GeneralDelegate
	{
		/** 应答器 */
		private var responder:IResponder;
		
		private var service:Object;
		
		public function GeneralDelegate( responder:IResponder )
		{
			this.responder = responder;
			this.service = ServiceLocator.getInstance().getRemoteObject("generalRemoteObject"); 
		}
		
		/**
		 * 登录
		 */
		public function logon( user:User ):void
		{
			var call:AsyncToken = service.Logon(user.userName, user.password);
			call.addResponder(responder);
		}
	}
}

 

 

 

 

3.4        Model

使用单例模式,保存全局数据。

package models
{
	import com.adobe.cairngorm.model.IModelLocator;
	
	[Bindable]
	public class GeneralModel implements IModelLocator
	{
		public var logonResult:String = "";
		
		/** 单一引用对象 */
		private static var generalModel:GeneralModel = null;
		
		[Deprecated(replacement="GeneralModel.getInstance()")]
		public function GeneralModel()
		{
		}
		
		public static function getInstance():GeneralModel
		{
			if( generalModel == null )
			{
				generalModel = new GeneralModel();
			}
			return generalModel;
		}
	}
}

  

 

 

3.5        登录事件类LogonEvent

自定义事件,继承CairngormEvent一般定义一些变量用来存储数据。

/**
 * 登陆操作事件
 */
package control.event
{
	import com.adobe.cairngorm.control.CairngormEvent;
	import vo.User;
	public class LogonEvent extends CairngormEvent
	{
		/** 操作登陆的用户 */
		public var user:User;

		public static const LOGON:String = "logon";
		
		public function LogonEvent(type:String, user:User)
		{
			this.user = user;
			super(type);
		}
	}
}

 

 

 

 

 

3.6        事件注册类GeneralControl

用于对事件注册监听器。

package control
{
	import com.adobe.cairngorm.control.FrontController;
	import control.event.*;
	import commands.*;
	public class GeneralControl extends FrontController
	{
		public function GeneralControl()
		{
			super.addCommand(LogonEvent.LOGON, LogonCommand );//注册,用户登陆命令
		}
	}
}

 

 

 

 

 

3.7 对应Command

       事件触发后的处理方法,和调用后台后返回结果的处理,例如更新model中的数据。

/**
 * 用户登陆,操作命令
 */
package commands
{
	import com.adobe.cairngorm.commands.ICommand;
	import com.adobe.cairngorm.control.CairngormEvent;
	import mx.rpc.IResponder;
	import mx.rpc.events.FaultEvent;
	import mx.rpc.events.ResultEvent;
	import business.GeneralDelegate;
	import errors.ManageErrors;
	import models.GeneralModel;
	import control.event.LogonEvent;
	import vo.User;
	
	public class LogonCommand implements ICommand, IResponder
	{
		public function LogonCommand()
		{
			
		}
		
/**------------------------------- Command接口方法 ----------------------------------------------*/		
		/**
		 * 用户登陆,事件处理方法
		 */
		public function execute( event:CairngormEvent ):void
		{
			var generalDelegate:GeneralDelegate = new GeneralDelegate( this );	
			generalDelegate.logon( (event as LogonEvent).user );
		}

/**------------------------------- IResponder接口方法 ---------------------------------------------*/
		
		public function result( info:Object ):void
		{
			var result:Boolean = (info as ResultEvent).result as Boolean;
			if( result )
			{
				GeneralModel.getInstance().logonResult = "登陆成功";
			}
			else
			{
				GeneralModel.getInstance().logonResult = "登陆失败";
			}
		}
		
		public function fault( info:Object ):void
		{
			ManageErrors.manageFaults( info as FaultEvent );
		}
	}
}

 

 

 

 

3.8 界面Application

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
				layout="absolute" minWidth="1003" minHeight="600" fontSize="12" xmlns:control="control.*" xmlns:services="services.*">
	
	<mx:Script>
		<![CDATA[
			import control.event.LogonEvent;
			
			import models.GeneralModel;
			
			import vo.User;			
			/**
			 * 登陆按钮,事件处理
			 */
			private function buttonLogon_clickHandler(event:MouseEvent):void
			{
				var user:User = new User();
				user.userName = this.textInputUserName.text;
				user.password = this.textInputPassword.text;
				var logonEvent:LogonEvent = new LogonEvent(LogonEvent.LOGON, user);
				logonEvent.dispatch();
			}
			
		]]>
	</mx:Script>
	
	<control:GeneralControl />
	
	<services:GeneralServices />
	
	<mx:Binding source="GeneralModel.getInstance().logonResult" destination="textArea.text"/>
	
	<mx:VBox  width="400" horizontalCenter="0" verticalCenter="90"  horizontalAlign="center">
		<mx:HBox  verticalAlign="middle"  borderStyle="solid">
			<mx:Form >
				<mx:FormItem label="用户名:">
					<mx:TextInput id="textInputUserName" width="150"   />
				</mx:FormItem>
				
				<mx:FormItem label="密码:">
					<mx:TextInput id="textInputPassword" width="150" displayAsPassword="true"  />
				</mx:FormItem>
			</mx:Form>
			<mx:Button label="登陆" click="buttonLogon_clickHandler(event)" />
		</mx:HBox>	
		
		<mx:TextArea id="textArea" text="未登录"  />
	</mx:VBox>
	
</mx:Application>

  

 

 

你可能感兴趣的:(xml,框架,Adobe)