Servlet生命周期

 

1:加载Servlet
web容器负责加载Servlet,当web容器启动时或者是在第一次使用这个Servlet时,容器会负责创建Servlet实例,但是用户必须通过部署描述符(web.xml)指定Servlet的位置,也就是Servlet所在的类名称,成功加载后,web容器会通过反射的方式对Servlet进行实例化。
2:初始化
当一个Servlet初始化后,容器将调用init()方法初始化这个对象,初始化的目的是为了让Servlet在处理客户端请求前完成一些初始化的工作,如建立数据库连接,读取资源文件信息等,如果初始化失败,则次Servlet将被直接卸载。
3:进入服务
当有请求提交时,Servlet将调用service()方法进行处理,常用的是service根据请求类型调用doGet()或者doPost()方法进行处理;在service()方法中,Servlet可以通过ServletRequest接受客户的请求,也可以利用ServletResponse设置响应信息。
4:销毁
当web容器关闭或者检测到一个Servlet要从容器中被删除时,会自动调用destroy()方法,以便让该实例释放掉所占用的资源。
5:卸载
当一个Servlet调用完destroy()方法后,次实例将等待被垃圾收集器所回收,如果需要再次使用此Servlet时,会重新调用init()方法初始化。
 
注意:
在正常情况下,Servlet只会初始化一次,而处理服务会调用多次,销毁也只会调用一次;但是如果一个Servlet长时间不使用的话,也会被容器自动销毁,而如果需要再次使用时会重新进行初始化的操作,即在特殊情况下初始化可能会进行多次,销毁也可能进行多次。
 
对于service()方法,一般来说这个方法是不需要重写的,因为在HttpServlet中已经有了很好的实现,它会根据请求的方式,调用doGet(),doPost()方法,也就是说service()是用来转向的,所以我们一般写一个Servlet,只需要重写doGet()或者doPost()就可以了。如果重写了service()方法,那么Servlet容器就会把请求交给这个方法来处理,倘若你重写的service()方法没有调用doXXX(),即使你在Servlet中又重写了其它doGet(), doPost()等也是不会被调用的,因为Servlet的service()被自动调用(就像init()和destory()方法一样),所以如果你由于某种需要,需要重写service()方法,并且根据不同的method调用doPost(),doGet()方法时,就要在末尾加上一句super.service(),这样就可以解决问题了。
posted @ 2014-11-13 14:46  无措  阅读(7877)  评论(1编辑  收藏  举报