servlet的生命周期

来源:百度文库 编辑:神马文学网 时间:2024/04/27 22:15:58
servlet的生命周期:
1.servlet有良好的生命周期的定义,包括加载、实例化、初始化、处理请求及服务结束。
2.这个生命周期由javax.servlet.Servlet接口的init()、service()、destroy()方法来表达。
3.servlet容器进行加载servlet,完成servlet的实例化,
容器运行servlet实例的init()方法进行初始化,
服务请求到达时,调用service()方法,由service()方法自动运行与请求对应的doXXX()方法(即doGet或doPost),
当服务器决定将实例销毁时,调用其destroy()方法。
Servlet与CGI的区别:
servlet处于服务器的进程中,可以通过多线程的方式运行service()方法,一个实例可以服务于多个请求,
并且实例一般不会被销毁;
CGI为每个请求都产生一个进程,服务结束后就销毁,所以效率上低于servlet。
详细讲解servlet的生命周期:
1.servlet运行在servlet的容器中,其生命周期由容器进行管理;通过javax.servlet.Servlet接口的init()、service()、destroy()方法
来实现;
2.servlet的生命周期包括下面几个阶段:
(1)加载和实例化
servlet容器负责servlet的加载和实例化。当servlet容器启动时,或者servlet容器检测到需要这个servlet服务的第一个请求时,
servlet容器会加载这个servlet,并生成servlet实例。
(注:servlet容器在启动后,必须知道这些servlet类所在的位置,servlet容器可以通过本地文件系统、远程文件系统或者
其他网络服务中,通过类加载器加载servlet类,加载成功后才能创建servlet实例;
servlet容器通过java的反射API,来进行实例化,容器调用的是servlet的无参构造方法-即默认的构造方法,所以我们在
编写servlet类时,不要写带参的构造方法)
(2)初始化
当servlet实例化后,容器将调用这个对象的init()方法进行初始化,初始化的目的是在这个实例为请求提供服务前完成初始化
工作,如建立配置连接,获取配置信息等。每个servlet实例,容器只调用一次init()方法。
servlet实例可以使用容器为其提供的ServletConfig对象,从web应用程序的配置信息中(即web.xml文件),获取初始化的参数
信息。
如果初始化期间发生错误,则会抛出ServletException异常或者unavailableException异常,来通知容器。ServletException异常
是一般的初始化失败,如没能找到初始化参数;UnavailableException异常是通知容器此实例不可用,如数据库未启动,数据
连接不成功,servlet就会向容器抛出UnvailableException异常,提示他暂时或永久不可用。
(3)请求处理
Servlet容器调用servlet实例的service()方法来对请求进行处理。需要强调的是,在service()方法调用之前,init()方法必须
成功执行。
在service()方法中,servlet实例通过ServletRequest对象,来获取客户端的相关信息和请求信息;处理完成后,servlet实例
通过ServletResponse对象来设置相应信息。
service()方法自动运行与请求对应的doXXX方法,如果请求是get方式的,则调用doGet()方法;如果请求是post方式的,
则调用doPost()方法。
当处理过程中出现异常,则servlet实例会抛出ServletException异常或者UnavailableException异常。如果抛出的
UnvailableException异常显示此实例永久不可用,则容器将调用servlet实例的destroy()方法,释放该实例,释放后对此实例
的所有请求,都将得到HTTP404的响应(请求的资源不可用);如果抛出的UnavailableExceptio异常显示此实例暂时不可用,
则在暂时不可用的时间段内,对此实例的请求,都将得到HTTP503的响应(服务暂时忙,不能处理请求)。
(4)服务结束
当容器检测到某个servlet实例需要在服务中移除时,则容器将调用servlet实例的destroy()方法,以便释放实例所使用的
资源,并将数据存储到持久存储设备中。当调用destroy()方法后,容器将释放此servlet实例,该实例随后将由垃圾回收器
进行垃圾回收处理。如果再有对此实例的服务请求时,容器将重新创建一个新的servlet实例。