Listener监听器与Filter过滤器
生活随笔
收集整理的這篇文章主要介紹了
Listener监听器与Filter过滤器
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.Listener
? ? [1]監聽器簡介 ? ? ? ? > Listener是JavaWeb的三大組件之一,Servlet、Filter、Listener ? ? ? ? > Listener翻譯過來就是監聽器 ? ? ? ? > 現實生活中的監聽器: ? ? ? ? ? ? - 監聽誰:明星 ? ? ? ? ? ? - 監聽器:朝陽群眾 ? ? ? ? ? ? - 監聽事件:干壞事 ? ? ? ? ? ? - 回調函數:報警 ? ? ? ? ? > JavaWeb中的監聽器: ? ? ? ? ? ? - 監聽誰:ServletContext、HttpSession、ServletRequest ? ? ? ? ? ? - 監聽器:自己寫 ? ? ? ? ? ? - 監聽的事件:生命周期、屬性的變化 ? ? ? ? ? ? - 回調函數:自己寫 ? ? ? ? ? > JavaWeb中的監聽器,共分為三大類,一共8個: ? ? ? ? ? > WEB組件的特點: ? ? ? ? ? ? 1.都需要創建一個類并實現某個接口 ? ? ? ? ? ? 2.都要在web.xml文件中進行配置 ? ? ? [2]監聽器分類? ? ? ? ? ? 1.生命周期監聽器(3個) ? ? ? ? 2.屬性變化監聽器(3個) ? ? ? ? 3.session中指定類屬性變化監聽器(2) ? ? ? [3]生命周期監聽器: ? ? ? ? > 監聽ServletContext、HttpSession、ServletRequest三個對象創建和銷毀 ? ? ? ? ? > javax.servlet.ServletContextListener --> 監聽ServletContext的生命周期變化 ? ? ? ? ? ? - 方法: ? ? ? ? ? ? ? ? void contextDestroyed(ServletContextEvent sce) ? ? ? ? ? ? ? ? ? ? - 在ServletContext對象銷毀前調用 ? ? ? ? ? ? ? ? ? void contextInitialized(ServletContextEvent sce) ? ? ? ? ? ? ? ? ? ? - 在ServletContext對象創建后調用 ? ? ? ? ? ? ? - 參數: ? ? ? ? ? ? ? ? ServletContextEvent ? ? ? ? ? ? ? ? ? ? - 可以用來獲取ServletContext對象 ? ? ? ? ? > javax.servlet.http.HttpSessionListener --> 監聽HttpSession對象的生命周期變化 ? ? ? ? ? ? - 方法: ? ? ? ? ? ? ? ? void sessionCreated(HttpSessionEvent se) ? ? ? ? ? ? ? ? ? ? - 在HttpSession對象創建以后調用 ? ? ? ? ? ? ? ? ? void sessionDestroyed(HttpSessionEvent se) ? ? ? ? ? ? ? ? ? ? - 在HttpSession對象銷毀前調用 ? ? ? ? ? ? ? - 參數: ? ? ? ? ? ? ? ? HttpSessionEvent ? ? ? ? ? ? ? ? ? ? - 可以用來獲取HttpSession對象 ? ? ? ? ? > javax.servlet.ServletRequestListener --> 監聽request對象的生命周期的變化 ? ? ? ? ? ? - 方法: ? ? ? ? ? ? ? ? void requestDestroyed(ServletRequestEvent sre) ? ? ? ? ? ? ? ? ? ? - 在request對象銷毀前調用 ? ? ? ? ? ? ? ? ? void requestInitialized(ServletRequestEvent sre) ? ? ? ? ? ? ? ? ? ? - 在request對象創建后調用 ? ? ? ? ? ? ? - 參數: ? ? ? ? ? ? ? ? ServletRequestEvent ? ? ? ? ? ? ? ? ? ? - 可以用來獲取ServletContext對象 ? ? ? ? ? ? ? ? ? ? - 可以用來獲取ServletRequest對象 ? ? ? [4]屬性監聽器 ? ? ? ? > ServletContext屬性變化監聽器 ? ? ? ? ? ? javax.servlet.ServletContextAttributeListener ? ? ? ? ? ? ? ? - 方法: ? ? ? ? ? ? ? ? ? ? void attributeAdded(ServletContextAttributeEvent scab) ? ? ? ? ? ? ? ? ? ? ? ? - 當我們向application域中添加屬性時調用 ? ? ? ? ? ? ? ? ? ? ? void attributeRemoved(ServletContextAttributeEvent scab) ? ? ? ? ? ? ? ? ? ? ? ? - 當我們從application域中移除屬性時調用 ? ? ? ? ? ? ? ? ? ? ? void attributeReplaced(ServletContextAttributeEvent scab) ? ? ? ? ? ? ? ? ? ? ? ? - 當application域中一個屬性被替換時調用 ? ? ? ? ? > HttpSession的屬性變化監聽器 ? ? ? ? ? ? javax.servlet.http.HttpSessionAttributeListener ? ? ? ? ? ? ? ? - 方法: ? ? ? ? ? ? ? ? ? ? void attributeAdded(HttpSessionBindingEvent se) ? ? ? ? ? ? ? ? ? ? ? ? - 當我們向session域中添加屬性時調用 ? ? ? ? ? ? ? ? ? ? ? void attributeRemoved(HttpSessionBindingEvent se) ? ? ? ? ? ? ? ? ? ? ? ? - 當我們從session中移除屬性時調用 ? ? ? ? ? ? ? ? ? ? ? void attributeReplaced(HttpSessionBindingEvent se) ? ? ? ? ? ? ? ? ? ? ? ? - 當session域中的一個屬性被替換時調用 ? ? ? ? ? ? ? ? ? 參數: ? ? ? ? ? ? ? ? ? ? HttpSessionBindingEvent: ? ? ? ? ? ? ? ? ? ? ? ? 作用: ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1.獲取發生變化的屬性的名字 getName() ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2.獲取發生變化的屬性的值 getValue() 注意屬性替換時,獲取到是舊的屬性值 ? ? ? ? ? ? ? ? ? ? ? ? ? ? 3.獲取HttpSession對象 getSession() 可以通過session對象獲取到新的屬性值 ? ? ? ? ? > ServletRequest屬性變化監聽器 ? ? ? ? ? ? -javax.servlet.ServletRequestAttributeListener ? ? ? ? ? ? ? ? - 方法: ? ? ? ? ? ? ? ? ? ? void attributeAdded(ServletRequestAttributeEvent srae) ? ? ? ? ? ? ? ? ? ? ? ? - 當我們向request域中添加屬性時調用 ? ? ? ? ? ? ? ? ? ? ? void attributeRemoved(ServletRequestAttributeEvent srae) ? ? ? ? ? ? ? ? ? ? ? ? - 當我們從request域中移除屬性時調用 ? ? ? ? ? ? ? ? ? ? ? void attributeReplaced(ServletRequestAttributeEvent srae) ? ? ? ? ? ? ? ? ? ? ? ? - 當request域中的一個屬性被替換時調用 ? ? ? ? > 監聽Session中指定類的實例屬性變化的監聽器 ? ? ? ? - 這兩個監聽器的接口,由一個JavaBean去實現,而且不用編寫配置文件 ? ? ? [5]HttpSessionBindingListener ? ? ? ? void valueBound(HttpSessionBindingEvent event) ? ? ? ? ? ? - 當該類實例設置進session域中時調用 ? ? ? ? ? void valueUnbound(HttpSessionBindingEvent event) ? ? ? ? ? ? - 當該類的實例從session域中移除時調用 ? ? ? ? ? HttpSessionBindingEvent: ? ? ? ? ? ? 作用: ? ? ? ? ? ? ? ? 1.獲取發生變化的屬性的名字 getName() ? ? ? ? ? ? ? ? 2.獲取發生變化的屬性的值 getValue() ? ? ? ? ? ? ? ? 3.獲取HttpSession對象 getSession() ? ? ? [6]HttpSessionActivationListener ? ? ? ? > 監聽某個類的實例和session一起活化和鈍化的監聽器 ? ? ? ? - 方法: ? ? ? ? ? ? void sessionDidActivate(HttpSessionEvent se) ? ? ? ? ? ? ? ? - 當該類實例和session一起活化時調用 ? ? ? ? ? ? ? void sessionWillPassivate(HttpSessionEvent se) ? ? ? ? ? ? ? ? - 當該類實例和session一起鈍化時調用 ? ? ? ? ? - 參數: ? ? ? ? ? ? HttpSessionEvent ? ? ? ? ? ? ? ? - 可以用來獲取HttpSession對象 ? ? 2.Filter ? ? [1] Filter簡介 ? ? ? ? - Filter直譯過來就是過濾器的意思 ? ? ? ? - JavaWeb中的Filter是用來過濾請求 ? ? ? ? - Filter是JavaWeb中三大組件之一:Servlet、Filter、Listener ? ? ? ? - 三大組件都需要運行在服務器端 ? ? ? ? - 編寫WEB組件有一個共同的特點: ? ? ? ? ? ? 1.編寫一個類實現某個接口 ? ? ? ? ? ? 2.在web.xml文件中進行配置 ? ? ? ? - Filter的作用: ? ? ? ? ? ? 1.過濾器可以在請求到達目標資源(JSP、HTML、Servlet等等)之前攔截請求 ? ? ? ? ? ? 2.過濾器也可以放行請求,使請求到達目標資源 ? ? ? ? ? ? 3.在響應到達瀏覽器之前對響應做一個處理 ? ? ? [2] Filter的HelloWorld ? ? ? ? 1.創建一個類實現Filter接口 ? ? ? ? 2.編寫web.xml配置文件 ? ? ? ? ? ? <filter> ? ? ? ? ? ? ? ? <filter-name>Filter的別名</filter-name> ? ? ? ? ? ? ? ? <filter-class>filter的全類名</filter-class> ? ? ? ? ? ? </filter> ? ? ? ? ? ? <filter-mapping> ? ? ? ? ? ? ? ? <filter-name>Filter的別名</filter-name> ? ? ? ? ? ? ? ? <url-pattern>要攔截的請求的地址</url-pattern> ? ? ? ? ? ? </filter-mapping> ? ? ? ? ? - url-pattern的配置規則: ? ? ? ? ? ? 1.精確匹配:只有訪問的路徑和url-pattern配置的路徑完全一致時,才會調用Filter攔截請求 ? ? ? ? ? ? ? ? 如: /index.jsp 只會攔截項目根目錄下index.jsp的請求 ? ? ? ? ? ? ? 2.路徑匹配:只要訪問的地址在url-pattern配置的路徑下,就會調用Filter攔截請求 ? ? ? ? ? ? ? ? 如: /hello/* 只要訪問項目根目錄下hello路徑下的資源,就會調用Filter ? ? ? ? ? ? ? ? ? ? /* 只要是當前項目下的請求都會調用Filter ? ? ? ? ? ? ? 3.后綴匹配: 只要訪問的地址后綴和url-pattern一致,就會調用Filter攔截請求 ? ? ? ? ? ? ? ? 如: *.jsp 只要訪問的地址以.jsp結尾,就會調用Filter ? ? ? ? ? ? ? 注意:所有的url-pattern必須符合上述規則。 ? ? ? ? ? ? ? ? 以上規則同樣適用于Servlet的url-pattern ? ? ? ? ? ? ? 當使用Filter去攔截一個Servlet時,只需要將Filter的url-pattern配置和Servlet的一樣即可, ? ? ? ? ? ? ? ? 同時也可以在filter-mapping中設置一個servlet-name標簽,來指定要攔截的Servlet, ? ? ? ? ? ? ? ? ? ? 這樣即使Servlet的url-pattern發生改變,Filter也會照常攔截 ? ? ? [3] Filter的生命周期 ? ? ? ? > Filter的生命周期是Filter由被創建到被銷毀的過程 ? ? ? ? > Filter的生命周期方法: ? ? ? ? ? ? 構造器:服務器一啟動就會創建Filter的實例,只會調用一次,Filter是單例。 ? ? ? ? ? ? ? init(): 構造器調用之后,馬上調用,用來初始化Filter,只會調用一次。 ? ? ? ? ? ? ? ? FilterConfig:代表當前Filter的配置信息,可以獲取當前Filter的初始化參數。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 還可以獲取ServletContext對象。 ? ? ? ? ? ? ? doFilter():每次攔截請求時都會調用,會調用多次。 ? ? ? ? ? ? ? ? ServletRequest:代表瀏覽器發送給服務器的請求報文,和Servlet中的request是一樣的。 ? ? ? ? ? ? ? ? ServletResponse:代表的是服務器響應給瀏覽器的響應報文,和Servlet中的response是一樣的。 ? ? ? ? ? ? ? ? FilterChain: 用來放行請求: ? ? ? ? ? ? ? ? ? ? chain.doFilter(request,response) --> 放行請求, ? ? ? ? ? ? ? ? ? ? ? ? 當調用該方法時,相當于調用了目標資源的service方法。 ? ? ? ? ? ? ? destroy():項目卸載Filter對象銷毀前調用,用來做一些如釋放資源等收尾的工作,只會調用一次。 ? ? ? [4] Filter的執行順序 ? ? ? ? - 為同一個WEB資源可以設置多個Filter攔截請求,多個Filter就組成了一個Filter鏈。 ? ? ? ? ? ? 當有多個Filter時,在去調用chain.doFilter()時, ? ? ? ? ? ? ? ? 如果Filter之后還有Filter,就相當于調用下一個Filter的doFilter方法 ? ? ? ? ? ? ? ? 如果Filter之后沒有Filter,就相當于調用了目標資源的service()方法 ? ? ? ? ? - 多個Filter的執行順序,有filter-mapping的順序決定,filter-mapping靠前的先攔截,靠后的后攔截。 ? ? ? ? - 注意:filter-mapping一定要在filter標簽的下邊 ? ? ? [5] ?dispatcher ? ? ? ? - Filter默認只會攔截直接向目標資源發送的請求。 ? ? ? ? - 我們可以在filter-mapping中通過dispatcher標簽來指定攔截請求的類型: ? ? ? ? ? ? <dispatcher>REQUEST</dispatcher> ? ? ? ? ? ? ? ? - request表示會攔截直接向目標資源發送的請求,如果不配置dispatcher則默認值就是request ? ? ? ? ? ? ? ? ? ? 如果寫了dispatcher則以寫的為準 ? ? ? ? ? ? ? <dispatcher>FORWARD</dispatcher> ? ? ? ? ? ? ? ? - forward表示會攔截通過轉發向目標資源發送的請求 ? ? ? ? ? ? ? <dispatcher>INCLUDE</dispatcher> ? ? ? ? ? ? ? ? - include表示會攔截通過動態包含向目標發送的請求 ? ? ? ? ? ? ? <dispatcher>ERROR</dispatcher> ? ? ? ? ? ? ? ? - error表示會攔截通過錯誤頁面的形式向目標發送的請求 ? ? ? ? ? ? ? ? ?<error-page> ? ? ? ? ? ? ? ? ? ? <error-code>404</error-code> ? ? ? ? ? ? ? ? ? ? <location>/4.jsp</location> ? ? ? ? ? ? ? ? ? </error-page> ? ? ? [6] HttpFilter ? ?? ?轉載請注明出處!
http://www.cnblogs.com/libingbin/
感謝您的閱讀。如果文章對您有用,那么請輕輕點個贊,以資鼓勵。
轉載于:https://www.cnblogs.com/libingbin/p/5985647.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Listener监听器与Filter过滤器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到有了男朋友是怎么回事
- 下一篇: BZOJ2087 : [Poi2010]