Listener

一、Listener(监听器)

监听某一个事件发生、状态改变

监听器内部机制接口回调

接口回调

  • 需求

A在执行循环,当循环到5的时候,通知B。

事先先把一个对象传递给A—当A执行到5的时候,通过这个对象,来调用B中的方法。 但是注意,不是直接传递B的实例,而是传递一个接口的实例过去。(所以叫接口回调)

就相当于我现在有个A类,但是具体循环之后怎么走的类我现在没有,保不准以后会有,所以我需要写一个接口传给a类一个对象,然后有B类的时候就可以实现接口,然后传递接口实例对象

test类调用a,a去找b(继承接口):


二、8个Web监听器(JSP四个作用域)#

其中三个作用域(JSP共四个)

  request     ---httpServletRequest
  session     ---httpSession
aapplication  ---ServletContext

监听器三种类型

1
2
3
1. 监听三个作用域创建和销毁(3个)
2. 监听三个作用域属性状态变更(3个)
3. 监听httpSession里面存值的状态变更(2个)

使用步骤

  • 1. 定义类,实现对应接口(自动给两个方法)

  • 2. 注册 | 配置监听器


三、 监听三个作用域创建和销毁

1. ServletContextListener

servletcontext创建:

    1. 启动服务器的时候

servletContext销毁:

    2. 关闭服务器. 从服务器移除项目
  • 1. 定义一个类,实现ServletContextListener接口(自动给两个方法)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class MyServletContextListener implements ServletContextListener {

//初始化调用
@Override
public void contextInitialized(ServletContextEvent sce) {
// TODO 自动生成的方法存根
System.out.println("初始化了");
}

//销毁调用
@Override
public void contextDestroyed(ServletContextEvent sce) {
// TODO 自动生成的方法存根
System.out.println("销毁了");
}

}
  • 2. Web.xml文件中注册 | 配置监听器
1
2
3
<listener>
<listener-class>Listener.MyServletContextListener</listener-class>
</listener>

点击控制栏Servers中红框

控制台输出结果:

2. ServletRequestListener

request创建:

      访问服务器上的任意资源都会有请求出现。

      访问 html: 会
      访问 jsp:    会
      访问 servlet : 会 

request销毁:

      服务器已经对这次请求作出了响应。(打开页面并且刷新一次)
  • 1. 定义类,实现对应接口(自动给两个方法)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class MyRequestListener implements ServletRequestListener {

@Override
public void requestDestroyed(ServletRequestEvent sre) {
// TODO 自动生成的方法存根
System.out.println("初始化了");
}

@Override
public void requestInitialized(ServletRequestEvent sre) {
// TODO 自动生成的方法存根
System.out.println("销毁了");
}

}
  • 2. web.xml文件内注册 | 配置监听器
1
2
3
<listener>
<listener-class>Listener.MyRequestListener</listener-class>
</listener>
  • 3.分别建立jsp、h5、servlet文件打开浏览器刷新
1
之后就会在控制台输出初始化和销毁的提示!

3. HttpSessionListener

session的创建:        
   只要调用getSession
     html:        不会
     jsp:        会      getSession();
     servlet:     会

session的销毁:
     1.超时  30分钟(默认时间)        
     2.非正常关闭 销毁
     3.正常关闭服务器(序列化)
  • 1. 定义类,实现对应接口(自动给两个方法)
1
2
3
4
5
6
7
8
9
10
11
12
public class MySessionListener implements HttpSessionListener {

@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("创建session了");
}

@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("销毁session了");
}
}
  • 2. web.xml文件内注册 | 配置监听器
1
2
3
<listener>
<listener-class>Listener.MySessionListener</listener-class>
</listener>

##4. 三个监听器作用 ##

1.ServletContextListener

    利用它来,在servletcontext创建的时候, 

    1. 完成自己想要的初始化工作

    2. 执行自定义任务调度。 执行某一个任务。 Timer  

2.HttpSessionListener

    统计在线人数(一个回合就是session)

四、 监听三个作用域属性状态变更

可以监听在作用域中值—添加|替换|移除动作。

1. ServletContextAttributeListener

2. ServletRequestAttributeListener

3. HttpSessionAttributeListener

