java web 关闭listener_JavaWeb Listener浅析

1、简介

监听器是一个专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动。监听器其实就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法立即被执行。

JavaWeb中的监听器是Servlet规范中定义的一种特殊类,它用于监听web应用程序中的ServletContext, HttpSession和 ServletRequest等域对象的创建与销毁事件,以及监听这些域对象中的属性发生修改的事件。

共包括以下3类8种监听器:

1.1、监听web对象创建与销毁的监听器

ServletContext创建与销毁监听:ServletContextListener

Httpsession的创建与销毁监听:HttpSessionListener

HttpServletRequest创建与销毁监听:ServletRequestListener

1.2、监听web对象属性变化

包括属性的添加,删除,替换(key值一样的时候,调用两次set就会触发这个事件)

ServletContex的属性变化的监听:ServletContextAttributeListener

Httpsession的属性变化的监听:HttpSessionAttributeListener

HttpServletRequest的属性的变化的监听:ServletRequestAttributeListener

1.3、监听session绑定javaBean

保存在Session域中的对象可以有多种状态:

​绑定session.setAttribute("bean",Object)到Session中;

​从 Session域中解除session.removeAttribute("bean")绑定;

​随Session对象持久化到一个存储设备中;

​随Session对象从一个存储设备中恢复

Servlet 规范中定义了两个特殊的监听器接口"HttpSessionBindingListener和HttpSessionActivationListener"来帮助JavaBean 对象了解自己在Session域中的这些状态,实现这两个接口的类不需要注册。

HttpSessionBindingListener:实现了HttpSessionBindingListener接口的JavaBean对象可以感知自己被绑定到Session中和 Session中删除的事件

HttpSessionActivationListener:实现了HttpSessionActivationListener接口的JavaBean对象可以感知自己被活化(反序列化)和钝化(序列化)的事件

2、使用示例

2.1、ServletContextListener使用示例

2.1.1、简单demo

@WebListener

public class MyServletContextListener implements ServletContextListener {

@Override

public void contextInitialized(ServletContextEvent sce) {

System.out.println("-----------contextInitialized-------------");

}

@Override

public void contextDestroyed(ServletContextEvent sce) {

System.out.println("-----------contextDestroyed-------------");

}

}

a383ad6e4f92ba78cc5fc3137f80f053.png

3eef7bc978ea953e3cace378f95d8478.png

2.1.2、ServletContextListener常见应用

2.1.2.1、初始化系统

可以实现在系统启动时获取文件或数据库中配置的全局参数、设置系统缓存、预加载内容等。

比如原来SSM项目web.xml文件中spring的配置:

org.springframework.web.context.ContextLoaderListener

2.1.2.2、启动特殊任务

ServletContextListener的第二个重要应用场景就是可以使一些程序跟随系统一起运行,比如启动定时任务。

以下是一个quartz定时的启动demo:

public class DemoListener implements ServletContextListener {

@Override

public void contextInitialized(ServletContextEvent servletContextEvent) {

DemoManager demoManager = null;

try {

demoManager = new DemoManager(new StdSchedulerFactory().getScheduler());

} catch (SchedulerException e) {

e.printStackTrace();

}

demoManager.addJob(DemoJob.class,"demoJob","Demo","0/8 * * * * ? ");

System.out.println("DemoListener 启动!");

}

@Override

public void contextDestroyed(ServletContextEvent servletContextEvent) {

}

}

2.2.2、ServletContextAttributeListener应用场景

2.2.2.1、设定系统参数

@WebServlet(name = "MyServlet2", urlPatterns = "/myServlet2")

public class MyServlet2 extends HttpServlet {

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

System.out.println("----------doPost-----------");

doGet(request, response);

}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

System.out.println("----------doGet-----------");

ServletContext context = getServletContext();

context.setAttribute("name","123");

}

}

57138ce33dbfa3ca3e1ed024e844ec69.png

7cea2515f2a90a1f47fbc8bb0af8fc6e.png

2.3、HttpSessionListener使用示例

2.3.1、简单demo

@WebListener

public class MyHttpSessionListener implements HttpSessionListener {

@Override

public void sessionCreated(HttpSessionEvent event) {

System.out.println("session: " + event.getSession().getId() + " Created");

}

@Override

public void sessionDestroyed(HttpSessionEvent event) {

System.out.println("session: " + event.getSession().getId() + " Destroyed");

}

}

2.3.2、HttpSessionListener应用场景

2.3.2.1、统计在线人数

@WebListener

public class MyHttpSessionListener implements HttpSessionListener {

@Override

public void sessionCreated(HttpSessionEvent event) {

System.out.println("session: " + event.getSession().getId() + " Created");

ServletContext context = event.getSession().getServletContext();

Integer count = (Integer) context.getAttribute("onlineCount");

if (null == count) {

count = 0;

} else {

count++;

}

context.setAttribute("onlineCount", count);

}

@Override

public void sessionDestroyed(HttpSessionEvent event) {

System.out.println("session: " + event.getSession().getId() + " Destroyed");

ServletContext context = event.getSession().getServletContext();

Integer count = (Integer) context.getAttribute("onlineCount");

if(null == count){

count = 0;

}else{

count--;

context.setAttribute("onlineCount", count);

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值