还记得上一篇文章里的灵魂拷问吗? 浏览器的一个请求,是如何精确到达你的web服务器里的业务逻辑里的,其中经历的流程能说个所以然吗,这个过程为:
- 客户端发送请求至服务器端 。
- 服务器将请求信息发送至 Servlet 。
- Servlet 生成响应内容并将其传给服务器 。响应内容动态生成,通常取决于客户端的请求 。
- 服务器将响应返回给客户端 。
- 客户端发送请求至服务器端 。这部分涉及的是计算机网络的基础知识,主要涉及各种协议,例如:ARP、DNS、TCP,HTTP等 。
- 服务器将请求信息发送至 Servlet 。这里就涉及的是具体的web服务器实现了,以Tomcat为例,这里不展开细说,请求到达Tomcat后,会经过各种阀门的处理,然后最终进入到我们的Servlet里面,这里附上Tomcat的整体处理流程图 。

文章插图
- Servlet 生成响应内容并将其传给服务器 。这部分没啥好说,就是具体的业务逻辑 。
- 服务器将响应返回给客户端 。跟第一点类似 。
所以可以看到二者的关系为:Servlet的运行依赖于Tomcat,Tomcat会为其提供很多基础功能的支持 。同时Tomcat对请求的业务处理是由具体的Servlet去实现,二者的结合有条不紊,实现了一个完整的web服务器功能 。
我们来看一下Servlet的发展历史,可以看到Servlet的第一个版本发布在1997年 。
版本日期JAVA EE/JDK版本特性Servlet 4.02017年10月JavaEE 8HTTP2 [1]Servlet 3.12013年5月JavaEE 7Non-blocking I/O, HTTP protocol upgrade mechanismServlet 3.02009年12月JavaEE 6, JavaSE 6Pluggability, Ease of development, Async Servlet, Security, File UploadingServlet 2.52005年10月JavaEE 5, JavaSE 5Requires JavaSE 5, supports annotationServlet 2.42003年11月J2EE 1.4, J2SE 1.3web.xml uses XML SchemaServlet 2.32001年8月J2EE 1.3, J2SE 1.2Addition of FilterServlet 2.21999年8月J2EE 1.2, J2SE 1.2Becomes part of J2EE, introduced independent web applications in .war filesServlet 2.11998年11月未指定First official specification, added RequestDispatcher, ServletContextServlet 2.0JDK 1.1Part of Java Servlet Development Kit 2.0Servlet 1.01997年6月再看Tomcat的发展历史,可以看到Tomcat的第一个版本是晚于Servlet的,所以Tomcat也被认为是最早比较完善的对Servlet支持的web服务器 。
版本日期JAVA EE/JDK版本tomcat-102021-06-16JDK 11tomcat-92015-11-19JDK 1.8tomcat-82013-08-05JDK 1.7tomcat-72010-06-13JDK 1.6tomcat-62006-10-21JDK 1.5tomcat-52004-08-29JDK 1.4tomcat-42003-09-06JDK 1.3tomcat-32003-09-06JDK 1.1再论Servlet是什么打开代码,可以看到Servlet其实是一个接口,接口意味着什么?意味着是规范,任何对它的合理实现都可以认为是一个Servlet,以我们常用的http为例,对http的支持是
HttpServlet
,看一下它的类继承图,可以看到它就是实现了Servlet
接口 。
文章插图
简单看一下
Servlet
接口定义的方法,可以看到只有五个方法,包含了初始化,执行业务逻辑,销毁等重要过程 。
文章插图
其中重点的是
service()
方法 。那么这个方法是在哪里被执行了呢?上面我们说过,Servlet是依赖于Tomcat运行的,所以这个方法应该是在Tomcat里被调用了,我们看一下代码 。
经验总结扩展阅读
- spring cron表达式源码分析
- 集合框架——LinkedList集合源码分析
- 含源码 手把手教你使用LabVIEW OpenCV DNN实现手写数字识别
- 补充部分---ScheduledThreadPoolExecutor类分析 线程池底层原理详解与源码分析
- 五 Netty 学习:服务端启动核心流程源码说明
- springboot自动配置原理以及手动实现配置类
- 三十六 Java开发学习----SpringBoot三种配置文件解析
- HashMap底层原理及jdk1.8源码解读
- SpringBoot 常用读取配置文件的 3 种方法!
- 含源码 手把手教你使用LabVIEW人工智能视觉工具包快速实现传统Opencv算子的调用