Servlet的生命周期

2023-11-01

目录

1.Servlet的一生有这么几个阶段

2.一个Servlet从开始到消亡


1.Servlet的一生有这么几个阶段

  1. 调用构造方法进行实例化
// 1.构造方法(在第一次发起请求时,调用一次)
	public HomeServlet() {
		System.out.println("HomeServlet通过构造方法实例化");
	}

​​​​​​​

2. 调用init(),进行初始化

// 2.初始化
	@Override
	public void init() throws ServletException {
		System.out.println("HomeServlet的实例初始化");
	}

  3.调用service方法,执行相应的逻辑

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;
                try {
                    ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
                } catch (IllegalArgumentException iae) {
                    // Invalid date header - proceed as if none was set
                    ifModifiedSince = -1;
                }
                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);
        }
    }

4. 销毁

// 4.销毁(当服务器重启或者关闭时通过实例调用)
	private void destory() {
		System.out.println("服务被销毁了.......");
	}


2.一个Servlet从开始到消亡

1. 第一步:当我们第一次请求服务器的时候,tomcat(类似的技术也相同)会帮我们进行第一次实例化(调用无参构造方法),并且只有在客户端第一次请求服务器时才会实例化,之后的请求都会使用第一次实例化的对象。

2.第二步:紧接着,tomcat会自动调用init()方法,进行第一次实例化,同样也只有第一次请求时才进行初始化。

3.第三步:tomcat会自动调用HttpServlet类的service()方法(一般子类不会重写该方法),在该方法中会判断客户端发起的请求方法类型,然后根据类型执行相应的逻辑,值得注意的是在service()方法中,他对每种方法的执行逻辑都是返回一个错误的页面,而我们想要执行正确的逻辑,需要在子类中去实现doGet(),doPost()方法,这样客户端在请求后,才会执行我们想要的逻辑。在servlet对象没有被销毁之前,会重复使用这个实例进行请求响应。

