之前对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 是运行在服务器上的小程序,它可以使任何 Java 应用程序、...Servlet 负责处理客户端的请求,Filter 负责过滤和拦截 Web 资源,而 Listener 负责监听Servlet 容器中的事件。
Servlet中的八大Listener是Java Web开发中的重要组成部分,它们允许开发者监听和响应Web应用程序中的特定事件。这些Listener提供了在Servlet容器(如Tomcat)管理的生命周期事件上的扩展点,使得我们能够在恰当的...
在Java的Web开发中,Servlet和Listener是两个非常重要的组件,它们构成了动态Web应用程序的核心部分。Servlet主要负责处理客户端的请求并返回响应,而Listener则用于监听和响应各种Web应用程序中的事件。本教程将...
首先,我们需要了解 listener、filter、servlet 的定义和作用。Listener 是一种特殊的 Servlet,它可以监听页面、Session 和 Request 等对象的创建、销毁和修改事件,从而实现对 Web 应用的监听和控制。Filter 是一...
综上所述,掌握Servlet、Filter和Listener是成为一名合格的Java Web开发者的基础,它们在构建高效、安全的Web应用程序中起着关键作用。通过不断实践和学习,开发者可以灵活运用这些技术,实现更复杂、更高效的Web...
Web服务器中的三大组件,即Servlet、Filter和Listener,是构建动态Web应用程序的关键元素。这些组件都是基于Java的,主要用于增强和扩展Web服务器的功能。 Servlet是Java中用于处理HTTP请求的核心组件,它是动态...
关于filter、servlet在web.xml配置及加载顺序
Servlet、Filter和Listener是Java Web开发中的核心组件,它们在构建动态Web应用程序中扮演着重要角色。下面将分别深入解析这三个概念。 **Servlet接口** Servlet是Java编程语言中定义的一个接口,它允许开发者创建...
### ServletListener大全 #### 概述 在Java Web开发中,`ServletListener`是一类特殊的设计模式,主要用于...通过这种方式,我们可以方便地在Java Web应用程序中使用各种`ServletListener`来监听和响应容器中的事件。
Servlet是Java Web开发中的核心组件,它用于扩展服务器的功能,处理来自客户端(通常是Web浏览器)的请求,并向客户端发送响应。这份"Servlet中文帮助文档"提供了关于Servlet API的详细描述,便于开发者理解和使用。...
在Spring Boot应用中,整合Listener主要是为了监听应用的生命周期事件,例如在应用启动或关闭时执行特定的操作。这里我们讨论两种整合Listener的方式。 ### 方式一:通过注解扫描完成Listener组件的注册 1. **创建...
Java Servlet监听器(Listener)是Java Web开发中的一个重要组件,它们允许开发者在特定事件发生时执行自定义逻辑,而无需直接修改原有的业务代码。监听器是Servlet规范的一部分,通过实现特定的接口,开发者可以...
9. **监听器**:Servlet Context Listener、Session Listener和Request Listener等,它们在特定事件发生时执行代码,如上下文初始化、会话创建或结束。 10. **MVC模式**:Servlet与Model-View-Controller设计模式的...
9. **监听器Listener**:Servlet API中的监听器(如ServletRequestListener、ServletContextListener)可以在特定事件(如请求到达、应用启动/停止)发生时执行代码,增强了应用程序的灵活性。 10. **会话管理**:...
Servlet API中文文档是Java Web开发中的重要参考资料,它详尽地解释了Servlet技术的各种接口、类和方法,为开发者提供了全面的理解和使用指南。Servlet API是J2EE平台的一部分,主要用于构建动态Web应用程序,它是...
Servlet、Filter和Listener是Java Web开发中的三大核心组件,它们在构建动态Web应用程序时起着至关重要的作用。这个"Servlet小例子源码"压缩包显然提供了关于这些概念的实际应用示例,非常适合初学者来理解和掌握。 ...
Servlet3.0引入了注解,允许开发者直接在类或方法上使用`@WebServlet`、`@WebFilter`和`@WebListener`注解来声明它们,使得代码更加简洁,也更易于维护。 其次,Servlet3.0引入了异步处理能力。通过实现`...
由于Servlet是多线程的,开发者需要注意线程安全问题,避免在Servlet实例中使用非线程安全的数据结构。通常,将数据存储在`ServletConfig`或`ServletContext`中,而非Servlet实例,可以解决这类问题。 七、过滤器...