• java web(五):java web三大组件之另外两个和八大监听器


      java的三大组件指Servlet、Filter、Listener。八大监听器指八个接口。前面介绍了Servlet,现在介绍一下Filter拦截器以及拦截地址的设置,

    Listener监听那些事件。

      java web的cookie和session机制有篇博客讲的很好,有兴趣的博友可以去看看。地址:https://www.cnblogs.com/whgk/p/6422391.html


     一:Filter

      1.基本概念

        Filter称之为过滤器,是用来做一些拦截的任务, 在Servlet接受请求之前,做一些事情,如果不满足限定,可以拒绝进入Servlet。

        

        一个web项目中可以配置多个filter过滤器,浏览器访问静态资源如html、jsp、css或者访问动态资源servlet都会经过filter过滤器,满足条件,过滤器放行,否则直接返回。

      2.使用

        filter有很多用处,网上一搜,在filter层,来获取用户的身份,可以考虑在filter层做一些常规的校验(如参数校验,referer校验等),可以在filter层做

      稳定性相关的工作(如全链路打点,可以在filter层分配一个traceId;也可以在这一层做限流等)。我最常见的是spring中的编码过滤器。我们通过编码过滤器认识filter。

        代码:

    package com.briup.servlet.filter;
    
    import java.io.IOException;
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    
    /**
     * Servlet Filter implementation class EncodingFilter
     * 编码过滤器
     */
    public class EncodingFilter implements Filter {
    
        private String encoding;
        
        public EncodingFilter() {}
    
        public void destroy() {}
    
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
                throws IOException, ServletException {
            //设置编码格式【只对post方式有效】;
            request.setCharacterEncoding(encoding);
            response.setCharacterEncoding(encoding);
            //放行;
            chain.doFilter(request, response);
            
            System.out.println("servlet执行完毕,返回到filter");
        }
    
        
        public void init(FilterConfig fConfig) throws ServletException {
            //我们把编码设置在web.xml中,如果需要改编码在配置文件中更改而不需要更改代码
            encoding = fConfig.getInitParameter("encoding");
        }
    
    }

      web.xml:

    <filter>
        <display-name>EncodingFilter</display-name>
        <filter-name>EncodingFilter</filter-name>
        <filter-class>com.briup.servlet.filter.EncodingFilter</filter-class>
        <init-param>
          <param-name>encoding</param-name>
          <param-value>utf-8</param-value>
        </init-param>
      </filter>
      <filter-mapping>
        <filter-name>EncodingFilter</filter-name>
        <!-- /* 代表拦截所有请求 -->
        <url-pattern>/*</url-pattern>
      </filter-mapping>

     访问:http://127.0.0.1:7778/StudyServlet/HelloWorld或者http://127.0.0.1:7778/StudyServlet/success.html,控制台都会输出一句:"servlet执行完毕,返回到filter"。

      

    3.拦截地址的配置

        filter我主要想说的就是拦截地址如何配置了。    

    第一种 【匹配任意】

        <url-pattern>/*</url-pattern> 

    第二种 【精确匹配】

        <url-pattern>/test_servlet</url-pattern>

        表示此拦截器只会拦截/test_servlet这一个路径

    第三种 【扩展名匹配】

              <url-pattern>*.html</url-pattern>

              表示此拦截器只会拦截后缀名是.html的路径

    第四种 【路径匹配】

              <url-pattern>/test/*</url-pattern>

               表示此拦截器拦截/test路径下的所有资源

    注意:服务器内部跳转不会拦截,只会拦截浏览器发送的地址。

    二:监听器

      Servlet监听器的作用是监听Web容器的有效期事件,可以监听由于Web应用中状态改变而引起的Servlet容器产生的相应事件,然后接受并处理这些事件。

      下面简单介绍这8个接口和其中的方法。

      监听ServletContent(应用上下文)

         1.ServletContentListener接口  

          Servlet的上下文监听,它主要实现监听ServletContext的创建和删除

            (1)contextInitialized(ServletContextEvent event); //通知正在收听的对象,应用程序已经被加载和初始化。

            (2)contextDestroyed(ServletCotextEvent event);  // 通知正在收听的对象,应用程序已经被载出,即关闭。

        2.ServletContextAttributeListener接口

          应用上下文存、移除、更改数据进行监听。

            (1)attributeAdded(ServletContextAttributeEvent event); //应用上下文存数据的时候触发【调用setAttribute方法】

            (2)attributeRemoved(ServletContextAttributeEvent event); //ServletContent对象调用removeAttribute方法触发。

            (3)attributeReplaced(ServletContextAttributeEvent event);  //当存数据的时候,key值已经存在,value值被替换的时候触发。

      

      监听session接口

        3.HttpSessionListener接口

          (1)sessionCreated(HttpSessionEvent even); //session被创建的时候触发。

          (2)sessionDestroyed(HttpSessionEvent event); //session过期失效触发

        4.HttpSessionAttributeListener

          用法和ServletContextAttributeListener接口类似。

      

      监听request接口

        5.ServletRequestListener

        6.ServletRequestAttributeListener

      用法和上面类似。

      7.HttpSessionActivationListener;        
         该接口实现监听HTTP会话active和passivate。
                         (1)attributeAdded(HttpSessionBindingEvent event); // 当有对象加入session的范围时,通知正在收听的对象
                         (2)attributeReplaced(HttpSessionBindingEvent event); //当在session的范围有对象取代另一个对象时,通知正在收听的对象。
                         (3)attributeRemoved(HttpSessionBindingEvent event);  //当有对象从session的范围有对象取代另一个对象时,通知正在收听的对象 。

        其中HttpSessionBindingEvent类主要有三个方法:getName()、getSession()和getValue()

      8.HttpBindingListener;                     
        接口实现监听HTTP会话中对象的绑定信息。
                      (1)alueBound(HttpSessionBindingEvent event);   //当有对象加入session的范围时会被自动调用
                      (2)valueUnBound(HttpSessionBindingEvent event);  //当有对象从session的范围内移除时会被自动调用

    注:本文一部分是参考网上资料的。

  • 相关阅读:
    pyhon学习日记第八天tkinter模块6
    python学习日记第八天tkinter模块5
    python学习日记第七天tkinter模块4
    python学习日记第七天tkinter模块3
    python学习日记第六天tkinter模块2
    python学习日记第六天tkinter模块学习1
    python学习日记第五天(飞机大战)
    python学习日记第四天
    python学习日记第三天(实例)
    Demo Nec
  • 原文地址:https://www.cnblogs.com/yangji0202/p/10554173.html
Copyright © 2020-2023  润新知