servlet生命周期(理解有误的地方还请大家指正)
做为常见的面试题 虽说现在servlet有些过时 现在公司也基本上采用struts1,struts2等框架替代了servlet ,但看过struts1和struts2源码的人
应该清楚 其实他们都是在一定程度上封装了servlet的一些功能(个人理解大家可以批评指正)所以了解它的生命周期对我们了解框架以及一定 程度的纠错很有帮助。
<1.servlet加载(loading)和实例(intertance)化(将servlet从硬盘读取到系统内存)
servlet容器(container)(支持发布java项目的web 服务器(service))负责加载和实例化servlet,当客户端(client)发送请求时,
servlet容器(container)会在内存中查找是否存在该servlet intertance(servlet 实例) 如果存在,就从内存中直接取出该实例,来响应请求
如果不存在就创建(create)一个servlet 实例,加入内存 在响应请求(注意:因为一个servlet在生命周期内只会被加载一次(单例模式),所以就导致了线程的不安全(这也是struts1线程不安全的原因 以后整理struts的时候会提到))
(大家可以这样理解 servlet 相当于java里的一个静态方法 在程序运行期间只在内存加载一次)
顺便提下web.xml中selvlet元素中的<load-on-startup>配置节:
load-on-startup元素标记容器是否在启动的时候就加载这个servlet(实例化并调用其init()方法)
1) 它的值必须是一个整数,表示servlet应该被载入的顺序
2)当值为0或者大于0时,表示容器在应用启动时就加载并初始化这个servlet;
3)当值小于0或者没有指定时,则表示容器在该servlet被选择时或由容器自行决定合适加载。
4)正数的值越小,该servlet的优先级越高,应用启动时就越先加载。
5)当值相同时,容器就会自己选择顺序来加载。
所以,<load-on-startup>x</load-on-startup>,中x的取值1,2,3,4,5代表的是优先级,而非启动延迟时间。
<2.初始化(init)
在 servlet容器(container)完成servlet实例化后servlet的init()方法进行初始化 对于每一个servlet intertance(servlet 实例)init()方法只被调用一次
(可以理解为 为这个servlet设置一些共有的参数,只在初次执行时加载一次,第二次运行时该属性就已经存在。
打个比方,比如MyEclipse的工作空间,第一次需要设置一次,第二次就默认了 无需再次执行设置这一环节 因为它已 经具备了这些属性了)
<3.服务
servlet被初始化以后,就处于能响应的就绪状态,当servlet容器(container)接受到客户端(client)请求时,会调用servlet的service()方法处理客户端请求
servlet实例(instance)通过servletrquest对象获得客户端(client)请求通过调用servletresponse()对象设置响应信息(此处涉及HTTP协议会在我整理HTTP协议时在次提到)
<4.销毁
servlet instance(实例)是由容器(container)创建的所以实例(intertance)的销毁也是由容器来完成servlet容器判断一个servlet 实例是否应当被释放是
(容器关闭或回收资源(可能涉及垃圾回收原理(在整理完jvm垃圾回收机制时可能做详细解释)))容器就会调用servlet的destory()方法,destory()指定那些资源可以被回收而不是由destory()方法直接回收
另外英语和数学真的对学习计算机很有帮助 希望大家注意工作的时候整理 比如我将一些术语翻译过来 另外数学对理解计算机原理真的很有帮助 |
|