Servlet 生命周期可以描述为servlet的生命跨度,从载入到销毁。
在解释servelt生命周期前,先来讨论一些你将在本文中看到的一些术语,这将帮你更快速地理解它。
Web Server: 它也被成为Http Server,处理从客户端发来的Http 请求,用Http Response 响应此请求。
Web Container: 也称为Servlet容器,Servlet引擎。它与Servlet交互,是Web Server的一部分。它是Web Server的主要组件,管理servlet的生命周期。
Servlet的生命周期包含五步:
1) 载入Servlet
2) 创建Servlet实例
3) 调用init()方法
4) 调用service()方法独立响应每个客户的请求
5) 调用destory()方法
然我们回到我们的主要话题。这里是servlet生命周期的五个步骤。
步骤1:载入servlet
当web server(例如tomcat)启动时,servlet容器部署载入所有的servlet
步骤2:创建servlet实例
一旦所有的servlet被载入,这个servlet容器创建每一个servlet的实例。servlet容器对每个servlet只创建一次,并且所有的这个servlet的请求都被同一个servlet实例处理。
步骤3:调用init()方法
一旦所有的servlet类被实例化,每个servlet的init()方法都会被调用。这个方法初始化这个servlet,有某些初始化参数你可以在部署描述文件(web.xml)中指定。例如,如果一个servlet有个大于0的值,那么它的init()方法在容易启动时会被立刻调用。
你可以在web.xml中指定该元素,像这样:
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.beginnersbook.MyServletDemo</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
现在这个相应的servlet类com.beginnersbook.MyServletDemo的init()方法在web容器启动时立刻被调用。
步骤4:调用service()方法
每次web server接受到servlet的请求时,它就产生一个新的线程来调用service()方法(所以我们经常说的单例多线程就是这个意思)。如果这个servlet是GenericServlet那么这个请求被他自己的service()服务,如果这个servlet是HttpServlet,那么service()方法接受该请求并基于请求类型分发它到对应的成立方法上。
例如,如果它是一个Get请求,service()方法将分发此请求到doGet()方法上,通过调用doGet()方法,并带上请求参数。类似地,像Post,Head,Put等请求都会被分发到相应的doPost(),doPut(),doHead()方法上,通过service()方法。
(image)[https://beginnersbook.com/wp-content/uploads/2013/05/Servlet_Life_Cycle.jpg]
注意:不像init()方法和destory()方法只被调用一次,service()方法可在生命周期中调用任意多次,只要servlet没有被销毁,对于每个客户端请求service()都会被调用。
步骤五:地用destory()方法
当servelt容器关闭(经常发生在我们关闭web server时),它卸载所有的servlet并调用每个初始化的servlet的destory()方法。