1. 程式人生 > >JavaWeb(十二)---web.xml 中的listener、 filter、servlet 載入順序及其詳解

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先執行