【Servlet】Servlet生命周期

Servlet 的生命周期详解 在方法执行过程中,DispatcherServlet 会根据配置的 HandlerAdapter 对请求参数进行解析,将其转换为方法所需的类型,并将方法的执行结果封装为 ModelAndView 对象。在初始化阶段中,DispatcherServlet 会读取并解析配置文件(如 web.xml 或注解配置等),创建必要的组件对象(如 HandlerMapping、HandlerAdapter 等),并将它们存储在 ServletContext 中,以便于在后续的请求处理中使用。 阅读详情

Servlet的生命周期:
1.当Servelt被装载到容器中后,创建一个Servlet实例,并调用init()方法进行初始化。

2.初始化后的实例调用service()方法处理用户请求。

3.调用destroy()方法,销毁Servlet实例。

       Init()方法只会被调用一次,在Servlet被第一次请求加载时调用该方法,此后再有用户请求访问Servelt时,服务器会启动一个新的线程调用service()方法响应用户的请求,所以说每个用户的每一次请求都会使service()方法被调用,它们的执行过程是在不同的线程中进行的。因此,一个Servlet的init()方法只会被调用一次,而service()会被多次调用。

       Servlet本身是一个接口,而大家平时在创建Servlet的时候是继承HttpServlet类的,而且有一件事情很奇怪,关于Servlet的生命周期,提到实例是调用service()方法处理用户请求的,但在实际编码中,我们是通过调用HttpServlet的doGet()和doPost()方法处理用户请求,这就奇怪了,到底Servlet是怎样进行调用的?

       其实HttpServlet是有service()方法的,还记得刚开始学习Servlet的时候,老师跟我们说了这样一句话,我现在想想都觉得好笑,他说写Servlet的时候,doPost()、doGet()方法不能同时跟service()方法一起写。虽然是好笑,但是从表面看来他也没说错,那到底是怎么一回事呢?实际上,HttpServelt与Servlet接口是没有直接关系的,HttpServlet继承了GenericServlet类,而GenericServlet类是一个实现了Servlet接口的抽象类,他们的关系如下:


Servlet接口和GenericServlet是不特定于任何协议的,而HttpServlet是特定于HTTP协议的类,如上图所示,我们除了继承HttpServlet类之外,还可以通过继承GenericServlet抽象类编写Servlet类。Servlet接口定义了5个方法,包括关系Servlet生命周期的3个重要方法,GenericServlet抽象类中也有这3个方法。虽然平时我们写Servlet类用得比较多的方法是HttpServlet的doPost()和doGet()方法。但实际上在HttpServlet类中有两个service()方法,一个是重写GenericServlet类的,一个是HttpServlet自己定义的。在实际的调用中,Servlet初始化后是调用源自Servlet接口的service()方法,在HttpServlet中,该方法将ServletRequest和ServletResponse转换为HttpServletRequest和HttpServletResponse。在方法的最后调用HttpServlet自定义的service()方法,在自定义的service()方法中根据方法名去调用具体的处理方法,也就是在service()方法中经过判断调用doPost()或doGet()等方法。

这两个方法的源码如下:

public void service(ServletRequest req, ServletResponse res)
        throws ServletException, IOException {
        HttpServletRequest  request;
        HttpServletResponse response;
        try {
            request = (HttpServletRequest) req;
            response = (HttpServletResponse) res;
        } catch (ClassCastException e) {
            throw new ServletException("non-HTTP request or response");
        }
        service(request, response);
}

protected void service(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
        String method = req.getMethod();
        if (method.equals(METHOD_GET)) {
            long lastModified = getLastModified(req);
            if (lastModified == -1) {
                // servlet doesn't support if-modified-since, no reason
                // to go through further expensive logic
                doGet(req, resp);
            } else {
                long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
                if (ifModifiedSince < (lastModified / 1000 * 1000)) {
                    // If the servlet mod time is later, call doGet()
                    // Round down to the nearest second for a proper compare
                    // A ifModifiedSince of -1 will always be less
                    maybeSetLastModified(resp, lastModified);
                    doGet(req, resp);
                } else {
                    resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
                }
            }
        } else if (method.equals(METHOD_HEAD)) {
            long lastModified = getLastModified(req);
            maybeSetLastModified(resp, lastModified);
            doHead(req, resp);
        } else if (method.equals(METHOD_POST)) {
            doPost(req, resp);
        } else if (method.equals(METHOD_PUT)) {
            doPut(req, resp);        
        } else if (method.equals(METHOD_DELETE)) {
            doDelete(req, resp);
        } else if (method.equals(METHOD_OPTIONS)) {
            doOptions(req,resp);
        } else if (method.equals(METHOD_TRACE)) {
            doTrace(req,resp);
        } else {
            //
            // Note that this means NO servlet supports whatever
            // method was requested, anywhere on this server.
            //
            String errMsg = lStrings.getString("http.method_not_implemented");
            Object[] errArgs = new Object[1];
            errArgs[0] = method;
            errMsg = MessageFormat.format(errMsg, errArgs);
            resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
        }
}

