一、了解监听器
1.1 什么是监听器
监听器就是一个实现了特定接口的Java类。这个Java类用来监听另一个Java类的方法调用或者属性改变。当被监听的对象的发生上述的事件后。监听器某个方法就会立即执行。
1.1.1 监听器的组件
监听器可以大致分为四个组件(方便理解)
- 事件源:事件发生的源头
- 监听器:监听事件发生
- 绑定:将监听器绑定到事件源
- 事件:能够触发监听器的事
1.2 什么是Servlet监听器
在Servlet的规范中定义了多种类型的监听器。监听器用来分别监听 ServletContext、HttpSession、ServletRequest三个域对象的
1.2.1 Servlet监听器的组件
Servlet监听器的组件大致分为四个组件
- 事件源:request域对象、session域对象、ServletContext域对象
- 监听器:Servlet三种监听器
- 绑定:配置web.xml
- 事件:域对象发生改变
1.3 Servlet监听器的分类
Servlet规范中提供了8个监听器
按功能进行划分将其分成三类,如下:
- 一类:监听三个域对象的创建和销毁的监听器
- 二类:监听三个域对象的属性变更的监听器。(属性添加、属性移除、属性替换)
- 三类:监听HttpSession对象中的JavaBean的状态的改变。(绑定、解除绑定、钝化、活化)
二、监听器的开发步骤
- 自定义类实现一类监听器
- 重写监听器中的方法
- 配置xml配置文件或注解配置
/**
* 监听器开发步骤
*/
public class FirstListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
/**
* 监听ServletContext域的初始化,随着服务器的启动
*/
System.out.println("ServletContext初始化");
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
//监听ServletContext域的销毁,随着服务器的关闭
System.out.println("ServletContext销毁");
}
}
三、监听器的配置方式
3.1 xml配置
<listener>
<listener-class>com.mylifes1110.java.listener.FirstListener</listener-class>
</listener>
3.2 注解配置
@WebListener,加了该注解默认配置了监听器
package com.mylifes1110.java.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
/**
* 监听器开发步骤
*/
@WebListener
public class FirstListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
/**
* 监听ServletContext域的初始化,随着服务器的启动
*/
System.out.println("ServletContext初始化");
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
/**
* 监听ServletContext域的销毁,随着服务器的关闭
*/
System.out.println("ServletContext销毁");
}
}
四、一类监听器
监听三个域对象(ServletContext、Session、Request)的创建与销毁
4.1 监听ServletContext域对象
- 实现ServletContextListener接口并覆盖方法
- 监听服务器启动的时候创建ServletContext对象时
- 监听服务器关闭的时候ServletContext对象被销毁掉时
package com.mylifes1110.java.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
/**
* 监听ServletContext
*/
@WebListener
public class TestServletContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
/**
* 监听ServletContext域的初始化,随着服务器的启动
*/
System.out.println("ServletContext初始化");
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
/**
* 监听ServletContext域的销毁,随着服务器的关闭
*/
System.out.println("ServletContext销毁");
}
}
4.2 监听Session域对象
- 实现HttpSessionListener接口并覆盖方法
- 监听服务器端第一次调用getSession方法时
- 监听session过期或调用了invalidate方法
package com.mylifes1110.java.listener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
/**
* 监听HttpSession
*/
@WebListener
public class TestHttpSessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
System.out.println("Session创建");
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
System.out.println("Session销毁");
}
}
Servlet测试
package com.mylifes1110.java.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet(name = "TestSessionServlet", value = "/tss")
public class TestSessionServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//创建Session对象
HttpSession session = request.getSession();
System.out.println(session.getId());
//销毁Session对象
session.invalidate();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
4.3 监听Request域对象
- 实现ServletRequestListener接口并覆盖方法
- 监听客户的向服务器发送了一次请求而创建这一个request对象
- 监听当服务器为这次请求作出了响应之后的request对象销毁
package com.mylifes1110.java.listener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
/**
* 监听ServletRequest
*/
@WebListener
public class TestServletRequestListener implements ServletRequestListener {
@Override
public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
System.out.println("Request对象创建");
}
@Override
public void requestInitialized(ServletRequestEvent servletRequestEvent) {
System.out.println("Request对象销毁");
}
}
Servlet测试
package com.mylifes1110.java.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;