java中的Servlet对象生命周期以及过滤器监听器

news2024/10/5 17:24:05

review:

  1. Servlet生命周期中的初始化方法: init() , init(config)
    public void init(ServletConfig config) throws ServletException {
    this.config = config ;
    init();
    }
    因此,如果我们需要在初始化时执行一些自定义的操作,那么我们可以重写无参的init方法。
    我们可以通过getConfig()获取ServletConfig对象
    可以通过config.getInitParameter()获取初始化参数

  2. 通过ServletContext获取配置的上下文参数

  3. MVC : V:view 视图 ; C:Controller 控制器 ; M:Model 模型
    模型有很多种类:数据访问模型(DAO);业务逻辑模型(BO);值对象模型(POJO);数据传输对象(DTO)
    在这里插入图片描述

  4. IOC
    IOC - 控制反转 / DI - 依赖注入
    控制反转:

    1. 之前在Servlet中,我们创建service对象 , FruitService fruitService = new FruitServiceImpl();
      这句话如果出现在servlet中的某个方法内部,那么这个fruitService的作用域(生命周期)应该就是这个方法级别;
      如果这句话出现在servlet的类中,也就是说fruitService是一个成员变量,那么这个fruitService的作用域(生命周期)应该就是这个servlet实例级别
    2. 之后我们在applicationContext.xml中定义了这个fruitService。然后通过解析XML,产生fruitService实例,存放在beanMap中,这个beanMap在一个BeanFactory中
      因此,我们转移(改变)了之前的service实例、dao实例等等他们的生命周期。控制权从程序员转移到BeanFactory。这个现象我们称之为控制反转

    依赖注入:

    1. 之前我们在控制层出现代码:FruitService fruitService = new FruitServiceImpl();
      那么,控制层和service层存在耦合。
    2. 之后,我们将代码修改成FruitService fruitService = null ;
      然后,在配置文件中配置:


今日内容:
1. 过滤器Filter
2. 事务管理(TransactionManager、ThreadLocal、OpenSessionInViewFilter)
3. 监听器(Listener , ContextLoaderListener)

  1. 过滤器Filter
  1. Filter也属于Servlet规范
  2. Filter开发步骤:新建类实现Filter接口,然后实现其中的三个方法:init、doFilter、destroy
    配置Filter,可以用注解@WebFilter,也可以使用xml文件
  3. Filter在配置时,和servlet一样,也可以配置通配符,例如 @WebFilter(“*.do”)表示拦截所有以.do结尾的请求
  4. 过滤器链
    1)执行的顺序依次是: A B C demo03 C2 B2 A2
    2)如果采取的是注解的方式进行配置,那么过滤器链的拦截顺序是按照全类名的先后顺序排序的
    3)如果采取的是xml的方式进行配置,那么按照配置的先后顺序进行排序
  1. 事务管理

    1. 涉及到的组件:
    • OpenSessionInViewFilter
    • TransactionManager
    • ThreadLocal
    • ConnUtil
    • BaseDAO
    1. ThreadLocal
    • get() , set(obj)
    • ThreadLocal称之为本地线程 。 我们可以通过set方法在当前线程上存储数据、通过get方法在当前线程上获取数据
    • set方法源码分析:
      public void set(T value) {
      Thread t = Thread.currentThread(); //获取当前的线程
      ThreadLocalMap map = getMap(t); //每一个线程都维护各自的一个容器(ThreadLocalMap)
      if (map != null)
      map.set(this, value); //这里的key对应的是ThreadLocal,因为我们的组件中需要传输(共享)的对象可能会有多个(不止Connection)
      else
      createMap(t, value); //默认情况下map是没有初始化的,那么第一次往其中添加数据时,会去初始化
      }
      -get方法源码分析:
      public T get() {
      Thread t = Thread.currentThread(); //获取当前的线程
      ThreadLocalMap map = getMap(t); //获取和这个线程(企业)相关的ThreadLocalMap(也就是工作纽带的集合)
      if (map != null) {
      ThreadLocalMap.Entry e = map.getEntry(this); //this指的是ThreadLocal对象,通过它才能知道是哪一个工作纽带
      if (e != null) {
      @SuppressWarnings(“unchecked”)
      T result = (T)e.value; //entry.value就可以获取到工具箱了
      return result;
      }
      }
      return setInitialValue();
      }
  2. 监听器

    1. ServletContextListener - 监听ServletContext对象的创建和销毁的过程

    2. HttpSessionListener - 监听HttpSession对象的创建和销毁的过程

    3. ServletRequestListener - 监听ServletRequest对象的创建和销毁的过程

    4. ServletContextAttributeListener - 监听ServletContext的保存作用域的改动(add,remove,replace)

    5. HttpSessionAttributeListener - 监听HttpSession的保存作用域的改动(add,remove,replace)

    6. ServletRequestAttributeListener - 监听ServletRequest的保存作用域的改动(add,remove,replace)

    7. HttpSessionBindingListener - 监听某个对象在Session域中的创建与移除

    8. HttpSessionActivationListener - 监听某个对象在Session域中的序列化和反序列化

  3. ServletContextListener的应用 - ContextLoaderListener

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

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