所以说我们在编写Servlet类时,一般重写doPost()和doGet()方法,如果重写了service()方法,那么就不能调用doPost和doGet()方法,除非你重写service()方法的时候对doPost和doGet()方法进行调用。所以没必要那样写,不过也不是说不能同时写,了解了这个调用过程,我们就知道是怎么回事了。


Author:立礼

Sign:人生不要有太多的幻想,而要有更多的行动。


Servlet生命周期、配置、创建时机及默认Servlet 阅读详情

相关推荐

Inside NAND Flash Memories.中文版. Chatper 2 [2.1-2.2.1]

2.1 Introduction 半导体存储器分类: RAM:Random Access Memories--掉电丢失 ROM:Read Only Memories--只读,出厂时写好;掉电不丢失;不可更改。 NVM:Non-Volatile Memories--电可擦除/写入,并且掉电不丢失。第一类产品为EPROM memory (Erasable Programmable Read...

xuqikang的专栏 3608

Servlet常用API

Servle核心API

m0_62360856的博客 277

Halcon Socket TCP通讯:从算子调用到工业视觉系统集成

本文详细介绍了Halcon Socket TCP通讯在工业视觉系统中的应用与优化技巧。从基础算子调用到高并发处理,再到与PLC、机器人及MES系统的集成实战,提供了全面的解决方案和性能优化建议,帮助开发者高效实现工业视觉系统的通讯需求。

weixin_33502772的博客 248

Servlet介绍的以及它的生命周期

1、当我们想要访问一个网站时,只需要在浏览器地址栏里输入网址,然后点击搜索或者链接即可,比如www.baidu.com,然后回车浏览器就可以跳转到百度首页了,那么这个过程底层的步骤是怎么实现的呢?这就涉及到http的请求与响应了:2、我们访问网站时,大部分场景下都是基于Browser/Server模式(浏览器/服务器模式),简称BS架构,它的特点是,客户端只需要浏览器,应用程序的逻辑和数据都存储在服务器端。浏览器只需要请求服务器,获取网页页面,并把网页页面展示给用户即可,此传输过程遵循Http协议。

qq_55897122的博客 426

STC32-USB-CAN:基于STC32G的国产双通道隔离CAN分析调试设备设计与实战

本文详细介绍了基于国产STC32G单片机设计双通道隔离CAN分析调试设备的全过程。该设备实现了双通道隔离CAN数据监控、中继转发及USB高速通信,并支持故障注入测试。核心采用全国产器件,通过实战测试验证了其在1Mbps波特率下长时间稳定工作的可靠性,为工程师提供了高性价比的CAN总线调试解决方案。

weixin_42465140的博客 98

利用Arcgis提取nc数据并计算区域年均温

1.下载数据。2.解压数据至不含中文的路径中。打开工具箱中的多维分析工具-创建NetCDF栅格图层,导入数据。3.打开工具箱中的数据管理工具-图层和表视图-创建栅格图层,导入数据,对输出数据进行命名,得到月均温栅格数据。4.选择工具箱-Spatial Analyst工具(空间分析工具)-地图代数-栅格计算器,计算全国一年年均温。​5.将其导出为.tif格式数据,方便后期使用。6.选择工具箱-Spatial Analyst工具(空间分析工具)-区域分析--以表格显示分区统计,得到分区域的气温数据。

什么都学亿点点的博客 7995

Servlet生命周期小结

Servlet的生命周期从Servlet类加载,到创建Servlet类实例,Servlet的初始化(真正成为一个Servlet),有请求到来,调用service方法(主要工作),直到Servlet被destroy;     1.Servlet类加载:         1.1  启动web容器后,容器去寻找应用的部署描述文件(web.xml),从部署描述文件中读取到上下文初始化参数,此时创建一个

Jassy1994的博客 1万+

【土壤普查实战】Python+ArcGIS随机森林模型一键生成土壤类型栅格图

本文详细介绍了如何利用Python和ArcGIS结合随机森林模型实现土壤类型栅格图的自动化生成,大幅提升土壤普查效率。通过环境准备、数据预处理、模型构建与调优等关键步骤,帮助用户掌握从样本点生成到最终栅格图输出的完整流程,适用于大面积区域或样本点较多的土壤分类任务。

weixin_29229989的博客 220

Servlet的生命周期

Servlet的生命周期 servlet的生命周期就是从servlet出现到销毁的全过程。主要分为以下几个阶段: 加载类—>实例化(为对象分配空间)—>初始化(为对象的属性赋值)—>请求处理(服务阶段)—>销毁 服务器启动时(web.xml中配置load-on-startup=1,默认为0)或者第一次请求该servlet时,就会初始化一个Servlet对象,也就是会执行初始...

zhouym_的博客 11万+

CCS8.1 导入CCS3.3工程方法

    CCS3.3作为开发人员使用最广开发工具,研究人员手上存在不少该版本的建立的程序版本,然而随着TI公司推出高级版本的CCS平台,在新的平台上集成了更加丰富的功能和优点。利用新版本的平台在开发和编译旧版本工程上可以节省大量时间和精力。在使用新版本开发3.3版本工程时,首要解决的就是加载3.3的工程文件,现将加载过程记录如下: 第一步:Project-&gt;Import Legacy CC...

1万+

2021秋-北邮计算机导论期末考试(BUPT)

2021秋-北邮计算机导论期末考试(BUPT) 难度较低适合新手练习

weixin_73985779的博客 1501

Servlet生命周期

Servlet生命周期

雷神乐乐的博客 896

智能车图像处理22-进阶篇14--小s的判断

这篇文章中主要讲述智能车图像处理中 : 小s的判断方法。

taiyuezyh的博客 2574

java servlet的生命周期_Java Servlet系列之Servlet生命周期

Servlet生命周期定义了一个Servlet如何被加载、初始化,以及它怎样接收请求、响应请求,提供服务。在讨论Servlet生命周期之前,先让我们来看一下这几个方法:1. init()方法在Servlet的生命周期中,仅执行一次init()方法,它是在服务器装入Servlet时执行的,可以配置服务器,以在启动服务器或客户机首次访问Servlet时装入Servlet。无论有多少客户机访问Servl...

weixin_36268390的博客 1358

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

servlet的生命周期

1、Servlet的生命周期就是servlet类对象什么时候创建?什么时候调用对应的方法,什么时候销毁。也就是说自定义对象的生命周期由我们程序员自己手动控制。但是!!!Servlet它不是一个普通的java类。是一个被tomcat服务器调用的。所以Servlet是生命周期是被tomcat服务器去控制的。

m0_74356429的博客 1062

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

JavaWeb——Servlet——Servlet的生命周期

JavaWeb——Servlet——Servlet的生命周期 导语:所谓Servlet的生命周期,就是说Servlet什么时候被创建的?什么时候被销毁的?从被创建到被销毁它又经历了哪些过程呢? 原理: Servlet底层的生命周期分为5个阶段来执行 1、装载web.xml web.xml文件中对Servlet进行了声明,并且绑定了url,tomcat启动时会自动扫描web.xml文件,从而知道了Servlet的存在并将其解析。 2、创建Servlet对象,执行构造函数 当我们第一次去访问url时,tomca

muyuxifeng的博客 436

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Servlet 的生命周期

一、Servlet 生命周期 Servlet 生命周期流程如下图所示: 在 Servlet 的整个生命周期中,创建 Servlet 实例、init() 方法和 destory()方法都只执行一次。当初始化完成后,Servlet 容器会将该实例保存在内存中,通过调用它的 service() 方法,为接收到的请求服务。 二、与 Servlet 生命周期有关的方法 与 Servlet 生命周期有关的方法一般有以下三个: init() 方法 init() 方法是在创建 Servlet 对象时被调用,而且

weixin_45606872的博客 471
上一篇: 【JSP】JSP验证用户是否登录
下一篇: 【JS】判断用户名和密码是否为空
励志故事
博客等级 码龄12年 99粉丝 110原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值