Servlet生命周期

来源:互联网 发布:天美与光子知乎 编辑:程序博客网 时间:2024/06/08 15:09
Servlet的生命周期从Web服务器开始运行时开始,以后会不断地处理来自浏览器的访问请求,并将响应结果通过Web服务器返回给客户端,直到Web服务器停止运行,Servlet才会被清除。
(1)加载阶段
当Web服务器启动时,Servlet容器加载一个Java Servlet类,这个过程也有可能推迟到Web客户端请求Servlet服务器时发生。通常情况下,Servlet容器使用Java类加载容器加载一个Servlet,可以加载本地的Servlet,也可以加载远程的Servlet。注意:Servlet只需要被加载一次,然后将会实例化该类的一个实例或者多个实例
(2)初始化阶段
Servlet容器调用Servlet的初始化方法init()进行Servlet初始化。在初始化时,将会读取配置信息,完成数据连接等工作。在这个阶段,要给init()方法传入一个ServletConfig()对象,ServletConfig()对象包含了初始化参数和容器环境的信息,并负责向Servlet传递信息,如果传递失败,则会发生ServletException,Servlet将不能正常工作。在这种情况下,该Servlet将会被容器清除掉,但是不会调用destroy()方法释放资源,因为初始化尚未完成。清除该Servlet后,容器将重新初始化这个Servlet。但是如果抛出的是UnavailableException异常,并且该异常指定了最小的初始化间隔时间,那么至少需要等待该指定时间之后,才会进行新的Servlet的初始化
(3)Servlet运行阶段
当Web‘服务器接受到浏览器的访问请求后,将把该请求传递给Servlet容器。Servlet容器将请求包装成HttpServletRequest和HttpServletResponse对象,封装从Web客户端接收到HTTP请求和由Servlet生成的响应。并且用这两个对象作为参数,调用service()方法。在service()方法中,可以从HttpServletRequest类中提取来自HttpSession、request或cookies等对象的状态信息,进行特定应用的处理,并且用HttpServletResponse对象生成HTTP响应数据。容器在有些情况下会将多个Web‘请求发送给同一个Servlet实例进行处理。在这种情况下必须采取一定的手段处理多线程问题。一个简单的方法针对Servlet实现SingleThreadModel接口。这样就可以保证一次只会有一个线程访问service()方法。容器可以通过维护一个请求队列或者维护一个Servlet实例池实现这样的功能。
(4)Servlet结束时期
Servlet将一直运行到被服务器卸载,或者当Web服务器和容器关闭时。这种情况下将回收init()方法中使用的资源,如关闭数据库连接等。这些都是通过调用destrory()方法来实现的。容器在调用destrory()方法之前,他必须等待那些正在service()方法中执行的线程执行完毕或者在服务器定义的一段时间内执行(这个时间段在调用destroy()方法之前)。一旦destroy()方法被调用,容器就不会再向该实例发送任何请求。如果容器需要再使用该Servlet,它必须创建新的实例。destroy()方法完成后,容器必须释放Servlet实例以便它能够被垃圾回收机制回收。 



原创粉丝点击