`

Servlet监听器

阅读更多
概述:
Servlet监听器用于监听一些重要事件的发生,监听器对象可以在事情发生前、发生后可以做一些必要的处理。
接口:
目前Servlet2.4和JSP2.0总共有8个监听器接口和6个Event类,其中HttpSessionAttributeListener与
HttpSessionBindingListener 皆使用HttpSessionBindingEvent;HttpSessionListener和 HttpSessionActivationListener则都使用HttpSessionEvent;其余Listener对应的Event如下所 示:





分别介绍:
一 ServletContext相关监听接口
补充知识:
通过ServletContext 的实例可以存取应用程序的全局对象以及初始化阶段的变量。
在JSP文件中,application 是 ServletContext 的实例,由JSP容器默认创建。Servlet 中调用 getServletContext()方法得到 ServletContext 的实例。
注意:
全局对象即Application范围对象,初始化阶段的变量指在web.xml中,经由<context-param>元素所设定的变量,它的范围也是Application范围,例如:

<context-param>
<param-name>Name</param-name>
<param-value>browser</param-value>
</context-param>
当容器启动时,会建立一个Application范围的对象,若要在JSP网页中取得此变量时:
String name = (String)application.getInitParameter("Name");
或者使用EL时:
${initPara.name}
若是在Servlet中,取得Name的值方法:
String name = (String)ServletContext.getInitParameter("Name");


1.ServletContextListener:
用于监听WEB 应用启动和销毁的事件,监听器类需要实现javax.servlet.ServletContextListener 接口。
ServletContextListener 是 ServletContext 的监听者,如果 ServletContext 发生变化,如服务器启动时 ServletContext 被创建,服务器关闭时 ServletContext 将要被销毁。

ServletContextListener接口的方法:
void contextInitialized(ServletContextEvent sce)
通知正在接受的对象,应用程序已经被加载及初始化。
void contextDestroyed(ServletContextEvent sce)
通知正在接受的对象,应用程序已经被载出。

ServletContextEvent中的方法:
ServletContext getServletContext()
取得ServletContext对象


2.ServletContextAttributeListener:用于监听WEB应用属性改变的事件,包括:增加属性、删除属性、修改属性,监听器类需要实现javax.servlet.ServletContextAttributeListener接口。

ServletContextAttributeListener接口方法:
void attributeAdded(ServletContextAttributeEvent scab)
若有对象加入Application的范围,通知正在收听的对象
void attributeRemoved(ServletContextAttributeEvent scab)
若有对象从Application的范围移除,通知正在收听的对象
void attributeReplaced(ServletContextAttributeEvent scab)
若在Application的范围中,有对象取代另一个对象时,通知正在收听的对象


ServletContextAttributeEvent中的方法:
java.lang.String getName()
回传属性的名称
java.lang.Object getValue()
回传属性的值

二、HttpSession相关监听接口
1.HttpSessionBindingListener接口
注意:HttpSessionBindingListener接口是唯一不需要再web.xml中设定的Listener

当我们的类实现了HttpSessionBindingListener接口后,只要对象加入Session范围 (即调用HttpSession对象的setAttribute方法的时候)或从Session范围中移出(即调用HttpSession对象的 removeAttribute方法的时候或Session Time out的时候)时,容器分别会自动调用下列两个方法:
void valueBound(HttpSessionBindingEvent event)
void valueUnbound(HttpSessionBindingEvent event)

思考:如何实现记录网站的客户登录日志, 统计在线人数?

2.HttpSessionAttributeListener接口
HttpSessionAttributeListener监听HttpSession中的属性的操作。
当 在Session增加一个属性时,激发attributeAdded(HttpSessionBindingEvent se) 方法;当在Session删除一个属性时,激发attributeRemoved(HttpSessionBindingEvent se)方法;当在Session属性被重新设置时,激发attributeReplaced(HttpSessionBindingEvent se) 方法。这和ServletContextAttributeListener比较类似。

3.HttpSessionListener接口
HttpSessionListener监听 HttpSession的操作。当创建一个Session时,激发session Created(HttpSessionEvent se)方法;当销毁一个Session时,激发sessionDestroyed (HttpSessionEvent se)方法。

4.HttpSessionActivationListener接口
主要用于同一个Session转移至不同的JVM的情形。

四、ServletRequest监听接口
1.ServletRequestListener接口
和ServletContextListener接口类似的,这里由ServletContext改为ServletRequest
2.ServletRequestAttributeListener接口
和ServletContextListener接口类似的,这里由ServletContext改为ServletRequest



有的listener可用于统计网站在线人数及访问量。 如下:

服务器启动时(实现ServletContextListener监听器contextInitialized方法),读取数据库,并将其用一个计数变量保存在application范围内

session创建时(实现HttpSessionListener监听器sessionCreated方法),读取计数变量加1并重新保存

服务器关闭时(实现ServletContextListener监听器contextDestroyed方法),更新数据库


简例一

监听用户上线与退出,显示在线用户

1、登陆页面 Login.jsp

<%@page pageEncoding="gb2312" contentType="text/html; charset=gb2312" %>
<% 
session=request.getSession(false);
if(session!=null)session.invalidate();
%>
<html>
<head><title></title></head>
<body>
<form action="isOnline.jsp" method="post">
用户名:<input type="text" name="uName"/>
<input type="submit" value="上线">
</form>
</body>
</html>

2、控制页面(只是为了说明监听器问题,所以简单了点...) isOnline.jsp

<%@page pageEncoding="gb2312" contentType="text/html; charset=gb2312" %>
<html>
<head><title></title></head>
<body>
<%
session=request.getSession();
session.setAttribute("userName",request.getParameter("uName"));
response.sendRedirect("showOnline.jsp");
%>
</body>
</html>


3、显示页面 showOnline.jsp

<%@page pageEncoding="gb2312" contentType="text/html; charset=gb2312" import="java.util.ArrayList" %>
<html>
<head><title></title></head>
<body>
<% 
ArrayList showList=(ArrayList)(getServletContext().getAttribute("list"));
out.print("在线人数 "+showList.size()+"<br>");
for(int i=0;i<showList.size();i++){
out.print(showList.get(i)+"在线"+"<br>");
}
%>
<br>
<a href="Login.jsp">退出</a>
</body>
</html>

4、配置页面 web.xml

<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<listener> 
    <listener-class>org.xiosu.listener.onlineListener</listener-class>
</listener>
</web-app>

5、监听器 onlineListener.java

package org.xiosu.listener;

import java.util.ArrayList;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class onlineListener implements HttpSessionListener,
HttpSessionAttributeListener {
// 参数
ServletContext sc;
ArrayList list = new ArrayList();
// 新建一个session时触发此操作
public void sessionCreated(HttpSessionEvent se) {
sc=se.getSession().getServletContext();
System.out.println("新建一个session");
}
// 销毁一个session时触发此操作
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("销毁一个session");
if (!list.isEmpty()) {
   list.remove((String) se.getSession().getAttribute("userName"));
   sc.setAttribute("list", list);
}
}
// 在session中添加对象时触发此操作,在list中添加一个对象
public void attributeAdded(HttpSessionBindingEvent sbe) {
list.add((String) sbe.getValue());
sc.setAttribute("list", list);
}
// 修改、删除session中添加对象时触发此操作
public void attributeRemoved(HttpSessionBindingEvent arg0) {
}
public void attributeReplaced(HttpSessionBindingEvent arg0) {
}
}

在Web开发中关于监听器的应用
首先,也要在web.xml配置文件中进行声明:
        在web.xml文件中的声明如下:(声明片断)    要放在filter过滤器声明和filter-mapping声明后面
   

        <listener-class>markchen.web.listener.MySessionListener</listener-class>
    </listener>
    <listener>
         <listener-class>markchen.web.listener.MyServletContextListener</listener-class>
    </listener>

//这两个java类的内容都和简单,仅仅是为了演示说明而已

//MySessionListener.java文件的内容如下 
     //Web应用程序中会话的生命周期监听器实现    
package markchen.web.listener;

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

public class MySessionListener implements HttpSessionListener {
    
    //在会话一创建时该方法被调用,可以在此处编写自己需要做特殊处理的程序代码
     public void sessionCreated(HttpSessionEvent event) {
                
                  HttpSession session = event.getSession();        
                  String sessionId=session.getId();
                  System.out.println("Session::::::"+sessionId+"******Created******");
        }
        
     //在会话即将销毁时该方法被调用,可以在此处编写自己需要做特殊处理的程序代码
     public void sessionDestroyed(HttpSessionEvent event) {
                
                 HttpSession session = event.getSession();        
                 String sessionId=session.getId();
                 System.out.println("Session::::::"+sessionId+"******Destroyed******");
        
                }        
}
    
      注意:在sessionDestroyed()方法中一定不要再调用session.invalidate()方法了
            因为每调用一次session.invalidate()方法都会触发sessionDestroyed()方法的调用
             进而形成死循环,最终使Web应用程序意外终止

      //MyServletContextListener.java
            //Web应用程序的生命周期监听器实现
package markchen.web.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class MyServletContextListener implements ServletContextListener {
        
         //在Web应用程序初始化后该方法被调用 
         public void contextInitialized(ServletContextEvent event) {
               
              System.out.println("******Application started******");                
         }
        
         //在Web应用程序销毁时该方法被调用
       public void contextDestroyed(ServletContextEvent event) {

                 System.out.println("******Application ended******");                
        }
}
  • 大小: 46.1 KB
分享到:
评论

相关推荐

    servlet 监听器范例

    在Java Web开发中,Servlet监听器(Servlet Listener)扮演着重要的角色,它是Servlet规范的一部分,允许开发者对Web应用程序中的特定事件进行监听和响应。在这个范例中,我们将深入探讨如何利用监听器来统计在线...

    servlet监听器案例

    Servlet监听器是Java Web开发中的一个重要概念,它允许开发者在特定的Servlet容器事件发生时执行相应的代码。在本文中,我们将深入探讨Servlet监听器的工作原理、配置和使用,结合具体的"web.xml"配置以及JSP页面的...

    servlet监听器技术源码

    Servlet监听器技术是Java Servlet规范中的一项重要特性,它允许开发者在特定的Servlet容器事件发生时执行自定义的代码逻辑。这些事件可以包括Web应用程序的初始化、终止,或者是Servlet或Servlet上下文...

    JAVA Servlet监听器listener学习资料

    Java Servlet监听器(Listener)是Java Web开发中的一个重要组件,它们允许开发者在特定事件发生时执行自定义逻辑,而无需直接修改原有的业务代码。监听器是Servlet规范的一部分,通过实现特定的接口,开发者可以...

    Servlet监听器在基于移动Web在线考试系统中的应用.pdf

    "Servlet监听器在基于移动Web在线考试系统中的应用" Servlet监听器是Servlet规范中定义的一种特殊类,用于监听Web应用程序中的ServletContext、HttpSession和ServletRequest等域对象的创建与销毁事件,以及这些域...

    servlet 监听器的实现

    Servlet监听器是Java Web开发中的一个重要概念,它允许开发者在特定事件发生时执行代码,比如在Web应用程序启动、停止时,或者在用户会话创建、销毁时。这为程序员提供了更多的控制权,使得他们能够更好地管理和监控...

    servlet监听器

    Servlet监听器是Java Web开发中的一种关键组件,主要用于监控和响应Web应用程序中的特定事件。它们是Servlet规范中定义的特殊类,能够监听ServletContext、HttpSession和ServletRequest等域对象的生命周期事件,以及...

    servlet监听器实现踢人小案例

    Servlet监听器是Java Web开发中的一个重要概念,它允许开发者在特定事件发生时执行代码,比如在Web应用程序启动、停止,或者在某个Servlet被创建或销毁时。在这个“servlet监听器实现踢人小案例”中,我们将探讨如何...

    JAVA培训Servlet监听器.pdf

    JAVA Servlet监听器是指在Servlet容器中,用于监听一些重要事件的发生,监听器对象可以在事情发生前、发生后做一些必要的处理。监听器可以分为多种类型,每种类型都有其特定的应用场景和用途。 ...

    servlet监听器总结

    ### Servlet监听器总结 #### 一、Listener概念与作用 - **定义**:在Java Web开发中,Listener(监听器)是一种特殊的组件,主要用于监听容器内的特定事件,并根据这些事件的发生执行相应的处理逻辑。 - **功能**...

    Servlet监听器例子

    Servlet监听器是Java Web开发中的一个重要概念,它们是Servlet API的一部分,允许开发者在特定的Servlet容器事件发生时执行代码。这些事件可以是Web应用程序启动、关闭,或者与HTTP会话相关的事件,如创建、销毁或...

    servlet监听器教程(含代码)

    Servlet监听器是Java Web开发中的一个重要概念,它允许开发者在特定事件发生时执行代码,比如在Web应用程序启动或停止时,或者在某个Servlet实例被创建或销毁时。本教程将深入探讨Servlet监听器的工作原理、类型以及...

    利用servlet监听器,系统启动时创建自定义容器简单例子

    在Java Web开发中,Servlet监听器(Servlet Listeners)是一种重要的组件,它们可以在特定的事件发生时被调用,比如Web应用的初始化、用户会话的创建或销毁等。在这个例子中,我们将探讨如何利用Servlet监听器在系统...

    j2ee20:servlet04监听器(监听四大web域)(用于访问人数的统计)、mvc模式的引入

    在本文中,我们将深入探讨Java EE(J2EE)中的Servlet监听器以及它们在Web应用程序中的作用,特别是在访问人数统计和引入MVC模式方面。首先,让我们了解什么是Servlet监听器。 Servlet监听器是Java Servlet规范的一...

    servlet过滤器和监听器PPT课件.ppt

    servlet过滤器和监听器,servlet过滤器和监听器课件,servlet过滤器和监听器PPT

Global site tag (gtag.js) - Google Analytics