flex流行mvc框架之cairngorm小試牛刀
《flex流行mvc框架之cairngorm小試牛刀》由會員分享,可在線閱讀,更多相關(guān)《flex流行mvc框架之cairngorm小試牛刀(10頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、前幾天學(xué)了下Flex的一MVC流行框架Cairngorm,并自己小試牛刀一把,暫作了一網(wǎng)站后臺,通過項目讓我現(xiàn)在覺得Cairngorm并不是一個如此神奇的東西,只要我們大家都能按照它走一遍就會有所收獲,我們就會對MVC有個基本的了解,也會對Cairngorm有一個初步了解,希望大家通過我的這篇文章也能寫出一個demo出來,當(dāng)然是能在不看我這篇demo或者別人的demo的前提下寫出來啦,呵呵,首先要說的是,這個框架并不是一定要在lcds下才能運行的,所以大家可以簡單的建個Flex項目就OK了,下面就開始我們的Demo。在最后會把整個工程源碼提供出來,歡迎下載。 我們新建工程,有一個Cair
2、ngrom的swc包一定要引進去才行的哈,不然是不能成功的,所以大家可以Cairngrom的官方網(wǎng)站上去下載哈,我在這里提供地址,方便大家去下載 先把我剛寫的一個小demo的部署結(jié)構(gòu)給大家看看, 下面我會一一講解每個包中應(yīng)方的類,每個包的命名都是很規(guī)范的,這樣大家就很清晰的理解你寫的代碼的意思,所以建議大家不要輕易改變這么命名。我先說說這里的包,既然是MVC框架的話,當(dāng)然我們要把哪些是M,哪些是V以及哪些是C給分出來。M主要是模型,我們從命名也許也能猜到了,model和vo應(yīng)該都歸屬于該層了,它主要是存放的是數(shù)據(jù)模型,vo中存的就是普通的數(shù)據(jù),一般的話都是最小單位的數(shù)據(jù),是不能進
3、行再次分解的數(shù)據(jù),代碼如下: Java代碼 1. packageorg.rjb.vo 2. { 3. importcom.adobe.cairngorm.vo.IValueObject; 4. //一般情況下,我們需要實現(xiàn)框架中的IValueObject接口 5. publicclassUserVOimplementsIValueObject{ 6. //存放用戶名 7. publicvaruserName:String; 8. //存放密碼 9. publicvarpassword:String; 10. } 11. } package or
4、g.rjb.vo { import com.adobe.cairngorm.vo.IValueObject; //一般情況下,我們需要實現(xiàn)框架中的IValueObject接口 public class UserVO implements IValueObject{ //存放用戶名 public var userName:String; //存放密碼 public var password:String; } } 而model中的數(shù)據(jù)一般是包括相應(yīng)的VO對象以及一些相關(guān)的應(yīng)用變量,比如說系統(tǒng)狀態(tài)什么的,當(dāng)然要按自己的意思來了,并且我們一般把它做
5、成單例類,前面我有篇文章就是講單例模式的,并對比了java和actionscript3.0中不同的實現(xiàn)方式,如果還不是很了解的話大家可以去參考下。下面是改model類: Java代碼 1. packageorg.rjb.model 2. { 3. importcom.adobe.cairngorm.model.ModelLocator; 4. 5. importorg.rjb.vo.UserVO; 6. [Bindable] 7. publicclassUserModelLocatorimplementsModelLocator 8. { 9. //存
6、放vo對象 10. publicvaruserVO:UserVO; 11. //存放一些狀態(tài)變量 12. publicvarstate:String="User---Login"; 13. //單例對象 14. privatestaticvarmodelLocator:UserModelLocator; 15. 16. publicstaticfunctiongetInstance():UserModelLocator{ 17. if(modelLocator==null){ 18. modelLocator=newUserModelLocator(new
7、SingleClass()); 19. } 20. returnmodelLocator; 21. } 22. 23. publicfunctionUserModelLocator(single:SingleClass){ 24. if(single==null){ 25. thrownewError("YouCanOnlyHaveOneUserModelLocator"); 26. } 27. 28. } 29. } 30. } 31. classSingleClass{} package org.rjb.model { imp
8、ort com.adobe.cairngorm.model.ModelLocator; import org.rjb.vo.UserVO; [Bindable] public class UserModelLocator implements ModelLocator { //存放vo對象 public var userVO:UserVO; //存放一些狀態(tài)變量 public var state:String="User---Login"; //單例對象 private static var modelLocator:UserMo
9、delLocator; public static function getInstance():UserModelLocator{ if(modelLocator==null){ modelLocator=new UserModelLocator(new SingleClass()); } return modelLocator; } public function UserModelLocator(single:SingleClass){ if(single==null){ throw new Error
10、( "You Can Only Have One UserModelLocator" ); } } } } class SingleClass{} 設(shè)成單例類的話我們可以保證系統(tǒng)的數(shù)據(jù)得到同意,并且我們會把它設(shè)置為綁定模式,可以和接下來說的view包下的視圖類進行數(shù)據(jù)綁定。view包下前面說了,是存放相關(guān)的視圖的,可以是as的也可以是mxml的,看大家的意思了,比如說我們可以存放些自定義的組建或擴展的組件等,下面是LoginPanel.mxml的代碼: Java代碼 1.
11、
2. 12、elLocator.getInstance();
11. //提交的出來方法
12. privatefunctionsubmit():void{
13. varuserVO:UserVO=newUserVO;
14. userVO.userName=this.userName.text;
15. userVO.password=this.password.text;
16. varloginEvent:LoginEvent=newLoginEvent(userVO);
17. CairngormEventDispatcher.getInstance().dispat 13、chEvent(loginEvent);
18. }
19. //重置的出來方法
20. privatefunctionreset():void{
21. this.userName.text="";
22. this.password.text="";
23. }
24. //返回的處理方法
25. privatefunctionreturnToLogin():void{
26. this.currentState="";
27. modelLovator.state="User---Login";
28. reset();
29. }
3 14、0. ]]>
31.
32. 15、="text1"/>
37.
38. 16、tChild"relativeTo="{vbox1}">
45. 17、
49.
50.
51. 18、d="form1">
55. 19、
60.
61. 20、xmlns:mx=" layout="absolute" width="400" height="300" horizontalAlign="center" verticalAlign="middle">
21、rVO;
[Bindable]
private var modelLovator:UserModelLocator=UserModelLocator.getInstance();
//提交的出來方法
private function submit():void{
var userVO:UserVO=new UserVO;
userVO.userName=this.userName.text;
userVO.password=this.password.text;
var loginEvent:LoginEvent=new 22、LoginEvent(userVO);
CairngormEventDispatcher.getInstance().dispatchEvent(loginEvent);
}
//重置的出來方法
private function reset():void{
this.userName.text="";
this.password.text="";
}
//返回的處理方法
private function returnToLogin():void{
this.currentState="";
mod 23、elLovator.state="User---Login";
reset();
}
]]>
24、ly="Courier New" fontSize="36" color="#EC175D" id="text1"/>
26、="188" label="return" click="returnToLogin()"/>
27、 horizontalCenter="4" verticalCenter="1" id="form1">
28、Password="true" id="password" text="pass"/>
29、vent包,其實這個包我們和接下來說的commands包合并,我在這就分開了,為的是使結(jié)構(gòu)更加清晰哈,在event包下我們存放的是我們自定義的事件,比如下面的LoginEvent.as:
Java代碼
1. packageorg.rjb.event
2. {
3. importcom.adobe.cairngorm.control.CairngormEvent;
4.
5. importflash.events.Event;
6.
7. importorg.rjb.vo.UserVO;
8.
9. publicclassLoginEventexten 30、dsCairngormEvent
10. {
11. //定義事件類型常量
12. publicstaticconstLOGIN_EVENT:String="login";
13. //我們可以在這里加入額外的變量,當(dāng)然是我們需要的哈
14. publicvaruserVO:UserVO;
15. publicfunctionLoginEvent(userVO:UserVO)
16. {
17. super(LOGIN_EVENT);
18. this.userVO=userVO;
19. }
20.
21. overridepublicfun 31、ctionclone():Event
22. {
23. returnnewLoginEvent(userVO);
24. }
25. }
26. }
package org.rjb.event
{
import com.adobe.cairngorm.control.CairngormEvent;
import flash.events.Event;
import org.rjb.vo.UserVO;
public class LoginEvent extends CairngormEvent
{
//定義事件類型常量
32、public static const LOGIN_EVENT:String="login";
//我們可以在這里加入額外的變量,當(dāng)然是我們需要的哈
public var userVO:UserVO;
public function LoginEvent(userVO:UserVO)
{
super(LOGIN_EVENT);
this.userVO=userVO;
}
override public function clone():Event
{
return new LoginEvent(userVO);
} 33、
}
}
好了,我們繼續(xù)說說在command包下的東東哈,在這里的話主要是存放我們自定義的事件一旦發(fā)生的時候,我們究竟要怎么處理它,所以在這下面是我們自定義的類似監(jiān)聽事件的類,但是在這些類中我們一般只相當(dāng)于一個事件處理的接口,我們會把真正的處理轉(zhuǎn)交給business中的代理類中,尤其是進行遠程調(diào)用的時候最常用,下面是我們的LoginCommand類:
Java代碼
1. mand
2. {
3. mands.ICommand;
4. importcom.adobe.cairngorm.control.CairngormEvent;
5.
6. i 34、mportmx.controls.Alert;
7. importmx.core.Application;
8. importmx.rpc.IResponder;
9. importmx.rpc.events.ResultEvent;
10.
11. importorg.rjb.business.LoginDelegate;
12. importorg.rjb.event.LoginEvent;
13. importorg.rjb.model.UserModelLocator;
14.
15. publicclassLoginCommandimplemen 35、tsICommand,IResponder
16. {
17. //引用單例數(shù)據(jù)模型
18. publicvaruserModelLocator:UserModelLocator=UserModelLocator.getInstance();
19.
20. publicfunctionLoginCommand(){
21.
22. }
23.
24. //此處為處理入口,一般我們轉(zhuǎn)交給代理類處理
25. publicfunctionexecute(event:CairngormEvent):void{
26. varloginDelegate 36、:LoginDelegate=newLoginDelegate(this);
27. varloginEvent:LoginEvent=LoginEvent(event);
28. loginDelegate.login(loginEvent.userVO);
29. }
30. //返回的結(jié)果進行處理
31. publicfunctionresult(data:Object):void{
32. varresult:String=data.toString();
33. if(result=="OK"){
34. mx.core.Application.app 37、lication.loginPanel.currentState="success";
35. userModelLocator.state="Login---Result";
36. }else{
37. mx.core.Application.application.loginPanel.currentState="fail";
38. userModelLocator.state="Login---Result";
39. }
40. }
41. //處理過程出錯時的處理
42. publicfunctionfault(info:Object):void{ 38、
43. mx.controls.Alert.show(info+"");
44. }
45.
46. }
47. }
package mand
{
import mands.ICommand;
import com.adobe.cairngorm.control.CairngormEvent;
import mx.controls.Alert;
import mx.core.Application;
import mx.rpc.IResponder;
import mx.rpc.events.ResultEvent;
impo 39、rt org.rjb.business.LoginDelegate;
import org.rjb.event.LoginEvent;
import org.rjb.model.UserModelLocator;
public class LoginCommand implements ICommand, IResponder
{
//引用單例數(shù)據(jù)模型
public var userModelLocator:UserModelLocator=UserModelLocator.getInstance();
public function LoginC 40、ommand(){
}
//此處為處理入口,一般我們轉(zhuǎn)交給代理類處理
public function execute(event:CairngormEvent):void{
var loginDelegate:LoginDelegate=new LoginDelegate(this);
var loginEvent:LoginEvent=LoginEvent(event);
loginDelegate.login(loginEvent.userVO);
}
//返回的結(jié)果進行處理
public 41、 function result(data:Object):void{
var result:String=data.toString();
if(result=="OK"){
mx.core.Application.application.loginPanel.currentState="success";
userModelLocator.state="Login---Result";
}else{
mx.core.Application.application.loginPanel.currentState="fail";
42、 userModelLocator.state="Login---Result";
}
}
//處理過程出錯時的處理
public function fault(info:Object):void{
mx.controls.Alert.show(info+"");
}
}
}
再說說這個控制類,也就是control包下的類,這個下面主要是負責(zé)分發(fā)事件的,我們要把我們的自定義事件和我們的相應(yīng)的處理方法關(guān)聯(lián)起來,都是在這里進行的,通常一個類就可以了,下面是LoginControl.as的源碼:
Java代碼
1. packag 43、eorg.rjb.control
2. {
3. importcom.adobe.cairngorm.control.FrontController;
4.
5. importorg.rjb.event.LoginEvent;
6. mand.LoginCommand;
7.
8. publicclassLoginControlextendsFrontController
9. {
10. publicfunctionLoginControl(){
11. this.initialiseCommands();
12. }
13.
14. 44、 publicfunctioninitialiseCommands():void{
15. this.addCommand(LoginEvent.LOGIN_EVENT,LoginCommand);
16. }
17. }
18. }
package org.rjb.control
{
import com.adobe.cairngorm.control.FrontController;
import org.rjb.event.LoginEvent;
import mand.LoginCommand;
public class Lo 45、ginControl extends FrontController
{
public function LoginControl(){
this.initialiseCommands();
}
public function initialiseCommands():void{
this.addCommand(LoginEvent.LOGIN_EVENT,LoginCommand);
}
}
}
最后我們就說說我們的代理類哈,代理類前面已經(jīng)說了是我們的真正的處理類,我們把視圖區(qū)的數(shù)據(jù)傳到這里進行處理,最好把結(jié)果返回到相應(yīng)的IRe 46、sponsder接口實現(xiàn)類中,下面是我們的LoginDelegate.as的源碼:
Java代碼
1. packageorg.rjb.business
2. {
3. importmx.rpc.IResponder;
4.
5. importorg.rjb.vo.UserVO;
6.
7. publicclassLoginDelegate
8. {
9. publicvarresponder:IResponder;
10. publicfunctionLoginDelegate(responder:IResponder){
11. this. 47、responder=responder;
12. }
13. publicfunctionlogin(userVO:UserVO):void{
14. varresult:Object;
15. if(userVO.userName=="ljp"&&userVO.password=="pass"){
16. result="OK";
17. }else{
18. result="Fail";
19. }
20. responder.result(result);
21. }
22. }
23. }
package org.rjb.busines 48、s
{
import mx.rpc.IResponder;
import org.rjb.vo.UserVO;
public class LoginDelegate
{
public var responder:IResponder;
public function LoginDelegate(responder:IResponder){
this.responder=responder;
}
public function login(userVO:UserVO):void{
var result:Object;
49、if(userVO.userName=="ljp"&&userVO.password=="pass"){
result="OK";
}else{
result="Fail";
}
responder.result(result);
}
}
}
好了,基本介紹完了,我們可以測試下了哈,下面是測試代碼CairngormTest.mxml:
Java代碼
1.
2. 51、view="org.rjb.view.*"
xmlns:control="org.rjb.control.*"
>
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 6.煤礦安全生產(chǎn)科普知識競賽題含答案
- 2.煤礦爆破工技能鑒定試題含答案
- 3.爆破工培訓(xùn)考試試題含答案
- 2.煤礦安全監(jiān)察人員模擬考試題庫試卷含答案
- 3.金屬非金屬礦山安全管理人員(地下礦山)安全生產(chǎn)模擬考試題庫試卷含答案
- 4.煤礦特種作業(yè)人員井下電鉗工模擬考試題庫試卷含答案
- 1 煤礦安全生產(chǎn)及管理知識測試題庫及答案
- 2 各種煤礦安全考試試題含答案
- 1 煤礦安全檢查考試題
- 1 井下放炮員練習(xí)題含答案
- 2煤礦安全監(jiān)測工種技術(shù)比武題庫含解析
- 1 礦山應(yīng)急救援安全知識競賽試題
- 1 礦井泵工考試練習(xí)題含答案
- 2煤礦爆破工考試復(fù)習(xí)題含答案
- 1 各種煤礦安全考試試題含答案