JavaWeb三大组件之监听器Listener

版权声明:转载请联系作者本人!!! https://blog.csdn.net/weixin_42061805/article/details/82466132

JavaWeb组件

三大组件
Servlet
Listener
Filter

JavaWeb监听器

三大域
ServletContext
HttpSession
ServletRequest
监听器
生命周期监听 (两个方法)
属性监听 (三个方法)
具体监听器接口
ServletContext
ServletContextListener:两个方法(分别是在创建当前域对象和当前域对象死亡时调用)
contextDestroyed(ServletContextEvent sce) ServletContext对象销毁前调用该方法
contextInitialized(ServletContextEvent sce) ServletContext对象创建后调用该方法
ServletContextAttributeListener:三个方法(分别在添加属性,替换属性,移除属性时调用)
attributeAdded(ServletContextAttributeEvent event) 添加属性时调用
attributeRemoved(ServletContextAttributeEvent event) 移除属性时调用
attributeReplaced(ServletContextAttributeEvent event) 替换属性时调用
HttpSession
HttpSessionListener:两个方法(分别是在创建当前域对象和当前域对象死亡时调用)
sessionCreated(HttpSessionEvent se) HttpSession对象创建后调用
sessionDestroyed(HttpSessionEvent se) HttpSession对象销毁前调用
HttpSessionAttributeListener:三个方法(分别在添加属性,替换属性,移除属性时调用)
attributeAdded(HttpSessionBindingEvent event) 添加属性时调用
attributeRemoved(HttpSessionBindingEvent event) 替换属性时调用
attributeReplaced(HttpSessionBindingEvent event) 移除属性时调用
ServletRequest
ServletRequestListener:两个方法(分别是在创建当前域对象和当前域对象死亡时调用)
requestInitialized(ServletRequestEvent sre) ServletRequest对象创建后调用
requestDestroyed(ServletRequestEvent sre) ServletRequest对象销毁前调用
ServletRequestAttributeListener:三个方法(分别在添加属性,替换属性,移除属性时调用)
attributeAdded(ServletRequestAttributeEvent srae) 添加属性时调用
attributeRemoved(ServletRequestAttributeEvent srae) 移除属性时调用
attributeReplaced(ServletRequestAttributeEvent srae) 替换属性时调用
生命周期方法中的事件(Event)方法
ServletContextEvent
HttpSessionEvent
ServletRequestEvent
事件 方法
ServletContextEvent ServletContext getServletContext()获取当前ServletContext域对象
HttpSessionEvent HttpSession getSession()获取当前HttpSession域对象
ServletRequestEvent ServletContext getServletContext()获取当前ServletContext对象;ServletRequest getServletRequest();获取当前ServletRequest对象

如何新建监听器

定义一个监听器类,实现具体的监听器接口(此处实现生命周期方法)

package tqb.listener.web.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
    /**
    *
    * 可以在这里设置一些Tomcat(服务器)开启时需要初始化等的一些内容
    * 此处代码仅显示ServletContextListener的实现
    * 其余自行练习
    * @author tqb
    * 
    */
public class AListener implements ServletContextListener {

    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
        System.out.println("ServletContext对象销毁");
    }

    @Override
    public void contextInitialized(ServletContextEvent arg0) {
        System.out.println("ServletContext对象创建");
    }

}

定义一个监听器类,实现具体的监听器接口(此处实现属性方法)

package tqb.listener.web.listener;

import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.annotation.WebListener;
    /**
    *
    * 此处代码仅显示ServletContextAttributeListener的实现
    * 其余自行练习
    * @author tqb
    * 
    */
@WebListener
public class BListener implements ServletContextAttributeListener {

    /**
     * 提前在application中设置属性 application.setAttribute("nameDemo","valueDemo");
     */
    public void attributeAdded(ServletContextAttributeEvent event) {
        // 显示设置的键和值
        System.out.println(event.getName() + "+" + event.getValue());
    }

    /**
     * application.replaceAttribute("nameDemo","valueReplaceDemo");
     */
    public void attributeRemoved(ServletContextAttributeEvent event) {
        // 显示改之前的键和值以及修改过的值
        System.out.println(event.getName() + "+" + event.getValue() + "+"
                + event.getServletContext().getAttribute(event.getName()));
    }

    /**
     * application.removeAttribute("nameDemo");
     */
    public void attributeReplaced(ServletContextAttributeEvent event) {
        // 显示移除前的键和值
        System.out.println(event.getName() + "+" + event.getValue());
    }
}

在web.xml中配置完成注册

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>listener</display-name>

  <!-- 这里对监听器进行注册 -->
  <listener>
    <listener-class>tqb.listener.web.listener.AListener</listener-class>
  </listener>

  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
</web-app>

感知监听器

与HttpSession相关
添加到JavaBean中,而不是添加到三大域中
不需要在配置文件中注册
HttpSessionBindingListener
在JavaBean中实现HttpSessionBindingListener接口
重写以下两个方法
@Override
public void valueBound(HttpSessionBindingEvent arg0) {
    System.out.println("session中添加了我");
}

@Override
public void valueUnbound(HttpSessionBindingEvent event) {
    System.out.println("session移除了我");
}
session的序列化

在设置session并使用后,若服务器突然关闭(或出现故障),那么原本的session则会保留下来,在服务器重新启动时可以继续使用而不会死亡。注:在服务器突然关闭之后,会在服务器端的项目路径下保存当前正在操作的session文件,我们称之为session的序列化,如下图。
序列化文件

session的反序列化

在Tomcat的配置文件cof下的context.xml文件中添加如下内容。注:添加如下内容后,就不会出现上图的序列化文件,服务器重启后也无法使用之前的session

<!-- session的反序列化 -->
<Manager pathname="" />
session的钝化与活化

在服务器上的session若长时间无人使用时,服务器会采用一种session钝化的策略,就是先将这些长时间未使用的session保存到硬盘中去,当用户再次使用该session时,服务器会再次从硬盘中取出供用户使用,这个过程又叫做活化。注:一个session一个文件,名称为sessionID,拿出来使用时硬盘上保存的session文件不会删除。
首先需要在如下目录新建一个配置文件(文件名为当前项目名称)
这里写图片描述
文件内容为:

<?xml version='1.0' encoding='utf-8'?>
<Context>
    <Manager className="org.apache.catalina.session.PersistentManager" 
        maxIdleSwap="1"><!-- 此处的1代表1分钟不使用的话钝化 -->
            <Store className="org.apache.catalina.session.FileStore"
                directory="mysession"/><!-- 在如下图片的路径下新建一个musession文件夹(存放钝化的文件) -->
    </Manager>
</Context>
这里写图片描述
HttpSessionActivitionListener
JavaBean中实现HttpSessionActivitionListener接口
重写以下方法
package tqb.listener.web.listener;

import java.io.Serializable;

import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionEvent;

/**
 * 要想让此JavaBean随session一起钝化活化,必须实现序列化接口Serializable
 * @author tqb
 *
 */
public class User implements HttpSessionActivationListener, Serializable {

    @Override
    public void sessionDidActivate(HttpSessionEvent arg0) {
        System.out.println("即将被活化");
    }

    @Override
    public void sessionWillPassivate(HttpSessionEvent se) {
        System.out.println("即将被钝化");
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_42061805/article/details/82466132