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/

感謝您的閱讀。如果文章對您有用,那么請輕輕點個贊,以資鼓勵。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM