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

news2024/12/16 10:11:20

引入

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.coloradmin.cn/o/2260437.html

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

相关文章

电子科技大学考研,计算机与软件专业怎么选择?

电子科技大学在计算机与软件领域具备卓越实力,其毕业生就业前景及薪资水平均颇为可观。因此,学生应依据个人课程专长来选定专业。若各项课程均表现出色,推荐25届考生优先考虑软件专业,因其上岸难度相对较低。 接下来,C…

部署GitLab服务器

文章目录 环境准备GitLab部署GitLab服务器GitLab中主要的概念客户端上传代码到gitlab服务器CI-CD概述软件程序上线流程安装Jenkins服务器 配置jenkins软件版本管理配置jenkins访问gitlab远程仓库下载到子目录部署代码到web服务器自动化部署流程 配置共享服务器配置jenkins把git…

Python中的优化函数2:cvxpy包

文章目录 介绍使用步骤示例1示例2官方文档 介绍 它是一个基于 Python 的凸优化建模工具,专门用于定义和求解 凸优化问题(Convex Optimization Problems)。CVXPY 提供了一种直观的方式来表达优化问题,并通过高效的求解器来解决这些…

MSciNLI—— 针对科学自然语言推理任务提出的多样化数据集用于训练语言模型和大规模语言模型建立基线

概述 论文地址:https://arxiv.org/pdf/2404.08066 源码地址:https://github.com/msadat3/mscinli 自然语言推理(NLI)是一项识别两个句子之间语义关系的任务。第一个句子称为 “前提”,第二个句子称为 “假设”。传统的…

REVERSE-COMPETITION-CISCN-2025

REVERSE-COMPETITION-CISCN-2025 rand0mezCskydumpcython rand0m 3.12版本的pyd逆向 读16进制,分成4个4字节的int,每个int做两步运算 第一步,右移28bit,左移4bit,然后拼接 注意左移4bit后又&0x3a3affff&#xff0…

批量合并多个Excel到一个文件

工作中,我们经常需要将多个Excel的数据进行合并,很多插件都可以做这个功能。但是今天我们将介绍一个完全免费的独立软件【非插件】,来更加方便的实现这个功能。 准备Excel 这里我们准备了两张待合并的Excel文件 的卢易表 打开的卢易表软件…

【算法】—— 前缀和

一、区间求和问题 给定一个长度为n的序列a,有m次查询,每次查询输出一个连续区间的和。 使用暴力做法求解是将每次查询都遍历该区间求和 //暴力做法import java.util.Scanner;public class Test {public static void main(String[] args){Scanner scan…

股市投资策略升级:掌握马尔可夫决策过程与强化学习,提升交易技能

作者:老余捞鱼 原创不易,转载请标明出处及原作者。 写在前面的话:本文将深入探讨马尔可夫决策过程(MDP)和强化学习在股票交易中的运用。通过阐述MDP的基本原理和其在交易策略中的实际应用,试图向您揭示这些…

jvm结构介绍

1. 垃圾回收(Garbage Collection, GC):JVM自动管理内存的机制,负责回收不再使用的对象占用的内存空间。常见的垃圾回收算法包括标记-清除(Mark-Sweep)、复制(Copying)、标记-整理&am…

基于智能电能表的智能家居能源管理系统设计

目录 引言系统设计 硬件设计软件设计系统功能模块 电能测量模块数据传输模块能源管理模块控制算法 数据采集与处理算法能源优化算法代码实现 电能测量模块实现数据传输模块实现系统调试与优化结论与展望 1. 引言 随着智能家居的发展,电能管理成为智能家居系统中的…

【计算机组成原理】实验二:通用寄存器单元实验

实验二:通用寄存器单元实验 一、实验目的 了解通用寄存器的组成和硬件电路,利用通用寄存器实现数据的置数、左移、右移等功能。 二、实验内容 数据输入通用寄存器 寄存器内容无进位位左移实验 寄存器内容无进位位右移实验 三、实验步骤和结果 实…

codeforces一些题目思路复盘

codeforces round 919 dv2 C Partitioning the Array 大致题意,对于n约数i,我们把原数组分成份,并且每份中有i个元素,对于每个分组情况,如果存在一个数m使得数组中元素modm后使得每个部分的数组完全相同,如…

《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(四)

《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(四) 你好,我是拉依达。 感谢所有阅读关注我的同学支持,目前博客累计阅读 27w,关注1.5w人。其中博客《最全Linux驱动开发全流程详细解析(持续更新)-CSDN博客》已经是 Linux驱动 相关内容搜索的推荐首位,感谢大家支持。 《拉…

又细又长的马尾:tail

英语里边有一个单词 tail,意为“尾巴”,这应当是众所周知的事情了。 不过,tail 这条尾巴,并不简单,因为它还是一个词根,也就是说 tail 其实是自由词素。 事实上,tail 最初来自 马尾 这样一个概…

Lumos学习王佩丰Excel第二十一讲:经典Excel动态图表实现原理

一、动态图表实现原理 1、理解图表中的数据系列 在Excel图表中,系列指的是图表中的数据集合,它通常代表着一个数据源。每个系列都可以包含多个数据点,这些数据点在图表中以特定的形式展现,如柱状图中的柱子,折线图中…

使用Qt Creator设计可视化窗体(一)

一、创建项目 打开 Qt Creator ,在菜单栏中选中: “文件” --------> “新建文件或项目” ;或者使用快捷键:Ctrl n;或者直接点击:“new” Qt 中的构建工具有三种可供选择,分别是&#…

Rust之抽空学习系列(四)—— 编程通用概念(下)

Rust之抽空学习系列(四)—— 编程通用概念(下) 1、函数 函数用来对功能逻辑进行封装,能够增强复用、提高代码的可读 以下是函数的主要组成部分: 名称参数返回类型函数体 1.1、函数名称 在Rust中&…

springboot423玩具租赁系统boot(论文+源码)_kaic

摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装玩具租赁系统软件来发挥其高效地信息处理的作用&#xff0c…

.NET6 WebAPI从基础到进阶--朝夕教育

1、环境准备 1. Visual Studio 2022 2. .NET6 平台支持 3. Internet Information Services 服务器( IIS ) 4. Linux 服务器 【 CentOS 系统】 ( 跨平台部署使用 ) 5. Linux 服务器下的 Docker 容器( Docker 部署使用) …

Attentive Fusion论文精读

OPV2V: An Open Benchmark Dataset and Fusion Pipeline for Perception with Vehicle-to-Vehicle Communication 文章目录 背景创新点1.提出新的数据2.提出了一种注意力中间融合管道 2.相关工作车对车感知早期融合晚期融合中间融合 车对车数据集 3. OPV2V 数据集A.数据收集模…