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中的值;

      

 

 

   

 

posted @ 2022-04-05 07:59  耗喜天涯  阅读(46)  评论(0编辑  收藏  举报