package com.demo.listener;
import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
/**
* 监听器:主要用来监听特定对象的创建或销毁,以及属性的变化的;是一个实现特定接口的普通 java 类;
*
* Servlet 中可以监听的对象有:
* request、session、servletContext;
* 分别对应的是 request监听器、session监听器、servletContext监听器;
*
* 监听器接口:
* 1、监听对象创建或销毁的监听器接口:
* Interface ServletRequestListener:监听 request 对象的创建或销毁;
* Interface HttpSessionListener:监听 session 对象的创建或销毁;
* Interface ServletContextListener:监听 servletContext 对象的创建或销毁;
* 2、监听对象属性的变化:
* Interface ServletRequestAttributeListener:监听 request 对象属性变化:添加、移除、修改;
* Interface HttpSessionAttributeListener:监听 session 对象属性变化:添加、移除、修改;
* Interface ServletContextAttributeListener:监听 servletContext 对象属性变化;
* 3、session 相关监听器:
* Interface HttpSessionBindingListener:监听对象绑定到 session 上的事件;
* Interface HttpSessionActivationListener:监听 session 序列化及反序列化的事件;
*
* 监听 request 对象的创建或销毁
*/
public class MyRequestListener implements ServletRequestListener {
/**
* request 对象创建:
* 浏览器客户端访问服务器地址:http://localhost:8080/07_Listener_war_exploded/index.jsp 的时候创建 request 对象
*/
@Override
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("request 对象创建");
// 在 index.jsp 中添加一条数据(name)到 request 域中,从监听器中获取该数据:
// 1、获取 request 对象
ServletRequest servletRequest = sre.getServletRequest();
// 2、获取 request 域中的数据
Object value = servletRequest.getAttribute("name");
System.out.println("init:" + value); // 获取不到数据,因为此时 request 对象刚创建,还没有访问到目标资源
}
/**
* request 对象销毁:浏览器客户端访问服务器结束的时候销毁 request 对象
*/
@Override
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("request 对象销毁");
// 获取 request 对象
ServletRequest servletRequest = sre.getServletRequest();
// 获取 request 域中的数据
Object value = servletRequest.getAttribute("name");
System.out.println("destroy:" + value); // 能够获取到数据
}
}
package com.demo.listener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
/**
* 监听 HttpSession 对象的创建或销毁
*/
public class MySessionListener implements HttpSessionListener {
/**
* session 对象创建:
* 浏览器客户端第一次访问服务器的时候创建 session 对象,浏览器没有关闭重新打开的情况下,
* 后续所有访问都不再创建 session 对象;
*/
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("session 对象创建");
}
/**
* session 对象销毁:
* 注意:浏览器关闭时没有销毁 session 对象,但是重新打开浏览器后,第一次访问服务器的时候还是会创建 session 对象;
*
* 销毁的方法有两种,一种是 session 的最大时间(30分钟)之后,session 自动销毁;
* 另一种是调用 session 对象的 invalidate() 方法;
*/
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("session 对象销毁");
}
}
package com.demo.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
/**
* 监听 servletContext 对象的创建和销毁
*/
public class MyServletContextListener implements ServletContextListener {
/**
* servletContext 对象创建:服务器启动的时候创建 servletContext 对象;
*/
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("servletContext 对象创建");
}
/**
* servletContext 对象销毁:服务器关闭的时候销毁 servletContext 对象;
*/
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("servletContext 对象销毁");
}
}
配置监听器:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- 配置监听器:监听 request 对象的创建和销毁 -->
<listener>
<listener-class>com.demo.listener.MyRequestListener</listener-class>
</listener>
<!-- 监听 session 对象的创建和销毁 -->
<listener>
<listener-class>com.demo.listener.MySessionListener</listener-class>
</listener>
<!-- 监听 servletContext 对象的创建和销毁 -->
<listener>
<listener-class>com.demo.listener.MyServletContextListener</listener-class>
</listener>
</web-app>
index.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
$END$
<%
/* 添加数据到 request 域对象中 */
request.setAttribute("name", "admin");
/* 销毁 session 对象 */
session.invalidate();
%>
</body>
</html>