Servlet生命周期及运行原理总结

Servlet生命周期:

Servlet类加载->创建Servlet类实例->Servlet初始化(真正成为一个Servlet)->有请求到来,调用service方法(主要工作)->最后直到Servlet被destroy。

一、Servlet类加载:
1、启动Servlet容器(web容器)后,Servlet容器(web容器)首先会去寻找web应用的部署描述文件(web.xml),从部署描述文件(web.xml)中读取到上下文初始化参数,此时创建一个ServletContext对象,web应用的所有部分共享此上下文;
2、Servlet容器(web容器)为context-param创建String名值对(参数名和参数值均为String类型);
3、Servlet容器(web容器)将名值对交给ServletContext对象;
4、如果在部署描述文件(web.xml)中有Listener标签的话,则创建Listener实例;
5、Servlet容器(web容器)调用Listener的contextInitialized方法,传入ServletContextEvent对象,此对象包含一个ServletContext引用,事件处理代码可以得到上下文初始化参数。

二、创建Servlet类实例:
1、Servlet容器(web容器)读取部署描述文件(web.xml)中的Servlet标签,包括初始化参数(init-param);
2、Servlet容器(web容器)创建ServletConfig实例;
3、Servlet容器(web容器)为servlet初始化参数创建名值对;
4、Servlet容器(web容器)用名值对填充ServletConfig实例;
5、Servlet容器(web容器)创建Servlet类的新实例(一般在第一次请求到来时创建,也可通过设置load-on-start参数在web容器启动时创建)。

三、Servlet的初始化init方法:
1、因为Servlet的init方法在Servlet的一个生命周期中只会被执行一次,init方法是在web容器装入Servlet时执行的,可以通过配置,在启动web服务器时或客户机首次访问Servlet时装入Servlet。无论有多少客户机访问Servlet,都不会重复执行init方法。因此调用service方法前,Servlet初始化必须完成;
2、因为在GenericServlet中有两个init方法,其中有参数的init方法,调用了无参的init方法,所以如果需要重写init方法,只需要重写无参的init方法。

综合一、二、三:当启动Servlet容器(web容器)时,容器首先查找一个部署描述文件(web.xml),这个文件中记录了可以提供服务的Servlet,每个Servlet被指定一个Servlet名,也就是这个Servlet实际对应的Java的完整class文件名。Servlet容器会为每个自动装入选项的Servlet创建一个实例。所以,每个Servlet类必须有一个公共的无参数的构造器。当Servlet被实例化后,Servlet容器(web容器)将调用每个Servlet的init方法来实例化每个实例,执行完init方法之后,Servlet处于“已初始化”状态。所以说,一旦Servlet被实例化,那么必将调用init方法。通过Servlet在Servlet容器(web容器)启动后不立即初始化,而是收到请求后进行。在web.xml文件中用<load-on-statup> ...... </load-on-statup>对Servlet进行预先初始化。初始化失败后,执行init()方法抛出ServletException异常,Servlet对象将会被垃圾回收器回收,当客户端第一次访问服务器时加载Servlet实现类,创建对象并执行初始化方法。

四、Servlet的service方法:

service方法是Servlet的核心,每当一个客户请求一个HttpServlet对象,该对象的Service()方法就要调用,而且传递给这个方法一个“请求”(ServletRequest)对象和一个“响应”(ServletResponse)对象作为参数。在HttpServlet中已存在Service()方法。默认的服务功能是调用与HTTP请求的方法相应的do功能。每次请求到来时,都会调用service方法,在HttpServlet中,service方法是用于判断请求的方法(不用重写),而去重写doGet方法或doPost方法。

五、Servlet的destroy方法:
在Servlet的生命周期中,仅执行一次destroy()方法,在web服务器端停止且卸载Servlet时执行该方法。因为一个Servlet在运行service()方法时可能会产生其他的线程,因此需要确认在调用destroy()方法时,这些线程已经终止或完成。销毁Servlet实例时调用,调用结束后意味着该Servlet的生命周期已经结束。

综上所述:从容器角度来看,Servlet的生命周期是由Servlet容器(web容器)来控制的,它始于装入web服务器的内存时,并在终止或重新装入Servlet时结束。这项操作一般是动态执行的。然而,web服务器通常会提供一个管理的选项,用于在web服务器启动时强制装载和初始化特定的Servlet;从代码角度来看,Servlet的生命周期由接口javax.servlet.Servlet定义。所有的Java Servlet必须直接或间接地实现javax.servlet.Servlet接口,这样才能在Servlet Engine上运行。javax.servlet.Servlet接口定义了一些方法,在Servlet的生命周期中,这些方法会在特定时间按照一定的顺序被调用。

Servlet运行原理:


 

猜你喜欢

转载自jiangyupeng.iteye.com/blog/2409746