【spring mvc】springmvc在tomcat中的執行過程


一、WEB容器在啟動時,它會為每個WEB應用程序都創建一個對應的ServletContext對象(每個web應用程序唯一),它代表當前web應用web容器提供其一個全局的上下文環境,其為后面的spring IoC容器提供宿主環境;

二、讀取web.xml

服務器軟件或容器如(tomcat)加載項目中的web.xml文件,通過其中的各種配置來啟動項目,只有其中配置的各項均無誤時,項目才能正確啟動。web.xml有多項標簽,在其加載的過程中順序依次為:context-param >> listener >> fileter >> servlet​。(同類多個節點以出現順序依次加載)

1、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)

2、容器會讀取context-param(springmvc中可以沒有這個context-param,即WebApplicationContext不用配置具體數據),spring以WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE為屬性Key,context-param為屬性value對並存入servletContext

servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,this.context);

例如:

<context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>
          classpath:spring-common-config.xml,
          classpath:spring-budget-config.xml
      </param-value>
</context-param>

3、讀取listener創建監聽,根據指定的類路徑來實例化過濾器filter

4、初始化web.xml中的dispatcherservlet

首先,利用WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE從ServletContext中獲取之前的WebApplicationContext作為自己上下文的parent上下文。

然后,讀取/WEB-INF/[servlet名字]-servlet.xml文件,初始化自己持有的上下文。初始化完畢后,spring也將dispatcherservlet的上下文存到ServletContext中。

DispatcherServlet主要用作職責調度工作,本身主要用於控制流程,讀下面代碼,可以在initStrategies方法中看到主要職責如下:

1、文件上傳解析,如果請求類型是multipart將通過MultipartResolver進行文件上傳解析;

2、通過HandlerMapping,將請求映射到處理器(返回一個HandlerExecutionChain,它包括一個處理器、多個HandlerInterceptor攔截器);

3、通過HandlerAdapter支持多種類型的處理器(HandlerExecutionChain中的處理器);

4、通過ViewResolver解析邏輯視圖名到具體視圖實現;

5、本地化解析;

6、渲染具體的視圖等;

7、如果執行過程中遇到異常將交給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);
    }
}

三、具體的請求處理

 

1、首先用戶發送請求http://localhost:9080/springmvc-chapter2/hello到web容器,web容器根據“/hello”路徑映射到DispatcherServlet(url-pattern為/)進行處理;

2、當收到請求時,dispatcherservlet將請求交給handlerMapping,讓它找出對應請求的handlerExecutionChain對象,handlerExecutionChain返回攔截器和處理器。handlerExecutionChain是一個執行鏈,它包含一個處理該請求的handler(處理器,就是代碼中的xxxController),同時還可能包括若干個對該請求實施攔截的handlerInterceptor(攔截器);

3、SimpleControllerHandlerAdapter將HandlerExecutionChain中的處理器(xxxController適配為SimpleControllerHandlerAdapter

4、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正是調用具體的方法處理請求。

5、dispatherServlet通過配置文件中的ViewResolver,controller中的modelAndview的數據傳遞到前端模板freemarker/velocity;

6、前端模板渲染,將在處理器傳入的模型數據在視圖中展示出來

7、返回控制權給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(去掉空格)

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM