1. 什么是生命周期?
- 生命周期表示一个Java对象从最初被创建到最终被销毁,所经历的所有过程。
- BS架构涉及到的角色以及协议

2. Servlet对象的生命周期是谁来管理的?程序员可以干涉吗?
- Servlet对象的生命周期,JavaWeb程序员是无权干涉的,包括该Servlet对象的相关方法的调用,JavaWeb程序员也是无权干涉的。
- Servlet对象从最初的创建,方法的调用,以及最后对象的销毁,整个过程是由web容器来管理的。
- web Container管理Servlet对象的生命周期。
- “默认情况”下,Servlet对象在WEB服务器启动阶段是不会被实例化的。【若希望在web服务器启动阶段实例化Servlet对象,需要进行特殊的设置】
3. 描述Servlet对象生命周期
- 用户在浏览器地址栏输入URL
- web容器截取请求路径
- web容器在容器上下文中找请求路径对应的Servlet对象
- 若没有找到对应的Servlet对象
- 通过web.xml文件中相关的配置信息,得到请求路径对应的Servlet完整类名
- 通过反射机制,调用Servlet类的无参数构造方法完成Servlet对象的实例化
- web容器调用Servlet对象的init方法完成初始化操作
- web容器调用Servlet对象的service方法提供服务
- 若找到对应的Servlet对象
- web容器直接调用Servlet对象的service方法提供服务
- web容器关闭的时候、webapp重新部署的时候、该Servlet对象长时间没有用户再次访问的时候,web容器会将该Servlet对象销毁,在销毁该对象之前,web容器会调用Servlet对象的destroy方法,完成销毁之前的准备
4. 总结
- Servlet类的构造方法只执行一次
- Servlet对象的init方法只执行一次
- Servlet对象的service方法,只要用户请求一次,则执行一次
- Servlet对象的destroy方法只执行一次
5. 注意
- init方法执行的时候,Servlet对象已经被创建好了
- destroy方法执行的时候,Servlet对象还没有被销毁,即将被销毁
- Servlet对象是单例,但是不符合单例模式,只能称为伪单例,真单例的构造方法是私有化的。Tomcat服务器是支持多线程的,所以Servlet对象在单例多线程的环境下运行,Servlet对象中若有实例变量,并且实例变量涉及到修改操作,那么这个Servlet对象一定会存在线程安全问题,不建议在Servlet对象中使用实例变量,尽量使用局部变量。
- 若希望在web服务器启动阶段实例化Servlet对象,需要在web.xml文件中进行相关配置,例如:```xml
1
注意:1自然数越小优先级越高。
6. Servlet对象实例化之后,这个Servlet对象被存储到哪里了?
- 大多数的web容器都是将该Servlet对象以及对应的url-pattern存储到Map集合中了
在web容器中有这样一个Map集合
Map集合
key value
————————————————————————
/login LoginServlet对象引用
/delete delete对象引用
7. 服务器在启动的时候就会解析各个webapp的web.xml文件,做了什么?
将web.xml文件中的url-pattern和对应的Servlet完整类名存储到Map集合中了:
在web容器中有这样一个集合
Map集合
key value-----------------------------------------------------<br /> /login com.glutnn.servlet.LoginServlet<br /> /delete com.glutnn.servlet.DeleteServlet
8. Servlet接口中的这些方法编写什么代码?什么时候使用这些方法?
- 无参数构造方法【以后就不需要再考虑构造函数了,尽量别动构造函数】
- init方法,是SUN公司专门为JavaWeb程序员提供的一个初始化时刻,若希望在初始化时刻执行一段特殊的程序,这个程序可以编写到init方法中,将来会被自动调用
- 以上两个方法执行的时间几乎是相同的,执行次数都是一次,构造方法执行的时候对象正在创建,init方法执行的时候对象已经创建。若系统要求在对象创建时刻执行一段特殊的程序,这段程序尽量写到init方法中。为什么不建议将代码写到构造函数中呢?存在风险,当程序员编写构造方法的时候,可能会导致无参数构造方法不存在,一个类不编写任何构造函数,默认有一个无参数的构造函数,但是一旦编写一个有参数的构造函数之后,系统将不再提供无参数构造函数。
- service方法,这个方法是必须要重写的,因为在这个方法需要完成业务逻辑的处理,请求的处理,以及响应。而且这个方法中的代码是最有价值的,也是最难写的,因为最难写的就是业务代码了。
- destroy方法,这个方法也是SUN公司为JavaWeb程序员提供的一个特殊时刻,被称为对象销毁时刻,若希望在销毁时刻执行一段特殊的代码,需要将这段代码编写到destroy方法,自动被容器调用。
- 回顾:
- 类加载时刻执行程序,代码写到静态代码块中
- 结论:SUN公司为程序员提供了很多个不同的时刻。若在这个特殊时刻执行特殊程序,这些程序是有位置编写的
