JSP中的监听器
Web程序在服务器运行的过程中,程序内部会发生多事件,如Web应用的启动和停止、Session会话的开始和销毁、用户请求的开始和结束等等。有时程序员需要在这些事件发生的时机执行一些处理,以完成特定的任务(如通过监控Session的开始和结束,可统计网站的在线人数)。事实上,这些事件是可以编码处理的,Servelt API提供了大量的监听器Listener来监听Web程序中发生的这些事件,程序员只要实现恰当的特定的事件监听器,就可以对该事件进行处理。
使用监听器需要两个步骤:
第一,实现特定的Listener类,编写事件处理;
第二,通过web.xml(或者Annotation)配置启用该Listener。
总共有8个Listener接口,分为3类
1. 与ServletContext有关的Listener接口:
ServletContextListener
ServletContextAttributeListener
2. 与HttpSession有关的Listener接口:
HttpSessionListener
HttpSessionAttributeListener
HttpSessionActivationListener
HttpSessionBindingListener
3. 与ServletRequest有关的Listener接口:
ServletRequestListener
ServletRequestAttributeListener
监听器接口 | 实现方法 | 事件 | 执行时机 |
ServletContextListener | contextInitialized() contextDestroyed() |
ServletContextEvent | 加载Web应用时(如启动服务器后),会调用contextInitialized(), 移除Web应用时(服务器停止),会调用contextDestroyed ()方法。 |
ServletContextAttributeListener | attributeAdded() attributeReplaced() attributeRemoved() |
ServletContextAttributeEvent | 向application设置属性、置换、移除属性时依次调用这 三个方法 |
HttpSessionListener | sessionCreated() sessionDestroyed () |
HttpSessionEvent | 在HttpSession对象创建和销毁时会依次调用这两个方法 |
HttpSessionAttributeListener | attributeAdded() attributeReplaced() attributeRemoved() |
HttpSessionBindingEvent | 向Session设置属性、置换、移除属性时依次调用这三个方法 |
HttpSessionActivationListener | sessionDidActivate() sessionWillPassivate() |
HttpSessionEvent | 当session对象为了资源利用或负载平衡等原因而必须暂时储存至硬盘或其它储存器时(透过对象序列化),所作的动作称之为Passivate,而硬盘或储存器上的session对象重新加载JVM时所采的动作称之为Activate,所以,这两个方法分别执行于Activeate之后与Passivate之前 |
HttpSessionBindingListener | valueBound() valueUnbound() |
HttpSessionBindingEvent |
在HttpServletRequest对象创建和销毁时会依次调用这两个方法 |
ServletRequestListener | requestInitialized() requestDestroyed() |
RequestEvent | 向request对象设置属性、置换、移除属性时依次调用这三个方法 |
ServletRequestAttributeListener | attributeAdded() attributeReplaced() attributeRemoved() |
ServletRequestAttributeEvent | 其实例被加入至session对象的属性中,则调valueBound(), 若从session对象的属性中移除,则调valueUnbound(); 实现 HttpSessionBindingListener接口的类无需在web.xml配置 |
例1:ServletContextAttributeListener接口(需要实现三个方法)
MyServletContextAttributeListener.java
public class MyServletContextAttributeListener implements ServletContextAttributeListener {public void attributeAdded(ServletContextAttributeEvent arg0) { // application范围属性添加时调用 System.out.println("添加application范围属性,属性名"+arg0.getName()+",属性值"+arg0.getValue()); } public void attributeReplaced(ServletContextAttributeEvent arg0) { // application范围属性替换时调用 System.out.println("替换application范围属性,属性名"+arg0.getName()+",替换后的属性值"+arg0.getValue()); } public void attributeRemoved(ServletContextAttributeEvent arg0) { // application范围属性移除时调用 System.out.println("移除application范围属性,属性名"+arg0.getName()); } }
web.xml
<listener> <description>MyServletContextAttributeListener</description> <listener-class>com.servlet.MyServletContextAttributeListener</listener-class> </listener>
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> <html> <head> <title>设置application范围属性</title> </head> <body> <% application.setAttribute("name", "James"); application.setAttribute("name", "123"); application.removeAttribute("name"); %> </body> </html>
控制台输出:
添加application范围属性,属性名name,属性值James
替换application范围属性,属性名name,替换后的属性值James
移除application范围属性,属性名name
例2:HttpSession Listener
1.HttpSessionListener接口,负责监听session的创建与销毁
MyHttpSessionListener.java 需要实现两个函数
@WebListener public class MyHttpSessionListener implements HttpSessionListener {//session启动时调用 public void sessionCreated(HttpSessionEvent arg0) { HttpSession session= arg0.getSession(); System.out.println("创建session,ID为"+session.getId()); } //session销毁时调用 public void sessionDestroyed(HttpSessionEvent arg0) { System.out.println("销毁session"); } }
HttpSessionAttributeListener接口 负责监听session内属性的创建、修改、删除
MyHttpSessionAttributeListener.java
@WebListener public class MyHttpSessionAttributeListener implements HttpSessionAttributeListener { public void attributeRemoved(HttpSessionBindingEvent arg0) { System.out.println("移除session范围属性"); } public void attributeAdded(HttpSessionBindingEvent arg0) { HttpSession session = arg0.getSession(); System.out.println("添加session范围属性"+session.getAttribute("name")); } public void attributeReplaced(HttpSessionBindingEvent arg0) { HttpSession session = arg0.getSession(); System.out.println("修改session范围属性"+session.getAttribute("name")); } }
web.xml,设定Listener的映射
<listener> <description>MyHttpSessionListener</description> <listener-class>com.servlet.MyHttpSessionListener</listener-class> </listener> <listener> <description>MyHttpSessionAttributeListener</description> <listener-class>com.servlet.MyHttpSessionAttributeListener</listener-class> </listener>
HttpSession.jsp
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> <html> <head> <title>关于session</title> </head> <body> <% session.setAttribute("name", "张三"); session.setAttribute("name", "李四"); session.removeAttribute("name"); session.invalidate(); %> </body> </html>
控制台显示:
添加session范围属性张三
修改session范围属性李四
移除session范围属性
销毁session