• JavaWeb(三)


    前言:JavaWeb的三大组件Servlet,Filter,Listener。是Java EE Web服务规定的服务器动态组件,由开发者编写,由web容器创建,加载顺序为Listener->Filter->Servlet。
    当来了一个application请求 呢么web三大组件是如何加载和初始化的呢
    在一个web应用程序中假定实现了所有的配置,服务器启动时首先要加载的是web.xml文件,从中确定整个web应用的基本配置。整个web.xml加载过程以及服务器对象创建过程如下:

    1. 启动一个WEB项目的时候,容器(如:Tomcat)会去读它的配置文件web.xml.读两个节点: 
    2. 容器创建一个ServletContext(application),这个WEB项目所有部分都将共享这个上下文,它标识一个web应用,首先在堆中分配空间,但尚未初始化。
    3. 容器将转化为键值对,并交给ServletContext。
    4. 容器创建中的类实例,并绑定需要监听的事件,对于application、session的创建来说,监听的是他们的init方法,类似于类的构造器方法,它为整个对象进行属性初始化。
    5. 容器创建过滤器实例开启对url进行过滤。
    6. 容器创建Servlet实例。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    上文咱们已经说过Servlet,这篇文章咱们就说FIlter,Listener

    Filter

    Servlet主要负责处理请求,而Filter主要负责拦截请求和放行。Filter实际上是一个接口,它定义了一套规则,等待具体的类来实现该接口,而具体的拦截操作还需要web容器来实现。
    在这里插入图片描述
    当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能,一般用于完成通用的操作比如登录验证,黑名单过滤等等。

    Filter生命周期

    1、init:在服务器启动时,会创建Filter对象,然后调用init方法。只执行一次,用于加载资源(和Servlet类似)
    2、doFilter:每一次请求被拦截资源时,会执行,可以执行多次
    3、destroy:在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法。只执行一次,用于释放资源。
    咱们举一个例子

    import javax.servlet.*;
    import javax.servlet.annotation.WebFilter;
    import java.io.IOException;
    
    @WebFilter("/*")//* 号代表拦截所有,访问所有的资源都会被过滤
    public class h0ne implements Filter {
        /**
         * 销毁方法,在tomcat结束时只执行一次
         */
        public void destroy() {
            System.out.println("销毁方法。。。。。。");
        }
    
        /**
         * 每次请求都会执行过滤方法
         * @param req
         * @param resp
         * @param chain 过滤器链
         * @throws ServletException
         * @throws IOException
         */
        public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
            //chain.doFilter(req, resp);
            System.out.println("过滤方法");
        }
    
        /**
         * 初始化方法,在Filter产生时只执行一次
         * @param config
         * @throws ServletException
         */
        public void init(FilterConfig config) throws ServletException {
            System.out.println("初始化方法,,,,,,");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    Filter拦截方式

    1、REQUEST:直接访问目标资源时执行过滤器。包括:在地址栏中直接访问、表单提交、超链接、重定向,只要在地址栏中可以看到目标资源的路径,就是REQUEST;
    2、FORWARD:转发访问执行过滤器。包括RequestDispatcher#forward()方法、jsp:forward标签都是转发访问;
    3、INCLUDE:包含访问执行过滤器。包括RequestDispatcher#include()方法、jsp:include标签都是包含访问;
    4、ERROR:当目标资源在web.xml中配置为中时,并且真的出现了异常,转发到目标资源时,会执行过滤器。

    路径拦截配置:

    1、具体资源路径: /index.jsp 只有访问index.jsp资源时,过滤器才会被执行
    2、拦截目录: /flag/* 访问/flag下的所有资源时,过滤器都会被执行
    3、后缀名拦截: *.flag 访问所有后缀名为flag资源时,过滤器都会被执行。
    4、拦截所有资源:/* 访问所有资源时,过滤器都会被执行
    
    • 1
    • 2
    • 3
    • 4

    执行过滤器的顺序:
    注解配置:按照类名的字符串比较规则比较,值小的先执行
    比如:AFilter 和 BFilter,AFilter就先执行了。
    web.xml:顺序决定于web.xml filter-mapping的顺序,在前面的先执行,后面的后执行

    Listener

    Listener也是一个接口,它需要注册,监听器中的方法,会在特殊事件发生时被调用!(本质是方法毁掉)Listener定义了监听的规则,等待实现类实现该接口,而具体的监听事务完全由web容器实现。
    比如
    事件:吃饭
    事件源:食堂(事件发生的地方)
    监听器:保安(一个对象)
    注册监听:将吃饭,食堂,保安绑定在一起。当事件源发生某一件事情时(比如打架)就会执行监听器代码(保安来啦~)

    1.ServletContext(监听Application)

    ①生命周期监听:ServletContextListener,它有两个方法,一个在出生时调用,一个在死亡时调用;

    void contextInitialized(ServletContextEvent sce):创建Servletcontext时
    void contextDestroyed(ServletContextEvent sce):销毁Servletcontext时
    
    • 1
    • 2

    ②属性监听:ServletContextAttributeListener,它有三个方法,一个在添加属性时调用,一个在替换属性时调用,最后一个是在移除属性时调用。

    void attributeAdded(ServletContextAttributeEvent event):添加属性时;
    void attributeReplaced(ServletContextAttributeEvent event):替换属性时;
    void attributeRemoved(ServletContextAttributeEvent event):移除属性时;
    
    • 1
    • 2
    • 3
    2.HttpSession(监听Session)

    ①生命周期监听:HttpSessionListener,它有两个方法,一个在出生时调用,一个在死亡时调用;

    void sessionCreated(HttpSessionEvent se):创建session时
    void sessionDestroyed(HttpSessionEvent se):销毁session时
    
    • 1
    • 2

    ②属性监听:HttpSessioniAttributeListener,它有三个方法,一个在添加属性时调用,一个在替换属性时调用,最后一个是在移除属性时调用。

    void attributeAdded(HttpSessionBindingEvent event):添加属性时;
    void attributeReplaced(HttpSessionBindingEvent event):替换属性时
    void attributeRemoved(HttpSessionBindingEvent event):移除属性时
    
    • 1
    • 2
    • 3
    3.ServletRequest(监听Request)

    ①生命周期监听:ServletRequestListener,它有两个方法,一个在出生时调用,一个在死亡时调用;

    void requestInitialized(ServletRequestEvent sre):创建request时
    void requestDestroyed(ServletRequestEvent sre):销毁request时
    
    • 1
    • 2

    ②属性监听:ServletRequestAttributeListener,它有三个方法,一个在添加属性时调用,一个在替换属性时调用,最后一个是在移除属性时调用。

    void attributeAdded(ServletRequestAttributeEvent srae):添加属性时
    void attributeReplaced(ServletRequestAttributeEvent srae):替换属性时
    void attributeRemoved(ServletRequestAttributeEvent srae):移除属性时
    
    • 1
    • 2
    • 3
    4.感知Session监听

    ①HttpSessionBindingListener监听

    在需要监听的实体类实现HttpSessionBindingListener接口
    重写valueBound()方法,这方法是在当该实体类被放到Session中时,触发该方法
    重写valueUnbound()方法,这方法是在当该实体类从Session中被移除时,触发该方法
    
    • 1
    • 2
    • 3

    ②HttpSessionActivationListener监听

    在需要监听的实体类实现HttpSessionActivationListener接口
    重写sessionWillPassivate()方法,这方法是在当该实体类被序列化时,触发该方法
    重写sessionDidActivate()方法,这方法是在当该实体类被反序列化时,触发该方法
    
    • 1
    • 2
    • 3

    参考文章:https://www.cnblogs.com/tag6254/p/9407156.html

  • 相关阅读:
    详解SpringBoot2.x前言
    多尺度分别融合方法
    从命令行管理文件(二)
    Tomcat & 创建动态web工程 & xml文件解析
    Minecraft 1.16.5 生化8 模组 2.0版本 故事书+更多枪械
    “世界首台USB-C iPhone”被拍卖,目前出价63万人民币
    什么时候运用二分搜索
    出纳商铺如何实施数字员工提高投资回报率
    Windows环境下Redis安装与配置的两种方式
    SpringMVC Day 04 : 数据绑定
  • 原文地址:https://blog.csdn.net/qq_53142368/article/details/128169002