Java Servlet Tomcat(HttpServlet)处理底层机制详解总括

news2024/10/6 0:29:59

以tomact服务器为例:

热知识:Servlet是java定义的处理动态资源(非静态资源)的java接口规范,HttpServlet是tomcat实现了servlet接口的类

一.当第一次发送请求时候:

1.查询web.xml中的url-parrtern中配置的路径,tomcat底层维护了两个hashmap,第一个hashmap的key为url-parrtern,value为servlet-name(一个servlet对象的唯一标识);第二个hashmap的key为servlet-name,value为servlet实例

2.查看请求的资源路径是否在xml配置中的url-parrtern,即tomcat底层遍历第一个hashmap,查看是否有key为url-parrtern的map结点,如果没有,则当静态资源(web路径下的资源)进行处理,静态资源也找不到则返回404的状态码,

否则在第一个hashmap中取出key为指定url-parrtern的value,即对应的servlet-name,然后在第二个hashmap中put一个值为上面找到的servle-name,value为该servlet对象的实例,底层扫描xml,

通过dom4j得到该servle-name对应的servlet-class,然后通过反射技术创建该servlet对象,然后放到第二个map中(访问指定存在的url-parrtern再创建对应的servlet实例,前提是未在servle配置信息中指明创建web项目时自动创建,即未指明

<load-on-startup>1</load-on-startup>//xml文件方式
@WebServlet(load-on-startup=1) //注解方式

如果指明了在web项目创建时,就创建,则项目启动就会把servlet实例放到第二个hashmap中,并且调用初始化init()方法

3.找到之后通过反射调用该servlet的初始化方法init()(如果有)然后调用service()方法,注意这里用到了多态的动态绑定的机制

即该类身上并没有service()方法,而在其父类HttpServlet身上,下面是Httpservlet源码

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String method = req.getMethod();
        long lastModified;
        if (method.equals("GET")) {
            lastModified = this.getLastModified(req);
            if (lastModified == -1L) {
                this.doGet(req, resp);
            } else {
                long ifModifiedSince = req.getDateHeader("If-Modified-Since");
                if (ifModifiedSince < lastModified) {
                    this.maybeSetLastModified(resp, lastModified);
                    this.doGet(req, resp);
                } else {
                    resp.setStatus(304);
                }
            }
        } else if (method.equals("HEAD")) {
            lastModified = this.getLastModified(req);
            this.maybeSetLastModified(resp, lastModified);
            this.doHead(req, resp);
        } else if (method.equals("POST")) {
            this.doPost(req, resp);
        } else if (method.equals("PUT")) {
            this.doPut(req, resp);
        } else if (method.equals("DELETE")) {
            this.doDelete(req, resp);
        } else if (method.equals("OPTIONS")) {
            this.doOptions(req, resp);
        } else if (method.equals("TRACE")) {
            this.doTrace(req, resp);
        } else {
            String errMsg = lStrings.getString("http.method_not_implemented");
            Object[] errArgs = new Object[]{method};
            errMsg = MessageFormat.format(errMsg, errArgs);
            resp.sendError(501, errMsg);
        }

    }

从上图可以看出判断是get请求还是post请求返回调用对应的doGet()方法和doPost()方法,

而这两个方法要进行重写,写自己的业务逻辑,然后调用的便是自己写的doGet和doPost方法,

用到了多态的动态绑定机制!!

初始化init方法和service方法的调用顺序如下:

二.当第二次及以后再发送请求时候:

直接通过查询两个tomcat维护的hashmap,第一个通过url-parrtern得到servlet-name,第二个通过servlet-name得到servlet实例,然后调用service()方法

三.说明:

1.Servlet实例对象是单例的,因为默认只有在第一次访问对应的url时才创建,以后再访问则是通过hashmap直接取出来的

2.tomcat维护的两个servlet是常驻内存的,知道web工程销毁或其他指定的方式

3.redepoly就会销毁所有的servlet实例对象

下一期介绍HttpservletRequest和HttpservletResponse

注:封面背景来自百度,

笔记参照了教育机构的老师,如有侵权请与我联系qq1989866756

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

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

