JavaWeb(三)
创始人
2024-03-16 01:24:18
0

前言: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实例。

上文咱们已经说过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("初始化方法,,,,,,");}
}

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、拦截所有资源:/* 访问所有资源时,过滤器都会被执行

执行过滤器的顺序:
注解配置:按照类名的字符串比较规则比较,值小的先执行
比如: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时

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

void attributeAdded(ServletContextAttributeEvent event):添加属性时;
void attributeReplaced(ServletContextAttributeEvent event):替换属性时;
void attributeRemoved(ServletContextAttributeEvent event):移除属性时;

2.HttpSession(监听Session)

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

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

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

void attributeAdded(HttpSessionBindingEvent event):添加属性时;
void attributeReplaced(HttpSessionBindingEvent event):替换属性时
void attributeRemoved(HttpSessionBindingEvent event):移除属性时

3.ServletRequest(监听Request)

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

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

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

void attributeAdded(ServletRequestAttributeEvent srae):添加属性时
void attributeReplaced(ServletRequestAttributeEvent srae):替换属性时
void attributeRemoved(ServletRequestAttributeEvent srae):移除属性时

4.感知Session监听

①HttpSessionBindingListener监听

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

②HttpSessionActivationListener监听

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

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

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【Ctfer训练计划】——(三... 作者名:Demo不是emo  主页面链接:主页传送门 创作初心ÿ...