当前位置: 首页 > article >正文

JavaWeb开发基础Servlet生命周期与工作原理

Servlet生命周期

Servlet的生命周期由Servlet容器(如Tomcat、Jetty等)管理,主要包括以下5个阶段:

  1. 加载Servlet类

  2. 创建Servlet实例

  3. 调用init方法

  4. 调用service方法

  5. 调用destroy方法

  1. 加载(Loading):

    • 当Servlet容器启动或第一次接收到对某个Servlet的请求时,它会加载Servlet类
    • 这个过程只发生一次,除非Servlet被卸载或容器重新启动
  2. 实例化(Instantiation):

    • 在加载Servlet类之后,容器会创建一个Servlet实例
    • 这个实例化过程也是一次性的,除非Servlet被卸载或容器重新启动
  3. 初始化(Initialization):

    • 容器调用Servlet实例的init()方法进行初始化

    • init()方法只被调用一次,用于执行一次性的初始化任务,如读取配置参数、初始化资源等

    • 你可以重写init()方法以执行自定义的初始化逻辑

      public void init(ServletConfig config)
  4. 请求处理(Request Handling):

    • 每当有请求到达时,容器会调用Servlet的service()方法来处理请求

    • service()方法根据请求的类型(如GET、POST等)调用相应的处理方法(如doGet()doPost()等)

      public void service(ServletRequest request, ServletResponse response)
  5. 销毁(Destruction):

    • 当容器决定卸载Servlet(如容器关闭或Servlet被重新加载)时,它会调用Servlet的destroy()方法

    • destroy()方法用于执行清理任务,如关闭资源、保存状态等

    • destroy()方法只被调用一次

      public void destroy()

Servlet重新加载

Servlet被重新加载通常发生在以下几种情况下:

  1. Servlet类文件被修改:

    • 如果在开发过程中修改了Servlet类文件,Servlet容器可能会检测到这些更改并重新加载Servlet
    • 这通常发生在开发环境中,生产环境中一般不会自动重新加载
  2. 容器配置发生变化:

    • 如果修改了Servlet容器的配置文件(如web.xml),容器可能会重新加载相关的Servlet
  3. 容器重启:

    • 当Servlet容器重启时,所有的Servlet都会被重新加载
  4. 手动重新加载:

    • 某些Servlet容器提供了手动重新加载Servlet的功能,通常通过管理控制台或命令行工具

当Servlet被重新加载时,Servlet容器会执行以下步骤:

  1. 销毁现有的Servlet实例:

    • 容器调用现有Servlet实例的destroy()方法,执行清理任务
    • 释放资源,如关闭数据库连接、释放文件句柄等
  2. 卸载Servlet类:

    • 容器卸载现有的Servlet类,释放类加载器持有的资源
  3. 重新加载Servlet类:

    • 容器重新加载Servlet类文件,创建新的类加载器实例
  4. 实例化新的Servlet对象:

    • 容器创建新的Servlet实例
  5. 初始化新的Servlet实例:

    • 容器调用新的Servlet实例的init()方法进行初始化

Servlet代码示例

有3种方式使用Servlet:

①实现Servlet接口

import java.io.*;
import javax.servlet.*;public class First implements Servlet {ServletConfig config = null;public void init(ServletConfig config) {this.config = config;System.out.println("servlet is initialized");}public void service(ServletRequest req, ServletResponse res)throws IOException, ServletException {res.setContentType("text/html");PrintWriter out = res.getWriter();out.print("<html><body>");out.print("<b>hello simple servlet</b>");out.print("</body></html>");}public void destroy() {System.out.println("servlet is destroyed");}public ServletConfig getServletConfig() {return config;}public String getServletInfo() {return "copyright 2007-1010";}
}

②继承GenericServlet类

import java.io.*;
import javax.servlet.*;public class First extends GenericServlet {public void service(ServletRequest req, ServletResponse res)throws IOException, ServletException {res.setContentType("text/html");PrintWriter out = res.getWriter();out.print("<html><body>");out.print("<b>hello generic servlet</b>");out.print("</body></html>");}
}

③继承HttpServlet类

