Listener(监听器)

简介

1.Listener用于监听JavaWeb程序中的事件,当事件被触发时,监听器中的指定方法将会被调用。
2.监听器的内部机制是接口回调

什么是接口回调(理解)

通过安卓开发中,按钮的点击监听来理解

  • MainActivity
public class MainActivity extends AppCompatActivity {
    private Button bu_test;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bu_test=findViewById(R.id.bu_test);

          //采用匿名实现类的方式
//        bu_test.setOnClickListener(new View.OnClickListener() {
//            @Override
//            public void onClick(View view) {
//
//            }
//        });


        //设置按钮的点击监听
        /*
            对于设计者来说,设计者并不知道我们开发者点击这个按钮要做什么操作,所以设计者在点击监听方法中设置一个参数,
            这个参数是一个接口,作为开发者,我们要传递这个接口的实现类过去,当点击按钮的时候,
            实际执行的是实现类(MyOnClickListener)的方法(onClick)。
         */
        bu_test.setOnClickListener(new MyOnClickListener());
    }

     class MyOnClickListener implements View.OnClickListener{
        @Override
        public void onClick(View view) {
            Log.e("onClick","MyOnClickListener 点击");
        }
     }
}
  • OnClickListener接口
    public interface OnClickListener {
        void onClick(View v);
    }

监听器的分类及使用

1.监听三个作用域创建和销毁

  • ServletContextListener

    作用:监听ServletContext对象的创建与销毁
    扩展:
    servletcontext创建:启动服务器的时候
    servletContext销毁:关闭服务器. 从服务器移除项目

  • ServletRequestListener

    作用:监听ServletRequest对象的创建与销毁
    扩展:
    request创建:访问服务器上的任意资源都会有请求出现。也就是说访问 html, jsp, servlet等都会创建。
    request销毁:服务器已经对这次请求作出了响应。

  • HttpSessionListener

    作用:监听HttpSession对象的创建与销毁
    扩展:
    session的创建:调用getSession就会创建
    session的销毁:1.session超时 2.服务器非正常关闭时销毁 3.正常关闭服务器(会把session保存到硬盘中(序列化))

三个作用域创建与销毁监听器的使用:
以ServletContextListener为例(其他两个监听器和该监听器使用方法一样)

  1. 创建ServletContextListener的实现类
public class MyServletContextListener  implements ServletContextListener {
			@Override
			public void contextInitialized(ServletContextEvent sce) {
				System.out.println("创建ServletContext了");
			}
			@Override
			public void contextDestroyed(ServletContextEvent sce) {
				System.out.println("销毁ServletContext了");	
			}
}
  1. 在web.xml文件中注册监听器
<listener>
<listener-class>mycode.MyServletContextListener</listener-class>
</listener>

由于ServletContext对象在服务器启动时创建,关闭时销毁。所以启动服务器时contextInitialized()方法被调用,关闭服务器时contextDestroyed()方法被调用。

这类监听器的作用

  1. ServletContextListener

    利用它来,在servletcontext创建的时候, 可以执行一些初始化工作或执行自定义任务调度(执行某一个任务)。

  2. HttpSessionListener

    可以用来统计在线人数.

2. 监听三个作用域属性属性变化

  • ServletContextAttributeListener
  • HttpSessionAttributeListener
  • ServletRequestAttributeListener

三个作用域属性属性变化监听器的使用
request属性监听器为例(其他两个监听器和该监听器使用方法一样)

  1. 创建ServletRequestAttributeListener的实现类
public class MyRequestAttributeListener implements ServletRequestAttributeListener {
	@Override
	public void attributeAdded(ServletRequestAttributeEvent srae) {
		System.out.println("request域中添加一个属性"+srae.getName()+"="+srae.getValue());
	}
	@Override
	public void attributeRemoved(ServletRequestAttributeEvent srae) {
		System.out.println("request域中移除一个属性"+srae.getName()+"="+srae.getValue());
	}
	@Override
	public void attributeReplaced(ServletRequestAttributeEvent srae) {
		System.out.println("request域中一个属性被修改了"+srae.getName()+"="+srae.getValue());
	}
}
  1. 在web.xml文件中注册监听器
<listener>
		<listener-class>mycode.MyRequestAttributeListener</listener-class>
</listener>

操作request域中的属性时,对应方法将会被调用。

3. 监听Session内的对象

  • HttpSessionBindingListener
    作用:监听某个对象在session域中的创建与移除(绑定和解除绑定)。
    使用:要监听哪一个类,直接使该类实现HttpSessionBindingListener接口。
public class Student implements HttpSessionBindingListener {
		@Override
		public void valueBound(HttpSessionBindingEvent event) {
			System.out.println("对象被绑定进来了");
		}
		@Override
		public void valueUnbound(HttpSessionBindingEvent event) {
			System.out.println("对象被解除绑定");
		}
}
  • HttpSessionActivationListener
    作用:监听某个对象在session中的序列化(钝化)与反序列化(活化 )。
    扩展:
    钝化 (序列化) : Session在一段时间内没有被使用时,把内存中Session对象存储到硬盘上
    活化 (反序列化):Session被钝化后,服务器再次调用Session对象时,把硬盘中的Session对象读取到内存中。
    使用:要监听哪一个类,直接使该类实现HttpSessionActivationListener接口。
//这里为了是Student对象可以正常序列化到硬盘上,还需要让类实现java.io.Serializable接口
//如果Student对象中还包含其他对象的引用,则被关联的对象也必须支持序列化
public class Student implements HttpSessionActivationListener , Serializable {
	private static final long serialVersionUID = 1L;
	@Override
	public void sessionWillPassivate(HttpSessionEvent se) {
		// TODO Auto-generated method stub
	}
	@Override
	public void sessionDidActivate(HttpSessionEvent se) {
		// TODO Auto-generated method stub
	}
}

扩展:Session的活化和钝化

让session的在一定时间内钝化.

1. 在tomcat文件目录里面 conf/context.xml 里面配置,则对所有的运行在这个服务器的项目生效  

2. 在tomcat文件目录的conf/Catalina/localhost/context.xml 配置,则只对localhost域名生效(如访问: localhost:8080)。 

3. 在IDE中配置
   在web工程项目中的 META-INF/context.xml,则只对当前的工程生效。

	<Context>
		<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="9">
			<Store className="org.apache.catalina.session.FileStore" directory="itheima"/>
		</Manager>
	</Context>
	
	说明:
	maxIdleSwap :设置session的闲置时间,超过之后会自动钝化到硬盘中,单位分钟。(如下:9分钟不用就钝化)
	directory :  钝化后的那个文件存放的目录位置。 

案例1:定时发送生日邮件(监听ServletContext对象的创建+定时器+使用java发送邮件)

发布了48 篇原创文章 · 获赞 18 · 访问量 2969

猜你喜欢

转载自blog.csdn.net/qq_45615417/article/details/104128448