java---Servlet运行原理及生命周期

本文详细介绍了Servlet的工作原理,包括接收请求、根据请求计算响应和返回响应的过程,以及Servlet的生命周期,重点讲解了init(), service(), 和 destroy() 方法的作用。
摘要由CSDN通过智能技术生成

+目录

前言

运行流程

1.接收请求:

2.根据请求计算响应:

3.返回响应:

Servlet的生命周期

类加载

实例化

Servlet初始化阶段 init()方法

Servlet调用service()方法处理请求

Servlet调用destroy()方法销毁

总结



前言

Servlet 是一种实现动态页面的技术 . 是一组 Tomcat 提供给程序猿的 API, 帮助程序猿简单高效的开发一个 web app。

运行流程

1.接收请求:

用户在浏览器输入一个 URL, 此时浏览器就会构造一个 HTTP 请求。
这个 HTTP 请求会经过网络协议栈逐层进行 封装 成二进制的 bit , 最终通过物理层的硬件设备转换成光信号/ 电信号传输出去。
这些承载信息的光信号/ 电信号通过互联网上的一系列网络设备, 最终到达目标主机 ( 这个过程也需要网络层和数据链路层参与)。
服务器主机收到这些光信号/ 电信号, 又会通过网络协议栈逐层进行 分用 , 层层解析, 最终还原成 HTTP 请求。 并交给 Tomcat 进程进行处理 ( 根据端口号确定进程 )
Tomcat 通过 Socket 读取到这个请求 ( 一个字符串 ), 并按照 HTTP 请求的格式来解析这个请求得到HttpServletRequest 对象。根据请求中的 Context Path 确定一个 webapp, 再通过 Servlet Path 确定一个具体的类。 再根据当前请求的方法 (GET/POST/...), 决定调用这个类的 doGet 或者 doPost 等方法 . 此时我们的代码中的doGet / doPost 方法的第一个参数 HttpServletRequest 就包含了这个 HTTP 请求的详细信息 .

2.根据请求计算响应:

在我们的 doGet / doPost 方法中 , 就执行到了我们自己的代码 . 我们自己的代码会根据请求中的一
些信息 , 来给 HttpServletResponse 对象设置一些属性 . 例如状态码 , header, body 等。

3.返回响应:

我们的 doGet / doPost 执行完毕后 , Tomcat 就会自动把 HttpServletResponse 这个我们刚设置好
的对象转换成一个符合 HTTP 协议的字符串 , 通过 Socket 把这个响应发送出去。
此时响应数据在服务器的主机上通过网络协议栈层层 封装 , 最终又得到一个二进制的 bit , 通过物
理层硬件设备转换成光信号 / 电信号传输出去。
这些承载信息的光信号 / 电信号通过互联网上的一系列网络设备 , 最终到达浏览器所在的主机 ( 这个过 程也需要网络层和数据链路层参与)。
浏览器主机收到这些光信号 / 电信号 , 又会通过网络协议栈逐层进行 分用 , 层层解析 , 最终还原成
HTTP 响应 , 并交给浏览器处理。
浏览器也通过 Socket 读到这个响应 ( 一个字符串 ), 按照 HTTP 响应的格式来解析这个响应 . 并且把
body 中的数据按照一定的格式显示在浏览器的界面上。
比较详细的交互图:

Servlet的生命周期

首先明确Tomcat默认是使用懒汉模式(使用时才创建)创建单例对象。所以对象在第一次请求时被创建。

类加载

实例化

类加载后,创建Servlet实例,分配内存空间。

Servlet初始化阶段 init()方法

init()方法被设计成只调用一次。它在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用。因此,它是用于一次性初始化。

Servlet 创建于用户第一次调用对应于该 Servlet 的 URL 时,但是您也可以指定 Servlet 在服务器第一次启动时被加载。

当用户调用一个 Servlet 时,就会创建一个 Servlet 实例(这里是指第一次调用),每一个用户请求都会产生一个新的线程(因此Servlet是运行在多线程环境下的),适当的时候移交给 doGet 或 doPost 方法。init() 方法简单地创建或加载一些数据,这些数据将被用于 Servlet 的整个生命周期。

Servlet调用service()方法处理请求

首先,Tomcat 会根据 URL 中的 Context Path Servlet Path 确定要调用哪个 Servlet 实例的 service 方法。

service() 方法是执行实际任务的主要方法。Servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。

每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务。service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并在适当的时候调用 doGet、doPost、doPut,doDelete 等方法。

service() 方法由容器调用,service 方法在适当的时候调用 doGet、doPost、doPut、doDelete 等方法。所以,我们不用对 service() 方法做任何动作,我们只需要根据来自客户端的请求类型来重写 doGet() 或 doPost() 即可。

Servlet调用destroy()方法销毁

destroy() 方法只会被调用一次,在 Servlet 生命周期结束时被调用。destroy() 方法可以让Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动。在调用 destroy() 方法之后,servlet 对象被标记为垃圾回收。


总结

加油哦~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值