前言
学一学Java Web 三大组件之一监听器。
Servlet监听器
监听器主要用来监听事件的创建和销毁以及属性的一些变化。
按照监听的事件源分为ServletContext、HttpSession和ServletRequest这三个域对象。
ServletContext监听器
编写一个监听器只需要两步:
- 实现接口的方法
- 注册一个监听器
ServletContextListener接口用于监听ServletContext对象的创建和销毁事件
package com.guigu.servlet;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class MySerlvetContextListener implements ServletContextListener{
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("SerlvetContext对象被销毁");
}
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("SerlvetContext对象被创建");
}
}
注册监听器,在web.xml配置
<!-- 配置监听器 -->
<listener>
<listener-class>com.guigu.servlet.MySerlvetContextListener</listener-class>
</listener>
image.png
ServletContextAttributeListener接口用于监听ServletContext对象属性的添加、修改和移除
实现接口的方法
package com.guigu.servlet;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class MySerlvetContextListener implements ServletContextAttributeListener{
@Override
public void attributeAdded(ServletContextAttributeEvent arg0) {
System.out.println("ServletContextAttribute被添加:" + arg0.getName() + " : " + arg0.getValue());
}
@Override
public void attributeRemoved(ServletContextAttributeEvent arg0) {
System.out.println("ServletContextAttribute被移除:" + arg0.getName() + " : " + arg0.getValue());
}
@Override
public void attributeReplaced(ServletContextAttributeEvent arg0) {
System.out.println("ServletContextAttribute被替换:" + arg0.getName() + " : " + arg0.getValue());
}
}
编写事件
package com.guigu.servlet;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloServlet1 extends HttpServlet{
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getServletContext().setAttribute("TestServletContextAttribute", "Hello");
req.getServletContext().setAttribute("TestServletContextAttribute", "World");
req.getServletContext().removeAttribute("TestServletContextAttribute");
resp.getOutputStream().print("<p>Hello World</p>");
}
}
注册监听器
<!-- 配置监听器 -->
<listener>
<listener-class>com.guigu.servlet.MySerlvetContextListener</listener-class>
</listener>
访问servlet
image.png
HttpSession监听器
HttpSessionListener接口用于监听HttpSession对象的创建和销毁
实现接口的创建销毁方法
package com.guigu.servlet;
import javax.servlet.http.*;
public class TestHttpSessionListener implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent se) {
System.out.println("Session创建了:" + se.getSession().getId());
}
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("Session销毁了:" + se.getSession().getId());
}
}
编写事件
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
Session ID: ${pageContext.session.id}
</body>
</html>
注册监听器
<!-- 配置监听器 -->
<listener>
<listener-class>com.guigu.servlet.TestHttpSessionListener</listener-class>
</listener>
<session-config>
<!-- 配置HttpSession对象的1分钟之后销毁 -->
<session-timeout>1</session-timeout>
</session-config>
访问index.jsp,服务端显示session值
image.png
HttpSessionAttributeListener接口用于监听HttpSession对象属性的添加、修改和移除
实现接口的方法
package com.guigu.servlet;
import javax.servlet.http.*;
public class TestHttpSessionListener implements HttpSessionAttributeListener {
@Override
public void attributeAdded(HttpSessionBindingEvent arg0) {
System.out.println("HttpSessionAttribute被添加:" + arg0.getName() + " : " + arg0.getValue());
}
@Override
public void attributeRemoved(HttpSessionBindingEvent arg0) {
System.out.println("HttpSessionAttribute被删除:" + arg0.getName() + " : " + arg0.getValue());
}
@Override
public void attributeReplaced(HttpSessionBindingEvent arg0) {
System.out.println("HttpSessionAttribute被替换:" + arg0.getName() + " : " + arg0.getValue());
}
}
编写事件
package com.guigu.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloServlet2 extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getSession().setAttribute("TestSessionAttribute", "Session_Test11");
req.getSession().setAttribute("TestSessionAttribute", "Session_Test22");
req.getSession().removeAttribute("TestSessionAttribute");
resp.getOutputStream().print("<p>Hello World</p>");
}
}
注册监听器
<!-- 配置监听器 -->
<listener>
<listener-class>com.guigu.servlet.TestHttpSessionListener</listener-class>
</listener>
image.png
待学习:
HttpSessionBindingListener接口用于对session钝化后监听。
HttpSessionActivationListener接口用于对session活化后监听。
ServletRequest监听器
ServletRequestListener接口用于监听ServletRequest对象的创建和销毁
实现接口的方法
package com.guigu.servlet;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
public class TestServletRequestListener implements ServletRequestListener{
@Override
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("ServletRequest创建了:"+sre.getServletRequest());
}
@Override
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("ServletRequest销毁了:"+sre.getServletRequest());
}
}
注册监听器
<listener>
<listener-class>com.guigu.servlet.TestServletRequestListener</listener-class>
</listener>
image.png
ServletRequestAttributeListener接口用于监听ServletRequest中属性的添加、修改和移除
实现接口的方法
package com.guigu.servlet;
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
public class TestSerlvetRequest implements ServletRequestAttributeListener{
@Override
public void attributeAdded(ServletRequestAttributeEvent arg0) {
System.out.println("ServletRequestAttribute被添加了:" + arg0.getName() + " : " + arg0.getValue());
}
@Override
public void attributeRemoved(ServletRequestAttributeEvent arg0) {
System.out.println("ServletRequestAttribute被删除了:" + arg0.getName() + " : " + arg0.getValue());
}
@Override
public void attributeReplaced(ServletRequestAttributeEvent arg0) {
System.out.println("ServletRequestAttribute被替换了:" + arg0.getName() + " : " + arg0.getValue());
}
}
编写事件
package com.guigu.servlet;
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloServlet2 extends HttpServlet{
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setAttribute("Content-Type", "text/html;charset=UTF-8");
req.setAttribute("Content-Type", "text/html;charset=gbk");
req.removeAttribute("Content-Type");
resp.getOutputStream().print("<p>Hello World</p>");
}
}
注册监听器
<listener>
<listener-class>com.guigu.servlet.TestSerlvetRequest</listener-class>
</listener>
image.png
监听器脑图
image.png
参考资料
https://blog.coderap.com/article/45
https://www.bilibili.com/video/BV1Y7411K7zz?p=189













网友评论