Listener&Filter

Listener的概述:

什么是监听器:

    * 监听器就是一个Java类用来监听其他的JavaBean的变化.

 

监听器和过滤器属于Servlet中的高级技术.

 

监听器的应用:

* 主要在Swing编程.

* 在Android大量应用.

 

* 监听器的术语:

    * 事件源      :被监听的对象.汽车

    * 监听器对象  :监听的对象.汽车上报警器

    * 事件源与监听器绑定:

    * 事件       :指的是事件源的改变.

    * 获得事件源对象.


Servlet的监听器:

Servlet的监听器:

* 监听ServletContext,HttpSession,ServletRequest

* 事件源和监听器绑定的过程:通过配置完成.

 

Servlet中的监听器:提供了8个监听器.

一类:监听三个域对象的创建和销毁的监听器.3个

二类:监听三个域对象的属性变更的监听器.(属性添加,属性移除,属性替换)3个.

三类:监听HttpSession对象中的JavaBean的状态的改变.(绑定,解除绑定,钝化和活化)2个


一类监听器:监听三个域对象的创建和销毁的监听器:

ServletContextListener:监听ServletContext对象的创建和销毁.

【方法】

【问题】

* ServletContext对象何时创建和销毁:

    * 创建:服务器启动时候,服务器可以为每个WEB应用创建一个单独的ServletContext.

    * 销毁:服务器关闭的时候,或者项目从服务器中移除.

 

【入门案例】

1.编写一个类实现监听器的接口.

public class MyServletContextListener implementsServletContextListener{

    @Override

    /**

     * 监听ServletContext对象的创建的方法:

     * @param sce

     */

    publicvoid contextInitialized(ServletContextEvent sce) {

        System.out.println("ServletContext对象被创建了...");

    }


    @Override

    /**

     * 监听ServletContext对象的销毁的方法:

     * @param sce

     */

    publicvoid contextDestroyed(ServletContextEvent sce) {

        System.out.println("ServletContext对象被销毁了...");

    }

 

}

2.通过配置完成监听器和事件源的绑定.

  <!-- 配置监听器 -->

 <listener>

    <listener-class>com.itheima.weblistener.MyServletContextListener</listener-class>

 </listener>

 

【企业中应用】

* 初始化工作.

* 加载配置文件:Spring框架.

    * ContextLoaderListener:

* 定时任务调度:

    * Timer,TimerTask.


HttpSessionListener:监听HttpSession对象的创建和销毁的监听器.

【方法】

【问题】

* HttpSession对象何时创建和销毁的?

    * 创建:服务器第一次调用getSession()方法的时候.

    * 销毁:

        * 非正常关闭服务器(正常关闭序列化到硬盘)

        *session过期了(默认30分钟)

        *session.invalidate()

 

【入门】

1.编写监听器:

public class MyHttpSessionListener implementsHttpSessionListener {

 

    @Override

    publicvoid sessionCreated(HttpSessionEvent se) {

        System.out.println("HttpSession对象被创建了...");

    }

 

    @Override

    publicvoid sessionDestroyed(HttpSessionEvent se) {

        System.out.println("HttpSession对象被销毁了...");

    }

 

}

 

2.配置监听器:

 <listener>

    <listener-class>com.itheima.weblistener.MyHttpSessionListener</listener-class>

 </listener>

 

【问题】

1.访问html是否创建session对象?           :不会

2.访问一个Servlet是否创建session对象?    :不会

3.访问一个jsp是否创建session对象?        :会


ServletRequestListener:监听ServletRequest对象的创建和销毁的监听器:

【方法】

【问题】

ServletRequest对象何时创建和销毁?

    * 创建:客户端向服务器发送请求的时候.

    * 销毁:服务器为这次请求作出了响应时候.

【入门】

1.编写一个监听器

public class MyServletRequestListener implementsServletRequestListener {

    publicvoid requestInitialized(ServletRequestEvent sre)  {

    System.out.println("ServletRequest被创建了...");

    }

    publicvoid requestDestroyed(ServletRequestEvent sre) {

    System.out.println("ServletRequest被销毁了...");

    }

   

}

2.配置监听器

 <listener>

   <listener-class>com.itheima.weblistener.MyServletRequestListener</listener-class>

 </listener>

【问题】

1.访问html是否创建request对象?           :会

2.访问一个Servlet是否创建request对象?    :会

3.访问一个jsp是否创建request对象?        :会



二类监听三个域对象属性变更的监听器:

ServletContextAttributeListener:监听ServletContext对象中的属性变更的监听器

【方法】


HttpSessionAttributeListener:监听HttpSession对象中的属性变更的监听器

【方法】


ServletRequestAttributeListener:监听ServletRequest对象中的属性变更的监听器

【方法】



三类:监听HttpSession中的JavaBean的状态改变的监听器.(绑定,解决绑定,钝化,活化)

三类监听器非常特殊:

* 监听器作用在JavaBean上.JavaBean可以自己感知在session中状态.

