`

Servlet中listener作用及使用

    博客分类:
  • Java
阅读更多

之前对servlet的listener监听感觉陌生,不知道具体作用及用法,今天梳理了一下其作用,并相应做了以下的测试。

 

作用:

主要分三种,第一种是监听应用启动和关闭,需要实现ServletContextListener接口;

                     第二种是监听session的创建与销毁;属性的新增、移除和更改,需要实现HttpSessionListener和HttpSessionAttributeListener接口。

                     第三种是HttpSessionBindingListener接口

 

 

测试:

先配置web.xml:

代码:

 

<context-param>
	<param-name>username</param-name>
	<param-value>pandita</param-value>
</context-param>
<context-param>
	<param-name>password</param-name>
	<param-value>bsoft</param-value>
</context-param>
<listener>
        <listener-class>com.pandita.servlet.listener.ApplicationListener</listener-class>
</listener>
<listener>
        <listener-class>com.pandita.servlet.listener.SessionListener</listener-class>
</listener>
<listener>
	<listener-class>com.pandita.servlet.listener.BindingListener</listener-class>
</listener>

 

 

 

第一种:实现ServletContextListener接口,接口有两个方法

             1)public void contextInitialized(ServletContextEvent sce); //应用启动事件

             2)public void contextDestroyed(ServletContextEvent sce); //应用停止事件

             示例代码:

            

package com.pandita.servlet.listener;

import java.text.SimpleDateFormat;
import java.util.Date;

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

/**
 * 监听web应用的启动和停止
 * @author Bsoft
 *
 */
public class ApplicationListener implements ServletContextListener {

	public static long applicationInitialized = 0L;
	
	/*应用停止事件*/
	//测试时在myeclipse里面点击停止按钮无法触发此方法,进入tomcat的bin目录下执行shutdown.bat就可以看到输出语句
	public void contextDestroyed(ServletContextEvent servletcontextevent) {
		System.out.println("ApplicationListener : 监听到应用关闭了!");
	}

	/*应用启动事件*/
	public void contextInitialized(ServletContextEvent servletcontextevent) {
		applicationInitialized = System.currentTimeMillis();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String datestr = sdf.format(new Date(applicationInitialized));
		System.out.println("ApplicationListener : 监听到应用启动时间为 " + datestr);
	}

}

 

 

第二种:实现HttpSessionListener和HttpSessionAttributeListener接口

             1、HttpSessionListener接口有两个方法:

                  1)public void sessionCreated(HttpSessionEvent httpsessionevent);

                  2)public void sessionDestroyed(HttpSessionEvent httpsessionevent);

 

             2、HttpSessionAttributeListener接口有三个方法:

                  1)public void attributeAdded(HttpSessionBindingEvent httpsessionbindingevent);
                  2)public void attributeRemoved(HttpSessionBindingEvent httpsessionbindingevent);
                  3)public void attributeReplaced(HttpSessionBindingEvent httpsessionbindingevent);

 

             示例代码:

          

package com.pandita.servlet.listener;

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

public class SessionListener implements HttpSessionListener , HttpSessionAttributeListener {

	private static int activeSessions = 0;	//计算活动会话的数量
	
	/*创建session*/
	public void sessionCreated(HttpSessionEvent arg0) {
		activeSessions ++ ;
		System.out.println("SessionListener : 新建了一个session,当前session数量为" + activeSessions);
	}

	/*销毁session*/
	public void sessionDestroyed(HttpSessionEvent arg0) {
		System.out.println("SessionListener : session被销毁了,可以在销毁session的时候做一些操作");
	}

	/*在session中添加对象时触发此操作*/
	@SuppressWarnings("unchecked")
	public void attributeAdded(HttpSessionBindingEvent arg0) {
		String attributeName = arg0.getName();
		HttpSession session = arg0.getSession();
		System.out.println("SessionListener : session被添加了属性" + attributeName + ",属性值为" + session.getAttribute(attributeName));
	}
	
	/*从session中移除对象时触发此操作*/
	public void attributeRemoved(HttpSessionBindingEvent arg0) {
		String attributeName = arg0.getName();
		System.out.println("SessionListener : " + attributeName + "属性被从session上移除了");
	}

	/*当session中对象被重新设置时触发此操作*/
	public void attributeReplaced(HttpSessionBindingEvent arg0) {
		String attributeName = arg0.getName();
		HttpSession session = arg0.getSession();
		System.out.println("SessionListener : " + attributeName + "属性被重新设置值了,新值为" + session.getAttribute(attributeName));
	}

}

 

第三种:实现HttpSessionBindingListener接口

            1、接口的两个方法:

             1).public void valueBound(HttpSessionBindingEvent event)
                  当对象正在被绑定到Session,Servlet容器调用这个方法来通知该对象。
              2).public void valueUnbound(HttpSessionBindingEvent event)
                  当从Session中删除对象时,Servlet容器调用这个方法来实现了HttpSessionBindingListener接                       口的对象,而这个对象 可以利用HttpSessionBindingEvent对象来访问与它相联系的

                  HttpSession对象。               

 

            介绍:如果一个对象实现了HttpSessionBindingListener接口,当这个对象被绑定到Session中或者从session中被删除时,Servlet容器会通知这个对象,而这个对象在接收到通知后,可以做一些初始化或清除状态的操作。

 

           作用:在线人数统计

利用HttpSessionBindingListener接口,编写一个在线人数统计的等程序。当一个用户登陆时,添加Session到在线人名单中,当一个用户退出时或者Session超时时,从在线人名单中删除该用户。
OnlineUserList这个类中,应用单件模式,向程序提供一个全局访问点。

 

          OnlineUserList.java类代码:

package com.pandita.servlet.listener;

import java.util.Enumeration;
import java.util.Vector;

public class OnlineUserList {

	//单例模式
	private static final OnlineUserList userlist = new OnlineUserList();
	private Vector<String> v = new Vector<String>();
	
	public OnlineUserList(){
		
	}
	
	public static OnlineUserList getInstance(){
		return userlist;
	}
	
	public Enumeration<String> getUserList(){
		return v.elements();
	}
	
	public int getUserCount(){
		return v.size();
	}
	
	public boolean isExist(String username){
		if(v.indexOf(username) >= 0){
			return true;
		}
		return false;
	}
	
	public void addUser(String username){
		if(username != null){
			if(isExist(username)){
				return ;
			}
			v.addElement(username);
		}
	}
	
	public void removeUser(String username){
		if(username != null){
			v.removeElement(username);
		}
	}
}

        

           BindingListener.java类代码:

package com.pandita.servlet.listener;

import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;

public class BindingListener implements HttpSessionBindingListener {
	
	private String username = "";
	private OnlineUserList userlist = OnlineUserList.getInstance();
	
	public BindingListener(String username) {
		this.username = username;
	}
	
	//启动加载监听类,上面定义了一个带参数的构造器,如不写出类的默认构造器,则会抛错:java.lang.InstantiationException
	public BindingListener(){
		
	}
	
	public void setUserName(String username){
		this.username = username;
	}
	
	public String getUserName(){
		return this.username;
	}
	
	public boolean isExist(String username){
		return userlist.isExist(username);
	}

	@SuppressWarnings("unchecked")
	public void valueBound(HttpSessionBindingEvent arg0) {
		System.out.println("BindingListener : 我被当做属性绑定到session中了。");
		userlist.addUser(this.username);
	}

	public void valueUnbound(HttpSessionBindingEvent arg0) {
		System.out.println("BindingListener : 我被session从属性列表中移除了。");
		userlist.removeUser(this.username);
	}

}

 

 

           Servlet代码:

package com.pandita.servlet;

import java.io.IOException;
import java.io.OutputStreamWriter;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;




/**
 * @since 2014-07-29
 * @author chenp
 * @description 从资源库获取JavaScript文件
 */
public class ScriptLoader extends HttpServlet implements Servlet{

	private static final long serialVersionUID = 5450443744150750822L;

	public void init(ServletConfig config) throws ServletException {

        }
	
	public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
		/*1).获取session*/
		HttpSession session = req.getSession(true);
		System.out.println("getSession()方法触发了SessionListener监听类的sessionCreated()方法!");
		
		/*2).session上加属性*/
		session.setAttribute("username", session.getServletContext().getInitParameter("username"));
		session.setAttribute("password", session.getServletContext().getInitParameter("password"));
		System.out.println("session的setAttribute()方法触发了SessionListener监听类的attributeAdded()方法!");

		/*3).从session上移除属性*/
		session.removeAttribute("username");
		System.out.println("session的removeAttribute()方法触发了SessionListener监听类的attributeRemoved()方法!");
		
		/*4).更改session上属性的值*/
		session.setAttribute("password", "bsoftbsoft");
		
		/*5).绑定HttpSessionBindingListener对象到session属性列表*/
		BindingListener bl = new BindingListener((String) session.getAttribute("username"));
		session.setAttribute("binding", bl);
		
		/*6).绑定HttpSessionBindingListener对象到session属性列表*/
		session.removeAttribute("binding");
		
		/*7).销毁session*/
		session.invalidate();
		System.out.println("session的invalidate()方法触发了SessionListener监听类的sessionDestroyed()方法!");
	}
	
	public void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
	}
}

 

 

 参考资料:http://blog.csdn.net/java_pengjin/article/details/6760175

                   http://blog.sina.com.cn/s/blog_634695420100ggg3.html

分享到:
评论

相关推荐

    servlet+filter+listener 详解

    Servlet、Filter、Listener 详解 Servlet 是运行在服务器上的小程序,它可以使任何 Java 应用程序、...Servlet 负责处理客户端的请求,Filter 负责过滤和拦截 Web 资源,而 Listener 负责监听Servlet 容器中的事件。

    Servlet中的八大Listener

    Servlet中的八大Listener是Java Web开发中的重要组成部分,它们允许开发者监听和响应Web应用程序中的特定事件。这些Listener提供了在Servlet容器(如Tomcat)管理的生命周期事件上的扩展点,使得我们能够在恰当的...

    servlet--listener 各种接口的简单例子

    在Java的Web开发中,Servlet和Listener是两个非常重要的组件,它们构成了动态Web应用程序的核心部分。Servlet主要负责处理客户端的请求并返回响应,而Listener则用于监听和响应各种Web应用程序中的事件。本教程将...

    web.xml 中的listener、 filter、servlet 加载顺序及其详解.doc

    首先,我们需要了解 listener、filter、servlet 的定义和作用。Listener 是一种特殊的 Servlet,它可以监听页面、Session 和 Request 等对象的创建、销毁和修改事件,从而实现对 Web 应用的监听和控制。Filter 是一...

    servlet_filter_listener

    综上所述,掌握Servlet、Filter和Listener是成为一名合格的Java Web开发者的基础,它们在构建高效、安全的Web应用程序中起着关键作用。通过不断实践和学习,开发者可以灵活运用这些技术,实现更复杂、更高效的Web...

    web服务器三大组件servlet、Filter、Listener——浅浅笔记

    Web服务器中的三大组件,即Servlet、Filter和Listener,是构建动态Web应用程序的关键元素。这些组件都是基于Java的,主要用于增强和扩展Web服务器的功能。 Servlet是Java中用于处理HTTP请求的核心组件,它是动态...

    关于web.xml配置文件servlet,filter,listener加载顺序

    关于filter、servlet在web.xml配置及加载顺序

    Servlet、Filter、Listener深入理解.docx

    Servlet、Filter和Listener是Java Web开发中的核心组件,它们在构建动态Web应用程序中扮演着重要角色。下面将分别深入解析这三个概念。 **Servlet接口** Servlet是Java编程语言中定义的一个接口,它允许开发者创建...

    ServletListener大全

    ### ServletListener大全 #### 概述 在Java Web开发中,`ServletListener`是一类特殊的设计模式,主要用于...通过这种方式,我们可以方便地在Java Web应用程序中使用各种`ServletListener`来监听和响应容器中的事件。

    servlet 中文帮助文档

    Servlet是Java Web开发中的核心组件,它用于扩展服务器的功能,处理来自客户端(通常是Web浏览器)的请求,并向客户端发送响应。这份"Servlet中文帮助文档"提供了关于Servlet API的详细描述,便于开发者理解和使用。...

    SpringBoot整合Listener的两种方式.docx

    在Spring Boot应用中,整合Listener主要是为了监听应用的生命周期事件,例如在应用启动或关闭时执行特定的操作。这里我们讨论两种整合Listener的方式。 ### 方式一:通过注解扫描完成Listener组件的注册 1. **创建...

    JAVA Servlet监听器listener学习资料

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

    servlet中文帮助文档CHM格式

    9. **监听器**:Servlet Context Listener、Session Listener和Request Listener等,它们在特定事件发生时执行代码,如上下文初始化、会话创建或结束。 10. **MVC模式**:Servlet与Model-View-Controller设计模式的...

    Servlet中文API文档 servlet

    9. **监听器Listener**:Servlet API中的监听器(如ServletRequestListener、ServletContextListener)可以在特定事件(如请求到达、应用启动/停止)发生时执行代码,增强了应用程序的灵活性。 10. **会话管理**:...

    Servlet API中文文档

    Servlet API中文文档是Java Web开发中的重要参考资料,它详尽地解释了Servlet技术的各种接口、类和方法,为开发者提供了全面的理解和使用指南。Servlet API是J2EE平台的一部分,主要用于构建动态Web应用程序,它是...

    Servlet小例子源码

    Servlet、Filter和Listener是Java Web开发中的三大核心组件,它们在构建动态Web应用程序时起着至关重要的作用。这个"Servlet小例子源码"压缩包显然提供了关于这些概念的实际应用示例,非常适合初学者来理解和掌握。 ...

    Servlet3.0参考手册

    Servlet3.0引入了注解,允许开发者直接在类或方法上使用`@WebServlet`、`@WebFilter`和`@WebListener`注解来声明它们,使得代码更加简洁,也更易于维护。 其次,Servlet3.0引入了异步处理能力。通过实现`...

    Servlet中文api帮助文档

    由于Servlet是多线程的,开发者需要注意线程安全问题,避免在Servlet实例中使用非线程安全的数据结构。通常,将数据存储在`ServletConfig`或`ServletContext`中,而非Servlet实例,可以解决这类问题。 七、过滤器...

Global site tag (gtag.js) - Google Analytics