1.监听器概述
------------------------------------------------
Javaweb三大组件: Servlet、Filter、Listener
Listener -- 监听器:
> 它是一个接口, 内容由我们自己来实现
> 它需要注册, 例如注册在按钮上
> 监听器中的方法, 会在特殊事件发生时被调用
GUI(图形界面编程)
------------------------------------------------
车被偷事件分析:
事件源:
* 车 按钮
事件:
* 车被偷 按钮被点击
监听器:
* 例如警察 listener
* 监听器中的方法: 实施抓捕
----------------------------------------------------
2.javaweb中的监听器: (八个!)
事件源: 三大域(ServletContext、ServletRequest、HttpSession)
!!2.1.ServletContext
(1) 生命周期监听: ServletContextListener, 有两个方法, 一个在出生时调用, 一个在死亡时调用
void contextInitialized(ServletContextEvent sce) 创建ServletContext时调用
void contextDestroyed(ServletContextEvent sce) 销毁ServletContext是调用
(2) 属性监听: ServletContextAttributeListener, 有三个方法, 一个在添加属性时调用, 一个在替换属性时调用, 一个在移除属性时调用
void attributeAdded(ServletContextAttributeEvent scae) 添加属性时调用
void attributeReplaced(ServletContextAttributeEvent scae) 替换属性时调用
void attributeRemoved(ServletContextAttributeEvent scae) 删除属性时调用
2.2.HttpSession
(1) 生命周期监听: HttpSessionListener, 有两个方法, 一个在出生时调用, 一个在死亡时调用
void sessionCreated(HttpSessionEvent se) 创建Session时调用
void sessionDestroyed(HttpSessionEvent se) 销毁Session时调用
(2) 属性监听: HttpSessionAttributeListener, 有三个方法, 一个在添加属性时调用, 一个在替换属性时调用, 一个在移除属性时调用
void attributeAdded(HttpSessionBindingEvent se) 添加属性时调用
void attributeReplaced(HttpSessionBindingEvent se) 替换属性时调用
void attributeRemoved(HttpSessionBindingEvent se) 删除属性时调用
2.3.ServletRequest
(1) 生命周期监听: ServletRequestListener, 有两个方法, 一个在出生时调用, 一个在死亡时调用
void requestInitialized(ServletRequestEvent sre) 创建request时调用
void requestDestroyed(ServletRequestEvent sre) 销毁request时调用
(2) 属性监听: ServletRequestAttributeListener, 有三个方法, 一个在添加属性时调用, 一个在替换属性时调用, 一个在移除属性时调用
void attributeAdded(ServletRequestAttributeEvent srae) 添加属性时调用
void attributeReplaced(ServletRequestAttributeEvent srae) 替换属性时调用
void attributeRemoved(ServletRequestAttributeEvent srae) 删除属性时调用
----------------------------------------------------
3.ServletContextListener监听器案例: 重写WEB应用中获取WEB应用虚拟路径的方式
基本思路:在WEB应用被加载之后, 服务器会立即创建代表当前WEB应用的ServletContext对象, ServletContext对象创建之后激活ServletContextListener 监听器, 调用 contextInitialized()来进行处理, 在这个方法被调用时, 可以将WEB应用的虚拟路径存入到ServletContext域中, 方便后期在jsp中获取!!
----------------------------------------------------
4.事件对象:
------------------------------------------------
4.1.ServletContextEvent:
事件源: ServletContex
事件对象: ServletContextEvent
提供方法: getServletContext(); //获取当前事件源
监听器接口: ServletContextListener
------------------------------------------------
4.2.HttpSessionEvent:
事件源: HttpSession
事件对象: HttpSessionEvent
提供方法: getSession(); //获取当前事件源
监听器接口: HttpSessionListener(HttpSession的生命周期监听)
------------------------------------------------
4.3.ServletRequestEvent:
事件源: ServletRequest
事件对象: ServletRequestEvent
提供方法:
getServletRequest(); //获取当前事件源
getServletContext(); //获取代表当前WEB应用的ServletContext对象
监听器接口: ServletRequestListener
------------------------------------------------
4.4.ServletContextAttributeEvent
事件源: ServletContex
事件对象: ServletContextAttributeEvent
提供方法:
String getName(); //获取属性名
Object getValue(); //获取属性值
getServletContext(); //获取当前事件源
监听器接口: ServletContextAttributeListener
------------------------------------------------
4.5.HttpSessionBindingEvent
事件源: HttpSession
事件对象: HttpSessionBindingEvent
提供方法:
String getName(); //获取属性名
Object getValue(); //获取属性值
getSession(); //获取当前事件源
监听器接口: HttpSessionAttributeListener
------------------------------------------------
4.6.ServletRequestAttributeEvent
事件源: ServletRequest
事件对象: ServletRequestAttributeEvent
提供方法:
String getName(); //获取属性名
Object getValue(); //获取属性值
getServletRequest(); //获取当前事件源
getServletContext(); //获取代表当前WEB应用的ServletContext对象
监听器接口: ServletRequestAttributeListener
----------------------------------------------------
5.javaweb中编写监听器:
5.1.写一个监听器类: 要求必须实现监听器接口
public class MyXxxListener implements XxxListener{...}
5.2.注册监听: 在web.xml中配置完成注册
<listener>
<listener-class>listener.MyXxxListener</listener-class>---全限定名称(全路径名)
</listener>
----------------------------------------------------
6.使JavaBean感知自己在Session域中状态变化的监听器
------------------------------------------------
* 这两个监听器是用来添加到javaBean上, 而不是三大域上!
* 这两个监听器不需要写专门的类去实现, 也不需要在web.xml中注册
* 只要让javaBean自己实现监听器接口即可
------------------------------------------------
6.1.HttpSessionBindingListener: 添加到JavaBean上, JavaBean就知道自己是否被添加到Session中了
提供的方法:
valueBound(HttpSessionBindEvent e); //当前JavaBean感知到自己被添加到Session时调用
valueUnbound(HttpSessionBindEvent e); //当前JavaBean感知到自己被移出Session时调用
User user = new User();
HttpSession session = request.getSession();
session.setAttribute("user", user);
------------------------------------------------
6.2.HttpSessionActivationListener: 添加到JavaBean上,JavaBean就知道自己是随着Session一起钝化了还是活化了
提供的方法:
sessionWillPassivate(HttpSessionEvent e); //当前JavaBean感知自己随着Session一起钝化时调用
sessionDidActive(HttpSessionEvent e); //当前JavaBean感知自己随着Session一起活化时调用