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


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

文章插图
  • Servlet 生成响应内容并将其传给服务器 。这部分没啥好说,就是具体的业务逻辑 。
  • 服务器将响应返回给客户端 。跟第一点类似 。
Servlet与Tomcat的关系【Spring mvc源码分析系列--Servlet的前世今生】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里被调用了,我们看一下代码 。
发现service()方法会在org.apache.catalina.core.ApplicationFilterChain#internalDoFilter(ServletRequest request, ServletResponse response)里被调用 。看到这里,大家应该清楚Servlet如何跟Tomcat串联起来了吧 。
至于我们写的Servlet是怎么塞到了ApplicationFilterChain里面 , 可以去看后续系列Tomcat的原理分析(又在挖坑,我直接好家伙) 。
小试牛刀前面说了辣么多,那Servlet项目是什么结构,以及如何运行的 , 下面我们返璞归真搞个简单的Servlet项目来试试看 。
新建一个项目,勾上 。
Spring mvc源码分析系列--Servlet的前世今生

文章插图
过程省略,可参考文章,最终项目结构如下 。
Spring mvc源码分析系列--Servlet的前世今生

文章插图
MyServlet代码如下 。
/** * @author Codegitz * @date 2022/9/28 **/@WebServlet({"/myServlet"})public class MyServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("invoke MyServlet#doGet() method");doPost(req,resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("invoke MyServlet#doPost() method");resp.getWriter().write("<h1>Hello World</h1>");}}启动Tomcat就可以访问了 。麻雀虽小五脏俱全,这就是一个简单的Servlet项目构建过程 。可以看到这个纯粹的Servlet项目 , 没有涉及到Spring mvc的东西,那么如何涉及到Spring mvc后,项目会变成什么样呢?这个我们下一篇文章会介绍 。

推荐阅读