搭建Tomcat(二)--反射的应用

ops/2024/12/14 19:18:15/

引入

Tomcat 在处理HTTP请求时,会根据一系列规则和配置来判断该请求是想要获取动态资源还是静态资源

为什么要对请求进行判断?

Tomcat 判断HTTP请求是动态请求还是静态请求的主要目的是确定如何生成并返回响应内容。静态请求通常意味着服务器只需读取并返回文件系统中的某个文件,而动态请求则意味着服务器需要执行一些代码或逻辑来生成响应。

静态资源动态资源是什么?(定义)

  1. 静态资源

    • 静态资源指的是在服务器端生成后,不会在客户端进行动态改变的资源。
    • 这些资源通常包括HTML、CSS、JavaScript文件,以及图片、视频、音频等多媒体内容。
    • 静态资源在请求时,服务器直接返回其内容,客户端只需进行渲染或播放。
  2. 动态资源

    • 动态资源则是指那些在程序运行时可以改变或更新的资源。
    • 这些资源通常包括数据文件、网络连接、用户输入等,它们的状态可以在程序执行期间发生变化。
    • 动态资源需要服务器进行实时处理,根据用户的请求和数据库中的数据生成响应的内容

那么怎么去判断呢?

引用(网络资源回答)

  1. URL匹配

    • Tomcat 首先会根据请求的URL来尝试匹配静态资源。如果请求的URL直接对应到文件系统中的某个文件(例如 .html.css.js 等),并且该文件存在,则Tomcat 会将其视为静态请求。
    • 如果请求的URL不匹配任何静态资源,Tomcat 会进一步检查是否有Servlet或JSP等动态资源的映射规则与之匹配。
  2. Servlet映射

    • Tomcat 的 web.xml 配置文件(或注解配置)中定义了Servlet的映射规则。当请求的URL与某个Servlet的映射规则匹配时,Tomcat 会将其视为动态请求,并将请求转发给相应的Servlet进行处理。
    • 需要注意的是,Tomcat 还提供了一个默认的Servlet(如 DefaultServlet),它负责处理所有未明确映射到特定Servlet的静态资源请求。然而,这并不意味着所有未匹配到动态资源的请求都是静态请求,因为还可能有其他处理逻辑(如过滤器、重定向等)在起作用。
  3. 请求头信息

    • 虽然Tomcat 主要通过URL和Servlet映射来判断请求类型,但请求头信息有时也可以提供有用的线索。例如,某些请求可能会包含特定的请求头(如 Accept),表明客户端期望接收的内容类型。然而,这通常不是判断请求类型的决定性因素。
  4. 文件后缀

    • 在某些情况下,Tomcat 可能会根据请求的文件后缀来判断请求类型。例如,.jsp 后缀通常表示动态请求,而 .html.jpg 等后缀则通常表示静态请求。然而,这种方法并不是绝对可靠的,因为文件后缀可以被更改或伪造。
  5. 自定义逻辑

    • 开发者还可以通过编写自定义的过滤器、拦截器等组件来扩展Tomcat的请求处理逻辑。这些组件可以在请求到达Servlet之前对请求进行预处理和判断,从而实现对请求类型的自定义判断和处理。

上面是一些官方回答,那么究竟是怎么判断的呢?

简单而言,tomcat想要确定请求访问的是动态资源还是静态资源先从动态资源中查找(存在动态资源映射表),若是能从中查到,则返回动态资源,若是不能从动态中匹配,那么再去静态序列查找,能查到就返回静态资源,静态也查不到就返回404。

动态资源映射表

动态资源映射表是一种数据结构或数据库表,它用于记录和管理动态资源与相应物理资源或逻辑资源之间的映射关系。在Web服务器(如Tomcat)或应用程序中,动态资源通常指的是那些需要服务器实时处理或生成的资源,如JSP页面、Servlet、数据库查询结果等。

如下的表项(K值和Value值):

其中key值对应就是e.g Servlet中的WebServlet里填写的项:

而value值就是key对应的类对象(堆中对应的那一块内存空间):

【上面提到的类对象,并非是简单类的实例,而是经过反射得到的Class类文件】

 

引入反射--->⭐Java---反射--获取类信息⭐-CSDN博客

反射获取类信息的三种方式(对象、类、类的路径):

    //反射的三种方式//类的路径Class clazz1=Class.forName("Demo");//类Class clazz2=Demo.class;//类的对象Demo demo=new Demo();Class clazz3=demo.getClass();

而打印这些得到的类信息后进行比对打印:

得到输出都是true:

 

至于这里为什么返回true,就要提到反射的知识了:

首先,反射是一种获取类信息的能力,可以获取一个类的方法、构造器、变量、父子类、接口......等等信息。

所以,以下就能涵盖一个tomcat运行项目的流程:

假设在一个项目中,我们写了10个servlet动态资源,以及5个HTML静态资源,启动tomcat扫描项目。

 首先tomcat扫描时会优先扫描动态资源,通过@WebServlet获取其中的“/FindAllBook”作为Key值,并存入动态资源映射表:

之后value值就是通过key值去访问 FindAllBook类,并且将其反射后的类信息存到value的位置;

即类对象,搭建起动态资源映射表:


http://www.ppmy.cn/ops/141887.html

相关文章

开源分布式系统追踪-03-CNCF jaeger-02-快速开始

分布式跟踪系列 CAT cat monitor 分布式监控 CAT-是什么? cat monitor-02-分布式监控 CAT埋点 cat monitor-03-深度剖析开源分布式监控CAT cat monitor-04-cat 服务端部署实战 cat monitor-05-cat 客户端集成实战 cat monitor-06-cat 消息存储 skywalking …

用github镜像加速, --recursive还是去github站怎么处理?

小伙伴们大多碰到过github抽风的情况,时通时断,时快时慢,非常考验心情。 以前碰到连不上的时候,我大多就是在gitee和gitcode网站找一下镜像,找到后直接git clone 新地址即可。但是碰到 --recursive的时候就不行了&…

【LeetCode力扣热题100】【LeetCode 49】字母异位词分组

方法一:字符串排序 字母异位词指的是两个单词的字符组成相同,字符的排列顺序不同,由此可推断,这两个词经过内部字符排序后的结果是相同的,[nat -> ant] [tan -> ant]。将排序后的词语作为map的key值&#xff0c…

Redis学习笔记之——学习计划

Redis——Remote Dictionary Server,开源、基于内存、速度快、key-value... Redis做为一个高性能的键值存储系统,广泛应用于缓存、会话存储、分布式锁以及其他需要快速访问的数据场景中。熟悉掌握redis,似乎已成为广大码农们必备的一项技能。…

智汇云舟4个案例入选“中国联通智慧城市物联感知与AI应用案例”

12月10日,由中国联通智慧城市军团联合联通数字科技有限公司物联网事业部、物联中国团体组织联席会共同主办的“中国联通首届智慧城市领域物联感知与AI应用优秀案例发布交流大会”在郑州举行。大会现场对50余个优秀案例进行了集中发布与表彰。智汇云舟凭借深厚的技术…

短视频矩阵源码开发部署全流程解析

在当今的数字化时代,短视频已成为人们娱乐、学习和社交的重要方式。短视频矩阵系统的开发与部署,对于希望在这一领域脱颖而出的企业和个人而言,至关重要。本文将详细阐述短视频矩阵源码的开发与部署流程,并附上部分源代码示例&…

计算机毕业设计Python中华古诗词知识图谱可视化 古诗词智能问答系统 古诗词数据分析 古诗词情感分析模型 自然语言处理NLP 机器学习 深度学习

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

用友U8+ API接口使用教程

前言 U8和其他的公开的开放API接口有一些差异,他是需要先对接的到代理服务器,通过代理服务器进行对接,所以只要保证U8能上网就能对接,和畅捷通T的模式有点类似 流程: 注册成为开发者(用于创建用友U8 API应…