javaWeb开发的三大组件:jsp/servlet + 过滤器Filter + 监听器Listener

监听器:

监听域对象的创建与销毁 3个

监听域对象中值状态的改变 3个

监听对象与session的关系2个

监听对象是否在session中存在

活化与钝化

过滤器:

Filter接口

过滤器的作用

过滤器如何使用

@WebFilter urlPatterns ==> String[] dispatcherTypes ==> Dispatcher[]

过滤器的生命周期

init() 初始化

doFilter() 执行过滤,切记放行!

destroy() 销毁

 

监听器(接口)

8个监听接口

第一组:用来监听域对象(ServletContext、HttpSession、HttpServletRequest)的创建与销毁          3个

第二组:用来监听域对象(ServletContext、HttpSession、HttpServletRequest)中值状态的改变     3个

第三组:用来监听对象与Session的关系,实现活化与钝化 2个

过滤器(只有一个接口,Filter)

统一编码

登录控制

 

 

一、什么是监听器?

监听器是接口,一个类实现了监听接口之后,就具备了监听某些内容的功能!

当监听的对象,比如域对象创建、销毁时,就可以捕捉到这个行为,进而在方法中完成操作!

 

监听的内容及监听器的分类:

第一组:负责监听域对象(ServletContext、HttpSession、HttpServletRequest)的创建与销毁 3个

第二组:负责监听域对象中值状态(添加、修改、删除)的改变 3个

第三组:监听对象与Session的关系1个,活化与钝化1

 

监听器机制主要服务于底层框架、servlet机制等代码中,在自定义书写的代码中有关于监听器的使用并不是特别多。

 

1、监听域对象的创建与销毁

(1)、ServletContextListener,监听ServletContext的创建与销毁

示例代码:

为了保证类具备监听的功能,实现接口后,要进行注册

以上两种方式同一时间只能存在一种!!!

a、在web.xml文件中实现注册

b、在监听器类上添加监听注解(推荐使用!)

(2)、HttpSessionListener,监听Session域对象的创建与销毁

示例代码:

 

 session对象执行了invalidate()方法,那么监听销毁的方法就会自动执行!

 (3)、ServletRequestListener,监听request域对象的创建与销毁

示例代码:

在监听的方法中,参数可以用来获取监听的域对象,进而执行操作!

切记,HttpServletRequest接口 继承了 ServletRequest接口,但是我们之前学习的有关于请求的方法都是HttpServletRequest接口中的,如果需要使用,则需要类型转换!

2、监听域对象中值状态的改变(添加、修改、删除)

(1)、ServletContextAttributeListener,监听ServletContext域对象中值状态的改变

示例代码:

jsp页面操作值的代码:

打印的结果:

(2)、HttpSessionAttributeListener,监听session域对象中值状态的改变

示例代码:

页面操作数据的方法:

打印的结果:

(3)、ServletRequestAttributeListener,监听request域对象中值状态的改变

示例代码:

页面中操作数据的方法:

打印数据的结果:

3、监听对象与Session关系

(1)   HttpSessionBindingListener,监听对象是否在session中是否存在

之前学的六个监听器,创建类实现接口,那么此类就具有了监听域对象的功能。但此时我们需要去监听对象,所以说我们应该让我们监听的对象的类来实现监听接口!

 

示例:监听学生对象是否在session中存在

创建学生类,并且让学生类实现HttpSessionBindingListener

 

jsp中操作对象的方法:

控制打印结果:

(2)、HttpSessionActivationListener,实现session的活化与钝化

钝化

当服务器正常关闭时,还存活着的session(在设置时间内没有销毁) 会随着服务器的关闭被以文件(“SESSIONS.ser”)的形式存储在tomcat 的work 目录下,这个过程叫做Session 的钝化。

 

活化

当服务器再次正常开启时,服务器会找到之前的“SESSIONS.ser” 文件,从中恢复之前保存起来的Session 对象,这个过程叫做Session的活化。

 

应用场景:

打开浏览器窗口正常访问的过程中,我们可以获取到当前会话session中的数据,比如说登录状态。由于服务器维护导致服务器正常关闭,我们的访问不能正常进行了,但我需要的是在服务器开启之后依旧可以拿到之前会话session中的数据,此时就可以使用HttpSessionActivationListener来实现session的活化与钝化。

 

测试:

