您的位置:首页 > 其它

Servlet中的监听器及监听在线人数实例

2014-06-14 18:53 351 查看
Servlet
API提供了基本的应用程序事件监听器接口。编程者可以通过实现这些接口来使用管理事件的功能。Servlet2.4以后提供了对以下对象的事件监听:ServletContext,HttpSession,ServletRequest。监听ServletContext可以使Web程序得知整个应用程序载入和卸载等运行情况。监听HttpSession可以Web程序了解应用程序会期间的状况并作出响应。监听ServletRequest可以使
Web程序控制Web请求的生命周期。
下面结合JavaServetAPI官方文档对各个事件监听器接中进行说明。
一、 ServletContextListener

所在包:javax.servlet
接口声明:public interface
ServletContextListener extends java.util.EventListener
方法:
1.void
contextDestroyed(ServletContextEvent sce)
当应用被卸载后触发执行该方法中的代码。
2.void
contextInitialized(ServletContextEvent sce)
当应用在初始化时触发执行该方法中的代码。
这里需要对 ServletContentEvent说明一下,它是一个ServletContext对象的事件,其类的声明如下:
public
class ServletContentEvent extends java.util.EventObject
包含方法:ServletContext
getServletContext(),返回事件的Servlet上下文,即产生事件的当前应用程序。

二、 ServletContextAttributeListener

所在包:javax.servlet
接口声明:public interface
ServletContextAttributeListener
extends java.util.EventListener
方法:

1. void attributeAdded(ServletContextAttributeEvent scab)

当一个新的属性加入到Servlet的上下文中后触发该方法中的代码。
2.void
attributeRemoved(ServletContextAttributeEvent scab)

当一个属性被从servlet的上下文中移走后触发该方法中的代码。
3.void
attributeReplaced(ServletContextAttributeEvent scab)

当servlet上下文中的一个属性的值被替换后触发该方法中的代码。
ServletContextAttributeEvent是servlet上下文里的属性的事件,其类声明如下:
public class
ServletContextAttributeEvent
extends ServletContextEvent
包含方法:String
GetName(),返回产生事件的属性名称;Object GetValue(),返回产生事件的属性的值。

三、HttpSessionListener

所在包:javax.servlet
接口声明:public interface
HttpSessionListener
extends java.util.EventListener
方法:
1.void
sessionCreated(HttpSessionEvent se)
当一个会话被创建后触发执行该方法中的代码。
2.void
sessionDestroyed(HttpSessionEvent se)
当一个会话被释放后触发执行该方法中的代码。
HttpSessionEvent 是会话事件类,其声明如下:
public class HttpSessionEvent
extends
java.util.EventObject
包含方法:HttpSession getSession(),返回产生事件的session对象。

四、 HttpSessionActivationListener

所在包:javax.servlet
接口声明:public interface
HttpSessionActivationListener
extends java.util.EventListener
方法:

1.void SessionDidActivate(HttpSessionEvent se)
2.void
SessionWillPassivate(HttpSessionEvent se)

Activate与Passivate是用于置换对象的动作,当session对象为了资源利用或负载平衡等原因而必须暂时储存至硬盘或其它储存器时(透过对象序列化),所作的动作称之为Passivate,而硬盘或储存器上的session对象重新加载JVM时所采的动作称之为Activate。

五、HttpSessionAttributeListener
所在包:javax.servlet
接口声明:public interface HttpSessionAttributeListener

extends java.util.EventListener
方法:
1.void
attributeAdded(HttpSessionBindingEvent se)
2.void
attributeReplaced(HttpSessionBindingEvent se)
3.void
attributeRemoved(HttpSessionBindingEvent se)

以上三个方法分别在会话属性被加入、会话属性值被修改和会话属性被移除时触发执行。
HttpSessionBindingEvent 是一个会话事件对象类,其声明如下:
public interface
HttpSessionBindingListener
extends java.util.EventListener
包含方法:String
getName(),返回产生当前事件的会话的属性名。Object getValue(),返回产生当前事件的会话的属性值。HttpSession
getSession(),返回产生当前事件的会话对象。

六、 HttpSessionBindingListener

所在包:javax.servlet
接口声明:public interface
HttpSessionBindingListener
extends java.util.EventListener
方法:

1.void valueBound(HttpSessionBindingEvent event)
当实现
HttpSessionBindingListener接口的对象被绑定到Session Attribute中,该对象的此方法被执行。
2.void
valueUnbound(HttpSessionBindingEvent event)
当实现
HttpSessionBindingListener接口的对象被从Session Attribute解除绑定,该对象的此方法被执行。
请注意 HttpSessionAttributeListener与HttpSessionBindingListener的区别:

1.前者是需要在web.xml中进行描述的,后者不需要。

2.前者是在任何session的属生变化时都会触发执行其方法中的代码,而后者只是在实现它的对象被绑定到会话属性或被从会话属生中解除绑定时,才会触发执行那个对象的valueBound和valueUnboundy这两个方法的代码。比如说有两个对象A和B都实现了HttpSessionBindingListener接口,当A被绑定到会话属性中时,只是A的valueBound()
方法被触发执行。

七、 ServletRequestListener

