欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-28 13:59:28
...

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运行原理:

Servlet生命周期及运行原理总结
            
    
    博客分类: 基础知识 Servlet生命周期 
 

  • Servlet生命周期及运行原理总结
            
    
    博客分类: 基础知识 Servlet生命周期 
  • 大小: 13.7 KB
相关标签: Servlet生命周期