SpringMVC框架web.xml解讀

一:前言

web.xml文件一般位於WEB-INF目錄下。

如果讀過tomcat源碼,就知道在tomcat在啟動過程的初始化階段,會讀取web.xml的配置。

二:示例

SpringMVC框架web.xml解讀

spring父容器配置

SpringMVC框架web.xml解讀

springMvc子容器配置

以上內容均為web.xml中配置,分為spring父容器和springMVC子容器的配置。

子容器的ApplicationContext會和父容器的ApplicationContext相關聯。

三:解讀

3.1 ContextLoaderListener

ContextLoaderListener的作用就是啟動Web容器時,自動裝配ApplicationContext的配置信息。因為它實現了ServletContextListener這個接口,在web.xml配置這個監聽器,啟動容器時,就會默認執行它實現的方法,使用ServletContextListener接口,開發者能夠在為客戶端請求提供服務之前向ServletContext中添加任意的對象。這個對象在ServletContext啟動的時候被初始化,然後在ServletContext整個運行期間都是可見的。

每一個Web應用都要一個ServletContext與之相關聯。ServletContext對象在應用啟動時被創建,在應用關閉的時候被銷燬。ServletContext在全局範圍內有效,類似於應用中的一個全局變量。

在ServletContextListener中的核心邏輯便是初始化WebApplicationContext實例並存放至ServletContext中。

ServletContextListener 接口如下,tomcat等容器啟動過程中會調用contextInitialized方法,加載ApplicationContext容器

public interface ServletContextListener extends EventListener {

public void contextInitialized(ServletContextEvent sce);

public void contextDestroyed(ServletContextEvent sce);

}

3.2 DispatcherServlet

(一)介紹

DispatcherServlet的繼承關係如下圖:

SpringMVC框架web.xml解讀

在Spring中,ContextLoaderListener只是輔助功能,用於創建WebApplicationContext類型實例,而真正的邏輯實現其實是在DispatcherServlet中進行的,DispatcherServlet是實現servlet接口的實現類。

servlet是一個java編寫的程序,此程序是基於HTTP協議的,在服務器端運行的(如Tomcat),是按照servlet規範編寫的一個Java類。主要是處理客戶端的請求並將其結果發送到客戶端。servlet的生命週期是由servlet的容器來控制的,它可以分為3個階段:初始化,運行和銷燬。

(1)初始化階段

  • servlet容器加載servlet類,把servlet類的.class文件中的數據讀到內存中。
  • servlet容器創建一個ServletConfig對象。ServletConfig對象包含了servlet的初始化配置信息。
  • servlet容器創建一個servlet對象。
  • servlet容器調用servlet對象的init方法進行初始化。

(2)運行階段。

當servlet容器接收到一個請求時,servlet容器會針對這個請求創建servletRequest和servletResponse對象,然後調用service方法。並把這兩個參數傳遞給service方法。service方法通過servletRequest對象獲得請求的信息。並處理該請求。再通過servletResponse對象生成這個請求的響應結果。然後銷燬servletRequest和servletResponse對象。我們不管這個請求是post提交的還是get提交的,最終這個請求都會由service方法來處理。

(3)銷燬階段。

當Web應用被終止時,servlet容器會先調用servlet對象的destory方法,然後再銷燬servlet對象,同時也會銷燬與servlet對象相關聯的servletConfig對象。我們可以在destory方法的實現張紅,釋放servlet所佔用的資源,如關閉數據庫連接,關閉文件輸入輸出流等。

servlet的框架是由兩個Java包組成:javax.servlet和javax.servlet.http。在javax.servlet包中定義了所有的servlet類都必須實現或擴展的通用接口和類,在javax.servlet.http包中定義了採用HTTP通信協議的HttpServlet類。

servlet被設計成請求驅動,servlet的請求可能包含多個數據項,當Web容器接收到某個servlet請求時,servlet把請求封裝成一個HttpServletRequest對象,然後把對象傳給servlet的對應的服務方法。

(二)DispatcherServlet的初始化

在servlet初始化階段會調用其init方法,所以我們首先要查看在DispatcherServlet中是否重寫了init方法。我們在其父類HttpServletBean中找到了該方法 init()

在初始化過程中會逐級調用相關方法:

init() -》

initServletBean() -》

initWebApplicationContext() -》

createWebApplicationContext(rootContext) -》

createWebApplicationContext(ApplicationContext parent) -》 configureAndRefreshWebApplicationContext(ConfigurableWebApplicationContext wac)

其中,configureAndRefreshWebApplicationContext方法中添加了一個ApplicationListener,它在onRefresh(ApplicationContext context) 的initStrategies(ApplicationContext context)方法中,對相關組件進行了初始化:

protected void initStrategies(ApplicationContext context) {

initMultipartResolver(context);

initLocaleResolver(context);

initThemeResolver(context);

initHandlerMappings(context);

initHandlerAdapters(context);

initHandlerExceptionResolvers(context);

initRequestToViewNameTranslator(context);

initViewResolvers(context);

initFlashMapManager(context);

}

SpringMVC框架web.xml解讀


分享到:


相關文章: