监听器的配置

在JavaWeb中有个叫监听器的东西,这监听器主要用来监听三大对象:HttpServletRequest、HttpSession、ServletContext,每个对象对应着各自的监听器接口。监听器可以监听这三个对象中的对象创建、初始化与销毁信息的事件,也可以监听对象中的属性变更信息的事件,例如对象的属性添加或删除属性等变更信息。

所以会有六个主要的监听器接口,ServletRequestListener、ServletContextListener和HttpSessionListener接口是用于监听对象的创建与销毁信息。

ServletContextAttributeListener, HttpSessionAttributeListener 和ServletRequestAttributeListener,这三个接口则是定义了三个方法来处理被监听对象中的属性的增加,删除和替换的事件,同一个事件在这三个接口中对应的方法名称完全相同,只是接受的参数类型不同。

配置监听器的方式有两种,第一种是以注解的方式配置,第二种则是以web.xml文件的方式配置。

一、注解

使用注解的方式配置监听器很简单,实现一个或多个监听器接口,然后写上@WebListener注解即可。

二、XML文件配置

使用web.xml文件配置监听器,示例如下:

<!--配置监听器(包名+类名)-->
<listener>
    <listener-class>cn.edu.cuit.listener.OnLineCountListener</listener-class>
</listener>

三、监听器运作

代码示例:

package cn.edu.cuit.listener;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

/**
 * @author fhzheng
 * <h1> 监听器实现如下监听 </h1>
 * <li> 1.ServletContextListener 上下文变更监听器
 * <li> 2.HttpSessionListener 会话变更监听器
 * <li> 3.HttpSessionAttributeListener 会话属性变更监听器
 * <li> 4.当相应的对象发生变更时,就触发监听事件
 * 
 */
public class OnLineCountListener implements ServletContextListener, HttpSessionListener, HttpSessionAttributeListener {

	private ServletContext application = null;	// 上下文对象
	private ArrayList<String> users = null;		// 用户列表
	private HttpSession session = null;			// 用户会话对象
	private String user = null;

	/**
	 * <li> 上下文的初始化
	 */
	public void contextInitialized(ServletContextEvent sce) {
		this.application = sce.getServletContext();
		this.application.setAttribute("users", new ArrayList<String>());
		System.out.println("监听器日志:/t监听器完成上下文对象的获取");
		System.out.println("监听器日志:/t监听器完成用户列表的初始化");
	}

	/**
	 * <li> 上下文的销毁
	 */
	public void contextDestroyed(ServletContextEvent sce) {
	}

	/**
	 * <li> session的创建
	 */
	public void sessionCreated(HttpSessionEvent se) {
		System.out.println("监听器日志:/t一个Session创建了!");
	}

	/**
	 * <li> session的销毁
	 */
	public void sessionDestroyed(HttpSessionEvent se) {
		session = se.getSession();
		user = (String) session.getAttribute("username");
		users = (ArrayList<String>) session.getServletContext().getAttribute("users");
		for (String u : users) {
			if (u.equals(user)) {
				users.remove(u);
				break;
			}
		}
		session.invalidate();
		System.out.println("监听器日志:/t一个Session被销毁掉了!");
	}

	/**
	 * <li> 属性的添加
	 */
	public void attributeAdded(HttpSessionBindingEvent se) {
		users = (ArrayList<String>) application.getAttribute("users");
		users.add(se.getValue().toString());
		this.application.setAttribute("users", users);
		System.out.println("监听器日志:/t一个属性添加完成了");
	}

	/**
	 * <li> 属性的移除
	 */
	public void attributeRemoved(HttpSessionBindingEvent se) {
	}

	/**
	 * <li> 属性的替换【更新】
	 */
	public void attributeReplaced(HttpSessionBindingEvent se) {
	}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值