JavaWeb Listener浅析

2021-03-09 14:28

阅读:327

标签:row   就会   场景   lin   cti   序列化   init   out   eve   

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-------------");
    }
}

技术图片

技术图片

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) {

    }
}
@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");
    }
}

技术图片

技术图片

2.2.2、ServletContextAttributeListener应用场景
2.2.2.1、设定系统参数

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);
        }
    }
}

JavaWeb Listener浅析

标签:row   就会   场景   lin   cti   序列化   init   out   eve   

原文地址:https://www.cnblogs.com/wind-ranger/p/14171708.html


评论


亲,登录后才可以留言!