import javax.servlet.http.*;
import javax.servlet.*;
import java.io.*;public class DemoServ extends HttpServlet {public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {res.setContentType("text/html");PrintWriter pw = res.getWriter();String name = req.getParameter("name");pw.println("Welcome " + name);}
}

继承HttpServlet类是最常用的方式,接下来通过六个步骤,看看具体实践。

第一步,创建目录结构。

第二步,创建Servlet。

import javax.servlet.http.*;
import javax.servlet.*;
import java.io.*;public class DemoServlet extends HttpServlet {public void doGet(HttpServletRequest req, HttpServletResponse res)throws ServletException, IOException {res.setContentType("text/html");PrintWriter pw = res.getWriter(); pw.println("<html><body>");pw.println("Welcome to servlet");pw.println("</body></html>");pw.close();}
}

第三步,编译Servlet。

<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope>
</dependency>

编译后将class文件拷贝到WEB-INF/classes。

第四步,创建web.xml。

<web-app><servlet><servlet-name>sonoojaiswal</servlet-name><servlet-class>DemoServlet</servlet-class></servlet><servlet-mapping><servlet-name>sonoojaiswal</servlet-name><url-pattern>/welcome</url-pattern></servlet-mapping>
</web-app>

web.xml是一个部署描述符文件,用于配置Java Web应用程序。

Java Servlet 3.0引入了@WebServlet注解,用于简化Servlet的配置:

import javax.servlet.http.*;
import javax.servlet.*;
import java.io.*;
import javax.servlet.annotation.WebServlet;@WebServlet("/welcome")
public class DemoServlet extends HttpServlet {private static final long serialVersionUID = 1L;public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {res.setContentType("text/html");PrintWriter pw = res.getWriter(); pw.println("<html><body>");pw.println("Welcome to servlet");pw.println("</body></html>");pw.close();}
}

web.xml在低版本Servlet是必须的,在高版本Servlet已经不再需要。

第五步,部署Servlet。

将项目文件复制到Apache Tomcat的webapps目录下,启动Tomcat服务。

第六步,访问Servlet。

浏览器请求http://localhost:9999/demo/welcome,就能看到Servlet响应内容。

Servlet工作原理

  1. 请求映射:

    • 浏览器发送一个HTTP请求到服务器

    • 服务器根据web.xml文件中的配置,将请求映射到相应的Servlet

  2. 创建请求和响应对象:

    • 服务器为每个请求创建HttpServletRequestHttpServletResponse对象。这些对象包含了请求的所有信息和用于生成响应的方法
  3. 调用service方法:

    • 服务器在一个新的线程中调用Servlet的service方法来处理请求
  4. 调用public service方法:

    • public service 方法内部会调用protected service方法。public service方法是HttpServlet类的一部分,它负责处理所有类型的HTTP请求

      public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {if (req instanceof HttpServletRequest && res instanceof HttpServletResponse) {HttpServletRequest request = (HttpServletRequest)req;HttpServletResponse response = (HttpServletResponse)res;this.service(request, response);} else {throw new ServletException("non-HTTP request or response");}
      }
  5. 调用protected service方法:

    • protected service方法根据请求的类型(如GET、POST等)调用相应的处理方法(如doGetdoPost等)

      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);}
      }
  6. 调用doGet方法:

    • 如果请求类型是GET,protected service方法会调用doGet方法。doGet方法处理请求并生成响应
  7. 生成响应并发送给客户端:

    • doGet方法生成响应(如HTML、JSON等),并通过HttpServletResponse对象将响应发送回客户端
  8. 删除请求和响应对象:

    • 在响应发送完毕后,Web容器会删除HttpServletRequestHttpServletResponse对象,以释放资源
    • 处理请求的线程要么被返回到线程池,要么被删除,这取决于服务器的实现

总结,Servlet的生命周期包括初始化(init)、请求处理(service,调用doGet、doPost等)、和销毁(destroy)。工作原理是:客户端请求,服务器分发,创建请求和响应对象,调用service方法,生成并发送响应,删除请求和响应对象。

参考资料:

https://www.javatpoint.com/life-cycle-of-a-servlet

https://www.javatpoint.com/steps-to-create-a-servlet-using-tomcat-server

