文章:Servlet监听器
Servlet监听器
www.firnow.com 时间 : 2010-07-19 作者:网络 编辑:huyang629 点击: 43 [ 评论 ]
-
-
一、Servlet中对象作用域
1、 ServletContext 上下文
应用服务器一启动就产生该对象,服务器关闭即销毁
作用于全局,所有Servlet ,相当于静态变量
2、 HttpSession 会话
客户端第一次请求产生,session过期销毁
作用于同一个客户端,相当于成员变量
3、 ServletRequest请求
一次请求产生一个对象,请求结束即销毁
作用于同一次请求,相当于局部变量
二、Servlet监听器
工作流程:
(1)确定事件源
(2)写一个类,实现Servlet监听器接口,并从写接口里面的方法
(3)在web.xml里注册建立联系,
<listener>
<listener-class>Servlet类事件源全路径</listener-class>
</listener>
(4)事件源触发事件,监听器调用相应方法
1、ServletContext事件
(1)ServletContextListener接口,用于监听ServletContext的创建与销毁
相应方法:
void contextInitialized(ServletContextEvent e); ServletContext创建触发
void contextDestroyed(ServletContextEvent e); ServletContext销毁触发
(2)ServletContextAttribyteListener接口,用于监听ServletContext属性状态
相应方法:
void attributeAdded(ServletContextEvent e); ServletContext属性加入触发
context.setAttribute(“a”,”b”);
void attributeRemovd(ServletContextEvent e); ServletContext属性删除触发
context.removeAttribute(“a”,);
void attributeReplaced(ServletContextEvent e); ServletContext属性修改触发
context.setAttribute(“a”,”c”);
2、HttpSession事件
(1)HttpSessionListener接口,用于监听session的创建与销毁
相应方法:
void sessionCreated(HttpsessionEvent e) session 创建触发
void sessionDestroyed (HttpsessionEvent e) session 销毁触发
(2)HttpSession AttributeListener接口,用于监听session属性状态
相应方法:同ServletContextAttribyteListener
(3)HttpSessionBindingListener接口,用于监听绑定对象到Session属性监听
唯一一个不用在web.xml里注册的监听接口
绑定
Ression.setAttribute(“a”, 实现该接口的对象),
触发void valueBound(HttpSessionBindingEvent e);方法
移除:
Ression.removeAttribute(“a”),
触发void valueUnbound(HttpSessionBindingEvent e);方法
3、 SercletRequest事件
(1)ServletRequestListener接口 用于监听request的销毁与创建
(2)ServletRequesAttributetListener接口 用于监听request的属性状态
文章出处:飞诺网(www.firnow.com):http://dev.firnow.com/course/3_program/java/javajs/20100719/456543.html
文章:配置监听器
21.3 Servlet监听器实例讲解-站点计数监听器
监听器也是Servlet 2.3新增的功能,在许多触发性的处理中需要。通常用做用户某一事件的触发监听,比如监听用户的来访和退出、监听某一数据事件的发生或者定义一个周期性的时钟定期执行。这一功能极大地增强了Java Web程序的事件处理能力。
为了演示监听器的使用,这里以在线用户计数器为例进行讲解。本节为了演示,我们使用Tomcat默认的ROOT项目代码进行测试。首先在D:/Tomcat 6.0/webapps下新建测试站点目录counter,并复制D:/Tomcat 6.0/webapps/ROOT下的所有文件和目录到D:/Tomcat 6.0/webapps/counter目录下。下面在该目录下进行调试。
21.3.1 配置监听器
首先在文件counter/WEB-INF/web.xml中添加如下的监听器器配置:
- <listener>
- <listener-class>com.utils.CounterListener</listener-class>
- </listener>
21.3.2 编写监听器类
在counter/WEB-INF/classes/com/utils下新建类CounterListener.java,代码如下:
- package com.utils;
- import javax.servlet.http.*;
- public class CounterListener implements HttpSessionListener {
- public static int count;
- public CounterListener () {
- count = 0;
- }
- //创建一个session时激发
- public void sessionCreated(HttpSessionEvent se) {
- count++;
- }
- //一个session失效时激发
- public void sessionDestroyed(HttpSessionEvent se) {
- if(count>0) count--;
- }
- };
在该代码中,变量count为静态变量,在整个系统中唯一,记录整个系统中在线用户数。sessionCreated()在用户到访时自动调用,使用count++;sessionDestroyed()在用户会话过期或单击退出销毁session时调用,使用count--。
21.3.3 运行查看监听效果
统计的功能有了,现在在login.jsp中添加一句代码,用以显示用户计数:
当前在线用户:<%=com.utils.CounterListener.count%>
访问http://localhost:8081/counter/index.htm,单击登录.
文章:session监听器的使用
监听器概述
1.Listener是Servlet的监听器
2.可以监听客户端的请求、服务端的操作等。
3.通过监听器,可以自动激发一些操作,如监听在线用户数量,当增加一个HttpSession时,给在线人数加1。
4.编写监听器需要实现相应的接口
5.编写完成后在web.xml文件中配置一下,就可以起作用了
6.可以在不修改现有系统基础上,增加web应用程序生命周期事件的跟踪
常用的监听接口
1.ServletContextAttributeListener
监听对ServletContext属性的操作,比如增加/删除/修改
2.ServletContextListener
监听ServletContext,当创建ServletContext时,激发contextInitialized (ServletContextEvent sce)方法;当销毁ServletContext时,激发contextDestroyed (ServletContextEvent sce)方法。
3.HttpSessionListener
监听HttpSession的操作。当创建一个Session时,激发session Created(SessionEvent se)方法;当销毁一个Session时,激发sessionDestroyed (HttpSessionEvent se)方法。
4.HttpSessionAttributeListener
监听HttpSession中的属性的操作。当在Session增加一个属性时,激发attributeAdded (HttpSessionBindingEvent se) 方法;当在Session删除一个属性时,激发attributeRemoved (HttpSessionBindingEvent se)方法;当在Session属性被重新设置时,激发attributeReplaced (HttpSessionBindingEvent se) 方法。
使用范例:
由监听器管理共享数据库连接
生命周期事件的一个实际应用由context监听器管理共享数据库连接。在web.xml中如下定义监听器:
listener
listener-classXXX.MyConnectionManager/listener-class
/listener Øserver创建监听器的实例,接受事件并自动判断实现监听器接口的类型。要记住的是由于监听器是配置在部署描述符web.xml中,所以不需要改变任何代码就可以添加新的监听器。
public class MyConnectionManager implements ServletContextListener{
public void contextInitialized(ServletContextEvent e) {
Connection con = // create connection
e.getServletContext().setAttribute(con, con);
}
public void contextDestroyed(ServletContextEvent e) {
Connection con = (Connection) e.getServletContext().getAttribute(con);
try {
con.close();
}
catch (SQLException ignored) { } // close connection
}
}
监听器保证每新生成一个servlet context都会有一个可用的数据库连接,并且所有的连接对会在context关闭的时候随之关闭。
计算在线用户数量的Linstener
(1)
Package xxx;
public class OnlineCounter {
private static long online = 0;
public static long getOnline(){
return online;
}
public static void raise(){
online++;
}
public static void reduce(){
online;
}
}
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class OnlineCounterListener implements HttpSessionListener{
public void sessionCreated(HttpSessionEvent hse) {
OnlineCounter.raise();
}
public void sessionDestroyed(HttpSessionEvent hse){
OnlineCounter.reduce();
}
}
在需要显示在线人数的JSP中可是使用
目前在线人数:
%@ page import=xxx.OnlineCounter %
%=OnlineCounter.getOnline()%
退出会话(可以给用户提供一个注销按钮):
form action=exit.jsp method=post
input type=submit value=exit
/form
exit.jsp: %session.invalidate() ;%
在web.xml中加入:
listener
listener-classservletlistener111111.SecondListener/listener-class /listener
怎么样,就是这么简单,不用对现有代码做任何的修改。