Listener 监听器
来源:互联网 发布:搜狗输入法centos版 编辑:程序博客网 时间:2024/06/09 18:58
一、Listener监听器
Javaweb开发中的监听器,是用于监听web常见对象
监听器(Listener):当一个事件发生的时候,你希望获得这个事件发生的详细信息,而并不想干预这个事件本身的进程,这就要用到监听器。
如HttpSessionListener,可以用于追踪Session创建和销毁这两个生命周期。
如HttpSessionAttributeListener,用于追踪Session上的Attribute,添加移除替换这三种事件。
有了这些扩展点,我们做一些功能的时候就比较方便,如检测在线人数就可以使用HttpSessionListener,当Session创建时在线人数+1,Session销毁时在线人数-1,如果没有提供这个扩展点,我们要实现也不是不行,就是要麻烦一些了。
HttpServletRequest HttpSession ServletContext
监听它们的创建与销毁 属性变化 session绑定javaBean
1、监听机制
事件 就是一个事情;比如点开始按钮,点我的电脑,会弹出一个相应的反馈,这就是事件
事件源 产生这个事情的源头
监听器 用于监听指定的事件的对象
注册监听 要想让监听器可以监听到事件产生,必须对其进行注册。
2.1、监听域对象的创建与销毁
(1)监听ServletContext创建与销毁 ServletContextListener
ServletContext 被 Servlet 程序用来与 Web 容器通信。例如写日志,转发请求。每一个 Web 应用程序含有一个Context,被Web应用内的各个程序共享。因为Context可以用来保存资源并且共享,所以我所知道的 ServletContext 的应用是
1)Web缓存----把不经常更改的内容读入内存,所以服务器响应请求的时候就不需要进行慢速的磁盘I/O了。
2)在程序启动的时候初始化配置文件,比如启动日志组件,IO组件等等。3)请求转发
ServletContextListener 是 ServletContext 的监听者,如果 ServletContext 发生变化,如服务器启动时 ServletContext 被创建,服务器关闭时 ServletContext 将要被销毁。
在JSP文件中,application 是 ServletContext 的实例,由JSP容器默认创建。Servlet 中调用 getServletContext()方法得到 ServletContext 的实例。
我们使用缓存的思路大概是:
服务器启动时,ServletContextListener 的 contextInitialized()方法被调用,所以在里面创建好缓存。可以从文件中或者从数据库中读取取缓存内容生成类,用 ervletContext.setAttribute()方法将缓存类保存在 ServletContext 的实例中。
程序使用 ServletContext.getAttribute()读取缓存。如果是 JSP,使用application.getAttribute()。如果是 Servlet,使用 getServletContext().getAttribute()。如果缓存发生变化(如访问计数),你可以同时更改缓存和文件/数据库。或者你等 变化积累到一定程序再保存,也可以在下一步保存。
服务器将要关闭时,ServletContextListener 的 contextDestroyed()方法被调用,所以在里面保存缓存的更改。将更改后的缓存保存回文件或者数据库,更新原来的内容。
import javax.servlet.ServletContext;import javax.servlet.ServletContextListener;public class MyContextListener implements ServletContextListener {private ServletContext context = null;public void contextInitialized(ServletContextEvent event) {System.out.println("servlet context created");}public void contextDestroyed(ServletContextEvent event) {System.out.println("servlet context destroy");}}
(2)监听HttpSession创建与销毁 HttpSessionListener
(3)监听HttpServletRequest创建与销毁 ServletRequestListener
2.2、监听域对象的属性变化
(1)监听ServletContext属性变化 ServletContextAttributeListener
(2)监听HttpSession属性变化 HttpSessionAttributeListener
(3)监听HttpServletRequest属性变化 ServletRequestAttributeListener
2.3、监听session绑定javaBean
(1)它是用于监听javaBean对象是否绑定到了session域 HttpSessionBindingListener
(2)它是用于监听javaBean对象的活化与钝化 HttpSessionActivationListener
1. 创建一个类,实现指定的监听器接口
2. 重写接口中的方法
import javax.servlet.ServletContext;import javax.servlet.ServletContextListener;public class MyContextListener implements ServletContextListener {private ServletContext context = null;public void contextInitialized(ServletContextEvent event) {System.out.println("servlet context created");}public void contextDestroyed(ServletContextEvent event) {System.out.println("servlet context destroy");}}
3. 在web.xml文件中对监听器进行注册。
在web.xml中加这行代码
<listener> <listener-class>test.MyServletListener</listener-class></listener>
案例 定时器-定时销毁session
比如我们通过网络购买火车票时,如果一定时间不付款订单就会被取消。又比如双十一,有秒杀活动,一过零点就开启秒杀,一到时间就触发事件开启秒杀。
1. 首先我们把session都存到一个集合,然后定时查看集合里的session有没有过时,怎样可以将每一个创建的session全都保存起来?
我们可以做一个HttpSessionListener,当session对象创建时,就将这个session对象装入到一个集合中.将集合List<HttpSession>保存到ServletContext域中。
2. 怎样可以判断session过期了?
在HttpSession中有一个方法public long getLastAccessedTime() ,它可以得到session对象最后使用的时间。可以使用invalidate方法销毁。我们上面的操作需要使用任务调度功能.在java中有一个Timer定时器类
- Listener监听器
- Listener监听器
- 监听器Listener
- Listener 监听器
- Listener 监听器
- Listener 监听器
- Listener 监听器
- Listener 监听器
- Listener监听器
- Listener 监听器
- Listener 监听器
- Listener 监听器
- Listener--监听器
- Listener 监听器
- 监听器(Listener)
- listener 监听器
- Listener 监听器
- listener监听器
- HTTP协议 (六) 状态码详解
- 【angular2】(2)angular2自定义组件示例
- 我的第一个博客
- VS使用问题汇总
- 安卓的知识结构
- Listener 监听器
- C语言结构体的简单使用实例
- 反射
- HTTP协议 (五) 代理
- loading。。。加载层的写法
- Java Web开发之环境搭建
- 关于HTML中的置换与非置换元素
- OpenGL/3D图形渲染管线
- 微信支付一直签名错误