+目录
前言
运行流程
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 对象被标记为垃圾回收。
总结
加油哦~~