• Filter 、Proxy 与 Listener


    01. Filter

      a. Filter 是一个接口,需要写一个类实现这个接口

        > 接口: javax.servlet 下的 Filter;

        > 在 doFilter中实现过滤,并将符合条件的请求放行:

          >> filterChain.doFilter(servletRequest,servletResponse);

      b. 拦截路径配置

        1. 注解方式

          @WebFilter("/*")

        2. web.xml配置

          

      c. 最简易过滤器下的异常及处理

       > 新建一个 Filter实现类,重载 Filter

       > 启动服务时发现异常

        

       > 异常点识别

        

         > 注释掉默认的 super 调用

        

       d. 过滤器的生命周期

        > 一个过滤器,在实现接口时,有三个接口需要实现;

          

        > init: 在服务启动后会被自动加载,执行一次;一般用于资源的加载;

        > destroy: 在服务正常关闭销毁时,会自动执行一次;一般用于资源的释放;

        > doFilter: 过滤处理,可以执行多次;基于配置的拦截路径,有业务请求时,都会执行;

       e. 过滤器的执行流程

        

       f. 过滤器配置详解

        1. 拦截路径的配置

          a. 具体资源路径的拦截:   /index.jsp    >>  只有访问 index.jsp期间资源时,过滤器才会被执行;

          b. 目录拦截:   /user/*   访问/user下的所有资源时,过滤器都会被执行;

          c. 后缀名拦截: *.jsp   访问所有后缀名为 .jsp 的资源时,过滤器都会被拦截;

          d. 拦截所有资源:  /*   访问所有资源时,过滤器都会被执行;

        2. 拦截方式配置: 资源被访问的方式

          > 注解配置:

            * 设置 DispatcherType 属性;

              a. REQUEST: 默认值;浏览器直接请求资源;

              b. FORWARD: 转发访问资源;

              c. INCLUDE: 包含访问资源;

              d. ERROR:  错误跳转资源;

              f. ASYNC: 异步访问资源;

            * web.xml配置

               需要配置 <dispatcher>  DispatcherType五种选择 </dispatcher> 标签即可;

      g: 过滤器链( 多个过滤器)

        > 执行顺序:  过滤器1执行 > 过滤器2执行 > 资源执行  > 过滤器2执行 > 过滤器1执行    

        > 多个过滤器执行先后问题

          * 注解配置方式:  按照类名的字符串比较规则比较,值小的先执行;

          * web.xml 配置: <filter-mapping> 谁定义在上边,谁先执行;      

    2.代理

      

     1 public static void main(String[] args) {
     2         //01.创建真实对象
     3         ASUS asus = new ASUS();
     4         //02.创建代理对象
     5         SalePC proxyInstance = (SalePC) Proxy.newProxyInstance(//
     6                 asus.getClass().getClassLoader(),//
     7                 asus.getClass().getInterfaces(),//
     8                 //代理对象调用的所有方法都会调用这个方法
     9                 new InvocationHandler() {
    10                     @Override
    11                     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    12                         //识别方法
    13                         if("Sale".equalsIgnoreCase(method.getName())){
    14                             //参数增强
    15                             Double p = (Double) args[0];
    16                             p = p*0.8;
    17                             System.out.println("方法体增强:专车接你...");
    18                             //传递的是处理后的参数,不再是原参数
    19                             String invoke = (String) method.invoke(asus, p);
    20                             System.out.println("方法体增强:专车送货...");
    21                             //增强返回
    22                             invoke = "结果增强: "+ invoke+"_赠送鼠标键盘及鼠标垫";
    23                             return invoke;
    24                         }else{
    25                             Object invoke = method.invoke(asus, args);
    26                             return invoke;
    27                         }
    28                     }
    29                 });
    30         //03.执行
    31         proxyInstance.Show();
    32         String sale = proxyInstance.Sale(8000);
    33         System.out.println(sale);
    34 
    35     }

     3. 监听Listener  

      a. 概念:  web的三大组件之一

        * 事件监听机制

          * 事件:一个事情;

          * 事件源:事件发生的地方;

          * 监听器: 一个对象

          * 注册监听: 将事件、事件源、监听器绑定在一起;当事件源上发生某个事件后,执行监听器代码;

      b. ServletContextListener: 监听ServletContext对象的创建与销毁

        * void contextDestroyed(ServletContextEvent sce):  ServletContext 对象被销毁前调用本方法;

        * void contextInitalized(ServletContextEvent sce): ServletContext 对象创建后会调用该方法;

      c. 在 contextInitalized 函数中,主要用来加载全局资源,服务一启动就将被加载;

      d. 新建监听类实现接口监听,

        

       f. 参数配置:

        监听配置(web.xml):

          

         注解方式:

          直接配置:  @WebListener

         初始化资源配置: 代码中可通过  String s = context.getInitParameter("initFile"); 读取到 param-value中的值;

          

       

  • 相关阅读:
    BZOJ3238 [Ahoi2013]差异 SA+单调栈
    BZOJ2754 [SCOI2012]喵星球上的点名 SA+莫队+树状数组
    Luogu P3251 [JLOI2012]时间流逝 期望dp
    Luogu P3962 [TJOI2013]数字根 st
    BZOJ3619 [Zjoi2014]璀灿光华 构造+dfs
    Codeforces 990G 点分治+暴力
    express基础项目创建
    Node.js 中使用 ES6 中的 import / export 的方法大全
    bootstrap 辅助工具
    python实现FTP服务器
  • 原文地址:https://www.cnblogs.com/jieling/p/16101236.html
Copyright © 2020-2023  润新知