1. 什么是监听器?
监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。
监听器可以监听客户端的请求、服务端的操作等,通过监听器,可以自动激发一些操作,在事件发生前或发生后进行一些操作。
Servlet中有三种监听器,分别为:对上下文事件的监听、对会话事件的监听、对请求事件的监听。
2.如何开发监听器?
(1)和编写其它事件监听器一样,编写servlet监听器也需要实现一个特定的接口,并针对相应动作覆盖接口中的相应方法。
(2)和其它事件监听器略有不同的是,servlet监听器的注册不是直接注册在事件源上,而是由WEB容器负责注册,开发人员只需在web.xml文件中使用<listener>标签配置好监听器,web容器就会自动把监听器注册到事件源中。
(3)一个 web.xml 文件中可以配置多个 Servlet 事件监听器,web 服务器按照它们在web.xml 文件中的注册顺序来加载和注册这些 Serlvet 事件监听器。
3.具体实现 分析一下对会话事件的监听:
需要用到接口HttpSessionListener和HttpSessionBindingListener
HttpSessionListenerDemo.java
package com.demo.controller;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class HttpSessionListenerDemo implements HttpSessionListener {
@Override
// 当用户与服务器之间开始时触发该方法
public void sessionCreated(HttpSessionEvent se) {
// TODO Auto-generated method stub
HttpSession session = se.getSession();
ServletContext application=session.getServletContext();
Object obj=application.getAttribute("count");
if(obj==null){
application.setAttribute("count", 1);
}else{
application.setAttribute("count", Integer.parseInt(String.valueOf(obj))+1);
}
System.out.println("session Created........");
}
@Override
// 会话断开,服务器销毁触发该方法
public void sessionDestroyed(HttpSessionEvent se) {
// TODO Auto-generated method stub
System.out.println("session Destroyed........");
}
}
HttpSessionBindingListenerDemo.java
package com.demo.controller;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
public class HttpSessionBindingListenerDemo implements
HttpSessionBindingListener {
private String username;
public HttpSessionBindingListenerDemo(String username) {
super();
this.username = username;
}
@Override
public void valueBound(HttpSessionBindingEvent event) {
// TODO Auto-generated method stub
ServletContext app = event.getSession().getServletContext();
List<String> list = (List<String>) app.getAttribute("list");
if (list == null) {
list = new ArrayList<String>();
}
list.add(username);
app.setAttribute("list", list);
System.out.println("绑定...........");
}
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
// TODO Auto-generated method stub
HttpSession session = event.getSession(); // 获取session
ServletContext application = session.getServletContext(); // 获取application
List list = (List) application.getAttribute("list"); // 获得用户列表
list.remove(username);
System.out.println("解除绑定....");
}
}
在web.xml中配置监听
<listener>
<listener-class>com.demo.controller.HttpSessionListenerDemo</listener-class>
</listener>