Java Web 之监听器

2021-08-13  本文已影响0人  CSeroad

前言

学一学Java Web 三大组件之一监听器。

Servlet监听器

监听器主要用来监听事件的创建和销毁以及属性的一些变化。
按照监听的事件源分为ServletContext、HttpSession和ServletRequest这三个域对象。

ServletContext监听器

编写一个监听器只需要两步:

  1. 实现接口的方法
  2. 注册一个监听器

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

上一篇 下一篇

猜你喜欢

热点阅读