相关文章

简单易用又功能强大,来看看Postman接口测试工具怎么用?

一、Postman介绍 Postman官网上这样介绍它:"Manage all of your organizations APIs in Postman, with the industrys most complete API development environment."看的出来Postman是功能强大的API测试的工具 Postman 提供功能强大的 Web API 和 HTTP 请求的调试&a…

【C++】 类练习---封装链表、人物移动

目录 前言 正文 结构体和类的区别 练习1:封装链表 用类封装链表的注意事项 定义一个链表的节点结构 链表类代码 主函数 运行结果 练习2:人物移动 说明 头文件以及宏 人物类 主函数 运行结果 结语 前言 在学完了【C】 类基础汇总&#x…

Java多线程---线程的创建(Thread类的基本使用)

本文主要介绍Java多线程的相关知识, Thread的创建, 常用方法的介绍和使用, 线程状态等. 文章目录 前言 一. 线程和Thread类 1. 线程和Thread类 1.1 Thread类的构造方法 1.2 启用线程的相关方法 2. 创建第一个Java多线程程序 3. 使用Runnable对象创建线程 4. 使用内部类…

【Java笔试强训 31】

🎉🎉🎉点进来你就是我的人了博主主页:🙈🙈🙈戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔🤺🤺🤺 目录 一、选择题 二、编程题 🔥美国节日…

数组传参不理解?(数组传参的本质)

在我们编写程序时,经常需要传递参数给函数,其中一种常见的参数类型就是数组。数组作为一种数据结构,可以存储多个相同类型的数据元素,并按照一定的顺序排列。在函数中传递数组参数,可以方便地对数组进行操作处理。但是…

StarCoder - 源代码大模型

StarCoder 是一种在源代码和自然语言文本上训练的语言模型 (LM)。 它的训练数据包含 80 多种不同的编程语言以及从 github 问题和提交以及笔记本中提取的文本。 StarCoder 是在 github 代码上训练的,因此它可以用来执行代码生成。 更准确地说,模型可以完…

手术麻醉系统源码——业务流程介绍

采用计算机和通信技术,实现监护仪、麻醉机、呼吸机、输液泵等设备输出数据的自动采集,采集的数据能够如实准确地反映患者生命体征参数的变化,并实现信息高度共享,根据采集结果,综合其他患者数据,自动生成手…

在springboot项目中配置数据库下划线命名映射为java的驼峰命名时出错

问题 在使用spirngboot集成mybaits的时候,想要开启命名映射,如图配置 # mybatis配置 mybatis:type-aliases-package: com.zhong.springcloud.pojoconfig-location: classpath:mybatis/mybatis-config.xmlmapper-locations: classpath:mybatis/mapper/*…

4年外包出来,5次面试全挂....

