风言风语Web之servlet的生命周期

[size=medium] 上回说到Tomcat的一些基本概念与功能,并且提到容器如Tomcat掌控着servlet的生死大权,这回就让我们一起来看看Tomcat是怎么行使这个生杀予夺的大权而servlet又是如何沦落到任“猫”宰割的地步的吧:

[align=center][img]http://dl.iteye.com/upload/attachment/0063/6254/3db676ae-d5fe-341b-abb9-14a7b954770e.png[/img][/align]

接下来,我们来看图作文:
[b]第一段:[/b]首先当然是找到servlet类文件(讲到寻找servlet,不得不提容器在接受客户请求时会根据URL寻找servlet,但是那个servlet一般指的是已经完成了初始化的servlet,要注意区别开来)。Tomcat在启动时,或者在第一个请求到达时,加载servlet类文件。此时,这个servlet光辉的一生开始了。
[b]第二段:[/b]之后的事情JVM也会做,找到构造器,创建一个对象。
好吧,这样,前面两段就已经结束了。是不是发现有种凤头、猪肚、豹尾的感脚啊?毕竟前面两步不是重点,而且熟悉Java的也会了解其中的门门道道。我们一起来摸一摸猪肚吧。
[b]第三段:[/b]这一部分的主要职责是调用init()方法完成servlet的初始化工作。有人会问:都已经有构造器了,为什么还要再调用一个init()函数进行初始化工作?介样子做岂不是多此一举?一开始我也支持这位有人君的idea,后面一打探,才发现这样做是有学问的:初始化工作目标是给servlet一些特有的东西,比如DB连接、一些只能初始化一次的变量或者来自web.xml文件中的参数(有些参数不适合硬编码到代码中,放在web.xml文件会更好),而这些都是通过ServletConfig得到的,我们不能强迫用户往构造器中传递一个或是多个参数,而在方法中参数的数量具有更好的可控性,事实上,我们会看到两个init方法,一个没有参数,一个有ServletConfig参数,但是有参的init方法会调用无参的init()方法。另一个原因导致init方法和构造器分离的原因是,若轻易将初始化工作全部放在构造器中,当在构造器中出错时(比如web.xml中参数出错)就会导致servlet无法被实例化,但是如果将这些功能放在init方法中,导致的后果最多是抛出一个异常而不会导致servlet的流产!这些也只是我对这点的一些粗浅的认识,希望大家可以将自己的意见留下来,不甚感激!需要注意的是,初始化工作必须在servlet处理请求之前完成!
[b]第四段:[/b]好的,servlet最荣幸的时刻到来了,它终于可以为人民服务啦!它先判断客户提出的是GET请求还是POST请求,并进入service()方法,然后分别进行处理。如果是GET请求,则调用doGet()方法,如果是POST请求就调用doPost()方法勒。doGet()和doPost()一般是需要我们覆盖的,具体在doPost()和doGet()中怎么处理就是按照你的旨意了。当然也有可能是其他的请求,但是很少会出现,因此不在考虑范围之内。而POST和GET也是有很多区别的,以后的博客中会讲到,还是期待一下额。
[b]第五段:[/b]人生啊,总是有阴晴圆缺,悲欢离合和生老病死,servlet亦如是。当服务器停止工作或者servlet发生了改变,都会致使当前servlet生命终结。当一个servlet要离开世间时,总是会调用destroy()方法,关闭一切已经打开的资源,并进行一些其它的告别处理。是的,servlet走的时候带走了一切,只留给我们许许多多的回忆和遐想。
说到servlet的生命周期,就不得不说ServletConfig和ServletContext这一对儿,下一篇博客将会重点介绍这一对好基友!
最后,就用一头猎豹作为这回的结尾吧,毕竟豹尾豹尾嘛(本来打算一开始插一张凤姐的头像作为凤头,但是为了社会治安我压制住了)!下回我们接着唠!

[img]http://dl.iteye.com/upload/attachment/0063/6256/7e274fff-533f-32ba-96a4-5f4c25c9d2ac.png[/img]
[/size]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值