Spring mvc源码分析系列--Servlet的前世今生( 二 )


还记得上一篇文章里的灵魂拷问吗? 浏览器的一个请求,是如何精确到达你的web服务器里的业务逻辑里的,其中经历的流程能说个所以然吗,这个过程为:

  1. 客户端发送请求至服务器端 。
  2. 服务器将请求信息发送至 Servlet 。
  3. Servlet 生成响应内容并将其传给服务器 。响应内容动态生成,通常取决于客户端的请求 。
  4. 服务器将响应返回给客户端 。
以上的每一步都包含着大量的细节,现在广泛使用的web服务器是Tomcat,以Tomcat为例,简单分析一下以上的四步:
  • 客户端发送请求至服务器端 。这部分涉及的是计算机网络的基础知识,主要涉及各种协议,例如:ARP、DNS、TCP,HTTP等 。
  • 服务器将请求信息发送至 Servlet 。这里就涉及的是具体的web服务器实现了,以Tomcat为例,这里不展开细说,请求到达Tomcat后,会经过各种阀门的处理,然后最终进入到我们的Servlet里面,这里附上Tomcat的整体处理流程图 。

Spring mvc源码分析系列--Servlet的前世今生

文章插图
  • Servlet 生成响应内容并将其传给服务器 。这部分没啥好说,就是具体的业务逻辑 。
  • 服务器将响应返回给客户端 。跟第一点类似 。
Servlet与Tomcat的关系Tomcat是一个web服务器,又有人称其为Servlet容器,那么顾名思义,Tomcat运行时会包含很多的Servlet在其中,当请求到达Tomcat时,Tomcat会帮我们将请求封装成一个Request对象,经过不同层级的阀门处理后,转发到了具体的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接口 。
Spring mvc源码分析系列--Servlet的前世今生

文章插图
简单看一下Servlet接口定义的方法,可以看到只有五个方法,包含了初始化,执行业务逻辑,销毁等重要过程 。
Spring mvc源码分析系列--Servlet的前世今生

文章插图
其中重点的是service()方法 。那么这个方法是在哪里被执行了呢?上面我们说过,Servlet是依赖于Tomcat运行的,所以这个方法应该是在Tomcat里被调用了,我们看一下代码 。

经验总结扩展阅读