1. 程式人生 > 實用技巧 >Web容器初始化過程

Web容器初始化過程

Web容器初始化過程

例項化由部署描述符中的< listener >元素標識的每個事件偵聽器的例項。 對於實現ServletContextListener的例項化偵聽器例項,呼叫contextInitialized()方法。

例項化由部署描述符中的< filter >元素標識的每個過濾器的例項,並呼叫每個過濾器例項的init()方法。

例項化由< servlet >元素標識的每個servlet的例項,該元素包括<啟動時載入>元素,其順序由啟動時載入元素值定義,並呼叫每個servlet例項的init()方法。

SpringMVC 的 web.xml配置

<?xml version="1.0" encoding="UTF-8"?>  
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"  
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
   
    <context-param>  
        <param-name>contextConfigLocation</param-name>  
        <param-value>classpath:applicationContext.xml
</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <servlet-name>mvc-dispatcher</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet
</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>mvc-dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>

  

  • <listener>標籤中定義了spring容器載入器

  • <servlet>標籤中定義了spring前端控制器

  在 Servlet API中有一個ServletContextListener介面,它能夠監聽ServletContext物件的生命週期,實際上就是監聽Web應用的生命週期。當Servlet容器啟動或終止Web應用時,會觸發ServletContextEvent事件,該事件由ServletContextListener來處理。在ServletContextListener介面中定義了處理ServletContextEvent 事件的兩個方法contextInitialized()和contextDestroyed()。

  ContextLoaderListener監聽器的作用就是啟動Web容器時,自動裝配ApplicationContext的配置資訊。因為它實現了ServletContextListener這個介面,在web.xml配置了這個監聽器,啟動容器時,就會預設執行它實現的方法。由於在ContextLoaderListener中關聯了ContextLoader這個類,所以整個載入配置過程由ContextLoader來完成。

DispatchServlet初始化

在SpringMVC架構中,DispatchServlet負責請求分發,起到控制器的作用。下面詳細來解釋說明:

  • DispatchServlet名如其義,它的本質上是一個Servlet,子類不斷的對HttpServlet父類進行方法擴充套件

  • HttpServlet有兩大核心方法:init()和service()方法。HttpServletBean重寫了init()方法,在這部分,我們可以看到其實現思路:公共的部分統一來實現,變化的部分統一來抽象,交給其子類來實現,故用了abstract class來修飾類名。此外,HttpServletBean提供了一個HttpServlet的抽象實現,使的Servlet不再關心init-param部分的賦值,讓servlet更關注於自身Bean初始化的實現

  • FrameworkServlet提供了整合web javabean和spring application context的整合方案。在原始碼中可以看到通過執行initWebApplicationContext()方法和initFrameworkServlet()方法實現

  • DispatchServlet是HTTP請求的中央排程處理器,它將web請求轉發給controller層處理,它提供了敏捷的對映和異常處理機制,DispatchServlet轉發請求的核心程式碼在doService()方法中實現

用ContextLoaderListener初始化上下文,接著使用DispatchServlet來初始化WebMVC的上下文