
文章插图
- 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里被调用了,我们看一下代码 。发现
service()
方法会在org.apache.catalina.core.ApplicationFilterChain#internalDoFilter(ServletRequest request, ServletResponse response)
里被调用 。看到这里,大家应该清楚Servlet如何跟Tomcat串联起来了吧 。至于我们写的Servlet是怎么塞到了
ApplicationFilterChain
里面 , 可以去看后续系列Tomcat的原理分析(又在挖坑,我直接好家伙) 。小试牛刀前面说了辣么多,那Servlet项目是什么结构,以及如何运行的 , 下面我们返璞归真搞个简单的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后,项目会变成什么样呢?这个我们下一篇文章会介绍 。
推荐阅读
- spring cron表达式源码分析
- 集合框架——LinkedList集合源码分析
- 含源码 手把手教你使用LabVIEW OpenCV DNN实现手写数字识别
- 补充部分---ScheduledThreadPoolExecutor类分析 线程池底层原理详解与源码分析
- 五 Netty 学习:服务端启动核心流程源码说明
- springboot自动配置原理以及手动实现配置类
- 三十六 Java开发学习----SpringBoot三种配置文件解析
- HashMap底层原理及jdk1.8源码解读
- SpringBoot 常用读取配置文件的 3 种方法!
- 含源码 手把手教你使用LabVIEW人工智能视觉工具包快速实现传统Opencv算子的调用