目录
一、Listener介绍
- 概念:Listener 表示监听器,是JavaWeb三大组件(Servlet、Filter、Listener)之一。
- 监听器可以监听在
application
,Session
,Request
三个对象创建、销毁或者往其中添加修改删除属性时自动执行代码的功能组件。 - Listener分类:JavaWeb共提供了8个类型的监听器。
- 作用:监听某个事件的发生,状态的改变。
- 内部机制:接口
回调
。
监听器分类 | 监听器名称 | 作用 |
---|---|---|
ServletContext监听 | ServletContextListener | 用于对ServletContext对象进行监听(创建、销毁) |
ServletContextAttributeListener | 对ServletContext对象中属性的监听(增删改) | |
Session监听 | HttpSessionListener | 对Session对象的整体状态的监听(创建、销毁) |
HttpSessionAttributeListener | 对Session对象中的属性监听(增删改) | |
HttpSessionBindingListener | 监听对象于Session的绑定和解除 | |
HttpSessionActivationListener | 对Session数据的钝化和活化的监听 | |
Request监听 | ServletRequestListener | 对Request对象进行监听(创建、销毁) |
ServletRequestAttributeListener | 对Request对象中属性的监听(增删改) |
实现监听:
① 创建类实现监听器接口
② web.xml文件中配置(注册)监听器
<listener>
<listener-class>自定义监听器类的全限定名称</listener-class>
</listener>
例如:
自定义一个MyHttpSessionListener
监听器
package com.tyt.listener;
/**
* 实现HttpSessionListener接口,
*/
public class MyHttpSessionListener implements HttpSessionListener {
//当一个用户打开网站的时候开启创建session执行的方法
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
}
//关闭网站的时候销毁session执行的的方法
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
}
}
web.xml配置文件相应监听器映射如下:
<!--监听映射-->
<listener>
<listener-class>com.tyt.listener.MyHttpSessionListener </listener-class>
</listener>
Servlet3.0后可以通过注解@WebListener
注册监听器
package com.tyt.listener;
@WebListener
public class MyHttpSessionListener implements HttpSessionListener {
//当一个用户打开网站的时候开启创建session执行的方法
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
}
//关闭网站的时候销毁session执行的的方法
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
}
}
二、Listener监听三个域对象创建与销毁
监听器分类 | 监听器名称 |
---|---|
ServletContext监听 | ServletContextListener |
Session监听 | HttpSessionListener |
Request监听 | ServletRequestListener |
1. 监听ServletContext域对象的创建与销毁
自定义类,实现ServletContextListener
@WebListener
public class MyServletContextListener implements ServletContextListener{
@Override
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("context init...");
}
@Override
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("context destroy...");
}
}
- ServletContext域对象的生命周期:
创建
:启动服务器时创建
销毁
:关闭服务器或者从服务器移除项目
- 作用:
利用ServletContextListener
监听器在创建ServletContext
域对象时完成一些想要初始化的工作或者执行自定义任务调度。
如:加载配置文件,在Spring框架中可定义ContextLoaderListener
2. 监听ServletRequest域对象的创建与销毁
自定义类,实现ServletRequestListener
@WebListener
public class MyServletRequestListener implements ServletRequestListener{
@Override
public void requestInitialized(ServletRequestEvent arg0) {
System.out.println("request init...");
}
@Override
public void requestDestroyed(ServletRequestEvent arg0) {
System.out.println("request destroy...");
}
}
- ServletRequest域对象的生命周期:
创建
:客户端向服务端发送请求
销毁
:服务器为该次请求做出响应
3. 监听HttpSession域对象的创建与销毁
自定义类,实现HttpSessionListener
@WebListener
public class MyHttpSessionListener implements HttpSessionListener{
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("session creat...");
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("session destroy...");
}
}
- HttpSession域对象的生命周期:
创建
:服务器中无session对象并调用getSession()方法
销毁
:
① session过期(默认为30分钟)
②session.invalidate()
,手动销毁
③非正常
关闭服务器(正常关闭会序列化到硬盘)
- 作用:
每位用户登录网站时都会创建一个HttpSession对象,利用这个统计在线人数。
三、Listener监听三个域对象属性状态的改变
监听器分类 | 监听器名称 |
---|---|
ServletContext监听 | ServletContextAttributeListener |
Session监听 | HttpSessionAttributeListener |
Request监听 | ServletRequestAttributeListener |
监听三个域对象属性状态的改变(属性添加、替换、移除)
1. 监听ServletContext域对象的属性状态改变
监听器代码:
@WebListener
public class MyServletContextAttributeListener implements ServletContextAttributeListener {
@Override
public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println("servletContext attribute add...");
}
@Override
public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println("servletContext attribute remove...");
}
@Override
public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println("servletContext attribute replace...");
}
}
测试代码:
protected void doGet(HttpServletRequest request, HttpServletResponse response){
ServletContext context = request.getServletContext();
// ServletContext域对象新加属性
context.setAttribute("name", "tyt");
// ServletContext域对象替换属性
context.setAttribute("name", "划水艺术家");
// ServletContext域对象移除属性
context.removeAttribute("name");
}
2. 监听ServletRequest域对象的属性状态改变
监听器代码:
@WebListener
public class MyHttpSessionAttributeListener implements ServletRequestAttributeListener{
@Override
public void attributeAdded(ServletRequestAttributeEvent servletRequestAttributeEvent) {
System.out.println("servletRequest attribute add...");
}
@Override
public void attributeRemoved(ServletRequestAttributeEvent servletRequestAttributeEvent) {
System.out.println("servletRequest attribute remove...");
}
@Override
public void attributeReplaced(ServletRequestAttributeEvent servletRequestAttributeEvent) {
System.out.println("servletRequest attribute replace...");
}
}
测试代码:
protected void doGet(HttpServletRequest request, HttpServletResponse response){
HttpSession session = request.getSession();
// HttpSession域对象新增属性
session.setAttribute("name", "tyt");
// HttpSession域对象替换属性
session.setAttribute("name", "划水艺术家");
// HttpSession域对象移除属性
session.removeAttribute("name");
}
3. 监听HttpSession域对象的属性状态改变
监听器代码:
@WebListener
public class MyHttpSessionAttributeListener implements HttpSessionAttributeListener {
@Override
public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("httpSession attribute add...");
}
@Override
public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("httpSession attribute remove...");
}
@Override
public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("httpSession attribute replace...");
}
}
测试代码:
protected void doGet(HttpServletRequest request, HttpServletResponse response){
// ServletRequest域对象新增属性
request.setAttribute("name", "tyt");
// ServletRequest域对象替换属性
request.setAttribute("name","划水艺术家");
// ServletRequest域对象移除属性
request.removeAttribute("name");
}
四、Listener监听HttpSession对象中的JavaBean的状态改变
监听器分类 | 监听器名称 |
---|---|
Session监听 | HttpSessionBindingListener |
Session监听 | HttpSessionActivationListener |
以上两种监听器不用注册。
以上两种监听器不用注册。
以上两种监听器不用注册。
1. 监听HttpSession域对象的绑定与解除
public class MyHttpSessionBindingListener implements HttpSessionBindingListener {
@Override
public void valueBound(HttpSessionBindingEvent arg0) {
System.out.println("HttpSession bound...");
}
@Override
public void valueUnbound(HttpSessionBindingEvent arg0) {
System.out.println("HttpSession unbound...");
}
}
2. 监听HttpSession域对象的钝化与活化
public class Bean implements HttpSessionActivationListener{
@Override
public void sessionDidActivate(HttpSessionEvent arg0) {
System.out.println("HttpSession 活化...");
}
@Override
public void sessionWillPassivate(HttpSessionEvent arg0) {
System.out.println("HttpSession 钝化...");
}
}
- session的钝化活化的用意:
session中的值会很多,并且我们有很长一段时间不会去使用这个内存中的值,那么可以考虑把session中的值存储到硬盘上(钝化);
等下一次要使用的时候,从硬盘上提取到内存中(活化)。