首页 > 代码库 > 第八章_监听器

第八章_监听器

8.1、监听器接口和注册

创建监听器的监听器接口属于javax.servletjavax.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.2ServletContext监听器

ServletContext级别上有两个监听器接口:ServletContextListenerServletContextAttributeListener

 

8.2.1ServletContextListener

ServletContextListener会对ServletContext的初始化和解构做出响应。ServletContext被初始化时,Servlet容器会在所有已注册的ServletContextListener中调用contextInitialized方法,其方法签名如下:

void contextInitialized(ServletContextEvent event)

ServletContext要被解构和销毁时,Servlet容器会在所有已注册的ServletContextListener中调用contextDestroyed方法,以下是contextDestroyed的方法签名:

void contextDestroyed(ServletContextEvent event)

contentInitializedcontextDestroyed都会收到一个来自Servlet容器的ServletContextEventjava.util.EventObject类的一个派生类:javax.servlet.ServletContextEvent。定义了一个返回ServletContextgetServletContext方法:

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) ;
	}

}