Servlet的生命周期,与CGI的区别

**Servlet的生命周期包括即Servlet从创建到销毁的这一个过程,可以将Servlet的生命周期分为初始化阶段、服务阶段、销毁阶段这三个阶段。

  1. 初始化阶段
    服务器会在客户端第一次访问Servlet,或服务器启动的时候为该Servlet创建实例。要想在服务器启动的时候就为Servlet创建实例,需要在web.xml中进行配置。当服务器为Servlet创建实例后,会在第一时间调用init()方法,完成Servlet的初始化操作。注意这个init()方法在Servlet的一生中,只会被服务器调用一次。
  2. 服务阶段
    当服务器接收到请求时,会去调用Servlet的service()方法来处理请求,而且每次请求的时候,服务器都会调用service()方法,并且创建新的ServletRequest和ServletResponse对象,所以该方法在Servlet的一生中会被调用多次。
  3. 销毁阶段
    当服务器关闭或者当前web应用被移出服务器时,Servlet会被销毁,在销毁之前,服务器会调用destroy()方法,可以把Servlet的“临终遗言“放在该方法中,例如把对某些资源的释放等代码放在destroy()方法中。
    与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。
    初始化的错误处理
    在初始化期间,servlet实例可能通过抛出UnavailableException 或者 ServletException异常表明它不能进行有效服务。如果一个servlet抛出一个这样的异常,它将不会被置入有效服务并且应该被容器立即释放。在此情况下destroy方法不会被调用因为初始化没有成功完成。在失败的实例被释放后,容器可能在任何时候实例化一个新的实例,对这个规则的唯一例外是如果失败的servlet抛出的异常是UnavailableException并且该异常指出了最小的无效时间,那么容器就会至少等待该时间指明的时限才会重新试图创建一个新的实例。
    处理请求中的异常
    servlet在对请求进行服务的时候有可能抛出ServletException或者UnavailableException异常。ServletException表明在处理请求的过程中发生了错误容器应该使用合适的方法清除该请求。UnavailableException表明servlet不能对请求进行处理,可能是暂时的,也可能是永久的。如果 UnavailableException指明是永久性的,那么容器必须将servlet从服务中移除,调用它的destroy方法并释放它的实例。如果指明是暂时的,那么容器可以选择在异常信息里面指明的这个暂时无法服务的时间段里面不向它发送任何请求。在这个时间段里面被被拒绝的请求必须使用 SERVICE_UNAVAILABLE (503)返回状态进行响应并且应该携带稍后重试(Retry-After)的响应头表明不能服务只是暂时的。容器也可以选择不对暂时性和永久性的不可用进行区分而全部当作永久性的并移除抛出异常的servlet。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值