springMVC請求流程詳解

SpringMVC 的工作流程
【1】用戶發送請求至前端控制器 DispatcherServlet;
【2】DispatcherServlet 收到請求調用 HandlerMapping 處理器映射器;
【3】處理器映射器找到具體的處理器(可以根據 xml配置、註解進行查找),生成處理器對象及處理器攔截器(如果有則生成)一併返回給 DispatcherServlet;
【5】DispatcherServlet 調用 HandlerAdapter 處理器適配器;
【6】HandlerAdapter 經過適配調用具體的處理器(Controller,也叫後端控制器);
【7】Controller 執行完成返回 ModelAndView;
【8】HandlerAdapter 將 controller 執行結果 ModelAndView 返回給 DispatcherServlet;
【9】DispatcherServlet 將 ModelAndView 傳給 ViewReslover 視圖解析器;
【10】ViewReslover 解析後返回具體 View;
【11】DispatcherServlet 根據 View進行渲染視圖(即將模型數據填充至視圖中);
【12】DispatcherServlet 響應用戶;

【前端控制器-DispatcherServlet】:接收請求,響應結果,相當於轉發器,中央處理器。有了 DispatcherServlet減少了其它組件之間的耦合度。用戶請求到達前端控制器,它就相當於 mvc模式中的c,DispatcherServlet 是整個流程控制的中心,由它調用其它組件處理用戶的請求,DispatcherServlet 的存在降低了組件之間的耦合性。可以將其看做是 SpringMVC 實現中最爲核心的部分;DispatcherServlet 的啓動過程就是 SpringMVC 的啓動過程。DispatcherServlet  的工作大致分爲兩個部分:①、初始化部分:由 initServletBean() 啓動通過 initApplicationContext() 方法最終調用 DispatcherServlet 的 initStrategies 方法。DispatcherServlet 對 MVC 的其他模塊進行初始化。比如:HandlerMapping、ViewResolver 等。②、對 HTTP 請求進行響應:doService() 方法,在這個方法調用中封裝了 doDispatch() 這個 doDispatch 是實現 MVC模式的主要部分。不但建立了自己持有的 IOC容器還肩負着請求分發處理的重任。
【處理器映射器-HandlerMapping】:對於不同 Web請求有對應的映射 Spring 提供了不同的 HandlerMapping 作爲映射策略。這個策略可以根據需求選擇。默認的策略:BeanNameUrlHandlerMapping。根據請求的 url查找 Handler,HandlerMapping 負責根據用戶請求找到 Handler即處理器,SpringMVC提供了不同的映射器實現不同的映射方式,例如:配置文件方式,實現接口方式,註解方式等;
【處理器適配器-HandlerAdapter】:按照特定規則(HandlerAdapter要求的規則)去執行Handler,通過 HandlerAdapter 對處理器進行執行,這是適配器模式的應用,通過擴展適配器可以對更多類型的處理器進行執行;
【處理器-Handler】(需要工程師開發):注意:編寫 Handler 時按照 HandlerAdapter 的要求去做,這樣適配器纔可以去正確執行Handler,Handler 是繼 DispatcherServlet 前端控制器的後端控制器,在 DispatcherServlet的控制下 Handler對具體的用戶請求進行處理。由於Handler涉及到具體的用戶業務請求,所以一般情況需要工程師根據業務需求開發 Handler;
【視圖解析器View resolver】:進行視圖解析,根據邏輯視圖名解析成真正的視圖(view)。View Resolver 負責將處理結果生成View視圖,View Resolver 首先根據邏輯視圖名解析成物理視圖名即具體的頁面地址,再生成 View視圖對象,最後對 View進行渲染將處理結果通過頁面展示給用戶。 springmvc 框架提供了很多的View視圖類型,包括:jstlView、freemarkerView、pdfView等;
【視圖View】(需要工程師開發):View 是一個接口,實現類支持不同的View類型(jsp、freemarker、pdf...);

<web-app>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
 
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/app-context.xml</param-value>
    </context-param>
 
    <servlet>
        <servlet-name>app</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value></param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
 
    <servlet-mapping>
        <servlet-name>app</servlet-name>
        <url-pattern>/app/*</url-pattern>
    </servlet-mapping>
</web-app>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章