JavaWeb(三)

news2024/12/26 23:49:49

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

1. 启动一个WEB项目的时候,容器(如:Tomcat)会去读它的配置文件web.xml.读两个节点: <listener></listener> 和 <context-param></context-param>
2. 容器创建一个ServletContext(application),这个WEB项目所有部分都将共享这个上下文,它标识一个web应用,首先在堆中分配空间,但尚未初始化。
3. 容器将<context-param></context-param>转化为键值对,并交给ServletContext。
4. 容器创建<listener></listener>中的类实例,并绑定需要监听的事件,对于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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/58938.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一文读懂Java中的String类之助力Java进阶之路

&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d; &#x1f947;博主昵称&#xff1a;Jovy. &#x1f35f;博客主页…

以太网 TCP协议(三次握手、四次挥手)

2.7.0 以太网 TCP协议&#xff08;三次握手、四次挥手&#xff09; 传输控制协议&#xff08;TCP&#xff0c;Transmission Control Protocol&#xff09;是一种面向连接的、可靠的传输层通信协议。 面向连接&#xff1a;指使用TCP协议的程序在使用的时候&#xff0c;需要预先进…

PLC远程维护解决方案

一、方案背景&#xff1a;随着工业4.0大力推动智能制造&#xff0c;完善的售后维护和技术服务逐步被各设备厂商所重视&#xff0c;服务将成为企业新的利益增长点&#xff0c;传统的售后服务已经远远不能满足客户需求&#xff0c;甚至给公司带来一定的经营成本和维护成本的压力&…

volatile与Java内存模型

volatile与Java内存模型 被volatile修改的变量有2大特点 特点 可以保证 1.可见性 2.有序性 还是那张图&#xff0c;volatile只能保证可见性和有序性 那为什么volatile可以实现这些功能呢 volatile的内存语义 当写一个volatile变量时&#xff0c;JMM会把该线程对应的本地…

# 智慧社区管理系统-基础信息管理-05车位管理