* 这类监听器不用配置.

 
HttpSessionBindingListener:监听HttpSession中的JavaBean的绑定和解除绑定的状态.

【方法】

 
HttpSessionActivationListener:监听HttpSession中的JavaBean的钝化和活化的状态.

【方法】

sessionDidActivate(HttpSessionEvent se);  -- 活化

SessionWillPassivate(HttpSessionEvent se); -- 钝化

 

通过配置序列化session:

context.xml

* tomcat/conf/context.xml                      :对tomcat中的所有虚拟主机和虚拟路径生效.

* tomcat/conf/Catalina/localhost/context.xml   :对tomcat下的localhost虚拟主机中的所有路径生效.

* 工程的META-INF/context.xml                     :对当前的工程生效.

 

<?xml version="1.0"encoding="UTF-8"?>

<!--

    maxIdleSwap :1分钟如果session不使用就会序列化到硬盘.

    directory   :itheima 序列化到硬盘的文件存放的位置.

 -->

<Context>

    <ManagerclassName="org.apache.catalina.session.PersistentManager"maxIdleSwap="1">

        <StoreclassName="org.apache.catalina.session.FileStore"directory="itheima"/>

    </Manager>

</Context>


监听器的总结:

Servlet的监听器分成三类8个:

* 一类:监听三个域对象的创建和销毁的监听器.

* 二类:监听三个域对象的属性的变更.

* 三类:监听HttpSession中JavaBean的状态的改变.



Filter的概述

什么是过滤器Filter:

Filter:一个实现了特殊接口的Java类.实现对请求资源的过滤的功能.

* 过滤器是Servlet技术中最为实用的技术.


过滤器的作用:

对目标资源进行过滤.

* 自动登录,解决网站乱码,进行页面静态化,进行响应压缩...


使用过滤器:

1.编写一个类实现过滤器的接口.

public class FilterDemo1 implements Filter{

 

    @Override

    publicvoid init(FilterConfig filterConfig) throws ServletException {

       

    }

 

    @Override

    publicvoid doFilter(ServletRequest request, ServletResponse response, FilterChainchain)

            throwsIOException, ServletException {

       

        System.out.println("FilterDemo1执行了...");

       

        // 放行

        chain.doFilter(request,response);

       

    }

 

    @Override

    publicvoid destroy() {

       

    }

 

}

2.对过滤器进行配置.

 <filter>

    <filter-name>FilterDemo1</filter-name>

    <filter-class>com.itheima.filter.FilterDemo1</filter-class>

 </filter>

 

 <filter-mapping>

    <filter-name>FilterDemo1</filter-name>

    <url-pattern>/*</url-pattern>

 </filter-mapping>


【过滤器的生命周期】(了解)

* Servlet的生命周期(*****)

* Filter生命周期:过滤器从创建到销毁的过程.

    * 服务器启动的时候,服务器就会创建过滤器的对象,每次访问被拦截目标资源,过滤器中的doFilter的方法就会执行.当服务器关闭的时候,服务器就会销毁Filter对象.

【FilterConfig的作用】

【方法】

        //获得初始化参数:过滤器的初始化参数.

        Stringusername = fConfig.getInitParameter("username");

        Stringpassword = fConfig.getInitParameter("password");

        System.out.println("初始化参数"+username+"   "+password);

   

        // 获得所有的初始化参数的名称:

        Enumeration<String>names = fConfig.getInitParameterNames();

        while(names.hasMoreElements()){

            Stringname = names.nextElement();

            Stringvalue = fConfig.getInitParameter(name);

            System.out.println(name+"    "+value);

        }

       

        // 获得过滤器的配置的名称:

        StringfilterName = fConfig.getFilterName();

        System.out.println("过滤器名称"+filterName);

 

【FilterChain:过滤器链】

过滤器链中的过滤器的执行的顺序跟<filter-mapping>的配置顺序有关.

【方法】


【Filter的配置】

【url-pattern的配置】与servlet中的配置一样:

* 三种配置:

    * 完全路径匹配:以 / 开始  /aaa /aaa/bbb

    * 目录匹配:    以 / 开始  /*  /aaa/*

    * 扩展名匹配: 不能以 / 开始 *.do  *.jsp  *.action

 

【servlet-name的配置】通过url-pattern拦截一个Servlet的资源.也可以通过servlet-name标签进行拦截.

 

【dispatcher的配置】

* REQUEST   :默认值.

* FORWARD   :拦截转发

* ERROR     :拦截跳转到错误页面.全局错误页面. 

* INCLUDE   :拦截在一个页面中包含另一个页面.


【Filter的使用】

在到达目标资源之前对request中的getParameter方法进行增强.

【增强一个类中的某个方法】

1.继承       :能够控制这个类的构造.

2.装饰者     :被增强的对象和增强的对象实现相同的接口,在增强对象中获得到被增强对象的引用.

3.动态代理       :这个类实现了接口即可.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值