监听器和过滤器

监听器和过滤器

1.监听器

1.介绍

  • 在Servlet 中定义了多种类型的监听器,它们用于监听的事件源分别是ServletContext,HttpSession和ServletRequest这三个域对象。

2.Servlet监听器的分类

  • 1.一类:监听三个域对象的创建和销毁的监听器(三个)。
  • 2.二类:监听三个域对象的属性变更〈属性添加、移除、替换)的监听器(三个)。
  • 3.三类:监听HttpSession中 JavaBean的状态改变(钝化、活化、绑定、解除绑定)的监听(两个)。

3.监听器种类

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

  • 代码演示以及方法的说明

  • 实现ServletContextListener接口中的方法

package com.ser.com.listenner;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class Listener1 implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("监听ServletContext创建了的方法执行了.....");
    }
    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("监听ServletContext销毁了的方法执行了.....");
    }
}
  • web.xml配置监听器
<listener>
    <listener-class>com.ser.com.listenner.Listener1</listener-class>
</listener>
2.HttpSessionListener监听器
  • 作用:用来监听HttpSession对象的创建和销毁的监听器。
  • 代码演示以及方法的说明
  • 实现HttpSessionListener接口中的方法
package com.ser.com.listenner;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class Listener2 implements HttpSessionListener {
    @Override
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
        System.out.println("监听HttpSession创建了的方法执行了.....");
    }
    @Override
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
        System.out.println("监听HttpSession销毁了的方法执行了.....");
    }
}
  • web.xml配置监听器
<listener>
    <listener-class>com.ser.com.listenner.Listener2</listener-class>
</listener>
3.ServletRequestListener监听器
  • 作用:用来监听ServletRequest对象的创建和销毁的监听器。
  • 代码演示以及方法的说明
  • 实现ServletRequestListener接口中的方法
package com.ser.com.listenner;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class Listener3 implements ServletRequestListener {
    @Override
    public void requestInitialized(ServletRequestEvent servletRequestEvent) {
        System.out.println("监听ServletRequest创建了的方法执行了.....");
    }
    @Override
    public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
        System.out.println("监听ServletRequest销毁了的方法执行了.....");
    }
}
  • web.xml配置监听器
<listener>
    <listener-class>com.ser.com.listenner.Listener3</listener-class>
</listener>
4.监听三个域对象的属性变更的监听器
1.ServletContextAttributeListener监听器
  • 作用:监听ServletContext对象中的属性变更(属性添加,移除,替换)的监听器。
2.HttpSessionAttributeListener监听器
  • 作用:监听HttpSession对象中的属性变更(属性添加,移除,替换)的监听器。
3.ServletRequestAttributeListener监听器
  • 作用:监听ServletRequest对象中的属性变更(属性添加,移除,替换)的监听器。
以上三个监听器用法相同,举例HttpSessionAttributeListener监听器演示
  • 实现HttpSessionAttributeListener接口中的方法
package com.ser.com.listenner;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
public class Listener4 implements HttpSessionAttributeListener {
    @Override
    public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("监听向Session添加属性的方法执行了");
    }
    @Override
    public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("监听从Session移除属性的方法执行了");
    }
    @Override
    public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("监听向Session替换属性的方法执行了");
    }
}
  • web.xml配置监听器
<listener>
    <listener-class>com.ser.com.listenner.Listener4</listener-class>
</listener>
5.监听HttpSession中Java类状态改变的监听器
  • 1.作用:保存在session 域中的Java类可以有多种状态,绑定到session中, 从 session 中解除绑定,随session对象持久化到一个存储设备中(钝化),随session对象从一个存储设备中恢复(活化)。Servlet对像中定义了两个特殊的监听的接口来帮助Java类了解自己在session域中的状态:HttpSessionBindingListener接口HttpSessionActivationListener接口。实现这两个接口的类不需要在web.xml 中进行配置。
  • 2.HttpSessionBindingListener监听器
    • 作用:监听Java类在HttpSession中的绑定和解除绑定的状态的监听器。
    • 代码演示以及方法的说明
    • 实现HttpSessionBindingListener接口中的方法
package com.ser.com.listenner;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
public class Listener5 implements HttpSessionBindingListener {
    private String name;
    public Listener5() {
    }
    public String getName() {
        return name;
    }
    public Listener5(String name) {
        this.name = name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public void valueBound(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("Listener5与Session绑定了........");
    }
    @Override
    public void valueUnbound(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("Listener5与Session解除绑定了........");
    }
}

  • 测试类
package com.ser;
import com.ser.com.listenner.Listener5;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        Listener5 listener5 = new Listener5();
        listener5.setName("zhangsan");
        session.setAttribute("listener5",listener5);//将实现HttpSessionBindingListener接口类的对象添加进session时就会和HttpSessionBindingListener监听器绑定
        session.removeAttribute("listener5");//将实现HttpSessionBindingListener接口类的对象移除session时就会和HttpSessionBindingListener监听器解除绑定
         }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}
  • 3.HttpSessionActivationListener监听器
    • 监听HttpSession中Java类的钝化和活化监听器。
    • 代码演示以及方法的说明
    • 实现HttpSessionActivationListener接口中的方法
