<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-60  評論-138  文章-1  trackbacks-0
    大約在08年年初的時候就知道igenko這個項目的存在,那個時候,還是剛剛起步,不過更新速度很快。
    之所以關注這個項目是因為技術架構和springside有很大的互補的地方,兩者都使用了spring,但是springside很著重展示后臺部分(當然了,這個隨著小胖的加入,前臺的grid會更強),而igenko則是更加著重前臺展現(它使用了flex作為客戶端)。另外,igenko值得關注的原因還有,他使用了jbpm作為工作流,并且項目的目標很明確,一個基于ria展現的cms系統。

    本篇關注一下igenko的客戶端登陸邏輯。
    對于登陸的后臺部分邏輯是使用的spring-acegi,所以后臺的部分和springside非常的相似,如果誰覺得需要更多了解,直接去看springside的wiki是最省事的了。而前臺的邏輯中,igenko試用了puremvc作為其mvc的框架,更有意思的是,bouiaw找了一個prana的開源框架充來當spring的角色,完成ioc的注入。
    在puremvc的邏輯中,需要在view(也就是mxml中)觸發出事件,而Mediator(view的一部分,相當于view的邏輯部分)來監聽這個事件。繼而Mediator將會發出Notify。系統中其他地方接收這個通知,繼而進行相關的邏輯處理,也就是說,view層的Mediator發送了消息給controll,繼而view層退出這個事件了處理。
    上邊的邏輯大家可以在,org.igenko.client.backoffice.view.common.BackofficeLogin這個類中看到,這個類觸發了一下的事件:
    dispatchEvent( new Event( BackofficeLogin.LOGIN ) );
    而org.igenko.client.backoffice.view.common.mediator.BackofficeLoginMediator則監聽這個事件,如下:
    backofficeLogin.addEventListener( BackofficeLogin.LOGIN, login );
    繼而在login方法中,處理邏輯:
    1 private function login( event:Event ) : void
    2         {
    3             sendNotification(NotificationConstants.LOGIN, new User(backofficeLogin.username.text, backofficeLogin.password.text));    
    4         }
    這個當中就發送了我說的那個通知。接下來就是controll層來處理這個通知。
    而controll層就是puremvc中的commond,按著文檔中的邏輯,那個通知觸發那個commond是由facade這個接口來負責的。
    這個時候就是igenko的一個有意思的地方了。在puremvc的文檔中,應該在facade當中將commond注冊進去,但是ingeko只是
    override protected function initializeController():void
            {
                
    super.initializeController();
                
                registerCommand(NotificationConstants.SERVICE_ERROR, ShowServiceError);
                registerCommandByConfigName(NotificationConstants.STARTUP, NotificationConstants.STARTUP_CMD);
                
            }
    當中看似沒有注冊任何關于Login的commond,但是當關注到NotificationConstants.STARTUP_CMD這個commond的時候,就會發現如下的代碼:
     public function set commands(_commands:Array):void {
                 logger.debug(
    "entering set commands");
                
    for each ( var c : Object in _commands ) {
                    var commandInstance:IIocCommand 
    = c as IIocCommand;             
                        logger.debug(
    "addSubCommand " + commandInstance);
                        addSubCommand(commandInstance);
                    }   
              }
    這說明,facade加入了一個StartupCommand,而StartupCommand又繼承了IocManagedMacroCommand這個可以執行多個commond的類,那么就是相當于facade注冊很多個commond.
    接下來的問題就是,StartupCommand中的_commands這個數組是那里來的呢?
    答案就是,ioc注入的。
    在ApplicationContextCommon.xml中可以發現如下的配置:
    <object id="startupCommand" class="org.igenko.client.common.controller.StartupCommand">
             
    <property name="commands">
                 
    <array>
                     
    <ref>registerCommandsCommand</ref>
                     
    <ref>registerProxiesCommand</ref>
                     
    <ref>registerMediatorsCommand</ref>
                 
    </array>
             
    </property>
        
    </object>
    對于當中的registerCommandsCommand是如下的:
    <object id="registerCommandsCommand" class="org.igenko.client.common.controller.startup.RegisterCommandsCommand">
           
    <property name="commands">
                 
    <array>
                       
    <!-- Login commands -->
                       
    <object class="org.igenko.client.common.controller.DynamicObject">
                       
    <property name="notification">
                          
    <object class="org.pranaframework.ioc.factory.config.FieldRetrievingFactoryObject">
                               
    <property name="staticField" value="org.igenko.client.common.NotificationConstants.LOGIN"/>
                          
    </object>
                       
    </property>
                       
    <property name="command" ref="loginCommand" />
                    
    </object>
                    
                    
    <object class="org.igenko.client.common.controller.DynamicObject">
                       
    <property name="notification">
                          
    <object class="org.pranaframework.ioc.factory.config.FieldRetrievingFactoryObject">
                               
    <property name="staticField" value="org.igenko.client.common.NotificationConstants.LOGOUT"/>
                          
    </object>
                       
    </property>
                       
    <property name="command" ref="logoutCommand" />
                    
    </object> 
                              
                    
    <!-- Webcompiler commands -->
                      
    <object class="org.igenko.client.common.controller.DynamicObject">
                       
    <property name="notification">
                          
    <object class="org.pranaframework.ioc.factory.config.FieldRetrievingFactoryObject">
                               
    <property name="staticField" value="org.igenko.client.common.NotificationConstants.COMPILE_WIDGET"/>
                          
    </object>
                       
    </property>
                       
    <property name="command" ref="compileWidgetCommand" />
                    
    </object>
              
                  
    </array>
              
    </property>
        
    </object>

    可以看見第一個注入的就是loginCommand.

    繼而,我們可以看見經過一系列的尋找,觸發了view層的login事件,最后會到達到
    org.igenko.client.common.controller.login.LoginCommand類的excute方法(很類似struts1吧,連方法名都一致)。如下:
    override public function execute(notification:INotification):void
            {    
                userToLogin 
    = notification.getBody() as User ;
                
    // inserted via IoC
                ILoginDelegate(delegate).checkLogin(userToLogin.name, userToLogin.password);
            }

    接下來就是通過remote object與后端通信了。

    希望這個摘記對于剛剛接觸的人有幫助。對于文中的不合理之處,歡迎指出!

    posted on 2008-10-08 10:13 張氏兄弟 閱讀(1987) 評論(0)  編輯  收藏 所屬分類: flex
    主站蜘蛛池模板: 丁香花免费完整高清观看| 未满十八18禁止免费无码网站| 毛片免费观看的视频| 亚洲国产日韩女人aaaaaa毛片在线| 在线看片免费人成视频福利| 国产亚洲精品a在线无码| 女人隐私秘视频黄www免费| 日本亚洲国产一区二区三区| 巨胸狂喷奶水视频www网站免费| 亚洲真人无码永久在线| 成人精品一区二区三区不卡免费看 | 97久久精品亚洲中文字幕无码 | 国产午夜亚洲精品午夜鲁丝片| 精品乱子伦一区二区三区高清免费播放| 亚洲JIZZJIZZ中国少妇中文| 一级做a毛片免费视频| 国产AV无码专区亚洲AV漫画 | 久草免费福利在线| 久久久久亚洲AV片无码| 18禁男女爽爽爽午夜网站免费| 亚洲精品美女在线观看| 啦啦啦手机完整免费高清观看| 爱爱帝国亚洲一区二区三区| 久久久精品国产亚洲成人满18免费网站 | 特级做A爰片毛片免费看无码 | 91嫩草私人成人亚洲影院| 免费看黄视频网站| 国产在亚洲线视频观看| 亚洲欧洲日产国码无码网站| 99精品视频在线视频免费观看| 亚洲国产成人精品激情| 免费看国产精品麻豆| 无码国产精品一区二区免费模式| 激情综合亚洲色婷婷五月| 免费h成人黄漫画嘿咻破解版| 久久久久久久久久免免费精品| 亚洲白色白色在线播放| 夜色阁亚洲一区二区三区| 99在线免费观看视频| MM1313亚洲精品无码久久| 亚洲成AV人片在线观看WWW|