Spring架構增強MultiActionController(二)

來源:互聯網
上載者:User

 5.實現MultiMethodControllerUrlHandlerMapping

    我們在上面討論過了怎麼實現MultiMethodControllerUrlHandlerMapping,要實現為具體的代碼,我們可以通過擴充org.springframework.web.servlet.handler.AbstractUrlHandlerMapping。AbstractUrlHandlerMapping擴充了org.springframework.web.context.support.WebApplicationObjectSupport。WebApplicationObjectSupport可以獲得當前WebApplicationContext。

    1. 重寫initApplicationContext方法,在context中尋找所有MultiActionController類型的bean,把MultiActionController的urlMethodmappings屬性的key值為key值,MultiActionController執行個體為索引值的索引值對添加到一個urlMap中。 
public class MultiMethodControllerUrlHandlerMapping extends AbstractUrlHandlerMapping...{
    private  Map urlMap = new HashMap();
    public void initApplicationContext() throws BeansException ...{
        initialUrlMap();
    }
    protected void initialUrlMap()throws BeansException...{
        //找查所有MultiMethodController類型和子類型的bean到一個map中,bean Name為key值 ,bean執行個體為value值
        Map matchingBeans = BeanFactoryUtils.beansOfTypeIncludingAncestors(
                getWebApplicationContext(),
                MultiMethodController.class, true, false);
        List controllers = null;
        if(!matchingBeans.isEmpty())...{
            controllers = new ArrayList(matchingBeans.values());
            for(int i = 0; controllers != null && i < controllers.size();i++)...{
                MultiMethodController controller = (MultiMethodController)controllers.get(i);
                Properties urlPros = controller.getUrlMethodmappings();
                Iterator itr = urlPros.keySet().iterator();
                for(;itr.hasNext();)...{
                    String url = (String)itr.next();
                    urlMap.put(url,controller);
                }
            }
        }
}

2. 遍曆urlMap,調用AbstractUrlHandlerMapping的registerHandler(String urlPath, Object handler)方法,依次將url與對應的handler註冊到AbstractUrlHandlerMapping的handlerMap中。

protected void registerUrlMap()throws BeansException...{
        if (this.urlMap.isEmpty()) ...{
            logger.info("Neither 'urlMap' nor 'mappings' set on MultiMethodControllerUrlHandlerMapping");
        }
        else ...{
            Iterator itr = this.urlMap.keySet().iterator();
            while (itr.hasNext()) ...{
                String url = (String) itr.next();
                Object handler = this.urlMap.get(url);
                // prepend with slash if it's not present
                if (!url.startsWith("/")) ...{
                    url = "/" + url;
                }
                //父類方法
                registerHandler(url, handler);
            }
        }

    }

 然後在initApplicationContext方法中調用registerUrlMap方法
public void initApplicationContext() throws BeansException ...{
        initialUrlMap();
        registerUrlMap();
    }
 3. 使用MultiMethodControllerUrlHandlerMapping
    使用MultiMethodControllerUrlHandlerMapping,只需要在ApplicationContext中,定義成一個bean就可以了。
id="multiMethodControllerUrlHandlerMapping"
  class="com.prs.application.ehld.web.handler.MultiMethodControllerUrlHandlerMapping">
  <property name="order">
     <value>3</value>
  </property>
</bean>
注意:在一個context如果定義多個HandlerMapping,需要為每一個HandlerMapping指定order屬性。

    你只需要在在context 中定義MultiMethodControllerUrlHandlerMapping,在使用MultiActionController時,只需要配置urlMethodmappings屬性就可以了。當刪除或增加一個MultiActionController的bean時,無需要連帶配置任何HandlerMapping. 簡化了bean的配置。使得MultiActionControler的bean配置只關心自身的屬性配置,而無需要去關心看起來與自身無關的HandlerMapping的配置。使得整個配置更合乎人們正常的思維邏輯,減少配置的複雜性。

6.設計討論

    在這裡我們將對以Spring為基礎進行項目架構設計進行一些討論.    
1. MultiActionController還是AbstractController與SimpleFormController組合
在使用Spring MVC時,SimpleFormController用於表單編輯和提交;而複雜的功能則通過擴充AbstractcController完成。這就是所謂的AbstractController與SimpleFormController組合。以AbstractController與SimpleFormController的結合來完成展示層邏輯。

    Spring MVC雖然也提供了MultiActionController,但是它似乎天生就有點蹩腳。對資料繫結支援不是很好,在用於表單編輯和提交時不像SimpleFormController那麼強大。其實通過對MultiActionController的擴充和增強,完成可以實現與SimpleFormController同樣的功能,比如資料校正等,並且還比SimpleFormController具有更多的靈活性。
在OO技術中,有一個重要的原則:低耦合,高內聚;我們應該按職責來設計對象。按對象應該具有的職責來給對象設計相應的方法。如果把一個對象本來該具有的職責分散到不同類中去完成,那麼這個些類是違反“低耦合,高內聚”原則的。一個類不是高內聚的,就不便於維護和擴充,造成大量重複代碼的產生。同樣把一組相關的功能分散到多個Controller去實現,是違反“低耦合,高內聚”原則的,可以就會產生大量的重複代碼。比如參數擷取,資料校正等。如果使用MultiActionController,把相關的功能由一個Controller的不同方法實現,集中在一個Controller類中處理,就使得這個Controller類是具有“高內聚”性的。所以,在項目應用中,相關的功能應該由一

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.