使用Flex+Cairngorm+AIR制作列车时刻表查询工具[连载三]
时间:2010-11-03 来源:小斌斌
编写命令
GetStationDetailCommand.as
- package com.example.command
- {
- import com.adobe.cairngorm.commands.ICommand;
- import com.adobe.cairngorm.control.CairngormEvent;
- import com.example.business.TrainDelegateWS;
- import com.example.business.TrainDelegateDB;
- import com.example.event.SearchByStationEvent;
- import com.example.model.TrainModelLocator;
- import mx.collections.ArrayCollection;
- import mx.controls.Alert;
- import mx.rpc.IResponder;
- import mx.rpc.events.FaultEvent;
- public class GetStationDetailCommand implements ICommand, IResponder
- {
- private var modelLocator:TrainModelLocator = TrainModelLocator.getInstance();
- private var deaultNS:Namespace = new Namespace("http://WebXml.com.cn/");
- private var diffNS:Namespace = new Namespace("diffgr","urn:schemas-microsoft-com:xml-diffgram-v1");
- public function execute( event : CairngormEvent ): void {
- var searchEvent:SearchByStationEvent = SearchByStationEvent(event);
- modelLocator.startStation = searchEvent.start;
- modelLocator.arriveStation = searchEvent.end;
- switch(modelLocator.currentService) {
- case "webService":
- var delegate : TrainDelegateWS = new TrainDelegateWS(this);
- delegate.getStationDetail();
- break;
- case "dataBase":
- var delegateDB : TrainDelegateDB = new TrainDelegateDB(this);
- delegateDB.getStationDetail();
- break;
- }
- }
- public function result( event : Object ) : void {
- default xml namespace = deaultNS;
- var resultXML:XML = new XML(event.result.toString());
- var resultList:XMLList = resultXML.getStationAndTimeByStationNameResult.diffNS::diffgram.getStationAndTime.TimeTable;
- var model : TrainModelLocator = TrainModelLocator.getInstance();
- model.currentStaionList.trainStationList = new ArrayCollection();
- var count:uint = 1;
- for each(var item:XML in resultList) {
- var nodeItem:Object = new Object();
- nodeItem.num = count;
- count++;
- nodeItem.TrainCode = item.TrainCode;
- nodeItem.FirstStation = item.FirstStation;
- nodeItem.LastStation = item.LastStation;
- nodeItem.StartStation = item.StartStation;
- nodeItem.StartTime = item.StartTime;
- nodeItem.ArriveStation = item.ArriveStation;
- nodeItem.ArriveTime = item.ArriveTime;
- nodeItem.KM = item.KM;
- nodeItem.UseDate = item.UseDate;
- model.currentStaionList.trainStationList.addItem(nodeItem);
- }
- model.currentState = "resultByStationList";
- }
- public function fault( event : Object ) : void {
- var faultEvent : FaultEvent = FaultEvent( event );
- Alert.show("Train could not be retrieved!");
- }
- }
- }
GetTrainDetailCommand.as
- package com.example.command
- {
- import com.adobe.cairngorm.commands.ICommand;
- import com.adobe.cairngorm.control.CairngormEvent;
- import com.example.business.TrainDelegateWS;
- import com.example.business.TrainDelegateDB;
- import com.example.event.SearchByTrainNameEvent;
- import com.example.model.TrainModelLocator;
- import mx.collections.ArrayCollection;
- import mx.controls.Alert;
- import mx.rpc.IResponder;
- import mx.rpc.events.FaultEvent;
- public class GetTrainDetailCommand implements ICommand, IResponder
- {
- private var modelLocator:TrainModelLocator = TrainModelLocator.getInstance();
- private var deaultNS:Namespace = new Namespace("http://WebXml.com.cn/");
- private var diffNS:Namespace = new Namespace("diffgr","urn:schemas-microsoft-com:xml-diffgram-v1");
- public function execute( event : CairngormEvent ): void {
- var searchEvent:SearchByTrainNameEvent = SearchByTrainNameEvent(event);
- modelLocator.currentTrain.name = searchEvent.trainName;
- switch(modelLocator.currentService) {
- case "webService":
- var delegate : TrainDelegateWS = new TrainDelegateWS(this);
- delegate.getTrainDetail();
- break;
- case "dataBase":
- var delegateDB : TrainDelegateDB = new TrainDelegateDB(this);
- delegateDB.getTrainDetail();
- break;
- }
- }
- public function result( event : Object ) : void {
- default xml namespace = deaultNS;
- var resultXML:XML = new XML(event.result.toString());
- var resultList:XMLList = resultXML.getDetailInfoByTrainCodeResult.diffNS::diffgram.getDetailInfo.TrainDetailInfo;
- var model : TrainModelLocator = TrainModelLocator.getInstance();
- model.currentTrain.journey = new ArrayCollection();
- var count:uint = 1;
- for each(var item:XML in resultList) {
- var nodeItem:Object = new Object();
- nodeItem.num = count;
- count++;
- nodeItem.TrainStation = item.TrainStation;
- nodeItem.ArriveTime = item.ArriveTime;
- nodeItem.StartTime = item.StartTime;
- nodeItem.KM = item.KM;
- model.currentTrain.journey.addItem(nodeItem);
- }
- model.currentState = "resultByTrainName";
- }
- public function fault( event : Object ) : void {
- var faultEvent : FaultEvent = FaultEvent( event );
- Alert.show("Train could not be retrieved!");
- }
- }
- }
前端控制器
然后让我们来完成前端控制器,这里比较简单,就是映射两个事件到相应的命令上:
TrainController.as
- package com.example.control
- {
- import com.adobe.cairngorm.control.FrontController;
- import com.example.command.*;
- import com.example.event.SearchByTrainNameEvent;
- import com.example.event.SearchByStationEvent;
- public class TrainController extends FrontController
- {
- public function TrainController() {
- initialiseCommands();
- }
- public function initialiseCommands() : void {
- addCommand( SearchByTrainNameEvent.SEARCH_BY_TRAIN_NAME, GetTrainDetailCommand);
- addCommand( SearchByStationEvent.SEARCH_BY_STATION, GetStationDetailCommand);
- }
- }
- }
自定义事件
我们需要自定义事件的播放来触发命令的操作,这里我们建立两个自定义事件,分别对应两种搜索状态:
SearchByStationEvent.as
- package com.example.event
- {
- import flash.events.Event;
- import com.adobe.cairngorm.control.CairngormEvent;
- public class SearchByStationEvent extends CairngormEvent {
- public static var SEARCH_BY_STATION : String = "searchByStation";
- public var start : String;
- public var end : String;
- public function SearchByStationEvent() {
- super(SEARCH_BY_STATION);
- }
- override public function clone() : Event {
- return new SearchByStationEvent();
- }
- }
- }
SearchByTrainNameEvent.as
- package com.example.event
- {
- import flash.events.Event;
- import com.adobe.cairngorm.control.CairngormEvent;
- public class SearchByTrainNameEvent extends CairngormEvent {
- public static var SEARCH_BY_TRAIN_NAME : String = "searchByTrainName";
- public var trainName : String;
- public function SearchByTrainNameEvent() {
- super(SEARCH_BY_TRAIN_NAME);
- }
- override public function clone() : Event {
- return new SearchByTrainNameEvent();
- }
- }
- }
下一步实现数据模型:
TrainModelLocator.as
- package com.example.model
- {
- import com.adobe.cairngorm.model.ModelLocator;
- import com.example.vo.StationListVO;
- import com.example.vo.TrainVO;
- [Bindable]
- public class TrainModelLocator implements ModelLocator {
- private static var modelLocator : TrainModelLocator;
- public static function getInstance() : TrainModelLocator {
- if ( modelLocator == null ) {
- modelLocator = new TrainModelLocator();
- }
- return modelLocator;
- }
- public function TrainModelLocator() {
- if ( modelLocator != null ) {
- throw new Error( "Only one TrainModelLocator instance should be instantiated" );
- }
- }
- //serviceConfig
- public var wsWSDL:String = "http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx?wsdl";
- public var currentTrain : TrainVO = new TrainVO();
- public var currentStaionList : StationListVO = new StationListVO();
- public var currentService:String = "webService";
- public var startStation:String = "";
- public var arriveStation:String = "";
- //当前状态
- public var currentState:String = "";
- }
- }
我们定义两个ValueObject类,用于保存按照两种搜索模式检索的返回结果:
StationListVO.as
- package com.example.vo
- {
- import com.adobe.cairngorm.vo.IValueObject;
- import mx.collections.ArrayCollection;
- [RemoteClass(alias="com.example.vo.StationListVO")]
- public class StationListVO implements IValueObject
- {
- //始发站
- [Bindable]
- public var startStation:String;
- //目的地
- [Bindable]
- public var endStation:String;
- //列车以及行程
- [Bindable]
- public var trainStationList:ArrayCollection;
- }
- }
TrainVO.as
- package com.example.vo
- {
- import com.adobe.cairngorm.vo.IValueObject;
- import mx.collections.ArrayCollection;
- [RemoteClass(alias="com.example.vo.TrainVO")]
- public class TrainVO implements IValueObject
- {
- //列车车次
- [Bindable]
- public var name:String;
- //列车行程,是一个数组,数组的每一项包含序号,车站,到达时间,发车时间,里程(公里)
- [Bindable]
- public var journey:ArrayCollection;
- }
- }
至此完成了编码工作,然后我们打开AIR的配置文件(TrainSchedule-app.xml),修改宽度和高度为(800*600),这样返回结果可以显示的更全面一些。
源码下载地址:
http://doc.riameeting.com/download/TrainSchedule.rar
相关阅读 更多 +