基于Listener监听器生命周期(详解)

网友投稿 393 2023-03-25


基于Listener监听器生命周期(详解)

一、Listener生命周期

listener是web三大组件之一,是servlet监听器,用来监听请求,监听服务端的操作。

listener分为:(都是接口类,必须实现相应方法)

1.生命周期监听器(3个)

ServletContextListener

requestDestroyed 在容器启动时被调用(在servlet被实例化前执行)

requestInitialized 在容器销毁时调用(在servlet被销毁后执行)

HttpSessionListener

sessionCreated 在HttpSession创建后调用

sessionDestroyed 在HttpSession销毁前调用(执行session.invalidate();方法)

ServletRequestListener

requestDestroyed 在request对象创建后调用(发起请求)

requestInitialized 在request对象销毁前调用(请求结束)

2.属性变化监听器(3个)

attributeAdded(ServletContextAttributeEvent event)向appliction中添加属性时调用

attributeRemoved(ServletContextAttributeEvent event)从appliction中删除属性时调用

attributeReplaced(ServletContextAttributeEvent event)替换application中的属性时调用

HttpSessionAttributeListener

attributeAdded(HttpSessionBindingEvent event)

attributeRemoved(HttpSessionBindingEvent event)

attributeReplaced(HttpSessionBindingEvent event)

ServletRequestAttributeListener

attributeAdded(ServletRequestAttributeEvent event)

attributeRemoved(ServletRequestAttributeEvent event)

attributeReplaced(ServletRequestAttributeEvent event)

以上监听器接口除了传参不同,方法名都是一样的。分别监听application,session,request对象的属性变化。

3.session中指定类属性变化监听器(2)

HttpSessionBindingListener 

valueBound(HttpSessionBindingEvent event) 当该类实例设置进session域中时调用

valueUnbound(HttpSessionBindingEvent event) 当该类的实例从session域中移除时调用

HttpSessionActivationListener 

sessionWillPassivate(HttpSessionEvent se)

sessionDidActivate(HttpSessionEvent se)

二、测试范例

1.生命周期监听:

ServletContentAttribute_Listener.java

public class ServletContentAttribute_Listener implements ServletContextListener {

/**

* ServletContextListener实现方法

* @param sce

*/

public void contextInitialized(ServletContextEvent sce) {

System.out.println("ServletContextListener初始化");

}

public void contextDestroyed(ServletContextEvent sce) {

System.out.println("ServletContextListener销毁");

}

}

其他两个监听器类似,不在重复贴出。

在web.xml中配置

study.myListener.ServletContentAttribute_Listener

study.myListener.HttpSessionAttribute_Listener

study.myListener.ServletRequestAttribute_Listener

运行结果:

2.属性监听:

ServletContentAttribute_Listener.java

public class ServletContentAttribute_Listener implements ServletContextAttributeListener{

/**

* ServletContextAttributeListener实现方法

* @param event

*/

public void attributeAdded(ServletContextAttributeEvent event) {

String meg = MessageFormat.format("ServletContent添加属性:{0},属性值:{1}",event.getName(),event.getValue());

System.out.println(meg);

}

public void attributeRemoved(ServletContextAttributeEvent event) {

String meg = MessageFormat.format("ServletContent删除属性:{0},属性值:{1}",event.getName(),event.getValue());

System.out.println(meg);

}

public void attributeReplaced(ServletContextAttributeEvent event) {

String meg = MessageFormat.format("ServletCoQJlaZuBCntent替换属性:{0},属性值:{1}",event.getName(),event.getValue());

System.out.println(meg);

}

}

另外两个监听器类似,不在赘诉。接下来用jsp页面测试

listenerDemo.jsp

<%--

Created by IntelliJ IDEA.

User: Administrator

Date: 2017/10/17

Time: 15:28

To change this template use File | Settings | File Templates.

--%>

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<%

/**

* servlet监听

*/

application.setAttribute("name","changxiang");

application.setAttribute("name","小Cai先森");

application.removeAttribute("name");

/**

* session监听

*/

session.setAttribute("sessionName","changxianhttp://g");

session.setAttribute("sessionName","小Cai先森");

session.removeAttribute("sessionName");

session.invalidate();

/**

* request监听

*/

request.setAttribute("requestName","changxiang");

request.setAttribute("requestName","小Cai先森");

request.removeAttribute("requestName");

%>

执行结果如下:

注意:其中遇到一个问题:就是在启动tomcat的时候servletcontextListener监听执行了两次,最后删除掉server.xml中 Context 的手动配置,这样就不会加载两次了。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:公有云平台管理接口(公有云平台管理接口是什么)
下一篇:从源码看angular/material2 中 dialog模块的实现方法
相关文章

 发表评论

暂时没有评论,来抢沙发吧~