我的情况 大概介绍一下个人情况,男,毕业于普通二本院校非计算机专业,18年跨专业入行测试,第一份工作在湖南某软件公司,做了接近4年的外包测试工程师,今年年初,感觉自己不能够再这样下去了&…

深入理解二分类和多分类CrossEntropy Loss和Focal Loss

深入理解二分类和多分类CrossEntropy Loss和Focal Loss 二分类交叉熵 在二分的情况下,模型最后需要预测的结果只有两种情况,对于每个类别我们的预测得到的概率为 p p p和 1 − p 1-p 1−p,此时表达式为( 的 log ⁡ \log log底数…

如何用ChatGP协助你,从品牌角度对产品提出升级建议?

该场景对应的关键词库(19个): 品牌洋葱图思维模型、产品信息、人群、品类、属性、体验、差异化特征、功效、品牌价值主张、目标用户、需求、痛点、爽点、消费者、外观、功能、结构、产品优化建议、产品开发可行性。 提问模板(3个&#xff09…

《Vue.js 设计与实现》—— 01 权衡的艺术

书籍链接:https://weread.qq.com/web/bookDetail/c5c32170813ab7177g0181ae 框架设计里到处都体现了权衡的艺术。 当我们设计一个框架时,框架本身的各个模块之间并不是相互独立的,而是相互关联、相互制约的。 作为框架设计者,一…

Windows10安装免安装版redis

下载 官方下载地址:github.com/MicrosoftAr…选择版本 解压安装 配置环境变量&注册成服务 配置环境变量 以管理员启动命令行,在redis安装根目录,把redis注册服务 redis-server --service-install redis.windows-service.conf --lo…

Communications chemisty|德睿智药工作-用于分子性质预测的药物约束异构图Transformer模型

德睿智药的分子性质预测任务 题目: Pharmacophoric-constrained heterogeneous graph transformer model for molecular property prediction 文献来源:COMMUNICATIONS CHEMISTRY | (2023) 6:60 | 代码:https://github.com/stardj/PharmHG…

springboot+dubbo+zookeeper 项目实战

现在有一段代码再前台,后台系统中都存在,都需要这段代码,存在这种情况,我们可以选择将这段代码提取出来作为一个服务,让前台和后台系统作为消费者远程调用这段代码,提高了代码的复用性。 springboot集成dub…

Unity Audio -- (2)创建动态音效

评估场景需求 本节的目标是添加脚步声到角色身上,当角色走路时,触发动画事件并播放声音。 脚步声是我们在真实世界中常常被我们所忽视的声音,但脚步声能够传达出许多环境信息。你现在可以花一小段时间绕着你周围的环境走一走并仔细听听脚步声…

CLIP : Learning Transferable Visual Models From Natural Language Supervision

CLIP : Learning Transferable Visual Models From Natural Language Supervision IntroductionApproach Introduction 在raw的数据上自监督的训练模型,已经在NLP领域取得了革命性进展,这种模型需要收到硬件、数据的限制,但是能得到很好的迁…

算法 DAY55 动态规划11 392.判断子序列 115.不同的子序列

392.判断子序列 本题可以直接用双指针解法。但是本题是编辑距离的入门题目,故采用动态规划解法为后序“编辑距离”类题目打基础。 本题与最大子序列非常相似,但不同的是s必须连续,t可以不连续。 五部曲 1、dp[i][j] 表示以下标i-1为结尾的字…

Seata介绍

介绍: Seata的设计目标是对这个业务无侵入,因此从业务无侵入的2PC方案开始的,在传统的2PC的基础上演进的。它把一个分布式事务拆分理解成一个包含了若干分支事务的全局事务。全局事务的职责是协调其下管辖的分支事务达成一致性,要…

25.自定义注解

自定义注解 一、什么是注解 Annontation是Java1.5开始引入的新特征,中文名称叫注解。 它提供了一种安全的类似注释的机制,用来将信息或元数据(metadata)与程序元素(类、方法、成员变量等)进行关联。为程序…