web專案載入順序
@WEB
web專案執行順序
現在主流的web開發框架一般都是基於Spring開發的,Spring生態圈量級非常之大,功能非常強大。今天講述一下普通的web專案載入順序。 雖然專案大部分都在使用SpringBoot、SpringCloud等微服務的架構來搭建專案,基本不會在進行這些配置了,但是如果專案追究Spring原始碼,這些基礎知識還是需要了解的。
-
web.xml
web專案執行時首先會載入web.xml配置檔案,一般該配置檔案在 /WebRoot(web)/WEB-INF/web.xml ,web.xml中的內容載入不依賴於內容書寫順序,而是以 context-param 、 listener、 filter、servlet的順序進行載入。web.xml中有以下幾項內容:
(1)context-param
以下為配置spring配置檔案目錄的配置。該配置是針對整個web專案上下文的。<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param>
(2)listener
該配置用於向web容器中註冊一個事件監聽器,監聽事件發生事件,如何響應等資訊。事件監聽程式在建立、修改和刪除會話或servlet環境時得到通知。常與context-param聯合使用。<listener> // 該類繼承ServletContextListener 包含初始化方法contextInitialized(ServletContextEvent event) 和銷燬方法contextDestoryed(ServletContextEvent event) <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
(3)filter
filter 在web專案中起到過濾請求的作用,可配置在web.xml中,也可在專案中使用程式碼 繼承Filter類來進行處理一些邏輯。Filter類中有 init(), doFilter(),destory() 方法。可獲取到請求ServletRequest 和ServletResponse,然後決定繼續處理哪些請求,阻擋哪些請求等。一般用作 防CRSF攻擊、防SQL注入、許可權過濾等 。
web.xml中filter 需要和 filter-mapping 一起使用,如下為字元過濾器。<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>
public interface Filter { default void init(FilterConfig filterConfig) throws ServletException {} void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException; default void destroy() {} }
(4)servlet
SpringMVC 中圍繞 DispatcherServlet 來設計請求對映、檢視處理、檢視解析。DispatcherServlet 用於處理請求分發。具體內容見後續SpringMVC執行順序。<servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:SpringMVC.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>
(5)歡迎頁
web專案預設啟動載入的頁面。<welcome-file-list> <welcome-file>.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list>
SpringMVC執行順序
- 時序圖
2.元件
DispatcherServlet
前端控制器DispatcherServlet是SpringMVC整個流程控制中心,由它來排程其它元件相互配合,完成匹配請求URL,解析資料,響應資料,檢視解析以及檢視渲染等任務。
HandlerMapping
處理器對映器HandlerMapping負責根據使用者請求URL找到匹配的Handler處理器。
HandlerAdapter
處理器介面卡HandlerAdapter對處理器進行執行
ModelAndView
ModelAndView是Spring封裝的model和view組合物件。可用於處理資料和檢視。
ViewResolver
檢視解析器ViewResolver負責處理結果生成檢視,先根據邏輯檢視名稱找到物理檢視地址,再生成檢視物件,最後對檢視進行渲染,將處理結果通過頁面展現給使用者。
Controller
業務邏輯處理器,接受請求引數,進行業務處理,返回響應的資料和檢視。
3.applicationContext.xml和dispatcher-servlet.xml
applicationContext.xml 是Spring的全域性配置檔案,用來控制Spring特性,管理Bean的容器。
dispatcher-servlet.xml是SpringMVC中用作控制器,攔截器、轉發view等作用。
注意
在兩個配置檔案中最好不要宣告相同的bean。 applicationContext.xml是隨ContextLoaderListener而載入的,ContextLoaderListener 配置於 中的。dispatcher-servlet.xml是隨DispatcherServlet而載入的,而DispatcherServlet配置於 中,在web.xml中載入順序為 context-param 、listener 、 filter 、servlet 。所以先載入applicationContext.xml 再載入dispatcher-servlet.xml