4.当服务器重启或者关闭时,service会销毁(产生的实例等都会销毁,自动调用derstory()方法)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Servlet的生命周期 的相关文章

  • HashMap不写入数据库

    我尝试在我的数据库中写入 但只写入发件人和消息 我不明白为什么会发生这种情况 我认为问题出在我使用 sendMessage 的地方 我认为问题是我没有什么可以做的读 写其他用户的主键 我在数据库中写入消息的活动 public class M
  • Java Try Catch Final 没有 Catch 的情况下会阻塞

    我正在审查一些新代码 该程序只有一个 try 和一个 finally 块 既然排除了 catch 块 那么如果 try 块遇到异常或任何可抛出的内容 它如何工作 它直接进入finally块吗 如果 try 块中的任何代码可以引发已检查异常
  • 使用cameltestsupport进行Camel单元测试,模板始终为空

    我正在用 Camel 做一个简单的单元测试 我想做的就是从文件 在资源下 读取 JSON 内容 将其发送到 Java 类进行验证 这是我试图测试的路线 无论我做什么 模板 我用来发送正文 json 始终为空 这是我的代码 public cl
  • 为什么 java 编译器不报告 Intellij 中多播表达式的未经检查的强制转换警告?

    为什么下面的代码没有报告 Intellij IDEA 的未经检查的警告jdk 1 8 0 121自从Supplier
  • eclipse中导入项目文件夹图标

    我在 Eclipse 工作区中新导入的 Maven 项目有J and M项目文件夹顶部的图标 项目和包资源管理器 而其他导入的 Maven 项目只有一个J icon 有人可以解释其中的区别吗 该项目有J装饰器被称为 Java 项目和具有M装
  • 如何在 JSP 中导入类?

    我是一个完全的JSP初学者 我正在尝试使用java util List在 JSP 页面中 我需要做什么才能使用除以下类之外的类java lang 使用以下导入语句进行导入java util List 顺便说一句 要导入多个类 请使用以下格式
  • Firestore - RecycleView - 图像持有者

    我不知道如何编写图像的支架 我已经设置了 2 个文本 但我不知道图像的支架应该是什么样子 你能帮我告诉我图像的文字应该是什么样子才能正确显示吗 holder artistImage setImageResource model getArt
  • 主线程如何在该线程之前运行?

    我有以下代码 public class Derived implements Runnable private int num public synchronized void setA int num try Thread sleep 1
  • 如何将 android.net.Uri 转换为 java.net.URL? [复制]

    这个问题在这里已经有答案了 有没有办法从Uri to URL 我正在使用的库需要这个 它only接受一个URL但我需要在我的设备上使用图像 如果该方案的Uri is http or https new URL uri toString 应该
  • 如何获取 WebElement 的父级[重复]

    这个问题在这里已经有答案了 我试过了 private WebElement getParent final WebElement webElement return webElement findElement By xpath 但我得到
  • Java 服务器-客户端 readLine() 方法

    我有一个客户端类和一个服务器类 如果客户端向服务器发送消息 服务器会将响应发送回客户端 然后客户端将打印它收到的所有消息 例如 如果客户端向服务器发送 A 则服务器将向客户端发送响应 1111 所以我在客户端类中使用 readLine 从服
  • Git 无法识别重命名和修改的包文件

    我有一个名为的java文件package old myfile java 我已经通过 git 提交了这个文件 然后我将我的包重命名为new所以我的文件在package new myfile java 我现在想将此文件重命名 和内容更改 提交
  • Java 数组的最大维数

    出于好奇 在 Java 中数组可以有多少维 爪哇language不限制维数 但是JavaVM规范将维度数限制为 255 例如 以下代码将无法编译 class Main public static void main String args
  • Java 收集返回顶级项目的映射的嵌套流

    我有以下模型 class Item String name List
  • Spring Security OAuth2简单配置

    我有一个简单的项目 需要以下简单的配置 我有一个 密码 grant type 这意味着我可以提交用户名 密码 用户在登录表单中输入 并在成功时获得 access token 有了该 access token 我就可以请求 API 并获取用户
  • Dispatcher-servlet 无法映射到 websocket 请求

    我正在开发一个以Spring为主要框架的Java web应用程序 特别使用Spring core Spring mvc Spring security Spring data Spring websocket 像这样在 Spring 上下文
  • 尝试使用等于“是”或“否”的字符串变量重新启动 do-while 循环

    计算行程距离的非常简单的程序 一周前刚刚开始 我有这个循环用于解决真或假问题 但我希望它适用于简单的 是 或 否 我为此分配的字符串是答案 public class Main public static void main String a
  • 如何在Java中正确删除数组[重复]

    这个问题在这里已经有答案了 我刚接触 Java 4 天 从我搜索过的教程来看 讲师们花费了大量精力来解释如何分配二维数组 例如 如下所示 Foo fooArray new Foo 2 3 但我还没有找到任何解释如何删除它们的信息 从内存的情
  • 哪个集合更适合存储多维数组中的数据?

    我有一个multi dimensional array of string 我愿意将其转换为某种集合类型 以便我可以根据自己的意愿添加 删除和插入元素 在数组中 我无法删除特定位置的元素 我需要这样的集合 我可以在其中删除特定位置的数据 也
  • Java:多线程内的 XA 事务传播

    我如何使用事务管理器 例如Bitronix http docs codehaus org display BTM Home JBoss TS http www jboss org jbosstm or Atomikos http www a