一后端 1:entuty package com.woniu.community.entity;import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;Data AllArgsConstructor NoArgsConstructor public class Parking {private int id;private String numbers;//车位号private…

SQL 专项笔记

SQL语句分类 1.DDL 数据库定义语言 主要是用于来操作数据库 以及数据库表 关键字 alter drop create truncate DQL 数据库查询语言 主要是用于操作数据库表 主要用于查询数据库中的数据 关键字 selectDML 数据库操纵语言 主要是用于操作数据库中数据表 主要是对数据进行 增加…

Sequence和Item

一、概述 sequence指的是uvm_sequence类&#xff0c;而item指的是uvm_sequence_item类。对于激励生成和场景控制&#xff0c;是由sequence来编织的&#xff0c;而对于激励所需要的具体数据和控制要求&#xff0c;则是从item的成员数据得到的。 二、Sequence Item介绍 item是基…

【前端设计】SDC中生成时钟create_generated_clock语法解析

我们的目标是┏ (゜ω゜)=☞芯片前端全栈工程师~喵! 前言 好久没有写前端设计系列的博客了,这次因为要在系统里加入时钟分频器因此复习一下sdc中关于生成时钟的约束语法,以下内容来自《综合与时序分析的设计约束》和一些自己的理解。 生成时钟 在sdc约束中,由端口输入的…

JavaScript -- 07. 面向对象编程

文章目录面向对象编程1 面向对象编程介绍2 类3 属性4 方法5 构造函数6 封装7 多态8 继承9 对象的内存结构10 原型10.1 原型链10.2 原型的作用&#xff1a;11 修改原型12 instanceof和hasOwn12.1 instanceof12.2 in12.3 hasOwnProperty12.4 hasOwn13 旧类14 new运算符面向对象编…

用上了mac才知道的一些事,献给Mac新手

以前电脑用windows&#xff0c;工作后刚用上mac&#xff0c;发现很多使用逻辑挺让人感觉新奇&#xff0c;甚至摸不着头脑,下面一一列举&#xff0c;帮助想要入手Mac的新手&#xff01; 1、鼠标滚轮的逻辑和Windows相反。 Mac上滚动鼠标控制页面上下滚动的逻辑和Windows刚好相…

使用 Learner Lab - 使用 S3 静态网页上传图片,搭配 API Gateway 与 Lambda

使用 Learner Lab - 使用 S3 静态网页上传图片&#xff0c;搭配 API Gateway 与 Lambda AWS Academy Learner Lab 是提供一个帐号让学生可以自行使用 AWS 的服务&#xff0c;让学生可以在 100 USD的金额下&#xff0c;自行练习所要使用的 AWS 服务&#xff0c;如何进入 Learne…

分割研究~~总结

搬来了基于实例分割的最新进展和发展历程&#xff0c;首先介绍了实例分割的基本逻辑,总结了目前主要研究方法及其原理和网络架构&#xff0c;对已发表的主流实例分割方法进行分析&#xff0c;最后对实例分割任务目前面临 的问题以及未来的发展趋势做出了分析,并针对所面临的问题…

磨金石教育插画干货分享|日本插画为什么独树一帜,那么受欢迎

插画的起源很早&#xff0c;在人类诞生文明的初级阶段&#xff0c;就有了岩画与壁画。在古典文明时代&#xff0c;中国印刷行业有了较大的发展&#xff0c;与之伴随的就是插画的长足发展。中国文化对日本起到了极大的影响。 在插画领域也是如此&#xff0c;客观的说&#xff0c…

CCF走进高校

CCF走进高校&#xff08;山东大学-人机专委&#xff09; 陶建华 人工智能与智能交互 人工智能的能力体系 感知智能&#xff1a;发展较快&#xff0c;人机交互场景运用较多&#xff1b; 认知智能&#xff1a;发展相对不成熟。 此外&#xff0c;专用智能领域发展较快&#xff0…

shell编程(一)

shell 简介 Shell 是一个用 C 语言编写的程序,一般我们说的shell编程&#xff0c;是指编写shell脚本。 Shell 负责完成用户与内核之间的交互&#xff08;shell是一个命令解释器&#xff0c;负责将用户的命令解析成操作系 统所能理解的指令&#xff09; 第一个shell脚本 创建…

Vue刷新后页面数据丢失问题的解决过程

在做vue项目的过程中有时候会遇到一个问题,就是进行F5页面刷新的时候,页面的数据会丢失,这篇文章主要给大家介绍了关于Vue刷新后页面数据丢失问题的解决过程,需要的朋友可以参考下&#xff01; 一、为什么刷新后数据会丢失 vuex存储的数据只是在页面中&#xff0c;相当于全局变…

[附源码]计算机毕业设计学习帮扶网站设计与实现Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Linux文件系统调用接口文件描述符的理解

&#x1f9f8;&#x1f9f8;&#x1f9f8;各位大佬大家好&#xff0c;我是猪皮兄弟&#x1f9f8;&#x1f9f8;&#x1f9f8; 文章目录一、对系统调用进行封装的理由二、文件的系统调用接口① openopen的选项--位图open的权限程序中设置umask权限掩码②close③write④read三、…

字节输入流【InputStream】(读文件)

字节输入流【InputStream】 java.io.InputStream 抽象类是表示字节输入流的所有类的超类&#xff0c;可以读取字节信息到内存中。它定义了字节输入流的基本共性功能方法。 public void close(): 关闭此输入流并释放与此流相关联的任何系统资源。 public abstract int read(): …

Telegraf

Telegraf是什么&#xff1f; Telegraf 是 InfluxData 公司开源的一款十分流行的指标采集软件&#xff0c;可以从数据库、系统和物联网传感器收集和发送度量和事件&#xff0c;它用Go编写&#xff0c;编译成一个没有外部依赖的二进制文件–需要非常少的内存&#xff0c;相…