Spring中DispatcherServlet的運行機制
DispatcherServlet是spring的web框架(以下簡稱SpringWeb)中的核心servlet."Spring的web框架——象其它web框架一樣——是一個請求驅動的web框架,其設計圍繞一個能將請求分發到控制器的servlet,它也提供其它功能幫助web應用開發。"----《Spring Framework 開發參考手冊(中文版)》而在SpringWeb框架中這個servlet就是org.springframework.web.servlet.DispatcherServlet。這個Servlet的繼承關系如下圖所示:SpringWeb首先將傳統的HttpServlet抽象類包裝成了Bean;FrameworkServlet抽象出了web框架中的servlets的一些基本行為,比如對application context的訪問;DispatcherServlet的主要工作就是將一個request分發到一個合適的處理器上,並將處理返回的ModelAndVIEw繪制出來返回給客戶端。
DispatcherServlet作為一個Servlet那他一定有兩個主要的方法:init()和DOService()。
一 init()初始化。DispatcherServlet繼承體系中init()方法的實現位於HttpServletBean中,HttpServletBean首先調用initBeanWrapper(),初始化BeanWrapper,然後調用抽象方法initServletBean(),這個方法的實現位於他的子類FrameworkServlet中;FrameWordServlet中的initServletBean()方法將調用initWebApplicationContext(),初始化WebApplicationContext,然後同樣調用他的抽象方法initFrameworkServlet(),而這個抽象方法的實現位於最終的DispatcherServlet中;DispatcherServlet中的initFrameworkServet()將依次初始化Multipar(用作文件上傳)解析器、本地化信息解析器、主題解析器處理器映射等等內容。所以DispatcherServlet的初始化順序為init();initBeanWrapper();
initServletBeaninitWebApplicationContext()
initFramework();initMultipartResolver();initLocaleResolver();initThemeResolver();initHandlerMappings();initHandlerAdapters();initHandlerExceptionResolvers();initVIEwResolvers();
二 doService()處理請求。DispatcherServlet中無論是通過post方式還是get方式提交的request,最終都會交由doService()處理。DOService()中的處理邏輯大致分以下六個步驟:1.if(request是MultiPart,即文件上傳) 則將request解析並包裝成MultipartHttpServletRequest2.mappedHandler = getHandler(request)根據request得到相應的處理器3.調用注冊的所有攔截器的preHandle方法4.調用處理器 HandlerAdapter ha = new getHandlerAdapter(mappedHandler.getHandler()); ModelAndVIEw mv = ha.handle(req, res, mappedHandler.getHandler())//這裡使用了adapter模式5.調用注冊的所有攔截器的postHandle方法6.繪制mv
也許Spring不像Struts、hibernate那樣是使用最為廣泛的,但他是全面的、輕量級的、足夠靈活的、容易替換、容易擴展的。SpringWeb是SpringFramework中的一個部分,而DispatcherServlet又是SpringWeb中的一小部分,要弄懂Spring以及他背後的設計思想,對我等菜鳥而言,還是有很長一段路要走的。但願在新的一條路出現之前,我們已經走遍了這條路。路漫漫其修遠兮,吾將上下而求索。繼續研究ing...to be continue...
參考資料Spring官方網站 http://www.springframework.org/Spring API http://www.springframework.org/docs/api/index.htmlSpring Reference Documentation http://www.springframework.org/docs/reference/index.HtmlSpring Framework 開發參考手冊(中文版)http://www.jactiongroup.Net/reference/html/index.Html