面试官问Servlet、HttpServlet,如何设计实现一个网络应用。今天就来扒一扒。
参考博文:
Servlet底层原理、Servlet实现方式、Servlet生命周期
随便写一个HelloServlet实现HttpServlet接口,再点进HttpServlet里,一路跟踪到Servet,可以看到如下关系
也就是说我们可以画出如下类图关系:
在servlet接口里,几个方法,分别对应servlet的生命周期。
先看张图,看不懂没关系,先看一眼。
我们知道,对于一个B/S架构的应用,我们要得到服务器的信息的话,要通过浏览器发送一个http请求,这个请求经过了一系列TCP等过程与服务器建立连接之后,服务器就得把响应的数据再还给浏览器,也就是http响应。这就是上图的1和7过程,但在这中间经历过什么呢,下面我们就来剖析一下:
假设现在已经有了一个servlet容器(至于什么是servlet容器,我们等会说,现在只需要知道它是个小碗里面装有很多servlet就行),这个容器呢对于新来的一个请求,会对这个请求进行解析,分析出需要什么样的servlet去处理这个请求,如果已经有一个合适的servlet,那就跳过这一步进入2.2了,而如果没有的话,就会首先调用servlet的构造方法,生成一个对象,然后调用Init() 方法,进行初始化(主要做一些准备工作和资源预加载)
既然请求来了,servlet也准备好了,现在万事俱备连东风都不欠了,那我们就肯定要对用户的请求进行响应了,那么是怎么响应的呢?还是那个容器,它会去调用刚创建好的servlet对象里面的service方法,在service方法里就可以进行具体的响应过程了,我们来看一丢丢源码,不要慌,它很简单。
你看这个方法,它把servletRequest和ServletResponse强转了一下,就丢给重载的另一个方法了,那我们去看看重载那个方法。下面的代码看起来有点长,但是先看一眼图,不要慌
看那些个框框,有没有觉得有一点熟悉,对,我们继承HttpServlet的时候最常去重写的可不就是doGet和doPost。就这样,servlet容器如何调用servlet进行服务的就很清楚了。
还可以看到,servlet里面有一个destroy方法,这个就不用多说,当servlet容器关闭时,servlet就会被销毁了。什么?你问没关闭容器能不能销毁servlet,答案是可以的。
servlet容器里装着很多servlet,Web服务器接收到HTTP请求后,会把请求转发给servlet容器,然后容器会根据自己内部的servlet对请求进行响应,并生虫动态结果返回给服务器。看下图:
原文:https://www.cnblogs.com/reyong/p/14642526.html