首页 > 代码库 > 第八章_监听器
第八章_监听器
8.1、监听器接口和注册
创建监听器的监听器接口属于javax.servlet和javax.servlet.http包的一部分,详情如下:
javax.servlet.ServletContextListener。这是对Servlet Context生命周期事件做出响应的监听器。创建好Servlet Context时会马上调用它的一个方法,并在关闭Servlet Context之前调用它的另一个方法。
javax.servlet.ServletContextAttributeListener。这是在添加、删除或替换某个Servlet Context属性时采取相应动作的监听器。
javax.servlet.http.HttpSessionAttributeListener。这是在创建、移除或替换Servlet上下文属性时响应的监听器。
javax.servlet.http.HttpSessionAttributeListener。这是在添加、删除或替换某个session属性时被调用的监听器。
javax.servlet.httpSessionActivationListener。这是在打开和关闭某个HttpSession时被调用的监听器。
javax.servlet.http.HttpSessionBindingListener。这是一个类,其实例将被保存为可以实现这个接口的HttpSession属性。当它在HttpSession中被添加或者删除时,实现HttpSessionBindingListener的类实例会收到通知。
javax.servlet.ServletRequestListener。这是对ServletRequest的创建和删除做出响应的监听器。
javax.servlet.ServletRequestAttributeListener。当ServletRequest中添加、删除或替换掉某个属性时,会调用该监听器的方法。
javax.servlet.AsyncListener。用于异步操作的监听器。
创建监听器时,只要创建一个实现相关接口的java类即可。在Servlet 3.0中。注册监听器有两种方法。
1、注解
@WebListener
public class ListenerClass implements ListenerInterface{
}
2、配置文件
<listener>
<listener-class>fully-qualified listener class</listener-class>
</listener>
在应用程序中可以想要多少个监听器就可以有多少个监听器。注意,对监听器方法的调用是同步进行的。
8.2、ServletContext监听器
在ServletContext级别上有两个监听器接口:ServletContextListener和ServletContextAttributeListener。
8.2.1、ServletContextListener
ServletContextListener会对ServletContext的初始化和解构做出响应。ServletContext被初始化时,Servlet容器会在所有已注册的ServletContextListener中调用contextInitialized方法,其方法签名如下:
void contextInitialized(ServletContextEvent event)
当ServletContext要被解构和销毁时,Servlet容器会在所有已注册的ServletContextListener中调用contextDestroyed方法,以下是contextDestroyed的方法签名:
void contextDestroyed(ServletContextEvent event)
contentInitialized和contextDestroyed都会收到一个来自Servlet容器的ServletContextEvent。java.util.EventObject类的一个派生类:javax.servlet.ServletContextEvent。定义了一个返回ServletContext的getServletContext方法:
ServletContext getServletContext()
这个方法很重要,因为这是方位ServletContext的唯一简便方法。它有许多ServletContextListener,可以将属性保存在ServletContext中。
下面是个例子:
countries.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <html> <head> <title>My JSP 'countries.jsp' starting page</title> </head> <body> We operate in these countries: <ul> <c:forEach items="${countries}" var="country"> <li>${country.value}</li> </c:forEach> </ul> </body> </html>
AppListener.java
package app08a.listener; import java.util.HashMap; import java.util.Map; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.annotation.WebListener; @WebListener public class AppListener implements ServletContextListener{ @Override public void contextDestroyed(ServletContextEvent sce) { } @Override public void contextInitialized(ServletContextEvent sce) { System.out.println("ServletContextListener started"); ServletContext servletContext = sce.getServletContext() ; Map<String,String> countries = new HashMap<String,String>() ; countries.put("ca", "Canada") ; countries.put("us", "United States") ; servletContext.setAttribute("countries", countries) ; } }