监听器

来源:互联网 发布:广电网络机顶盒wifi 编辑:程序博客网 时间:2024/06/01 16:31

监听器
1、监听器简介
Web监听器是Servlet规范中定义的一种特殊类,用于监听ServletContext、HttpSession和ServletRequest等域对象的创建与销毁事件,当Web应用启动时启动,当Web应用销毁时销毁。用于监听域对象的属性发生修改的事件,可以再事件发生前、发生后做一些必要的处理。
Web监听器的用途:
1)统计在线人数和在线用户
2)系统启动时加载初始化信息
3)统计网站访问量
4)跟Spring结合
2、监听器的实现及启动顺序
实现Web监听器步骤:
1)创建一个实现监听器接口的类,实现ServletContextListener接口
package com.oracle.listener;

public class FirstListener implements ServletContextListener{

//初始化方法public void contextInitialized(ServletContextEvent sce) {    System.out.println("监听器启动。。。");}//销毁方法public void contextDestroyed(ServletContextEvent sce) {    System.out.println("监听器销毁。。。");}

}

2)配置web.xml进行注册


com.oracle.listener.FirstListener

3)启动和停止服务器

监听器启动顺序
在一个web.xml中配置了多个监听器时,启动顺序根据注册的顺序依次启动

在一个web.xml中同时配置了过滤器、监听器和Servlet时,加载的先后顺序为:

3、监听器的分类
按监听器的对象划分
1)用于监听应用程序环境对象(ServletContext)的事件监听器
2)用于监听用户会话对象(HttpSession)的事件监听器
3)用于监听请求消息对象(ServletRequest)的事件监听器

按监听的事件划分
1)监听域对象自身的创建和销毁的事件监听器
 监听ServletContext对象的监听器接口ServletContextListener
 contextInitialized方法,ServletContext创建时调用
 contextDestroyed方法,ServletContext销毁时调用
 主要用途:定时器、全局属性对象
 监听HttpSession对象的监听器接口HttpSessionListener
 sessionCreated方法,session创建时调用
 sessionDestroyed方法,session销毁时调用
 主要用途:统计在线人数、记录访问日志
 监听ServletRequest对象的监听器接口ServletRequestListener
 requestInitialized方法,request创建时调用
 requestDestroyed方法,request销毁时调用
 主要用途:读取参数,记录访问历史
2)监听域对象中的属性的增加和删除的事件监听器
 ServletContext对象的监听器接口ServletContextAttributeListener
 HttpSession对象的监听器接口HttpSessionAttributeListener
 ServletRequest对象的监听器接口ServletRequestAttributeListener
 监听器中的方法:
 增加属性监听方法attributeAdded
 删除属性监听方法attributeRemoved
 修改属性监听方法attributeReplaced
3)监听绑定到HttpSession域中的某个对象的状态的事件监听器
 Session钝化机制
 把服务器中不经常使用的Session对象暂时序列化到系统文件或数据库系统中,当需要时再反序列化到内存中,整个过程由服务器自动完成。Session绑定和钝化、活化操作不需要在web.xml中注册。
 Session钝化机制由SessionManager管理。

 HttpSessionBindingListener接口
 绑定:valueBound方法
 解除绑定:valueUnbound方法
 HttpSessionActivationListener接口
 钝化:sessionWillPassivate方法,对象序列化
 活化:sessionDidActivate方法,对象反序列化
 序列化:Serializable
Session绑定案例
public class User implements HttpSessionBindingListener,HttpSessionActivationListener,Serializable {

private String username;private String password;public void valueBound(HttpSessionBindingEvent httpsessionbindingevent) {    System.out.println("valueBound Name:"+httpsessionbindingevent.getName());}public void valueUnbound(HttpSessionBindingEvent httpsessionbindingevent) {    System.out.println("valueUnbound Name:"+httpsessionbindingevent.getName());}//钝化public void sessionWillPassivate(HttpSessionEvent httpsessionevent) {    System.out.println("sessionWillPassivate "+httpsessionevent.getSource());}    //活化public void sessionDidActivate(HttpSessionEvent httpsessionevent) {    System.out.println("sessionDidActivate "+httpsessionevent.getSource());}

}

4、Servlet3.0下监听器的使用
 使用Servlet3.0的前提条件
 使用Servlet3.0新标准jar包;
 JDK必须在1.6以上版本;
 编译器的编译级别为6.0;
 在web.xml文件中,使用3.0规范;
 使用支持Servlet3.0特性的web容器,比如Tomcat7;
 Servlet3.0下监听器的用法

 @WebListener常用的属性

项目案例
统计在线人数
User.java
public class User {
private String sessionIdString;
private String ipString;
private String firstTimeString;

public String getSessionIdString() {    return sessionIdString;}public void setSessionIdString(String sessionIdString) {    this.sessionIdString = sessionIdString;}public String getIpString() {    return ipString;}public void setIpString(String ipString) {    this.ipString = ipString;}public String getFirstTimeString() {    return firstTimeString;}public void setFirstTimeString(String firstTimeString) {    this.firstTimeString = firstTimeString;}

}
SessionUtil.java
public class SessionUtil {

public static Object getUserBySessionId(ArrayList<User> userList, String sessionIdString) {    for (int i = 0; i < userList.size(); i++) {        User user = userList.get(i);        if (user.getSessionIdString().equals(sessionIdString)) {            return user;        }    }    return null;}

}
MyHttpSessionListener.java
@WebListener
public class MyHttpSessionListener implements HttpSessionListener {

private int userNumber = 0;@Overridepublic void sessionCreated(HttpSessionEvent arg0) {    userNumber++;    arg0.getSession().getServletContext().setAttribute("userNumber", userNumber);}@Overridepublic void sessionDestroyed(HttpSessionEvent arg0) {    userNumber--;    arg0.getSession().getServletContext().setAttribute("userNumber", userNumber);    ArrayList<User> userList = null;//在线用户List    userList = (ArrayList<User>)arg0.getSession().getServletContext().getAttribute("userList");    if(SessionUtil.getUserBySessionId(userList, arg0.getSession().getId())!=null){        userList.remove(SessionUtil.getUserBySessionId(userList, arg0.getSession().getId()));    }}

}
MyServletRequestListener.java
@WebListener
public class MyServletRequestListener implements ServletRequestListener {

private ArrayList<User> userList;//在线用户List@Overridepublic void requestDestroyed(ServletRequestEvent arg0) {}@Overridepublic void requestInitialized(ServletRequestEvent arg0) {    userList  = (ArrayList<User>)arg0.getServletContext().getAttribute("userList");    if(userList==null)        userList = new ArrayList<User>();    HttpServletRequest request = (HttpServletRequest) arg0.getServletRequest();    String sessionIdString = request.getSession().getId();    if(SessionUtil.getUserBySessionId(userList,sessionIdString)==null){        User user = new User();        user.setSessionIdString(sessionIdString);        user.setFirstTimeString(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));        user.setIpString(request.getRemoteAddr());        userList.add(user);    }    arg0.getServletContext().setAttribute("userList", userList);}

}

原创粉丝点击