JavaWeb课程系列
4.Servlet生命周期
4.1什么是生命周期:
应用程序中的对象不仅在空间上有层次结构的关系,在时间上也会因为处于程序运行过程中的不同阶段而表现出不同状态和不同行为——这就是对象的生命周期。
简单的叙述生命周期,就是对象在容器中从开始创建到销毁的过程。
4.2 Servlet容器
Servlet对象是Servlet容器创建的,生命周期方法都是由容器调用的。这一点和我们之前所编写的代码有很大不同。在今后的学习中我们会看到,越来越多的对象交给容器或框架来创建,越来越多的方法由容器或框架来调用,开发人员要尽可能多的将精力放在业务逻辑的实现上。
4.3 Servlet生命周期
我们在编写Servlet的HelloWorld的时候,我们发现服务器在启动后,访问配置的url的时候好像调用了Servlet的几个方法。到底Servlet在容器中是如何创建,使用,消亡的。我们探究一下:
主要步骤:
4.3.1 Servlet对象的创建
默认情况下,Servlet容器第一次收到HTTP请求时创建对应Servlet对象。容器之所以能做到这一点是由于我们在注册Servlet时提供了全类名,容器使用反射技术创建了Servlet的对象。
4.3.2 Servlet对象初始化
1)Servlet容器创建Servlet对象之后,会调用init(ServletConfig config)方法,对其进行初始化。在javax.servlet.Servlet接口中,public void init(ServletConfig config)方法要求容器将ServletConfig的实例对象传入,这也是我们获取ServletConfig的实例对象的根本方法。
2)为了简化开发,GenericServlet抽象类中实现了init(ServletConfig config)方法,将init(ServletConfig config)方法获取到的ServletConfig对象赋值给了成员变量ServletConfig config,目的是使其它方法可以共享这个对象。这时有一个问题:如果子类重写了这个init(ServletConfig config)方法,有可能会导致成员变量config对象赋值失败。所以GenericServlet抽象类另外提供了一个无参的public void init()方法,并在init(ServletConfig config)方法中调用,作为子类进行初始化操作时重写使用。而这个无参的init()方法之所以没有设计成抽象方法,是为了避免子类继承时强制实现这个方法带来的麻烦,使用者可以根据需要选择是否要覆盖这个方法。
4.3.3处理请求
1)在javax.servlet.Servlet接口中,定义了service(ServletRequest req, ServletResponse res)方法处理HTTP请求,同时要求容器将ServletRequest对象和ServletResponse对象传入。
2)在HttpServlet抽象类中,service(ServletRequest req, ServletResponse res)方法将ServletRequest对象和ServletResponse对象强转为了HttpServletRequest、HttpServletResponse子类对象,这样更适合于HTTP请求的处理,所以在doGet()和doPost()方法中使用的就是HttpServletRequest、HttpServletResponse的实现类对象了。
4.3.4 Servlet对象销毁
Web应用卸载或服务器停止执行时会销毁Servlet对象,而销毁之前为了执行一些诸如释放缓存、关闭连接、保存数据等操作,所以设计了public void destroy()方法。
步骤总结:
1)Servlet对象创建:接收到浏览器请求后,才创建对象
2)Servlet初始化
创建对象之后,会调用init()方法
作用:是在Servlet对象创建后,执行一些初始化操作
例如,读取一些资源文件,或建立某种连接
init()方法只在创建对象时执行一次,以后再接到请求时,就不执行了
3)Servlet处理客户端请求
接收到请求之后调用service()方法
在每次接到请求后都会执行
4)Servlet面临对象的销毁
当前Web应用卸载之前调用destroy()方法
在应用卸载之前,可能需要释放一些资源,关闭某些连接