对于监听器,刚初学JavaEE的我们也很是不是很了解,从名字上看,监听在web开发中的作用主要是干嘛的?监听器是servlet?还是class?这些对于我刚开始学监听器的时候也是一头雾水。
监听器其实就是一个特殊的java类,为什么特殊呢,因为它不是全是一个servlet,而且也要在web.xml进行配置且并没有像servlet那样只继承XXXservlet,还要实现
ServletContextListener接口,所以自我觉得是个特殊类(也可以理解为一个servlet,按个人理解,觉得怎么适合自己去学就怎么理解就好,这是我初学的感想)好了,接下来就聊聊这个监听器吧!!!
监听器主要是用来监听:用户是否登陆,用户是否销毁、在线人数统计等等;
监听监听,那么肯定要监听对象,那么监听器所监听的是域对象,监听三大作用域的对象
使用域对象 | 生命周期事件(初始化、销毁时)的监听
| 作用域中的值产生变化的时候进行监听(添加值、修改值、删除值) |
Application/servletcontext | ServletContextListener | 实现接口 ServletContextAttributeListener |
HttpSession | 初始化、销毁是 HttpSessionListener | HttpSessionAttributeListener |
HttpRequest | HttpRequestListener | HttpRequestAttributeListener |
为了更好明白,先举个例子先:
在聊天室中,监听ServletContext创建与销毁,监听用户列表
/*监听ServletContext对象的创建和销毁*/
public class MyServletContextListener extends HttpServlet implements ServletContextListener {
//ServletContext对象创建 下面这个方 法就会执行
//ServletContextEvent事件对象,监听器对象---》ServletContext对象.(事件源)
public void contextInitialized(ServletContextEvent sce) {
Map<User,HttpSession>userMap=new HashMap<User,HttpSession>();
sce.getServletContext().setAttribute("userMap",userMap);
}
public void contextDestroyed(ServletContextEvent sce) {
}
}
在web.xml中要配置
<servlet>
<servlet-name>MyServletContextListener</servlet-name>
<servlet-class>com.itjob.listener.MyServletContextListener</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServletContextListener</servlet-name>
<url-pattern>/UserServlet</url-pattern>
</servlet-mapping>
这样应该有点明白了吧?初学者应该懂得,我们要编写一个类,这个类要实现的是 ServletContextListener接口,实现这个接口,那么我们就要重写接口中的方法,contextInitialized是监听域对象的创建方法,只要域对象一创建,那么这个方法就执行;contextDestroyed是监听域销毁的方法,只要域对象一销毁,那么这个方法就执行。
那么执行这些方法有什么用呢?这就是监听器的关键所在,执行这些方法有利于对用户登陆的监听、、等等,之前说过。
再举个列子:
使用HttpSessionBandingListener;监听用户是否登陆
这个监听器特别,是作用在javabean上的。我们在User.java要实现HttpSessionBandingListener接口,中写:
//将javaBean与session绑定,
//就是把session对象往javabean中一存session.setAttribute()
public void valueBound(HttpSessionBindingEvent event) {
System.out.println("进入了....");//这是后台打印的
HttpSession session=event.getSession();//通过事件对象获取事件源对象
//从ServletContext中获得人员列表的Map集合
Map<User,HttpSession>userMap=(Map<User,HttpSession>)
session.getServletContext().getAttribute("userMap");
//将用户和对应存入到Map集合中。
userMap.put(this,session);
}
//解除绑定,java对象与session 解除绑定
public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println("退出了....");
//获得session对象
HttpSession session=event.getSession();
//获得人员列表
Map<User,HttpSession> userMap=(Map<User,HttpSession>)
session.getServletContext().getAttribute("userMap");
//将用户从Map中移除
userMap.remove(this);
}
// 使用监听器:HttpSessionBandingListener作用在JavaBean上的监听器.
req.getSession().setAttribute("existUser", existUser);
统计网站同时在线人数
实现HttpSessionListener接口,并定义一个静态计数器
当新建一个session的时候给计数器加1,销毁的时候减1。
具体实现如下:
//计数器
public static int count = 0;
//新产生一个session的时候会调用这个方法
public void sessionCreated(HttpSessionEvent event) {
//计数器加1
count ++;
System.out.println("session listener ***" + source);
}
//session销毁的时候会调用这个方法
public void sessionDestroyed(HttpSessionEvent event) {
//计数器减1
count--;
System.out.println("session listener sessionDestroyed ***" + source);
}
}
web.xml配置略
总的来说,要写一个监听器,首先先写一个类,这个类要实现 ServletContextListener接口,然后重写其的方法。最后我们在web.xml中配置就好了