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