https://www.javatpoint.com/how-servlet-works

ChatGPT

相关文章:

JavaWeb开发基础Servlet生命周期与工作原理

Servlet生命周期 Servlet的生命周期由Servlet容器(如Tomcat、Jetty等)管理&#xff0c;主要包括以下5个阶段&#xff1a; 加载Servlet类 创建Servlet实例 调用init方法 调用service方法 调用destroy方法 加载(Loading)&#xff1a; 当Servlet容器启动或第一次接收到对某个…...

三防平板科普:有什么特殊功能?应用在什么场景?

在数字化浪潮席卷全球的今天&#xff0c;智能设备已成为现代工业、应急救援、户外作业等领域的核心工具。然而&#xff0c;常规平板电脑在极端环境下的脆弱性&#xff0c;如高温、粉尘、水浸或撞击&#xff0c;往往成为制约效率与安全的短板。三防平板&#xff08;防水、防尘、…...

百度外链生态的优劣解构与优化策略深度研究

本文基于搜索引擎算法演进与外链建设实践&#xff0c;系统剖析百度外链的作用机制与价值模型。通过数据统计、案例分析及算法逆向工程&#xff0c;揭示不同类型外链在权重传递、流量获取、信任背书等维度的差异化表现&#xff0c;提出符合搜索引擎规则的外链建设技术方案&#…...

笔记: 在WPF中ContentElement 和 UIElement 的主要区别

一、目的&#xff1a;简要姐扫在WPF中ContentElement 和 UIElement 的主要区别 ContentElement 和 UIElement 是 WPF 中的两个基类&#xff0c;它们在功能和用途上有显著的区别。 二、主要区别 ContentElement 主要特点: • 没有视觉表示: ContentElement 本身不直接渲染任…...

项目中使用到了多个UI组件库,也使用了Tailwindcss,如何确保新开发的组件样式隔离?

在项目中使用多个组件库&#xff0c;同时使用 TailwindCSS&#xff0c;确保新开发的组件样式隔离是非常重要的。样式隔离可以避免样式冲突、全局污染以及意外的样式覆盖问题。以下是一些常见的策略和最佳实践&#xff1a; 1. 使用 TailwindCSS 的 layer 机制 TailwindCSS 提供…...

AI提示工程(Prompt Engineering)高级技巧详解

AI提示工程(Prompt Engineering)高级技巧详解 文章目录 一、基础设计原则二、高级提示策略三、输出控制技术四、工程化实践五、专业框架应用提示工程是与大型语言模型(LLM)高效交互的关键技术,精心设计的提示可以显著提升模型输出的质量和相关性。以下是经过验证的详细提示工…...

【速写】PPOTrainer样例与错误思考(少量DAPO)

文章目录 序言1 TRL的PPO官方样例分析2 确实可行的PPOTrainer版本3 附录&#xff1a;DeepSeek关于PPOTrainer示例代码的对话记录Round 1&#xff08;给定模型数据集&#xff0c;让它开始写PPO示例&#xff09;Round 2 &#xff08;指出PPOTrainer的参数问题&#xff09;关键问题…...

5.26 面经整理 360共有云 golang

select … for update 参考&#xff1a;https://www.cnblogs.com/goloving/p/13590955.html select for update是一种常用的加锁机制&#xff0c;它可以在查询数据的同时对所选的数据行进行锁定&#xff0c;避免其他事务对这些数据行进行修改。 比如涉及到金钱、库存等。一般这…...

中国移动咪咕助力第五届全国人工智能大赛“AI+数智创新”专项赛道开展

第五届全国人工智能大赛由鹏城实验室主办&#xff0c;新一代人工智能产业技术创新战略联盟承办&#xff0c;华为、中国移动、鹏城实验室科教基金会等单位协办&#xff0c;广东省人工智能与机器人学会支持。 大赛发布“AI图像编码”、“AI增强视频质量评价”、“AI数智创新”三大…...

模具制造业数字化转型:精密模塑,以数字之力铸就制造基石

