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();%>
对比监听和数据库字段统计,省去了打开、关闭数据库的资源消耗。
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){
//关闭数据库连接
}
}
}
<listener>
<listener-class>XXX.MyConnectionManager</listener-class>
</listener>
总结:
通过上面两个例子,看出监听的实质就是一些事件;
监听对于性能的影响,要看监听的频率和对象资源以及处理逻辑;
通过监听可以提高系统的安全级别。