Java的Tomcat和Servlet的运行原理详解
目录
- 一、客户端(浏览器)与服务器之间的交互
- 二、Tomcat启动过程
- 三、Tomcat处理请求过程
- 四、Servlet的service方法
- 总结
事实就是,main 方法在Tomcat 中,Servlet 程序是配合Tomcat上运行的,Tomcat 就有了main 方法,就会拖着 Servlet 运行起来。
文章图片
Servlet 是上是Tomcat 提供的一组API,因此其代码的实现是基于 Tomcat 的。Tomcat 通过 HTTP协议来和浏览器进行交互,交互主要分成三个步骤:
请求接收
、处理请求
、返回响应
一、客户端(浏览器)与服务器之间的交互 请求接收:
1.当用户在浏览器端输入一个网址后,浏览器就会构造一个HTTP请求
2.该HTTP请求就会通过种种手段转换成光电信号被传输到服务器端(具体的转换涉及通信知识)
3.服务器主机接收到这些光电信号后对其进行解析,还原成原本的HTTP请求,并交给Tomcat 进行处理
4.Tomcat 对HTTP请求进行解析,把请求交给 Servlet的代码进行处理
处理请求:
1.Tomcat 会通过 Content Path和Servlet Path来确定到某webapp的某类,在根据请求的方法(doXXX方法)来确定调用该类的具体方法,代码中的HttpServletRequest对象就包含着HTTP请求的详细内容,根据代码进行结果的计算
返回响应:
【Java的Tomcat和Servlet的运行原理详解】1.Servlet 根据代码计算生成响应对象(HttpServletResponse)
2.Tomcat 在把该响应对象构造成HTTP响应,通过光电信号的方式传输到浏览器主机
3.浏览器主机在对光电信号进行解析还原成原本的HTTP响应,交给浏览器进行处理
4.浏览器解析该HTTP响应,将数据显示在界面上
二、Tomcat启动过程 1.首先,我们实现的 Servlet 代码,只是单纯的创建了Servlet类而已,想要让这些类真正的被使用,需要Tomcat进行实例化,Tomcat就会根据
@WebServlet注解
来获取到需要被实例化的类,通过反射的方式创建实例,并集中放在一数组中。2.Tomcat持有了Servlet实例后,需要调用 Servlet 中的
init()
方法进行初始化操作(只会进行一次初始化操作)3.然后进行绑定端口号,创建线程池,来并发的处理请求
4.在服务器运行结束前,就会调用 Servlet对象中的
destroy()
方法,进行资源回收操作三、Tomcat处理请求过程 1.Tomcat 接收到请求之后,就会按照 HTTP协议的格式将其构造成 HttpServletRequest对象
2.Tomcat 根据 URL 来判断该请求书否为一静态资源(比如图片、HTML文件之类的),如果是,就直接返回该静态资源,如果是动态资源就执行接下来的Servlet 部分
3.根据 Content Path 和 Servlet Path来找到请求的Servlet对象,并调用Servlet中的service方法判断请求类型,调用到程序员自己写的doXXX方法
四、Servlet的service方法 伪代码:
class Servlet {public void service(HttpServletRequest req, HttpServletResponse resp) {String method = req.getMethod(); if (method.equals("GET")) {doGet(req, resp); } else if (method.equals("POST")) {doPost(req, resp); } else if (method.equals("PUT")) {doPut(req, resp); } else if (method.equals("DELETE")) {doDelete(req, resp); }......}}
service 会根据请求的方法,调用对应的方法,当调用doXXX方法时,触发
多态机制
,执行到程序员自己写的代码。程序员自己写的 Servlet 类继承自 HttpServlet 类,HttpServlet 类继承自 Servlet 类,因此程序员写的类是 Servlet 的子类。在前面有介绍到 Tomcat 在启动时会将需要被实例化的类都放在了Servlet数组中,因此实际上我们是通过父类的引用来获取到被实例化的类的,从而触发多态。
类似于
Servlet ins = new HelloServlet(); //HelloServlet 类是程序员自己实现的类的类名ins.doGet(req,resp);
总结 本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!
推荐阅读
- Java正则表达式循环匹配字符串方式
- 详解Rust中的workspace
- 聊聊Mybatis反射之ObjectWrapper的使用
- springboot利用@Aspect实现日志工具类的详细代码
- c++核心编程之函数的重载
- c++|c++ qt自定义搜索编辑框的实现方法
- 关于springboot-starter-undertow和tomcat的区别说明
- 记一次springboot中用undertow的坑
- javascript|Vue2 原理浅谈
- java|秒杀项目(三)之商品展示&&CRUD