相关文章

LNMP及论坛搭建

安装 Nginx 服务 systemctl stop firewalld systemctl disable firewalld setenforce 01.安装依赖包 #nginx的配置及运行需要pcre、zlib等软件包的支持&#xff0c;因此需要安装这些软件的开发包&#xff0c;以便提供相应的库和头文件。 yum -y install pcre-devel zlib-deve…

排序(4)——归并排序

目录 前言 1.归并排序的递归实现 1.1 归并排序概念 1.2 归并排序递归实现 2.归并排序的非递归实现 前言 今天给大家带来比较排序的最后一种&#xff0c;归并排序&#xff0c;这个排序&#xff0c;需要我们对递归&#xff0c;循环控制要有着较强的理解&#xff0c;我相信大…

【iOS的NSNULL nil Nil 】

前言 偶然看到了NSNULL 简单了解他的兄弟nil Nil记录一下。 NSNULL Nil nil 在iOS中&#xff0c;nil、Nil和NSNull都表示“空值”的概念&#xff0c;但它们在使用时有所不同。 nil和Nil都表示空指针&#xff0c;可以用于指针类型的变量、对象类型的变量、和Objective-C对象…

浙江海發進出口股份有限公司官网上线|LTD五金技术行业案例分享

​浙江海發進出口股份有限公司 (以下简称海發)是一家多元化的国际贸易企业。拥有自己的工厂&#xff0c;稳定的资金储备和最好的服务&#xff0c;在商业领域赢得了很高的声誉。地处长江三角洲交通经济中心嘉兴市。 浙江海發進出口股份有限公司 (以下简称海發)是一家多元化的国…

Python轻量级Web框架Flask(5)——Flask模型基础和数据迁移

0、前言&#xff1a;学习这部分的前提是对python的面向对象有一定的了解&#xff0c;同时对MySQL有扎实的学习 1、Flask模型基础知识&#xff1a; Flask模型 ORM &#xff08;注意&#xff1a;在flask中用ORM可以实现SQL语句功能&#xff0c;但是并不意味着SQL语句不重要&am…

NISACTF2023 WP

NISACTF2023 WP 前言 2年多没玩CTF了&#xff0c;pwn显得手生了不少&#xff0c;我的PWN环境已经在硬盘的某个角落里吃灰了。今天参加了一场校赛&#xff0c;捣鼓了一下午&#xff0c;Reverse和PWN都AK了。其实比赛是新手向&#xff0c;没啥难度&#xff0c;不过有道PWN设计的…

ChatGPT实战100例 - (02) 自动出PPT它不香么?

文章目录ChatGPT实战100例 - (02) 自动出PPT它不香么&#xff1f;一、需求与思路1. 需求&#xff1a;出个PPT&#xff0c;5分钟后要用2. 思路&#xff1a;生成markdown然后转化二、生成markdown语法的思维导图1. 问题2. 回答三、把markdown文本转换成PPTChatGPT实战100例 - (02…

STM32 gpio外部中断详解

什么是中断&#xff1f; 打断CPU执行正常的程序&#xff0c;转而处理紧急程序&#xff0c;然后返回原暂停的程序继续运行&#xff0c;就叫中断 中断的作用和意义 中断的意义&#xff1a;高效处理紧急程序&#xff0c;不会一直占用CPU资源 STM32 GPIO外部中断简图 NVIC 什么…

JSTL标签库

英文全称&#xff1a;Java Standard Tag Lib&#xff08;Java标准的标签库&#xff09; 使用目的&#xff1a;JSTL标签库通常结合EL表达式一起使用。目的是让JSP中的java代码消失。 使用位置&#xff1a;JSTL标签是写在JSP当中的&#xff0c;但实际上最终还是要执行对应的jav…

Ubuntu 开机启动 通过crontab定时器去检查脚本 实现

有个项目的程序需要实现开机启动 通过添加一个qmcy.service服务的方法 发现 确实执行脚本了 但是脚本的程序缺并没有起来 但是如果手动执行这个脚本 程序是能起来的 不知道为啥 没办法 网上搜了下 可以通过 crontab定时器去检查 程序是否启动 没启动的话去 执行对应的脚…