4. 以HttpSessionAttributeListener为例#

  • 1. 建立类实现对应接口(自动三个方法)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class MyHttpSession implements HttpSessionAttributeListener {
@Override
public void attributeAdded(HttpSessionBindingEvent se) {
System.out.println("属性被添加了");
}
@Override
public void attributeRemoved(HttpSessionBindingEvent se) {
System.out.println("属性被移除了");
}
@Override
public void attributeReplaced(HttpSessionBindingEvent se) {
System.out.println("属性被替换了");
}
}
  • 2. web.xml文件配置
1
2
3
 <listener>
<listener-class>Listener02.MyHttpSession</listener-class>
</listener>
  • 3. 新建jsp页面
1
2
3
4
5
<%
session.setAttribute("name","abobama");
session.setAttribute("name","zhangsan");
session.removeAttribute("name");
%>

运行jsp页面 然后刷新:


五、 监听httpSession里面存值的状态变更

这一类监听器不用注册。(直接继承即可)

1. HttpSessionBindingListener

  • 1.让javaBean 实现该接口即可
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Bean01 implements HttpSessionBindingListener{

//自定义属性--可以被修改
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}

@Override
public void valueBound(HttpSessionBindingEvent event) {
// TODO 自动生成的方法存根
System.out.println("值被绑定进来了");
}

@Override
public void valueUnbound(HttpSessionBindingEvent event) {
// TODO 自动生成的方法存根
System.out.println("解绑了");
}

}

2. HttpSessionActivationListener(激活)

用于监听session的值

  • 1.钝化 (序列化)

把内存中的数据 存储 到硬盘

  • 2.活化 (反序列化)

把硬盘中的数据 读取 到内存

  • 1.让javaBean 实现该接口即可
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Bean01 implements HttpSessionActivationListener{
//钝化
@Override
public void sessionWillPassivate(HttpSessionEvent se) {
// TODO 自动生成的方法存根
System.out.println("session被钝化了...");
}

//活化
@Override
public void sessionDidActivate(HttpSessionEvent se) {
// TODO 自动生成的方法存根
System.out.println("session被活化了...");
}
}

3. 钝化活化作用

session中的值可能会很多,并且我们有很长一段时间不使用这个内存中的值,那么可以考虑把session的值可以存储到硬盘上【钝化】,等下一次在使用的时候,在从硬盘上提取出来。 【活化】

4. 设置钝化时间(配置)

  • 1.在tomcat里面 conf/context.xml 里面配置

    对所有的运行在这个服务器的项目生效  
  • 2.在conf/Catalina/localhost/context.xml 配置

    对 localhost生效。  localhost:8080
  • 3.在自己的web工程项目中的 META-INF/context.xml

    只对当前的工程生效。(一般在这设置,因为项目的目录不同)

配置代码:

1
2
3
4
5
<Context>
<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
<Store className="org.apache.catalina.session.FileStore" directory="itheima"/>
</Manager>
</Context>
   **maxIdleSwap** : 1分钟不用就钝化
   **directory**:  钝化后的那个文件存放的目录位置。 
例如:F:\tomcat\apache-tomcat-7.0.52\work\Catalina\localhost\项目名\文件名

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. 一、Listener(监听器)
    1. 1.1. 接口回调
  2. 2. 二、8个Web监听器(JSP四个作用域)#
    1. 2.1. 其中三个作用域(JSP共四个)
    2. 2.2. 监听器三种类型
    3. 2.3. 使用步骤
  3. 3. 三、 监听三个作用域创建和销毁
    1. 3.1. 1. ServletContextListener
    2. 3.2. 2. ServletRequestListener
    3. 3.3. 3. HttpSessionListener
  4. 4. 四、 监听三个作用域属性状态变更
    1. 4.1. 1. ServletContextAttributeListener
    2. 4.2. 2. ServletRequestAttributeListener
    3. 4.3. 3. HttpSessionAttributeListener
  5. 5. 4. 以HttpSessionAttributeListener为例#
  6. 6. 五、 监听httpSession里面存值的状态变更
    1. 6.1. 1. HttpSessionBindingListener
    2. 6.2. 2. HttpSessionActivationListener(激活)
    3. 6.3. 3. 钝化活化作用
    4. 6.4. 4. 设置钝化时间(配置)
,