package com.ser.com.listenner;
import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
import javax.servlet.http.HttpSessionEvent;
import java.io.Serializable;
public class Listener6 implements HttpSessionActivationListener, Serializable {
    private String name;
    public Listener6() {
    }
    public String getName() {
        return name;
    }
    public Listener6(String name) {
        this.name = name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public void sessionWillPassivate(HttpSessionEvent httpSessionEvent) {
        System.out.println("这个java类被session钝化了。");//正常关闭服务器,session就会钝化实现HttpSessionActivationListener接口的java类
    }
    @Override
    public void sessionDidActivate(HttpSessionEvent httpSessionEvent) {
        System.out.println("这个java类被session活化了");//打开服务器,调用session就会活化实现HttpSessionActivationListener接口的java类
    }
}
  • 测试类
package com.ser;
import com.ser.com.listenner.Listener6;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        Listener6 listener6 = new Listener6();
        listener6.setName("zhangsan");
        }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}
  • 注意事项:session可以通过配置context.xml文件设置活化后多久钝化
  • context.xml配置的位置三个位置
    • 1.tomcat/conf/context.xml:作用范围:所有tomcat下虚拟主机和虚似目录下的工程
    • 2.tomcat/conf/Catalina/localhost/context.xml: localhost 虚拟主机下的所有项目会序列化session。
    • 工程/META-INF/context.xml:当前工程才会序列化session。
  • context.xml的内容
<?xml version='1.0' encoding='UTF-8'?>
<Context>
    <Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1"><!--设置钝化时间单位为分钟-->
        <Store className="org.apache.catalina.session.FileStore" directory="abc"/><!--钝化到那个位置-->
    </Manager>
</Context>

2.过滤器

1.概述

  • Filter称为过滤器,它是servlet技术中最实用的技术,web开发人员通过Filter技术,对web服务器所管理的资源(JSP,Servlet,静态图片或静态html 文件)进行拦截,从而实现一些特殊的功能。Filter就是过滤从客户端向服务器发送的请求。

2.过滤器入门程序

  • 实现Filter接口的方法
package com.ser.com.filter;
import javax.servlet.*;
import java.io.IOException;
public class Filter01 implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("Filter01执行了");
        //放行
        filterChain.doFilter(servletRequest,servletResponse);
    }
    @Override
    public void destroy() {
    }
}

  • web.xml中配置过滤器
  <filter>
    <filter-name>filter01</filter-name>
    <filter-class>com.ser.com.filter.Filter01</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>filter01</filter-name>
    <url-pattern>/*</url-pattern><!--这样表示过滤全部-->
  </filter-mapping>

3.Filterchain对象的概述

  • 1.FilterChain.过滤器链:在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称为是一个过滤器链。
  • 2.web服务器根据 Filter在 web.xml文件中的注册顺序(mapping 的配置顺序〉决定先调用那个Filter。依次调用后面的过滤器,如果没有下一个过滤器,就调用目标资源。
  • 3.代码演示
  • 写三个类实现Filter接口的方法这里只举例一个另外两个写法一样
package com.ser.com.filter;
import javax.servlet.*;
import java.io.IOException;
public class Filter01 implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("Filter01执行了");
        //放行
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("Filter01执行结束了");
    }
    @Override
    public void destroy() {
    }
}
  • web.xml中配置过滤器
<filter>
    <filter-name>filter01</filter-name>
    <filter-class>com.ser.com.filter.Filter01</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>filter01</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <filter>
    <filter-name>filter02</filter-name>
    <filter-class>com.ser.com.filter.Filter01</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>filter02</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <filter>
    <filter-name>filter03</filter-name>
    <filter-class>com.ser.com.filter.Filter01</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>filter03</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  • 运行结果
Filter01执行了
Filter02执行了
Filter03执行了
Filter03执行结束了
Filter02执行结束了
Filter01执行结束了

4.Filter的生命周期

  • Filter的创建和销毁是由web服务器负责。Web应用程序启动的时候,web服务器创建Filter的实例对象。并调用其init方法进行初始化(filter对象只会创建一次,init方法也只会执行一次)。每次filter进行拦截的时候,都会执行 doFilter的方法。当服务器关闭的时候,应用从服务器中移除的时候,服务器会销毁Filter对象。

5.FilterConfig对象

  • 1.作用:用来获取Filter的相关的配置的对象
  • 2.FilterConfig的主要方法
String filterName = filterConfig.getFilterName();//获取过滤器名称
        String initParameter = filterConfig.getInitParameter();//获取初始化参数
        Enumeration<String> initParameterNames = filterConfig.getInitParameterNames();//获取所有初始化参数的名字

6.过滤器的相关配置

  • 1.的配置
    • 完全路径匹配:以/开始比如/aaa /aaa/bbbu
    • **目录匹配: 以/开始以星号结束比如( /aaa/*) **
    • 扩展名匹配:不能以/开始以开始比如星号.jsp.do .actione
  • 2.的配置
    • 专门以servlet 的配置的名称拦截Servlet。
  • 3.的配置
    • 1.默认的情况下过滤器会拦截的是请求。dispatcher 的取值不同拦截的东西就不同
      • REQUEST:默认值。默认过滤器拦截的就是请求。
      • FORWARD:转发。
      • INCLUDE:页面包含的时候进行拦截
      • ERROR :页面出现全局错误页面跳转的时候进行拦截
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值