1、监听对象:ServletContext、HttpSession、ServletRequest

2、具体操作:
实现接口:javax.servlet.ServletContextListener
配置web.xml:
<listener>
<listener-class>cn.lxj.listener.FirstListener</listener-class>
</listener>

3、监听器启动顺序
按照注册的加载顺序,从上到下执行

4、执行优先顺序:监听器 > 过滤器 > Servlet

5、ServletContext(应用程序环境)对象监听:
接口:ServletContextListener
方法:contextInitialized(ServletContextEvent arg0) //创建时调用
ServletContext context = arg0.getServletContext();
//在这里设置内容,其他地方获取到context对象可以获取到此地方设置的属性
context.setAttribute("xxx", "1111");
String s = context.getInitParameter("config"); //获取配置文件信息
web.xml:
<context-param>
<param-name>config</param-name>
<param-value>1111</param-value>
</context-param>

contextDestroyed(ServletContextEvent arg0) //销毁时候调用,用于释放一些资源

用途:定时器、全局属性对象

HttpSession(用户会话)对象监听:
接口:HttpSessionListener
方法 sessionCreated(HttpSessionEvent arg0) // 打开页面session对象创建调用
sessionDestroyed(HttpSessionEvent arg0) // session对象销毁调用
arg0.getSession().setAttribute("name","张三"); //session对象设置
用途:记录在线人数、记录访问日志

ServletRequest(监听请求消息)
接口:ServletRequestListener
方法:requestInitialized(ServletRequestEvent arg0) //当前请求开始调用
requestDestroyed(ServletRequestEvent arg0) //当前请求结束调用
ServletRequest request = arg0.getServletRequest();//request对象
String name = request.getParameter("name");
用途:记录在线人数、记录访问日志

6、监听域对象中的属性添加、删除
ServletContext:
接口:ServletContextAttributeListener
HttpSession:
接口:HttpSessionAttributeListener
ServletRequest:
接口:ServletRequestAttributeListener

attributeAdd :增加
request.setAttribute("requestName", "requestName"); //每次访问
request.getSession().setAttribute("sessionName", "sessionName");//第一次访问
request.getSession().getServletContext().setAttribute("contextName", "contextName"); //第一次访问

attributeRemove :删除
request.removeAttribute("requestName");
request.getSession().removeAttribute("sessionName");
request.getSession().getServletContext().removeAttribute("contextName");

attributeReplace :
request.setAttribute("requestName", "requestName"); //未销毁之前在设置一次
request.getSession().setAttribute("sessionName", "sessionName");//第二次访问
request.getSession().getServletContext().setAttribute("contextName", "contextName"); //第二次访问

7、监听绑定到HttpSession某个域中某个对象的状态事件监听器:
HttpSession中对象状态:
绑定-->解除绑定 钝化(将session从内存持久化到存储设备上)-->活化(将session从存储设备上恢复到内存)
thEast)

Servlet规范:
接口:HttpSessionBindingListener(不需要在web.xml注册)
绑定:valueBound()
解除绑定:valueUnbound()
接口:HttpSessionActivationListener(不需要在web.xml注册)
钝化:sessionWillPassivate()
活化:sessionDidActivate()

HttpSessionBindingListener、HttpSessionActivationListener实例::

public class User implements HttpSessionBindingListener,HttpSessionActivationListener,Serializable {

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

private String username;
private String password;

public void valueBound(HttpSessionBindingEvent arg0) {
// TODO Auto-generated method stub
System.out.println("valueBound:"+arg0.getName());
}

public void valueUnbound(HttpSessionBindingEvent arg0) {
// TODO Auto-generated method stub
System.out.println("valueUnbound:"+arg0.getName());
}

/**
* 活化方法 ,磁盘->内存(用户访问)
* @param arg0
*/
public void sessionDidActivate(HttpSessionEvent arg0) {
// TODO Auto-generated method stub
System.out.println("sessionDidActivate:");
}
/**
* 钝化方法 ,内存->磁盘(停止服务器等操作)
* @param arg0
*/
public void sessionWillPassivate(HttpSessionEvent arg0) {
// TODO Auto-generated method stub
System.out.println("sessionWillPassivate:");
}
}
页面:
request.getSession.setAttribute("user", new cn.lxj.model.User)//触发valueBound
request.getSession.removeAttribute("user") //触发valueUnbound
【注】:想钝化、活化必须要实现Serializable


Persistentmanager配置:tomcat/conf/context.xml中
<Manager path="" />



8 Servlet3.0下监听器的应用(上面说的都是Servlet2.5下的应用):
如何查看Servlet版本:打开web.xml上面显示是2.5、3.0等
使用Servlet3.0条件:
使用Servlet3.0新标准jar包
jdk必须在1.6以上版本
编译器编译级别6.0以上
在web.xml文件中使用3.0以上规范
使用支持Servlet3.0特性的容器,比如Tomcat7及以上

8.1 @WebListener
条件:该注解用于将类生命为监听器,被@WebListener标注的类必须实现以下至少一个接口:
ServletContextListener
ServletContextAttributeListener
ServletRequestListener
ServletRequestAttributeListener
HttpSessionListener
HttpSessionAttributeListener
【注】:无法定义监听器顺序

属性:value ,String类型,可选,该监听器的描述信息
【对比】:
2.5:
<listener>
<listener-class>cn.lxj.listener.FirstSessionListener</listener-class>
</listener>
3.0:
@WebListener("this is a demo")
public class FirstSessionListener implements HttpSessionListener{...}