servlet是由web服务器调用,web服务器在收到浏览器请求后,会判断servlet是否存在,若不存在则装载创建servlet的实例并初始化(若存在则跳过此步骤),然后调用service方法对请求进行处理。
一、UML
从图中,可以看出:
1.抽象类HttpServlet继承抽象类GenericServlet,其有两个比较关键的方法,doGet()和doPost()
2.GenericServlet实现接口Servlet,ServletConfig,Serializable
3.HelloServlet(用户自定义Servlet类)继承HttpServlet,重写抽象类HttpServlet的doGet()和doPost()方法
注:任何一个用户自定义Servlet,只需重写抽象类HttpServlet的doPost()和doGet()即可,如上图的HelloServlet
二、Servlet在容器中的执行过程
Servlet在容器中的执行过程
流程:
-
浏览器向服务器发出GET/Post请求。
-
服务器上的容器逻辑接收到该url,根据该url判断为Servlet请求,此时容器逻辑将产生两个对象:请求对象(HttpServletRequest)和响应对象(HttpServletResponce)
-
容器逻辑根据url找到目标Servlet,且创建一个线程A。
-
容器逻辑将刚才创建的请求对象和响应对象传递给线程A。
-
容器逻辑调用Servlet的service()方法。
-
service()方法根据请求类型调用doGet()或doPost()方法。
-
doGet()或doPost()执行完后,将结果返回给容器逻辑。
-
线程A被销毁或被放在线程池中。
三、Servlet在容器中的生命周期
- 加载和实例化
当Servlet容器启动时,或者在容器检测到需要这个Servlet来响应第一个请求时,创建Servlet对象(实例)。 - 初始化
在Servlet实例化之后,容器将调用Servlet的init()初始化这个对象。 - 处理请求
Servlet容器调用Servlet的service()方法对请求进行处理。 - 终止服务
当容器检测到一个Servlet实例应该从服务中被移除的时候,容器就会调用实例的destroy(),以便让该实例可以释放它所使用的资源,保存数据到持久存储设备中。当需要释放内存或者容器关闭时,容器就会调用Servlet实例的destroy()方法。在destroy()方法调用之后,容器会释放这个Servlet实例,该实例随后会被Java的垃圾收集器所回收。如果再次需要这个Servlet处理请求,Servlet容器会创建一个新的Servlet实例。