前言
接著前面一片文章SpringMVC---IDEA 搭建SpringMVC工程,繼續解析各配置檔案是用來幹嘛的。只有弄懂每一個配置項的意義,才能更好的掌握springMVC.
問題
web.xml檔案詳解:
1、web.xml檔案作用是什麼?
web.xml檔案的作用是配置web工程啟動,對於一個web工程來說,web.xml可以有也可以沒有,如果存在web.xml檔案;web工程在啟動的時候,web容器(tomcat容器)會去載入web.xml檔案,然後按照一定規則配置web.xml檔案中的元件。
2、web容器載入web.xml檔案的規則是怎樣的?
web容器載入順序:ServletContext -> context-param -> listener -> filter ->servlet ;不會因在web.xml中的書寫順序改變:
a、web容器啟動後,會去載入web.xml檔案,讀取listener和context-param兩個節點
b、建立一個ServletContext(Servlet上下文)這個上下文供所有部分共享
c、容器將context-param轉換成鍵值對,交給ServletContext
d、接著按照上述順序繼續執行
SpringMVC的web.xml檔案
1、配置程式碼及流程圖示例:
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!--Spring MVC 配置 並新增監聽-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/spring/*</param-value>
</context-param>
<!-- 字元過濾器 傳值亂碼-->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--配置前端控制器 進行請求分發 DispatcherServlet本質也是一個Servlet -->
<servlet>
<!--名字可以自定義-->
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/springmvc.xml</param-value>
</init-param>
<!--標記容器啟動的時候就啟動這個servlet-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<!--攔截所有-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
複製程式碼
2、載入順序
a、首先載入Spring容器載入器:ContextLoaderListener
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
複製程式碼
檢視ContextLoaderListener原始碼可以發現其實現了ServletContextListener並繼承了ContextLoader類,ServletContextListener主要用於監聽web容器的啟動和銷燬,ContextLoader用於web容器啟動後載入springApplicationContext上下文。
ServletContextListener的兩個方法為contextInitialized,contextDestroyed,主要用來監聽Web應用的生命週期,當web應用初始化或者結束時會觸發ServletContextEvent,並由監聽器監聽觸發其他操作。
ContextLoader主要用於載入上下文:當web伺服器開啟時候,觸發ServletContextEvent並被ContextLoaderListener監聽到,此時執行,ContextLoaderListener中的contextInitialized方法,此方法為ContextLoader中的方法,檢視原始碼可以發現其建立了WebApplicationContext,並將springApplicationContext中的bean註冊到容器中供專案使用。
b、載入過濾器Filter(此處以編碼過濾器CharacterEncodingFilter為例)此過濾器的作用就是設定請求引數的編碼為UTF-8.
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
複製程式碼
c、載入Servlet:初始化DispatcherServlet,在SpringMVC架構中,DispatchServlet負責請求分發,起到控制器的作用
<!--配置前端控制器 進行請求分發 DispatcherServlet本質也是一個Servlet -->
<servlet>
<!--名字可以自定義-->
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/springmvc.xml</param-value>
</init-param>
<!--標記容器啟動的時候就啟動這個servlet-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<!--攔截所有-->
<url-pattern>/</url-pattern>
</servlet-mapping>
複製程式碼