1、WEB容器在啓動時,它會爲每一個WEB應用程序都建立一個對應的ServletContext對象(每一個web應用程序惟一),它表明當前web應用web容器提供其一個全局的上下文環境,其爲後面的spring IoC容器提供宿主環境;html
2、讀取web.xml前端
服務器軟件或容器如(tomcat)加載項目中的web.xml文件,經過其中的各類配置來啓動項目,只有其中配置的各項均無誤時,項目才能正確啓動。web.xml有多項標籤,在其加載的過程當中順序依次爲:context-param >> listener >> fileter >> servlet。(同類多個節點以出現順序依次加載)web
一、ServletContext建立後,經過啓動WebApplicationContext的Servlet(org.springframework.web.context.ContextLoaderServlet)或Web容器監聽器(org.springframework.web.context.ContextLoaderListener)觸發初始化WebApplicationContext事件,這個就是spring的ioc容器;(application context的初始化過程,可參考:http://www.cnblogs.com/hantalk/p/6647772.html)spring
二、容器會讀取context-param(springmvc中能夠沒有這個context-param,即WebApplicationContext不用配置具體數據),spring以WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE爲屬性Key,context-param爲屬性value對並存入servletContext;segmentfault
servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,this.context);tomcat
例如:服務器
<context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath:spring-common-config.xml, classpath:spring-budget-config.xml </param-value> </context-param>
三、讀取listener建立監聽,根據指定的類路徑來實例化過濾器filter;mvc
四、初始化web.xml中的dispatcherservletapp
首先,利用WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE從ServletContext中獲取以前的WebApplicationContext做爲本身上下文的parent上下文。框架
而後,讀取/WEB-INF/[servlet名字]-servlet.xml文件,初始化本身持有的上下文。初始化完畢後,spring也將dispatcherservlet的上下文存到ServletContext中。
DispatcherServlet主要用做職責調度工做,自己主要用於控制流程,讀下面代碼,能夠在initStrategies方法中看到主要職責以下:
一、文件上傳解析,若是請求類型是multipart將經過MultipartResolver進行文件上傳解析;
二、經過HandlerMapping,將請求映射處處理器(返回一個HandlerExecutionChain,它包括一個處理器、多個HandlerInterceptor攔截器);
三、經過HandlerAdapter支持多種類型的處理器(HandlerExecutionChain中的處理器);
四、經過ViewResolver解析邏輯視圖名到具體視圖實現;
五、本地化解析;
六、渲染具體的視圖等;
七、若是執行過程當中遇到異常將交給HandlerExceptionResolver來解析。
public class DispatcherServlet extends FrameworkServlet { //實現子類的onRefresh()方法,該方法委託爲initStrategies()方法。 @Override protected void onRefresh(ApplicationContext context) { initStrategies(context); } //初始化默認的Spring Web MVC框架使用的策略(如HandlerMapping) protected void initStrategies(ApplicationContext context) { initMultipartResolver(context); initLocaleResolver(context); initThemeResolver(context); initHandlerMappings(context); initHandlerAdapters(context); initHandlerExceptionResolvers(context); initRequestToViewNameTranslator(context); initViewResolvers(context); initFlashMapManager(context); } }
3、具體的請求處理
一、首先用戶發送請求http://localhost:9080/springmvc-chapter2/hello到web容器,web容器根據「/hello」路徑映射到DispatcherServlet(url-pattern爲/)進行處理;
二、當收到請求時,dispatcherservlet將請求交給handlerMapping,讓它找出對應請求的handlerExecutionChain對象,handlerExecutionChain返回攔截器和處理器。handlerExecutionChain是一個執行鏈,它包含一個處理該請求的handler(處理器,就是代碼中的xxxController),同時還可能包括若干個對該請求實施攔截的handlerInterceptor(攔截器);
三、SimpleControllerHandlerAdapter將HandlerExecutionChain中的處理器(xxxController)適配爲SimpleControllerHandlerAdapter;
四、SimpleControllerHandlerAdapter將會調用xxxController中的具體方法進行功能處理,該處理方法返回一個ModelAndView給DispatcherServlet;handlerAdapter對外有三個方法API:
//判斷這個adapter是否能夠處理這類handler
boolean supports(Object handler);
//封裝handler處理request的邏輯
ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
long getLastModified(HttpServletRequest request, Object handler);
handlermapping是把請求找到對應的處理對象,具體用什麼方法處理它無論。而handlerAdapter正是調用具體的方法處理請求。
五、dispatherServlet經過配置文件中的ViewResolver,把controller中的modelAndview的數據傳遞到前端模板freemarker/velocity;
六、前端模板渲染,將在處理器傳入的模型數據在視圖中展現出來;
七、返回控制權給DispatcherServlet,由DispatcherServlet返回響應給用戶,到此一個流程結束。
參考:
http://www.imooc.com/article/5385
https://segmentfault.com/q/1010000000210417
http://sishu ok.com/forum/blogPost/list/5188.html(去掉空格)
http://sishuo k.com/forum/blogPost/list/5160.html(去掉空格)