JavaWeb中的Listener和FIlter

moran
2020-09-24 / 0 评论 / 42 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2021年04月14日,已超过59天没有更新,若内容或图片失效,请留言反馈。

Listener

监听器

作用

监听某一个事件的发生,或者是状态的改变。

内部机制

其实就是接口回调。

接口回调

其实就是预先定义了一个接口,当你某个事件中需要执行另外一个类的方法时,可以直接调用该接口的实现方法(事件方法参数为接口),那么事件的方法可以一直不变,只需要修改实现类方法即可。

例子:

PrintListener接口:

interface PrintListener  {
    void print();
}

B实现类:

class B implements PrintListener{
    void print(){
        System.out.println("这是5的输出");
    }
}

A类:

class A{
    public void print(PirntListener l){
        for(int i = 0;i<10;i++){
            System.out.println("循环到了"+i);
            if(i==5){
                l.print();
            }
        }
    }
}

Test类

class TestDemo{
    public static void main(String[] agrs){
        A a = new A();
        a.print(new B());
    }
}

Web监听器

总共有8个,划分为三种类型

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

三个作用域

  • request

request对应的作用域对象是HttpServletRequest
其对应的监听器是ServletRequestListener

+ 创建

访问服务器上的任意资源。

+ 销毁

服务器对该次请求作出了响应。

  • session

session对应的作用域对象是HttpSession
其对应的监听器是HttpSessionListener

+ 创建

只要调用了getSession方法。
访问web资源中,只有jsp会默认调用getSesion,因此,访问jsp页面时将会创建该监听器.

+ 销毁

session超时(默认30分钟)
正常关闭服务器(序列化)
非正常关闭服 销毁

  • application

request对应的作用域对象是ServletContext
其对应的监听器是ServletContextListener

+ 创建

启动服务器的时候

+ 销毁

关闭服务器或者从服务器移除项目

使用这三个监听器需要实现对应的类,重写类中的初始化和销毁的方法。
另外还需要在web.xml中映射监听器。

作用

  • ServletContextListener

    1.完成自定义初始化工作
    2.执行自定义任务调用。执行某一个任务。timer
  • HttpSessionListener

    统计在线人数
    

web.xml中的配置

使用上方监听器需要配置xml

例子:

<listener>
    <listener-class>com.moran.listener.MySessionListener</listener-class>
</listener>

listener-class标签中填监听器的src下的路径

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

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

三个作用域

  • request

request对应的作用域对象是HttpServletRequest
其对应的监听器是ServletRequestAttributeListener

  • session

session对应的作用域对象是HttpSession
其对应的监听器是HttpSessionAttributeListener

  • application

request对应的作用域对象是ServletContext
其对应的监听器是ServletContextAttributeListener

使用这三个监听器需要实现对应的类,重写类中的添加(attributeAdded)|覆盖(attributeReplaced)|移除(attributeRemoved)的方法。
通过作用域对象.setAttribute()或者removeAttribute来触发监听器事件。
另外还需要在web.xml中映射监听器。

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

这一类监听器不用再web.xml中配置

HttpSessionBingdingListener

为JavaBean实现该接口,重写valueBound和valueUnbound方法。那么如果该JavaBean的实例对象被存到作用域中时,该监听器的事件将被触发。
setAttribute和removeAttribute方法。

HttpSessionActivationListener

用于监听现在session中的值是钝化(序列化)还是活化(反序列化)的动作。

钝化

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

活化

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

操作

为JavaBean实现该接口,重写sessionWillPassivate(钝化)和sesessionDidActivate(活化)方法,当服务器正常关闭时session将会被钝化。而如果要实现活化,则需要该JavaBean实现Serializable接口。

钝化活化的用意

session中的值可能会存储很多,有些值可能很长时间不使用,那么便可以将该值从内存中钝化到硬盘上。待到要使用的时候再从硬盘活化到内存中。

  • 让session在一定的时间钝化

三种方法

* 1.在tomcat里面conf/context.xml里面配置
* 2.在conf/Catalina/localhost/context.xml配置
* 3.在自己的web工程项目中WEB-INF/context.xml配置

配置的内容

<Context>
    <Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
        <Store className="org.apache.catalina.session.FileStore" directory="itheima"/>
    </Manager>
</Context>

maxIdleSwap:session多少时间不操作执行钝化
directory :钝化后的session存储位置

Filter

过滤器。其实就是对客户端发出的请求进行过滤。起到的是拦截的作用。

作用

  • 对一些敏感词汇进行过滤
  • 同一设置编码
  • 自动登录
    ...

使用Filter

定义类,实现FIleter接口

public class FilterDemo implements Filter {
    public void destroy() {
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        chain.doFilter(request, response);
    }

    public void init(FilterConfig fConfig) throws ServletException {
    }
}

注册Filter

在web.xml中注册映射,写法与servlet基本一样。

<filter>
    <filter-name>FilterDemo04</filter-name>
    <filter-class>com.moran.filter.FilterDemo04</filter-class>
</filter>
  
<filter-mapping>
    <filter-name>FilterDemo04</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

filter的执行顺序和注册的顺序有关
服务器响应的数据也会经过filter

生命周期

  • 创建

    > 在服务器启动的时候创建。
    
  • 销毁

    > 服务器关闭的时候。
    

细节

  • 1.init方法的参数FilterConfig可以用于filter注册时的name以及初始化参数。设计初衷和ServletConfig是一样的。
  • 2.如果对请求的数据已经处理过,需要放行,使用chain.dofilter(request,response)放行。
  • 3.filter注册时的url-pattern写法格式与servlet一样。还可以通过标签servlet-name对某个指定的servlet进行过滤(使用的不多,url-pattern完全可以替代)
  • 4.针对dispatcher设置

    • REQUEST:只要是请求就拦截,默认就是REQUEST
    • FORWARD:只要是转发就拦截
    • ERROR :页面出错跳转时拦截
    • INCLUDE:包含页面时候就拦截
0

评论 (0)

取消