zoukankan      html  css  js  c++  java
  • 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(),服务器正常关闭时会执行销毁方法

  • 相关阅读:
    使用AOP 实现Redis缓存注解,支持SPEL
    springmvc 双亲上下文导致的 No mapping found for HTTP request
    调用iframe 中的js[兼容各种浏览器]
    NIO学习:异步IO实例
    byte数组与对象之间的相互转换
    NIO学习:buffer读入与写出(文件复制示例)
    NIO学习:使用Channel、Buffer写入文件
    使用摘要流获取文件的MD5
    ActiveMQ入门实例
    获取java项目 classpath目录
  • 原文地址:https://www.cnblogs.com/masterhxh/p/12877702.html
Copyright © 2011-2022 走看看