在WEB端实现监听实质:
实现一系列的监听接口(实现相应的接口,覆写各接口中相应的方法,在相应的事件触发的时候会执行自己的监听器中的覆写的方法,在各个方法中完成自己想要的操作,从而实现了监听)
监听--就是在进行某种各个范围(application,session,request)中有相关值的设置、修改、替换的时候,这些操作都会触发事件,而Java中事件的代理机制,事件处理是利用listener机制,所以为了在事件触发的时候能够使自己能够采取相应的措施,就需要---->继承这样的listener,在listener中覆写相应的方法,覆写相应的事件处理方法,在对应的方法中处理对应的事件,也就是进行了监听(网上总结的特别好的)
总结:主要是用来监听特定对象的创建或销毁、属性的变化,需要实现特定接口的普通类。
相关的接口
一、监听对象创建/销毁的监听器接口
Interface ServletRequestListener 监听request对象的创建或销毁
Interface HttpSessionListener 监听session对象的创建或销毁
Interface ServletContextListener 监听servletContext对象的创建或销毁
二、监听对象属性的变化
Interface ServletRequestAttributeListener 监听request对象属性变化: 添加、移除、修改
Interface HttpSessionAttributeListener 监听session对象属性变化: 添加、移除、修改
Interface ServletContextAttributeListener 监听servletContext对象属性变化
三、session相关监听器
Interface HttpSessionBindingListener 监听对象绑定到session上的事件
Interface HttpSessionActivationListener 监听session序列化及反序列化的事件
生命周期
监听器的使用步骤
1、写一个普通的java类,实现先关接口
2、部署xml文件
A、ServletRequestListener(在sevlet中的service方法传入的参数是ServletRequest,在HttpServlet中将其强制转型了,所以没有HttpServletRequestListener相关接口,使用最基本的ServletRequest)
创建对应的实现类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
package comgqx.a_life; import javax.servlet.ServletRequestEvent; import javax.servlet.ServletRequestListener; /** * 监听request对象的创建和销毁 * @author Administrator */ public class MyRequestListener implements ServletRequestListener{ @Override public void requestDestroyed(ServletRequestEvent sre) { // TODO Auto-generated method stub //获取request中的存放的数据 Object obj=sre.getServletRequest().getAttribute( "cn" ); System.out.println(obj); System.out.println( "MyRequestListener.requestDestoryed()" ); } @Override public void requestInitialized(ServletRequestEvent sre) { // TODO Auto-generated method stub //获取request中的存放的数据 Object obj=sre.getServletRequest().getAttribute( "cn" ); System.out.println(obj+ "hhhhh" ); System.out.println( "MyRequestListener.requestInitialized()" ); } } |
session对象在强制关闭浏览器的时候,不算是session对象的销毁,只能说是不能用了,所以不会触发销毁事件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
package comgqx.a_life; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; public class MySessionListener implements HttpSessionListener{ //创建销毁 @Override public void sessionCreated(HttpSessionEvent se) { // TODO Auto-generated method stub System.out.println( "MySessionListener.sessionCreated()" ); } @Override public void sessionDestroyed(HttpSessionEvent se) { // TODO Auto-generated method stub System.out.println( "MySessionListener.sessionDestroyed()" ); } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
package comgqx.a_life; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; public class MyServletListener implements ServletContextListener{ //一般在服务器启动的时候创建,服务器关闭后销毁,用的相对比较多 @Override public void contextDestroyed(ServletContextEvent arg0) { // TODO Auto-generated method stub System.out.println( "MyServletListener.contextDestroyed()" ); } @Override public void contextInitialized(ServletContextEvent arg0) { // TODO Auto-generated method stub System.out.println( "1........MyServletListener.contextInitialized" ); } } |
写好配置文件
1
2
3
4
5
6
7
8
9
10
11
12
|
<!-- 监听request对象的创建 --> <listener> <listener- class >comgqx.a_life.MyRequestListener</listener- class > </listener> <!-- 监听servletContext对象的创建 --> <listener> <listener- class >comgqx.a_life.MyServletListener</listener- class > </listener> <!-- 监听session对象的创建 --> <listener> <listener- class >comgqx.a_life.MySessionListener</listener- class > </listener> |
写一个jsp来试验
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<%@ page language= "java" import = "java.util.*" pageEncoding= "UTF-8" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" > <html> <head> <title>My JSP 'index.jsp' starting page</title> </head> <body> i am coming! <%request.setAttribute( "cn" , "china" ); session.invalidate(); //销毁session(session默认最大活跃时间是30分钟) %> </body> </html> |
在启动服务器的时候会看到servlet对象的创建
然后通过jsp去访问,控制台如下显示