做web后端工程師,逃不過的web.xml,我們都知道配置這個文件是日常工作了,那么我們來把一些必須知道知識點梳理下。
我們把web項目啟動的時候,首先加載的就是web.xml這個文件,只有這個文件所有的配置信息沒錯之后,web項目才算真正地跑起來。
那么我們一起打開web.xml的配置信息的大門吧。
首先,我們需要肯定一個整體的信息的就是,無論的web.xml里面的配置信息順序是怎么樣,我們的執行順序是不會按照你寫在文件中的配置順序執行的,web.xml有自己的執行順序
初始化過程:
- 在啟動Web項目時,容器(比如Tomcat)會讀web.xml配置文件中的兩個節點<listener>和<contex-param>。
- 接着容器會創建一個ServletContext(上下文),應用范圍內即整個WEB項目都能使用這個上下文。
- 接着容器會將讀取到<context-param>轉化為鍵值對,並交給ServletContext。
- 容器創建<listener></listener>中的類實例,即創建監聽(備注:listener定義的類可以是自定義的類但必須需要繼承ServletContextListener)。
- 在監聽的類中會有一個contextInitialized(ServletContextEvent event)初始化方法,在這個方法中可以通過event.getServletContext().getInitParameter("contextConfigLocation") 來得到context-param 設定的值。在這個類中還必須有一個contextDestroyed(ServletContextEvent event) 銷毀方法.用於關閉應用前釋放資源,比如說數據庫連接的關閉。
- 得到這個context-param的值之后,你就可以做一些操作了.注意,這個時候你的WEB項目還沒有完全啟動完成.這個動作會比所有的Servlet都要早。
而同個類型下的執行順序是根據對應的mapping的信息執行的
依照xml的執行順序,我們來依次了解一下各個執行順序的標簽是什么意思
值得我們注意的是,web項目在啟動的時候,容器(Tomcat)會創建一個域對象ServletContext,我們先簡單介紹一下
ServletContext
這個官方的解釋是servlet上下文,啟動的時候,服務器會給每一個工程創建一個對象,這個對象就是ServletContext對象,且這個對象是全局唯一。而且整個工程內的servlet都共享這個對象。
首先我們先記住,ServletContext是一個域對象,不要急,這就給你介紹一下域對象
通過上圖,相信你可以明白域對象是在這次充當什么角色的
那么究竟域對象究竟是什么呢
域對象是服務器在內存上創建的存儲空間,用於不同動態資源(servlet)之間傳遞與共享數據
凡是域對象都有以下的三個方法
SetAttribute(name,value) |
往域對象里面添加數據,添加時以key-value形式添加 |
GetAttribute(name); |
根據指定的key讀取域對象里面的數據 |
RemoveAttribute(name) |
根據指定的key從域對象里面刪除數據 |
相信看到這里,不少打過代碼的童鞋已經了解到了域對象究竟是啥東西了,SetAttribute這些方法,我們在往域對象傳數據的時候,是經常使用的。
那么接下來我們就可以來了解一下
context-param
作用:該元素用來聲明應用范圍(整個WEB項目)內的上下文初始化參數。
在里面有param-name跟param-value
param-name 設定上下文的參數名稱。必須是唯一名稱
param-value 設定的參數名稱的值
把這個信息讀取完成之后,我們是轉化為鍵值對的,交給了ServletContext
按照順序,我們接下來需要了解的是Listener
Listener翻譯過來就是監聽器,顧名思義就是用來監聽我們web活動的,這個很好理解,servlet一共提供了八個監聽器
三個域對象的創建和銷毀監聽器
對象類型 |
對應的監聽器 |
ServletContext |
ServletContextListener |
HttpSession |
HttpSessionListener |
HttpServletRequest |
HttpServletRequestListener |
監聽三個對象的屬性變更的監聽器(屬性添加,屬性移除,屬性替換)
對象類型 |
對應的監聽器 |
ServletContext |
ServletContextAttributeListener |
HttpServletRequest |
ServletRequestAttributeListener |
HttpSession |
HttpSessionAttributeListener |
監聽HttpSession對象中的JavaBean的狀態的改變(綁定,解除綁定,鈍化和活化)
對象類型 |
對應的監聽器 |
HttpSession |
HttpSessionBindingListener(綁定,解除綁定) |
HttpSession |
HttpSessionActivationListener(鈍化和活化) |
那么關於監聽的介紹就到這里,深入的內容我會寫另外一篇博客給大家深入介紹
接下來是關於filter,也就是過濾器,過濾器顧名思義就是用來過濾一些需要的信息
filter
過濾器實際上就是對web提交過來的數據,對服務器處理的信息,進行再交付給對方。你可以理解為一個中間加工處理的地方。
通常都是用來攔截request,和response進行攔截過濾處理
通過上圖,我們可以更直觀地了解到過濾器的工作角色,值得我們注意的是,過濾器可能會有多個,經過過濾器一過濾完之后,還需要通過濾器二進行過濾處理,因為每個過濾器都有自己特定的過濾功能
關於多個過濾器的執行順序,我們請求到達Servlet之間是可以經過多個過濾器的,這些過濾器的執行順序是依賴於<filter-mapping>里面配置的順序。
servlet
servlet全稱Java Servlet,是用Java編寫的服務端程序,其主要功能在於交互式地瀏覽和修改數據,生成動態Web內容。
在web.xml這里主要是將你所寫的servlet對應的類配置到當中去,具體的servlet的詳解可以看我關於servlet詳解的文章