所在包:javax.servlet
接口声明:public interface
ServletRequestListener
extends java.util.EventListener
方法:
1.void
RequestDestroyed(ServletRequestEvent evt)
2.void
RequestInitialized(ServletRequestEvent evt)

以上两个方法分别在ServetRequest对象初始化和清除时触发执行。
ServletRequestEvent 表示ServletReuest事件类,其声明如下:
public class
ServletRequestEvent
extends java.util.EventObject
包含方法:ServletContext
getServletContext(),获得当前Web应用程序的上下文对象。ServletRequest
getServletRequest(),获得当前事件的主体,ServletRequest对象。

八、 ServletRequestAttributeListener

所在包:javax.servlet
接口声明:public interface
ServletRequestAttributeListener
extends java.util.EventListener
方法:

1.void attributeAdded(ServletRequestAttributeEvent e)

当向ServlvetRequest对象属性中添加属性后触发执行该方法。
2.void
attributeRemoved(ServletRequestAttributeEvent e)

当向ServlvetRequest对象属性中移除属性后触发执行该方法。
3.void
attributeReplaced(ServletRequestAttributeEvent e)

当修改ServlvetRequest对象属性的属生值后触发执行该方法。
ServletRequestAttributeEvent 是ServletRequest属性事件类,其声明如下:
public class
ServletRequestAttributeEvent
extends ServletRequestEvent
包含方法:String
getName(),获得触发事件的属性的名称。Object getValue(),获得触发事件的属生的值。
下面说明如何在web.xml中布署事件监听器以实现对事件的处理,格式如下:
<listener>

<listener-class>
fey.servlet.listener.CustomServletContextListener

</listener-class >
</listener>

其中fey.servlet.listener.CustomServletContextListener是实现上述各事件监听器接口的类名。当然需要将这些类放入Web容器的Web应用的classes或lib目录下以让Web容器可以找到。外说明一点,一个类可以一个或多个监听器接口。

九、实例:session的2个监听器接口监听当前在线人数列表

1、javax.servlet.http.HttpSessionBindingListener;
实现这个接口的类,每当被存放到session或从session中移除都会出发接口中相应的方法,从而实现监听的效果。
2、javax.servlet.http.HttpSessionListener;
实现这个接口的类,本身就是1个监听器,每当有session生成或消亡时,都触发接口中相应的方法,从而实现监听器的效果;
HttpSessionListener的实现类本身就是一个监听器,要使用它需要在web.xml中启动这个监听器,例如
<listener>

<listener-class>packname.classname</listener-class>

</listener>

3、这2个监听器是有区别的
前者的触发取决于session中加入的属性。
后者的触发取决于session本身的产生和消亡。
4、与和上述之类似的还有对ServletContext的监听和对Request监听。

在线人数列表是对所有人起作用,数据应放到application中即ServletContext对象。
OnLineDemo.java

import java.util.ArrayList;
import java.util.List;
import
javax.servlet.ServletContext;
import
javax.servlet.ServletContextEvent;
import
javax.servlet.ServletContextListener;
import
javax.servlet.http.HttpSessionAttributeListener;
import
javax.servlet.http.HttpSessionBindingEvent;
import
javax.servlet.http.HttpSessionEvent;
import
javax.servlet.http.HttpSessionListener;
public class OnlineDemo implements ServletContextListener,
HttpSessionListener, HttpSessionAttributeListener {

//
声明一个ServletContext对象
private ServletContext application = null;

public void contextInitialized(ServletContextEvent sce) {

// 容器初始化时,向application中存放一个空的容器
this.application =
sce.getServletContext();
this.application.setAttribute("alluser",
new ArrayList());
}

public void
contextDestroyed(ServletContextEvent sce) {
}

public void sessionCreated(HttpSessionEvent se) {
}

public void sessionDestroyed(HttpSessionEvent se) {
//
将用户名称从列表中删除
List l = (List)
this.application.getAttribute("alluser");
String value = (String)
se.getSession().getAttribute("uname");
l.remove(value);

this.application.setAttribute("alluser", l);
}

public void attributeAdded(HttpSessionBindingEvent se) {

// 如果登陆成功,则将用户名保存在列表之中
List l = (List)
this.application.getAttribute("alluser");

l.add(se.getValue());
this.application.setAttribute("alluser",
l);
}

public void
attributeRemoved(HttpSessionBindingEvent se) {
}

public void attributeReplaced(HttpSessionBindingEvent se) {
}

}
online.jsp
<%@ page contentType="text/html;charset=gb2312"%>

<%@ page import="java.util.*"%>
<form action="online.jsp"
method="post">
<input type="text" name="name">

<input type="submit" value="登陆">
<a
href="logout.jsp">注销</a>
</form>

<%

if(request.getParameter("name")!=null)

session.setAttribute("uname",request.getParameter("name")) ;
%>

<h2>在线人员</h2>
<hr>
<%
List l =
(List)application.getAttribute("allUser");
for(Object o : l)

out.println(o);
%>
logout.jsp
<%

session.invalidate() ;

%>
原帖地址:http://blog.sina.com.cn/s/blog_705c12080100nayb.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: