• 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/

    感谢您的阅读。如果文章对您有用,那么请轻轻点个赞,以资鼓励。

  • 相关阅读:
    C# 事件的简单例子
    pl sql 的目录 所在的目录 不能有 小括号,如 Program Files (x86)
    转】 C# 图片格式(JPG,BMP,PNG,GIF)等转换为ICO图标
    TQQ2440第三节:串口
    今天发现一个bug,不知道是什么问题,printf的问题吗,还是什么。先记下!
    【转载】内存对齐详解
    TQQ2440第二节:流水灯
    TQQ2440第一节:启动代码
    wince下sources\sources.cmn\Makefile.def的相关作用
    (基于Java)编写编译器和解释器第10章:类型检查第一部分
  • 原文地址:https://www.cnblogs.com/libingbin/p/5985647.html
Copyright © 2020-2023  润新知