随机推荐

  • sort函数与结构体

    include
  • Java高级编程实验_java高级编程项目实践.ppt

    java高级编程项目实践 ppt 由会员分享 可在线阅读 更多相关 java高级编程项目实践 ppt 32页珍藏版 请在人人文库网上搜索 1 Java高级编程项目实践 徐铭 课程目录 第一部分 需求定义 第二部分 用户界面设计 第三部分 数
  • 停止开发GPT-4?我更加关注数据版权、信息安全和数字鸿沟问题

    近日 随着ChatGPT和GPT 4的迅猛发展 人工智能对于人类社会以及文明的影响将是我们需要重视的问题 有人认为ChatGPT的表现引人入胜 但同时也让人感到毛骨悚然 因此 AI是否可靠 是否会导致灾难 机器智能超过人类的 奇点 是否真正
  • 公共IPV6 dns大全

    dns是什么和公共ipv4可阅读本篇文章 dns大全 一 阿里ipv6 dns 阿里的dns好在于自家的服务器遍布全球 加上自家研究的CDN技术快稳定 强大的阿里云团队技术坚持也是国内首家支持IPv4和IPv6 双端加持 安全快速 2400
  • js数组常见操作方法总结

    0 将数组中所有name改成ChName Name改成EnName var arr1 name aa Name ss children name ww Name nn name ff Name ee let arr2 JSON parse
  • 过滤器 和 拦截器 的区别

    1 过滤器 Filter 过滤器配置比较简单 直接实现Filter 接口即可 也可以通过 WebFilter注解实现对特定URL拦截 看到Filter 接口中定义了三个方法 init 该方法在容器启动初始化过滤器时被调用 它在 Filter
  • matplotlib图表多曲线多纵轴绘制工具方法

    matplotlib是常用的可视化库 画折线图只要把列表plot进去就可以轻松展示 这里只弄折线图 其它图暂时不管 同一图上不同曲线数值大小差太多就能绘制成地板和天花板还不能给人家量纲去了 所以不同曲线需要不同纵轴才能清晰看出细小波动 要是
  • vscode代码上传到gitlab

    1 打开终端 1 1输入一下内容提交到本地仓库 PS D VueProject2 mall admin web gt git add PS D VueProject2 mall admin web gt git commit m 商品优化
  • PCB翘曲度

    为了正确放置 SMT 组件 PCB 必须保持完全平整 为了准确放置 贴片机必须将 SMT 组件释放到所有组件的电路板上方相同高度 如果 PCB 有翘曲 也就是说不平整 则机器在将元件放置在电路板上时 在释放元件时无法保持恒定的高度 这会影响
  • 德隆现象给中国企业的反思

    德隆现象给中国企业的反思 刘亚军 萨尼威投资管理顾问公司董事长兼首席咨询顾问 一 德隆 一个资本扩张神话的终结 最近 德隆继创造了自1992年进入快速成长以来 十二年形成了220亿的资产规模 在国内股市长期低迷的情况下 旗下的 老三股 屹立
  • Matlab数字图像处理--分别采用 5×5,9×9,15×15 和 25×25 大小的拉普拉斯算子对图像进行锐化滤波,并完成图像的锐化增强

    题目 代码 初始化 B为灰度图 B rgb2gary img i表示生成尺寸为i i的拉普拉斯算子 function init B i lap genlaplacian i img lap imfilter B lap replicate
  • 计算机协会管理,计算机爱好者协会内部管理制度

    计算机爱好者协会内部管理制度 由会员分享 可在线阅读 更多相关 计算机爱好者协会内部管理制度 5页珍藏版 请在人人文库网上搜索 1 计算机爱好者协会内部管理制度 1内部管理考核制度目录第一章总章 3 第二章组织工作制度 4 第三章普通会员权
  • Injection of autowired dependencies failed; 的解决办法!

    错误信息 严重 Exception sending context initialized event to listener instance of class org springframework web context Contex
  • 趣解面向对象

    小白自述 过去就听说 到面向对象的时候即使没有女朋友 都可以new好多个 啥时候我也能想new多少new多少 面向对象听了很多老师的课 感觉好绕啊 这个类套那个类 怎么套的也是一头雾水 怎么才能学好了面向对象嘛 好多人都说面向对象是java
  • 【Tensorflow2.0】8、tensorflow2.0_hdf5_savedmodel_pb模型转换[1]

    文章目录 1 训练模型 2 各种模型间互转并验证 2 1 hdf5转saved model 2 2 saved model转hdf5 2 3 所有模型精度测试 2 4 hdf5和saved模型转tensorflow1 x pb模型 2 5
  • Linux修改虚拟内存

    Linux机器默认swap空间 虚拟内存 为2G或更小 在运行一些大型程序如深度神经网络程序时 物理内存往往无法满足需求 可以扩大swap空间以达到正常运行的目的 主要分为6个步骤 1 创建swap文件夹 sudo mkdir usr sw
  • ospf小总结

    Ospf 开放式最短路径优先协议 Open Shortest Path First OSPF 无类别链路状态igp协议 周期更新 30min 触发更新 链路状态协议的更新量随着网络范围的扩展指数性的上升 因此ospf协议为了在中大型网络中工
  • 【cpolar、PHPStudy— 搭建企业论坛】

    公司内部搭建企业论坛 并实现在外也可以访问 文章目录 公司内部搭建企业论坛 并实现在外也可以访问 前言 1 cpolar PHPStudy 2 Discuz 3 打开PHPStudy 安装网页论坛所需软件 4 进行网页运行环境的构建 5 运
  • 关于ADMM的研究(二)

    4 Consensus and Sharing 本节讲述的两个优化问题 是非常常见的优化问题 也非常重要 我认为是ADMM算法通往并行和分布式计算的一个途径 consensus和sharing 即一致性优化问题与共享优化问题 Consens
  • Servlet的生命周期

    目录 1 Servlet的一生有这么几个阶段 2 一个Servlet从开始到消亡 1 Servlet的一生有这么几个阶段 调用构造方法进行实例化 1 构造方法 在第一次发起请求时 调用一次 public HomeServlet System