Servlet监听器的那些事儿

本文介绍了Servlet监听器的基本概念,列举了几种常见的监听器接口,并通过两个实例详细展示了如何使用监听器进行在线人数统计及管理共享数据库连接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  Servlet监听器对象可以在事情发生前、后做一些必要的处理,这就是监听器的意义所在了。那么常见的监听器有哪些?在什么时候,怎么运用监听器呢?

常见的监听器接口:

1.ServletContextAttributeListener: 监听ServletContext的属性操作,如,添加、删除、修改


2.ServletContextListener:         监听ServletContext,当创建的 时候触发contextInitialized(ServletContextEvent sce)事件;当销毁的时候触发contextDestroyed(ServletContextEvent sce)方法。contextDestroyed(ServletContextEvent sce)事件。


3.HttpSessionListener:                 监听HttpSession,当创建Session时,触发sessionCreated(SessionEvent se)事件;当Session销毁时,触发sessionRemoved(SessionEvent se)事件。


4.HttpSessionAttributeListener:           监听HttpSession中属性的操作,增加属性,触发attributeAdded(HttpSessionBingdingEvent se)事件;删除属性,触发attributeRemoveded(HttpSessionBingdingEvent se)事件;重设HttpSession,触发attributeReplaced(HttpSessionBingdingEvent se)事件。


实例加深理解:

实例1.使用监听器,实现在线人数的统计:

OnlineCounter类,执行具体的人数增加或者减少的动作:

public class OnlineCounter{

	private static long online =0;

	public static long getOnline(){

		return online;
	}

	public static void raise(){

		online++;
	}	

	public static void reduce(){

		online--;
	}
}

OnlineCounterListener ,实现HttpSessionListener接口:(在 sessionCreated和sessoinDestroyed方法中调用OnlineCounter的执行增加和减少的方法):

import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class OnlineCounterListener implements HttpSessionListener{


	public void sessionCreated(HttpSessionEvent hse){
		OnlineCounter.raise();
	}

	public void sessoinDestroyed(HttpSessionEvent hse){

		OnlineCounter.reduce();
	}
}

配置web.xml 的<listener>节点:

<listener>
	<listener-class>sevletlistener.SecondListener</listener-class>
</listener>


jsp显示人数:

<%@ page import ="xxx.OnlineCounter"%>
<%@= OnlineCounter.getOnline()%>

退出会话(提供一个注销按钮):
<form action ="exit.jsp" methd = post>

	<input type =submit value="exit">
</form>


exit.jsp:<% session.invalidate();%>


对比监听和数据库字段统计,省去了打开、关闭数据库的资源消耗


实例2:监听器管理共享数据库连接:保证每新生成一个servlet context都会有一个可用的数据库连接,并且所有的连接对会在context关闭的时候随之关闭。

 MyConnectionManager:实现ServletContextListener接口的类:

public class MyConnectionManager implements ServletContextListener{

	public void contextInitiallized(ServletContextEvent e){

		//创建数据库连接
		Connection con =.......;
		e.getServletContext().setAttribute("conn",con);		
		
	}

	public void contextDestroyed(ServletContextEvent e){

		Connect con =(Connection) e.getServletContext().getAttribute("con");
		
		try{

			con.close();
		}catch(SQLException ignored){

		//关闭数据库连接
		}
	}


}


同样在web.xml中配置<listener>节点:

<listener>
	<listener-class>XXX.MyConnectionManager</listener-class>
</listener>

总结:

通过上面两个例子,看出监听的实质就是一些事件;

监听对于性能的影响,要看监听的频率和对象资源以及处理逻辑;

通过监听可以提高系统的安全级别。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值