先将一个对象存储在session中,然后钝化,活化之后恢复此对象的数据,查看过程。

此时我们应该让这个对象对应的类实现活化与钝化的接口。为了保证活化与钝化的成功,除了要实现HttpSessionActivationListener接口之外,还需要实现序列化接口,Serializable

public class Car implements HttpSessionActivationListener, Serializable {

 

    private static final long serialVersionUID = 1L;

    private String brand;

    private String color;

    public String getBrand() {

        return brand;

    }

    public void setBrand(String brand) {

        this.brand = brand;

    }

    public String getColor() {

        return color;

    }

    public void setColor(String color) {

        this.color = color;

    }

    public Car() {

        // TODO Auto-generated constructor stub

    }

    public Car(String brand, String color) {

        super();

        this.brand = brand;

        this.color = color;

    }

    @Override

    public String toString() {

        return "Car [brand=" + brand + ", color=" + color + "]";

    }

   

    //session钝化的方法

    @Override

    public void sessionWillPassivate(HttpSessionEvent se) {

        System.out.println("钝化");

        System.out.println(se.getSession());

        System.out.println(se.getSession().getAttribute("car"));

    }

    //session活化的方法

    @Override

    public void sessionDidActivate(HttpSessionEvent se) {

        System.out.println("活化");

        System.out.println(se.getSession());

        System.out.println(se.getSession().getAttribute("car"));

    }

}

先访问active.jsp页面,将车存入到会话session中:

再直接访问test.jsp,可以拿到车的品牌

此时正常关闭tomcat服务器,执行了钝化操作,session被以文件的形式存储在本地tomcat目录下,钝化的数据以及当前的session对象

重新启动服务器,执行活化操作,从钝化的文件中恢复之前会话中的数据,文件销毁,直接在浏览器中访问test.jsp依旧可以拿到数据。此时活化打印的数据以及session

活化与钝化时,因为tomcat服务器关闭了,就会导致会话对象的销毁,重启服务器开启了新会话,虽然会话对象发生了变化,但是数据一致即可!

二、过滤器

什么是过滤器???

一个类实现了过滤的接口,具有了过滤、筛选(请求、请求路径)的功能!Filter

 

过滤器场景:

1、设置统一编码,就是请求到达servlet与jsp之前,已经为请求对象、响应对象设置了编码格式,那么在jsp或者servlet中直接获取参数以及响应数据就可以了。

request.setCharacterEncoding(“utf-8”)

response.setContentType(“text/html;charset=utf-8”)

 

2、登录控制,我们要做到极致的话,如果没有登录,连访问页面的能力都没有!

 

过滤器的作用???

在请求到达jsp或者servlet之前,针对请求或者请求的路径进行处理,简化代码操作,更加方便。我们从一定角度出发考虑过滤器的话,可以将过滤器理解为一个工具类!

 

过滤器如何使用???

创建一个类实现过滤器的接口Filter

public class HahaFilter implements Filter {

 

    @Override

    public void init(FilterConfig filterConfig) throws ServletException {

        System.out.println("过滤器初始化");

    }

 

    @Override

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

            throws IOException, ServletException {

        System.out.println("过滤器过滤到请求");

        /*

            执行完过滤的功能代码之后,一定要将请求放行!!!

            如果哪一天,访问页面死活出不来,在排除了500及404的错误后,百分之99.9的情况就是过滤器中没有放行请求

         */

        chain.doFilter(request, response);

    }

 

    @Override

    public void destroy() {

        System.out.println("过滤器销毁");

    }

}

对创建的过滤器完成注册:

方式1,web.xml文件:

方式2,注解:

urlPatterns属性表示的是过滤器过滤的路径集合,是字符串数组,可以在数组中指定哪些路径需要过滤,哪些不需要过滤就不写在数组中!

但是要注意一个问题,web.xml文件中的注册与注解同一时间只能存在一个!!!

 

过滤器有个小bug:

过滤器默认只能过滤直接请求,过滤不了请求转发~~~

只需要在注解中添加过滤方式的属性即可:

过滤器的生命周期:

init(),当项目被tomcat加载启动服务器时,就会创建过滤器对象

doFilter(),当请求路径满足了过滤器过滤的路径条件时,就会执行过滤方法

destroy(),服务器正常关闭时会执行销毁方法

原文地址:https://www.cnblogs.com/masterhxh/p/12877702.html