模具被誉为 “工业之母”&#xff0c;是制造业的重要基石&#xff0c;其精度直接决定了工业产品的质量与性能。在工业制造向高精度、智能化发展的当下&#xff0c;《模具制造业数字化转型&#xff1a;精密模塑&#xff0c;以数字之力铸就制造基石》这一主题&#xff0c;精准点明…...

PECVD 生成 SiO₂ 的反应方程式

在PECVD工艺中&#xff0c;沉积氧化硅薄膜以SiH₄基与TEOS基两种工艺路线为主。 IMD Oxide&#xff08;USG&#xff09; 这部分主要沉积未掺杂的SiO₂&#xff0c;也叫USG&#xff08;Undoped Silicate Glass&#xff09;&#xff0c;常用于IMD&#xff08;Inter-Metal Diele…...

React与Vue核心区别对比

React 和 Vue 都是当今最流行、功能强大的前端 JavaScript 框架&#xff0c;用于构建用户界面。它们有很多相似之处&#xff08;比如组件化、虚拟 DOM、响应式数据绑定&#xff09;&#xff0c;但也存在一些核心差异。以下是它们的主要区别&#xff1a; 1. 核心设计与哲学 Rea…...

2024 CKA模拟系统制作 | Step-By-Step | 17、题目搭建-排查故障节点

目录 免费获取题库配套 CKA_v1.31_模拟系统 一、题目 二、考点分析 1. Kubernetes 节点状态诊断 2. 节点故障修复技能 3. 持久化修复方案 4. SSH 特权操作 三、考点详细讲解 1. 节点状态机制详解 2. 常见故障原因深度分析 3. 永久修复技术方案 四、实验环境搭建步骤…...

如何将图像插入 PDF:最佳工具比较

无论您是编辑营销材料、写报告还是改写原来的PDF文件&#xff0c;将图像插入 PDF 都至关重要。幸运的是&#xff0c;有多种在线和离线工具可以简化此任务。在本文中&#xff0c;我们将比较一些常用的 PDF 添加图像工具&#xff0c;并根据您的使用场景推荐最佳解决方案&#xff…...

Linux 文件 IO 性能监控与分析指南

Linux 文件 I/O 性能监控与分析指南 继 CPU 和网络之后&#xff0c;文件系统 I/O 是影响系统性能的第三大关键领域。无论是数据库响应缓慢、应用加载时间过长&#xff0c;还是日志写入延迟&#xff0c;其根源都可能指向磁盘 I/O 瓶颈。本章将深入探讨文件 I/O 的核心概念、监控…...

ABP VNext + Apache Flink 实时流计算:打造高可用“交易风控”系统

ABP VNext Apache Flink 实时流计算&#xff1a;打造高可用“交易风控”系统 &#x1f310; &#x1f4da; 目录 ABP VNext Apache Flink 实时流计算&#xff1a;打造高可用“交易风控”系统 &#x1f310;一、背景&#x1f680;二、系统整体架构 &#x1f3d7;️三、实战展示…...

前端面试题-HTML篇

1. 请谈谈你对 Web 标准以及 W3C 的理解和认识。 我对 Web 标准 的理解是&#xff0c;它就像是互联网世界的“交通规则”&#xff0c;由 W3C&#xff08;World Wide Web Consortium&#xff0c;万维网联盟&#xff09; 这样一个国际性组织制定。这些规则规范了我们在编写 HTML…...

JS数组 concat() 与扩展运算符的深度解析与最佳实践

文章目录 前言一、语法对比1. Array.prototype.concat()2. 扩展运算符&#xff08;解构赋值&#xff09; 二、性能差异&#xff08;大规模数组&#xff09;关键差异原因 三、适用场景建议总结 前言 最近工作中遇到了一个大规模数组合并相关的问题&#xff0c;在数据合并时有些…...

人工智能与机器学习从理论、技术与实践的多维对比

人工智能(Artificial Intelligence, AI)提出“让机器像人类一样思考”的目标,其核心理论围绕符号系统假设展开——认为智能行为可通过逻辑符号系统(如谓词逻辑、产生式规则)建模。 机器学习(Machine Learning, ML)是人工智能的子集,聚焦于通过数据自动改进算法性能的理…...

Netty 实战篇:手写一个轻量级 RPC 框架原型

