servlet原理

面试官问Servlet、HttpServlet,如何设计实现一个网络应用。今天就来扒一扒。

参考博文:

什么是Servlet容器

Servlet底层原理、Servlet实现方式、Servlet生命周期

HttpServlet、GenericServlet、Servlet之间的关系

随便写一个HelloServlet实现HttpServlet接口,再点进HttpServlet里,一路跟踪到Servet,可以看到如下关系

image-20210410213658643

也就是说我们可以画出如下类图关系:

image-20210410221658586

在servlet接口里,几个方法,分别对应servlet的生命周期。

Servlet生命周期

先看张图,看不懂没关系,先看一眼。

image-servlet生命周期

我们知道,对于一个B/S架构的应用,我们要得到服务器的信息的话,要通过浏览器发送一个http请求,这个请求经过了一系列TCP等过程与服务器建立连接之后,服务器就得把响应的数据再还给浏览器,也就是http响应。这就是上图的1和7过程,但在这中间经历过什么呢,下面我们就来剖析一下:

Servlet的加载与实例化

假设现在已经有了一个servlet容器(至于什么是servlet容器,我们等会说,现在只需要知道它是个小碗里面装有很多servlet就行),这个容器呢对于新来的一个请求,会对这个请求进行解析,分析出需要什么样的servlet去处理这个请求,如果已经有一个合适的servlet,那就跳过这一步进入2.2了,而如果没有的话,就会首先调用servlet的构造方法,生成一个对象,然后调用Init() 方法,进行初始化(主要做一些准备工作和资源预加载)

服务

既然请求来了,servlet也准备好了,现在万事俱备连东风都不欠了,那我们就肯定要对用户的请求进行响应了,那么是怎么响应的呢?还是那个容器,它会去调用刚创建好的servlet对象里面的service方法,在service方法里就可以进行具体的响应过程了,我们来看一丢丢源码,不要慌,它很简单。

image-20210410223412159

你看这个方法,它把servletRequest和ServletResponse强转了一下,就丢给重载的另一个方法了,那我们去看看重载那个方法。下面的代码看起来有点长,但是先看一眼图,不要慌

image-20210410223752831

看那些个框框,有没有觉得有一点熟悉,对,我们继承HttpServlet的时候最常去重写的可不就是doGet和doPost。就这样,servlet容器如何调用servlet进行服务的就很清楚了。

servlet的销毁

还可以看到,servlet里面有一个destroy方法,这个就不用多说,当servlet容器关闭时,servlet就会被销毁了。什么?你问没关闭容器能不能销毁servlet,答案是可以的。

Servlet容器

image-container

servlet容器里装着很多servlet,Web服务器接收到HTTP请求后,会把请求转发给servlet容器,然后容器会根据自己内部的servlet对请求进行响应,并生虫动态结果返回给服务器。看下图:

image-service

posted @ 2021-04-10 23:00  热勇一腔  阅读(121)  评论(0编辑  收藏  举报