JavaWeb(十二)---web.xml 中的listener、 filter、servlet 載入順序及其詳解
一、建立順序
1、web.xml檔案中的載入順序為:listener-filter-servlet
2、如果web.xml中配置了<context-param>,初始化順序:
context-param > Listener > Filter > Servlet
二、三大Web元件的生命週期
1、Listener:
Listener生命週期:一直從程式啟動到程式停止執行。
1.ServletContextListener:程式啟動呼叫Listener的contextInitialized()方法,程式停止呼叫Listener的contextDestroyed()方法
2.ServletRequestListener:每次訪問一個Request資源前,都會執行requestInitialized()方法,方法訪問完畢,都會執行requestDestroyed()方法。
3.HttpSessionListener:每次呼叫request.getSession(),都會執行sessionCreated()方法,執行session.invalidate()方法,都會執行sessionDestroyed()方法。
4.ServletRequestAttributeListener:每次呼叫request.setAttribute()都會執行attributeAdded()方法,
如果set的key在request裡面存在,就會執行attributeReplacerd()方法,
呼叫request.removeAttribute()方法,都會執行attributeRemoved()方法。
2、Filter
程式啟動呼叫Filter的init()方法(永遠只調用一次),程式停止呼叫Filter的destroy()方法(永遠只調用一次),
doFilter()方法每次的訪問請求如果符合攔截條件都會呼叫
程式第一次執行,會在servlet呼叫init()方法以後呼叫,不管第幾次呼叫,都在呼叫doGet(),doPost()方法之前。
3、Servlet
程式第一次訪問,會呼叫servlet的init()方法初始化(只執行一次),每次程式執行都會根據請求呼叫doGet()或者doPost()方法,程式停止呼叫destory()方法。
三、關於多個Filter時如何執行
一、當我們為一個資源設定了多個過濾器時,這些過濾器就組成一個Filter鏈的結構。
當執行到一個filter的doFilter方法,呼叫其中的chain.doFilter()。如果還有攔截器(filter),則繼續執行下一個filter的doFIlter方法,
如果之後沒有過濾器了,就放行請求。相當於呼叫了目標資源的service()方法。
doFilter()方法用於呼叫Filter鏈上的下一個過濾器,如果當前過濾器為最後一個過濾器則將請求傳送到目標資源。
二、當有多個Filter時,在web.xml中<url-pattern>靠前的filter先執行