监听器

对于监听器,刚初学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中配置就好了






  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

未名胡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值