【毕业设计】基于程序化生成和音频检测的生态仿真与3D内容生成系统----程序化生成多图层地形贴图的算法设计

(2条消息) 【开发日志】2023.04 ZENO----Image Processing----CompositeCV、Composite2、Composite3_EndlessDaydream的博客-CSDN博客 (2条消息) 【开发日志】2023.04 ZENO----Image Processing----ImageEdit、EditRGB、EditHSV_EndlessDaydream的博客-CSDN博客 (2条消息) 【…

telegraf在iiot领域的基本应用(Modbus,OPC)

熟悉telegraf是因为influxdb缘故&#xff0c;当时telegraf主要是作为granfa监控的agent一环&#xff0c;很多文章有相关的介绍&#xff0c;但作为java开发对telegraf&#xff08;go语言开发&#xff09;也仅仅只是适用级别&#xff0c;这边文章也只讲到一些简单的应用。希望能帮…

<STM32>STM32CubeMX-CAN通信(扫描读取数据方式)(5)

&#xff1c;STM32&#xff1e;STM32CubeMX-CAN通信&#xff08;扫描读取数据方式&#xff09;&#xff08;5&#xff09; 本节主要讲解CAN通信的功能&#xff0c;主要采用扫面检测接收数据的方式&#xff1b; CAN的详细解说可参考《STM32F4XXX中文参考手册》&#xff0c;资料有…

CDH 之 Kerberos 安全认证和 Sentry 权限控制管理(一)

一、Kerberos 和 Sentry 概述 1.1 什么是 Kerberos Kerberos是一种计算机网络授权协议&#xff0c;用来在非安全网络中&#xff0c;对个人通信以安全的手段进行身份认证。这个词又指麻省理工学院为这个协议开发的一套计算机软件。软件设计上采用客户端/服务器结构&#xff0c;…

java微服务商城高并发秒杀项目--011.授权规则和系统规则

授权规则在shop-order-server中新建RequestOriginParserDefinition.java,定义请求来源如何获取Component public class RequestOriginParserDefinition implements RequestOriginParser {Overridepublic String parseOrigin(HttpServletRequest request) {/*** 定义从请求的什么…

文本分类论文阅读

1.ChineseBERT: Chinese Pretraining Enhanced by Glyph and Pinyin Information&#xff08;ACL2021&#xff09; 字形嵌入根据汉字的不同字体获得&#xff0c;能够从视觉特征中捕捉汉字语义&#xff0c;拼音嵌入表征汉字的发音&#xff0c;解决了汉语中非常普遍的异义异义现…

四、vue基础-指令(一)、vscode代码片段

一、vscode代码片段 我们在前面联系Vue的过程中&#xff0c;有些代码片段是需要经常写的&#xff0c;我们再VSCode中我们可以生成一个代码片段&#xff0c;方便我们快速生成。VSCode中的代码片段有固定的格式&#xff0c;所以我们一般会借助于一个在线工具来完成。 具体步骤如…

01_什么是Uboot

目录 U-Boot简介 获取Uboot U-Boot初次编译 U-Boot烧写与启动 U-Boot简介 Linux系统要启动就必须需要一个bootloader程序(裸机程序),也就说芯片上电以后先运行一段bootloader程序。这段bootloader程序会先初始化DDR等外设,然后将Linux镜像从flash(NAND,NOR FLASH,SD,EMMC等…

【防止恶意用户注册】-- 手机在网状态 API 的防欺诈应用解析

简介 手机在网状态 API 支持传入手机号码&#xff0c;查询手机号在网状态&#xff0c;返回在网、在网不可用、不在网&#xff08;销号/未启用/停机&#xff09;等多种状态&#xff0c;查询手机号在网状态之后&#xff0c;可以根据具体的业务需求来进行不同的处理。 本文主要介…

EA的使用---文档的生成

EA中文档的自动生成 1.找到如下界面 2.选择第一个 3.设置存储的位置 4.点击Generate 5.查看生成的文档