1.Filter

    [1] Filter简介

        > Filter翻译为中文是过滤器的意思。
        
        > Filter是JavaWeb的三大web组件之一:Servlet、Filter、Listener
        
        > Filter的作用是在请求到达WEB资源(HTML、CSS、Servlet、JSP)之前进行拦截。
        
        > Filter需要交给Tomcat访问器来管理
       
        > Filter的作用:
            1.Filter可以在请求到达目标资源之前进行拦截
            2.Filter也可以放行请求
            3.Filter可以在响应到达浏览器之前做一个预处理

    [2] Filter的HelloWorld

        > 步骤:
            1.创建一个类实现Filter接口
            2.在web.xml文件中对Filter进行配置
               

 <filter>
     <filter-name>Filter的别名</filter-name>
     <filter-class>Filter的全类名</filter-class>
 </filter>
<filter-mapping>
      <filter-name>别名</filter-name>
       <url-pattern>需要Filter拦截的资源地址</url-pattern>
 </filter-mapping>

    [3] Filter的生命周期

        > 一个请求的发送,到响应返回是一个线程。
        
        > Filter的生命周期,指的是Filter对象由被创建到被销毁的过程。
        
        > Filter的生命周期方法:
            - 构造器:Filter的构造器在服务器启动时调用。 构造器只会调用一次,说明Filter也是单例多线程的。
            - init():在构造器被调用后,紧接着被调用。作用:用来初始化Filter。
            - doFilter():每一次拦截请求时都会调用。
                参数
                    ServletRequest request        请求报文
                    ServletResponse response   响应报文
                    FilterChain chain
                          >  该对象的作用就是放行请求:
                              可以通过 chain.doFilter(request,response) 放行请求。
                              当调用chain.doFilter()就相当于调用目标的资源的service方法。
            - destroy方法在项目停止时调用,用来在对象被销毁前做一些收尾工作。
            
        > url-pattern的设置规则:
        
              1.精确匹配:只有当目标资源的地址和url-pattern的地址一模一样时,Filter才会拦截资源
                  例子:/2.jsp , 只有当浏览器访问项目根目录下的2.jsp时,才会调用Filter
            
              2.路径匹配:当访问的资源在url-pattern配置的路径下时,Filter就会拦截资源。
                  例子1:/hello/* , 只要访问项目根目录下hello下的资源,就会调用Filter。
                  例子2:/* , 会拦截项目根目录下所有资源
            
              3.后缀匹配:只要访问的资源地址和url-pattern的后缀一样就会调用Filter
                  例子:*.jsp 只要是以jsp结尾的请求都会拦截
                
              - 以上规则适用于Servlet的url-pattern配置
            
              - 当使用Filter拦截一个Servlet时,可以将Filter的url-pattern和Servlet的url-pattern一样
                  这样Filter就会拦截发送到Servlet的请求,可以在一个Filter写多个url-pattern。
            
              - 也可以通过在filter-mapping中添加一个servlet-name标签来设置要拦截的Servlet的name

[4] Filter的执行顺序


        > 我们可以为一个资源设置多个过滤器,
            当我们为一个资源设置了多个过滤器时,这些过滤器就组成一个Filter链的结构。
            当我们去掉用chain.doFilter(),如果该过滤器后边还有其他的过滤, 相当于调用了下一个过滤器doFilter()方法
            如果过滤器后没有其他的过滤器,我们调用chain.doFilter(), 相当于调用了目标资源的service()方法。
        > 多个Filter的执行顺序,有filter-mapping标签的配置顺序决定, filter-mappint靠前,则filter先执行,靠后则后执行。
        > 我们可以通过修改filter-mapping的顺序来修改Filter的执行顺序

     [5] dispatcher

          > Filter默认只会拦截直接向目标资源发送的请求,而像转发之类的请求不会拦截
          > 可以在在filter-mapping的dispatcher标签中来指定过滤器要拦截的请求类型:
          

  <dispatcher>REQUEST</dispatcher>

                代表拦截发送到目标资源的直接请求,如果不指定dispatcher默认值就是request
                如果在filter-mapping设置了dispatcher则按照设置的内容来
               

  <dispatcher>FORWARD</dispatcher>

                FORWARD代表会拦截通过转发访问目标资源的请求。
            

 <dispatcher>INCLUDE</dispatcher>

                INCLUDE会拦截动态包含的请求。

  <dispatcher>ERROR</dispatcher>

                ERROR是拦截在web.xml中声明的错误页面的
                - 我们可以在web.xml文件进行一个错误页面的映射,通过如下标签:
                  

<error-page>
       <error-code>404</error-code>
       <location>/4.jsp</location>
</error-page>

                    error-code指的是发生错误的代码
                    location 发生错误以后去到的页面        

2.Listener

    [1]监听器简介

        > Listener是JavaWeb中三大组件之一。Servlet、Filter、Listener
        > 三大组件都有的共同特点,都需要实现一个接口,并在web.xml文件配置。
            监听器:朝阳群众
            监听对象:明星
            监听的事件:干坏事
            调用方法:报警
            
            
        > JavaWeb中的监听器的监听对象是谁?
            ServletContext
            HttpSession
            ServletRequest

    [2]监听器分类  

        > JavaWeb中的监听器共有三种,共8个监听器


            - 生命周期监听器,监听三个对象的创建和销毁的事件。
                * ServletContextListener

         * HttpSessionListener

         * ServletRequestListener


            - 属性监听器,监听三个对象中属性的变化。

        * ServletContextAttributeListener

           * HttpSessionAttributeListener

        * ServletRequestAttributeListener
            
            - session对象监听器,将它session中的属性,以及session的活化和钝化。
                * HttpSessionBindingListener

      * HttpSessionActivationListener

    [3]生命周期监听器

        ServletContextListener
            - ServletContext生命周期监听器
                   - void contextDestroyed(ServletContextEvent sce)
                      - 该方法在ServletContext对象销毁前调用
                    
                  - void contextInitialized(ServletContextEvent sce)  
                      - 该方法在ServletContext对象创建之前调用。
    
                  - ServletContextEvent 对象可以获取到ServletContext对象
                      ServletContextEvent.getServletContext();
                
        HttpSessionListener
              - HttpSession生命周期监听器
                  - void sessionCreated(HttpSessionEvent se)
                      - 该方法在Session创建时调用
                    
                  - void sessionDestroyed(HttpSessionEvent se)
                      - 在session销毁时调用
                
                  - HttpSessionEvent
                      - 可以获取HttpSession对象
            
     ServletRequestListener
              - void requestDestroyed(ServletRequestEvent sre)
                  - 在request对象销毁时调用
            
              - void requestInitialized(ServletRequestEvent sre)
                  - 在request对象创建时调用
            
              - ServletRequestEvent
                  可以获取ServletContext对象和ServletRequest        

    [4]属性监听器

        > 属性监听器,监听三个域中的属性的变化:添加一个属性,替换一个属性,移除一个属性
        > ServletContextAttributeListener


            - 监听ServletContext中的属性的变化
            
            void attributeAdded(ServletContextAttributeEvent scab)
                - 当向ServletContext中添加属性时调用
                
            attributeRemoved(ServletContextAttributeEvent scab)
                - 移除属性时调用
            
            attributeReplaced(ServletContextAttributeEvent scab)
                - 替换一个属性时调用



        > HttpSessionAttributeListener


              void attributeAdded(HttpSessionBindingEvent se)
              void attributeRemoved(HttpSessionBindingEvent se)
              void attributeReplaced(HttpSessionBindingEvent se)
            
         -    HttpSessionBindingEvent
                  1.可以获取到属性名 getName()
                  2.可以获取属性的旧值 getValue()
                  3.可以获取到HttpSession对象 getSession();
 

        > ServletRequestAttributeListener
              void attributeAdded(ServletRequestAttributeEvent srae)
              void attributeRemoved(ServletRequestAttributeEvent srae)
              void attributeReplaced(ServletRequestAttributeEvent srae) 

   [5]session对象监听器

 作用:监听session域中的属性的。
   HttpSessionBindingListener
        > 监听session域中某一个类的实例的添加和移除。
        > 该接口由JavaBean来实现,不需要再web.xml文件配置
            valueBound(HttpSessionBindingEvent event)
                - 当该类的实例,作为属性设置进session域中时调用
            valueUnbound(HttpSessionBindingEvent event)
                - 当该类的实例,从session域中被移除时调用
        

   HttpSessionActivationListener
        > 监听session域中的某类属性,和session一起活化和钝化的事件。
        > 该接口由JavaBean来实现,同样不需要再web.xml中配置
            void sessionDidActivate(HttpSessionEvent se)
                - 当前对象和session一起被活化到内存时调用
                
            void sessionWillPassivate(HttpSessionEvent se)
                - 当前对象和session一起钝化到硬盘时调用