2、关于Servlet对象的生命周期

1、什么是生命周期?

生命周期表示-个java对象从最初被创建到最终被销毁,经历的所有过程。

2、Servlet对象的生命周期是谁来管理的?程序员可以干涉吗?

Servlet对象的生命周期,javaweb程序员是无权干涉的,包括该Servlet对象的相关方法的调用,javaweb程序员也是无权干涉的。

Servlet对象从最初的创建,方法的调用,以及最对象的销毁,整个过程,是由WEB容器来管理的。

Web Container管理Servlet对象的生命周期。

3、“默认情况下”,Servlet对象在WEB服务器启动阶段不会被实例化。

[若希望在web服务器启动阶段实例化Servlet对象,需要进行特殊的设置]

4、描述Servlet对象生命周期

  1. 用户在浏览器地址栏上输入URL:http://localhost:8080/prj-serv1et-03/testLifeCycle

  2. web容器截取请求路径:/pri-servlet-03/testLifeCycle

  3. web容器在容器上下文中找请求路径/pri-servlet-03/testLifeCycle对应的Servlet对象

  4. 若没有找到对应的Servlet对象

    1. 通过web.xm1文件中相关的替置信息,得到请求路径/testLifeCycle对应的Servlet完整类名
    2. 通过反射机制,调用Servlet类的无参数构造方法完成Servlet对象的实例化
    3. web容器调用Servlet对象的init方法完成初始化操作
    4. web容器调用Servlet对象的service方法提供服务
  5. 若找到对应的Servlet对象

    1. web容器直接调用Servlet对象的service方法提供服务
  6. web容器关闭的时候/webapp重新部署的时候/该Servlet对象长时间没有用户再次访问的时候,web容器会将该Servlet对象销毁,在销毁该对象之前,web容器会调用Servlet对象的destroy方法,完成销毁之前的准备。

5、总结:

  1. Servlet类的构造方法只执行一次
  2. Servlet对象的init方法只执行一次
  3. Servlet对象的service方法,只要用户请求一次,则执行一次
  4. Servlet对象的destroy方法只执行一次

6、注意:

  1. init方法执行的时候,Servlet对象已经被创建好了。

  2. destroy方法执行的时候,Servlet对象还没有被销毁,即将被销毁。

7、Servlet对象是单例,但是不符合单例模式,只能称为伪单例。

  1. 真单例的构造方法是私有化的。

  2. Tomcat服务器是支持多线程的。所以Servlet对象在单实例多线程的环境下运行的。
    那么Servlet对象中若有成员变量,并且成员变量涉及到修改操作,那么这个Servlet对象一定会存在线程安全问题,不建议在Servlet对象中使用成员变量,尽里使用局部变量。

8、若希望在web服务器启动阶段实例化Servlet对象,需要在web.xml文件中进行相关的配置

例如:

<servlet>
    <servlet-name>  </servlet-name>
    <servlet-class>   </servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

注意: 1自然数越小优先级越高

9、Servlet对象实例化之后,这个Servlet对象被存储到哪里了?

大多数的WEB容器都是将该Servlet对象以及对应的ur1- pattern存储到Map集合中了:

  • 在WEB容器中有这样一个Map集给

Map<String,Servlet>集合

keyvalue
/1oginLoginServlet对象引用
/deleteDeleteServlet对象引用
/saveSaveServlet对象引用

10、服务器在启动的时候就会解析各个webapp的web.xml文件,做了什么?

做了将web.xml文件中的url-pattern和对应的Servlet完整类名存储到Map集合中了:

  • 在WEB容器中有这样一个Map集合

Map<String,String>集给

keyvalue
/1ogincom.javaweb.servlet.LoginServlet
/deletecom.javaweb.servlet.DeleteServlet

11、Servlet接口中的这些方法中编写什么代码?什么时候使用这些方法?

  1. 无参数构造方法
    [以后就不需要再考虑构造函数了,尽量别动构造函数]

  2. init方法

以上两个方法执行时间几乎是相同的,执行次数都是一次,构造方法执行的时候对象正在创建,init方法执行的时候对象已经创建

若系统要求在对象创建时刻执行一段特殊的程序,这段程序尽量写到init方法中。

  • 为什么不建议将代码编写到构造函数中呢?

存在风险!
当程序员编写构造方法的时候,可能会导致无参数构造方法不存在。
一个类不编写任何构造函数,默认有一个无参数的构造方法,但是一旦编写-一个有参数的构造方法之后,系统则不再提供无参数构造函数。

Servlet中的init方法是SUN公司为javaweb程序员专门提供的一个初始化时刻,若希望在初始化时刻执行一段特殊的程序,这个程序可以编写到init方法,将来会被自动调用。

  1. service方法

这个方法是必然要重写的,因为在这个方法需要完成业务逻辑的处理,请求的处理,以及完成响应。
而且这个方法中的代码是最有价值的。
也是最难写的,因为最难编写的就是业务代码啦。

  1. destroy方法

这个方法也是SUN公司为javaweb程序员提供的一个特殊的时刻,这个特殊的时刻被称为对象销毁时刻,若希望在销毁时刻执行一段特殊的代码,要将这段代码编写到destroy方法,自动被容器调用。

回顾:
类加载时刻执行程序,代码写到哪里?
编写到静态代码块中。

结论:
sun公司为我们程序员提供了很多个不同的时刻。若在这个特殊时刻执行特殊程序,这些程序是有位置编写的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值