小白学习Java第三十八天

今日内容

  1. 过滤器
  2. 监听器

一、过滤器Filter

(一)概述

1.概念

过滤器是一个服务器端的组件,它可以截取客户端的请求和服务端的响应信息,并对这些信息进行过滤处理。

2.原理:先过滤,后放行。

3.应用场景

1)统一处理中文编码问题

2)统一处理登录控制功能

(二)如何创建过滤器

方式一:使用web.xml注册过滤器

  1. 创建一个普通类实现Filter接口

 

  1. 重写Filter接口中的三个方法

 

  1. web.xml文件中注册过滤器

 

测试:

方式二:使用注解方式注册过滤器

  1. 创建一个普通类继承Filter接口
  2. 重写Filter接口中的三个方法
  3. 使用注解注册过滤器

 

这里我们可以直接通过@WebFilter("/*")注解的方式进行过滤器的注册,省去了web.xml繁琐的配置

说明:过滤器常用的路径配置格式有以下三种

1./*过滤所有的服务器端资源

2.*.do表示过滤所有以.do结尾的服务器端资源

3./hello 只能过滤hello这个路径的服务器端资源

过滤器的生命周期

1.调用init()方法初始化实例,在服务器启动时只调用一次;

2.每次访问请求,如果被访问的请求符合过滤条件都会调用doFilter()方法进行真正的过滤处理;

3.停止服务器调用destroy()方法,销毁实例,释放资源,只执行一次。

(三)过滤器的特点:

1.一个过滤器可以过滤多个servlet或者请求路径

 

 

2.过滤器默认情况下只过滤重定向的路径,不过滤转发路径。

设置过滤转发路径:

web.xml

 

注解

 

  • 使用过滤器实现统一编码

 

  • 使用过滤器实现登录控制

 

二、监听器Listener

(一)概述

1.概念

监听器就是一个实现了特定接口的Java类,主要用于监听某个域对象(三个)的状态变化的组件。

2.分类

第一维度:按照被监听的对象划分:ServletRequest HttpSession ServletContext

第二维度:监听的内容分:域对象的创建与销毁的、域对象的属性变化的、绑定到HttpSession域中某个对象状态的

 

3.原理

监听器涉及到以下几个组成部分:

1)事件源:被监听的对象,即:requestsessionservletContext三大域对象。

2)监听器:监听事件源对象,事件源对象状态的变化都会触发监听器。

3)注册监听器:将监听器与事件源进行绑定,有两种注册方式:web.xml @WebListener注解

4)事件:域对象发生改变时,立即触发监听器方法的执行。

原理图:

 

4.应用场景

1)统计网站在线人数

2)实现任务调度,启动定时程序

5.如何创建

步骤:

1)定义一个普通类实现监听器接口;

2)重写监听器接口方法;

3)注册监听器:配置 web.xml @WebListener注解

(二)监听域对象的创建与销毁

1. ServletContextListener

ServletContextListener监听器:用来监听ServletContext域对象的创建和销毁。

ServletContext对象代表全局唯一对象,每个web工程会产生一个ServletContext对象,服务器启动时创建,服务器关闭时销毁。

2. HttpSessionListener

HttpSessionListener监听器:用来监听HttpSession域对象的创建和销毁。

Session何时创建:Servlet中是request.getSession() JSP页面中自带Session,在浏览器第一次访问web项目时。

Session何时销毁:非正常关闭服务器,Session过期,session.invalidate()

 

3. ServletRequestListener

ServletRequestListener监听器:用来监听ServletRequest域对象的创建和销毁。

Request何时创建:请求发起时创建

Request何时销毁:响应结束时销毁

(三)监听域对象属性改变

ServletContextHttpSessionServletRequest中添加数据、修改数据、移除数据的监听器。

添加数据:setAttribute(key,value);  第一次向域中存值时

修改数据:setAttribute(key,value);  第二次以后key不变的情况下,只改值

移除数据:removeAttribute(key);

1. ServletContextAttributeListener

ServletContextAttributeListener监听器:监听ServletContext中属性的变化。

2. HttpSessionAttributeListener

HttpSessionAttributeListener监听器: 监听HttpSession中属性的变化。

案例:

创建监听器:

@WebListener
public class Demo02Listener implements HttpSessionAttributeListener {
    //添加
    @Override
    public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println(httpSessionBindingEvent.getName()+"添加到session中"+httpSessionBindingEvent.getValue());
    }

    //移除
    @Override
    public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println(httpSessionBindingEvent.getName()+"从session中移除"+httpSessionBindingEvent.getValue());
}

    //修改
    @Override
    public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("修改前:"+httpSessionBindingEvent.getName()+"======"+httpSessionBindingEvent.getValue());
        System.out.println("修改后:"+httpSessionBindingEvent.getName()+"======"+httpSessionBindingEvent.getSession().getAttribute(httpSessionBindingEvent.getName()));
    }
}

测试监听器:

 

3. ServletRequestAttributeListener

ServletRequestAttributeListener 监听器:监听ServletRequest中属性的变化。

以下是此类监听器对域中属性进行不同操作时所触发的方法:

1attributeAdded监听属性添加当数据范围对象没有该属性,第一次添加时会自动触发调用执行

2attributeRemoved 监听属性移除从一个数据范围对象删除一个已经存在的属性时会自动触发执行。

3attributeReplaced监听属性替换当一个数据范围已经存在一个属性,向数据范围添加相同名称属性时自动触发替换方法。

(四)监听绑定到HttpSession域中某个对象状态

此类监听器是Servlet中比较特殊的监听器,主要用来监听绑定到Session域中特定对象的状态。

  1. 绑定:将Java对象绑定到session中。
  2. 解除绑定:将Java对象从session中解除绑定。

HttpSessionBindingListener

  1. 钝化 :数据随 Session 对象序列化到一个存储设备中(硬盘)。
  2. 活化 :数据随 Session 对象从一个存储设备中(硬盘)恢复到内存。

HttpSessionActivationListener

1. HttpSessionBindingListener

实现HttpSessionBindingListener接口的Java对象,可以感知自身被绑定到Session或者从Session中解除绑定。

 

 

2. HttpSessionActivationListener

实现HttpSessionActivationListener接口的Java对象,可以感知从内存被钝化到硬盘,从硬盘活化到内存中。

钝化时机:服务器关闭或重启,指定时间内(长时间)不操作服务器。

活化时机:服务器再次开启。

课堂案例:监听一个老师对象的钝化与活化状态

  1. 创建一个老师类Teacher实现HttpSessionActivationListener接口,并重写内部两个方法。

package com.ujiuye.listener;

import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionEvent;
import java.io.Serializable;

public class Teacher implements HttpSessionActivationListener, Serializable {
    private  int id;
    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    //钝化--从内存中将session数据保存到本地磁盘
    @Override
    public void sessionWillPassivate(HttpSessionEvent httpSessionEvent) {
        System.out.println("teacher对象被钝化");
    }

    //活化--从本地磁盘文件中将sesison数据恢复到内存中
    @Override
    public void sessionDidActivate(HttpSessionEvent httpSessionEvent) {
        System.out.println("teacher对象被活化");
    }
}

  1. 配置tomcat根目录下conf文件夹里的context.xml文件,其中directory="e:\test"表示自定义钝化文件的存储路径,maxIdleSwap="1"表示超过1分钟未操作服务器会自动钝化。

<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="5">

        <Store className="org.apache.catalina.session.FileStore" directory="D:\session"> </Store>

    </Manager>

  1. 测试:创建一个first.jsp页面,向session中保存一个老师对象。

 

再创建一个second.jsp页面获取活化后session中的数据是否存在

 

测试:先访问first.jsp存数据,通过过期时间或手动关闭服务器让session对象发生钝化操作。

再重新启动服务器,直接访问second.jsp页面获取活化数据。

3. 特别注意:

1)实现这两个接口的类不需要在 web.xml 文件或注解中进行注册监听器,都是由Session自主完成的。

2HttpSessionActivationListener监听器涉及到Java对象的序列化操作,因此必须同时实现Serializable接口。

(五)综合案例:统计网站在线人数

思路分析:通过ServletContextListener监听,当Web应用上下文启动时,在ServletContext中添加一个List集合,用来准备存放在线的用户名;然后,可以通过HttpSessionAttributeListener监听器,当用户登录成功,把用户名设置到Session中时,同时将用户名存放到ServletContext中的List列表中;最后通过HttpSessionListener监听,当用户注销会话时,将用户名从应用上下文范围中的List列表中删除。

实现步骤:

  1. 创建监听器

 

 

  1. 创建登录页

 

  1. 登录Servlet

 

 

  1. 退出Servlet

 

  1. 显示在线人数

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值