Java Fileter & Java Listener 笔记

Java Fileter & Java Listener 笔记


Java Fileter

当浏览器发送请求访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能。

  • 过滤器的作用
    • 一般用于完成通用的操作。如:登陆验证、统一编码处理、敏感字符过滤

快速入门:

  1. 步骤:

    1. 定义一个类,实现接口 Fileter
    2. 复写方法
    3. 配置拦截路径
    import javax.sevrlet.Filter;		// 注意正确引包
    
    /**
     * 过滤器入门程序
     */
    @WebFilter("/*")		// 访问所有资源之前,都会执行该过滤器
    // @WebFilter("/demo.jsp")			// 只有访问 demo.jsp 的时候才会执行该过滤器
    public class FilterDemo 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("filterDemo被执行了....");
            
            // 放行
            filterChain.doFilter(servletRequest, servletResponse);
        }
        
        @Override
        public void destroy() {
            
        }
    }
    
  2. 过滤器细节:

    1. web.xml 配置

      <?xml version="1.0" encoding="UTF-8"?>
      <web-app>
          <filter>
              <filter-name>demo</filter-name>
              <filter-class>cn.itcast.web.FilterDemo</filter-class>
          </filter>
          <filter-mapping>
              <filter-name>demo</filter-name>
              <!--	拦截路径-->
              <url-pattern>/*</url-pattern>
          </filter-mapping>
          
      </web-app>
      
    2. 过滤器执行流程

       /**
     * 每一次请求被拦截资源时会执行。
        * 执行多次
        */
       @Override
       public void doFilter(ServletRequest servletRequest, 
                            ServletResponse servletResponse, 
                            FilterChain filterChain) throws IOException, ServletException {
           // 对 request 对象的请求消息增强
           System.out.println("filterDemo被执行了....");
           
           // 放行
           filterChain.doFilter(servletRequest, servletResponse);
           
           // 对 response 对象的响应消息增强
           System.out.println("filterDemo回来了....");
       }
    
    1. 过滤器生命周期方法
       /**
     * 在服务器启动后,会创建 Filter 对象,然后调用 init 方法。
        * 只执行一次,用于加载资源
        */
       @Override
       public void init(FilterConfig filterConfig) throws ServletException {
               System.out.println("init....");
       }
    
    /**
    * 在服务器关闭后,filter 对象被销毁。如果服务器时正常关闭,则会执行 destroy 方法。
     * 只执行一次,用于释放资源
     */
    @Override
    public void destroy() {
        System.out.println("destroy....");
    }
    
    1. 过滤器配置详解
    • 拦截路径的配置

      拦截类型字段解释
      具体的资源路径/index.jsp只有访问 index.jsp 资源时,过滤器才会执行
      目录拦截/user/*访问 /user 下的所有资源时,过滤器都会被执行
      后缀名拦截*.jsp访问所有后缀名为 jsp 的资源时,过滤器都会被执行
      拦截所有资源/*访问所有资源时,过滤器都会被执行
      • 拦截方式的配置

      资源被访问的方式

      • 注解配置:

        字段描述
        REQUEST默认值。浏览器直接请求资源
        FORWARD转发访问资源
        INCLUDE包含访问资源
        ERROR错误跳转资源
        ASYNC异步访问资源
        • 设置 dispatcherType 属性
           // 浏览器直接请求资源时,该过滤器会被执行
        @WebFilter(value = "/*", dispatcherType = DispatcherType.REQUEST)
        
        • web.xml 配置
           <filter-mapping>
            <filter-name>demo</filter-name>
               <!--	拦截路径 -->
               <url-pattern>/*</url-pattern>
               <!--	加入 dispatcher 标签 -->
               <dispatcher>REQUEST</dispatcher>
           </filter-mapping>
        
    1. 过滤器链(配置多个过滤器)
    • 执行顺序

      • 如果有两个过滤器(过滤器 1 和过滤器 2)

        Request
        Request
        Request
        Response
        Response
        Response
        浏览器
        过滤器 1
        过滤器 2
        资源执行
        过滤器 2
        过滤器 1
      • 过滤器先后问题

        • 注解配置

          • 按照类名的字符串的比较规则比较,值小的先执行

            • 如 AFilter 和 BFilter

              /**
               * 先比较靠前的,若一样则往后逐次移位比较。
               * 那么这次的比较在第一个字符就出结果了,即:
               */
              String X = new ["A","F","i","l","t","e","r"];
              String Y = new ["B","F","i","l","t","e","r"];
              X[0] > Y[0] ? Y[0] : X[0] == Y[0] ? X[1] > Y[1] ? ... X[0];
              
        • web.xml配置

          • 谁的<filter-mapping>定义在上边谁先执行

Java Listener

  • 事件监听机制

    • 事件:一件事情
    • 事件源:事件发生的地方
    • 监听器:一个对象
    • 注册监听:将事件、事件源、监听器绑定在一起。当事件源上发生某个事件的时候,执行监听器代码
  • ServletContextListener(监听 ServletContext 对象的创建和销毁)

    • 方法:

      /**
       * ServletContext对象被销毁之前会调用该方法
       */
      void contextDestroyed(ServletContextEvent sce);
      
      /**
       * ServletContext对象创建后会调用该方法
       */
      void contextInitialized(ServletContextEvent sce);
      
    • 步骤:

      1. 定义一个类,实现ServletContextListener接口

        @WebListener
        public class ContextLoaderListener implements ServletContextListener {
            /**
             * 监听 ServletContext 对象创建的。ServletContext 对象服务器启动后自动创建。
             * 
             * 在服务器启动后自动调用
             */
            @Override
        	public void contextDestroyed(ServletContextEvent servletContextEvent) {
                // 加载资源文件
                // 1. 获取 ServletContext 对象
                ServletContext servletContext = servletContextEvent.getServletContext();
                // 2. 加载资源文件
                String initParameter = servletContext.getInitParameter("contextConfigLocation");
                // 3. 获取真实路径
                String realPath = servletContext.getRealPath("contextConfigLocation");
                // 4. 加载进内存
                try {
                    FileInputStream fileInputStream = new FileInputStream(realPath);
                    System.out.println(fileInputStream);
                } catch (Exception e){
                    e.printStackTrace();
                }
            }
            
        	/**
             * 在服务器关闭后,ServletContext 对象被销毁。当服务器正常关闭后该方法被调用。
             */
            @Override
        	public void contextInitialized(ServletContextEvent servletContextEvent) {
                
            }
        }
        
      2. 复写方法

        @Override
        public void contextDestroyed(ServletContextEvent servletContextEvent) {
            System.out.println("ServletContext对象被创建了....");
        }
        
        @Override
        public void contextInitialized(ServletContextEvent servletContextEvent) {
            System.out.println("ServletContext对象被销毁了....");
        }
        
      3. 配置

        • web.xml配置方式

          <?xml version="1.0" encoding="UTF-8"?>
          <web-app>
              <listener>
              	<listener-class>cn.itcast.web.ContextLoaderListener</listener-class>
              </listener>
              
              <!--	指定初始化参数-->
              <context-param>
              	<param-name>contextConfigLocation</param-name>
              	<param-value>/WEB-INF/classes/applicationContext.xml</param-value>
              </context-param>
              
          </web-app>
          
        • 注解配置方式

          @WebListener
          public class ContextLoaderListener implements ServletContextListener { ... }
          
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值