SpringMVC之DispatcherServlet

DispatcherServlet是springMVC的前端控制器,也是springMVC中最重要的一個類。理解了DispatcherServlet也就差不多理解了springMVC。

DispatcherServlet繼承自FrameworkServlet,FrameWorkServlet繼承自HttpServletBean並且實現了ApplicationContextAware接口。HttpServletBean繼承自HttpServlet並且實現了EnvirommentCapable和EnvirommentAware接口。在spirng中,實現了xxxaware接口,我們就能夠從spring中獲取到xxx.所以實現了EnvirommentAware接口的類就可以通過setEnvironment來得到spring的環境變量。而EnvironmentCapable則可以通過getEnvironment來直接拿到Environment。ApplicationContextAware同理。因此DispatcherServlet可以獲取到ApplicationContext和Environment。

spring其實是先調用了HttpServletBean的init方法。然後init方法裏面又調用了initServletBean方法,這個方法實際上是調用子類FrameWorkServlet裏面的方法。在initServletBean中間,實際上調用了initWebApplicationContext方法和initFrameWorkServlet方法。在initWebApplicationContext中,實際上主要獲取了spring的根容器rootContext,設置了WebApplicationContext調用了onRefresh方法並且將webApplicationContext設置到了ServletContext中。在這裏核心就是調用了onFresh方法。FrameWorkServlet默認的onRefresh方法是空的,此時調用的是子類DispatcherServlet的onRefresh方法。在onRefresh方法中,調用了initStrategies方法,這個方法實際上調用了9個初始化方法,初始化了DispatcherServlet的9大組件。如果在配置文件中配置了組件,那麼spring就會通過配置文件來初始化相應的組件,否則的話,spring就會調用getDefaultStrategy來初始化這些組件。默認的初始化配置在org.springframework.web.DispatcherServlet.properties中配置的。至此,springMVC的創建過程就基本結束了。

springMVC在處理請求的時候,實際上調用到了FramWorkServlet的service方法,這個方法重寫了servlet的service方法。在這個方法中,spring將所有的請求都路由到了processRequest這個方法中統一處理。在processRequest這個方法中,主要調用了doService方法,並且在這個方法前後做了一些事情。主要是保存了LocalContext和RequestContext。LocalContext保存了一些本地化的信息,RequestContext主要用來獲取RequestAttribute(ServletRequestAttributes),我們可以通過這個ServletRequestAttributes來獲取request,response和session。在doService結束後,執行了publishRequestHandledEvent方法,這個方法會通過new一個ServletRequestHandledEvent來發布一些消息。這個event裏面包含了請求地址等等信息。我們可以通過實現ApplicationListener方法並重寫onApplicationEvent(ServletRequestHandleredEvent)這個方法來監控請求。

FrameWorkServlet在執行DoService方法時,執行的是子類DispatcherServlet的doService方法。在這個方法中對request的一些屬性進行了設置,接着調用了dispatcher方法,調用這個方法時,先根據request找到handler,然後通過handler獲得handlerAdapter,通過handlerAdapter的handler方法來執請求並生成視圖,最後解析視圖。至此,一個完整的調用過程就實現了


發佈了28 篇原創文章 · 獲贊 14 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章