本文将基于前文实现的编解码与心跳机制&#xff0c;构建一个简单的 RPC 框架&#xff0c;包括请求封装、响应解析、动态代理调用。为打造微服务通信基础打下基础。 一、什么是 RPC&#xff1f; RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用&#xff09;允许…...

什么是 WPF 技术?什么是 WPF 样式?下载、安装、配置、基本语法简介教程

什么是 WPF 技术&#xff1f;什么是 WPF 样式&#xff1f;下载、安装、配置、基本语法简介教程 摘要 WPF教程、WPF开发、.NET 8 WPF、Visual Studio 2022 WPF、WPF下载、WPF安装、WPF配置、WPF样式、WPF样式详解、XAML语法、XAML基础、MVVM架构、数据绑定、依赖属性、资源字典…...

亚远景-ISO 21434标准:汽车网络安全实践的落地指南

一、ISO 21434标准概述 ISO 21434是针对道路车辆网络安全的国际标准&#xff0c;旨在确保汽车组织在车辆的整个生命周期内采用结构化方法进行网络安全风险管理。 该标准适用于参与车辆开发的所有利益相关者&#xff0c;包括OEM、一级和二级供应商、汽车软件供应商以及网络安全…...

【动手学深度学习】2.4. 微积分

目录 2.4. 微积分1&#xff09;导数和微分2&#xff09;偏导数3&#xff09;梯度4&#xff09;链式法则5&#xff09;小结 . 2.4. 微积分 微积分的起源&#xff1a; 古希腊人通过逼近法&#xff08;多边形边数↑ → 面积逼近圆&#xff09;发展出积分的思想。 微分&#xff…...

流程自动化引擎:让业务自己奔跑

在当今竞争激烈的商业环境中&#xff0c;企业面临着快速变化的市场需求、日益复杂的业务流程以及不断增长的运营成本。如何优化业务流程、提升效率并降低成本&#xff0c;成为企业持续发展的关键问题。 流程自动化引擎&#xff08;Process Automation Engine&#xff09;作为一…...

AI炼丹日志-23 - MCP 自动操作 自动进行联网检索 扩展MCP能力

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; Java篇&#xff1a; MyBatis 更新完毕目前开始更新 Spring&#xff0c;一起深入浅出&#xff01; 大数据篇 300&#xff1a; Hadoop&…...

用 Python 模拟雪花飘落效果

用 Python 模拟雪花飘落效果 雪花轻轻飘落&#xff0c;给冬日带来一份浪漫与宁静。本文将带你用一份简单的 Python 脚本&#xff0c;手把手实现「雪花飘落效果」动画。文章深入浅出&#xff0c;零基础也能快速上手&#xff0c;完整代码仅需一个脚本文件即可运行。 目录 前言…...

基于定制开发开源AI智能名片S2B2C商城小程序的大零售渗透策略研究

摘要&#xff1a;本文聚焦“一切皆零售”理念下的大零售渗透趋势&#xff0c;提出以定制开发开源AI智能名片S2B2C商城小程序为核心工具的渗透策略。通过分析该小程序在需求感应、场景融合、数据驱动等方面的技术优势&#xff0c;结合零售渗透率提升的关键路径&#xff0c;揭示其…...

重拾Scrapy框架

基于Scrapy框架实现 舔狗语录百度翻译 输出结果到txt文档 爬虫脚本 from typing import Iterable, Any, AsyncIteratorimport scrapy import json from post.items import PostItemclass BaidufanyiSpider(scrapy.Spider):name "baidufanyi"allowed_domains [&quo…...

Day 40

单通道图片的规范写法 import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader , Dataset from torchvision import datasets, transforms import matplotlib.pyplot as plt import warnings warnings.filterwarnings(&q…...

XPlifeapp:高效打印,便捷生活

在数字化时代&#xff0c;虽然电子设备的使用越来越普遍&#xff0c;但打印的需求依然存在。无论是学生需要打印课表、资料&#xff0c;还是职场人士需要打印名片、报告&#xff0c;一个高效便捷的打印软件都能大大提高工作效率。XPlifeapp就是这样一款超级好用的手机打印软件&…...