Servlet 对象的生命周期

Servlet 对象的生命周期

  • 服务器在启动的时候 Servlet 对象有没有被创建出来(默认情况下)?

    • 默认情况下,服务器在启动的时候 Servlet 对象不会被实例化。
    • 这个设计是合理的。用户在没有发送请求之前,如果提前创建出来所有 Servlet 对象,必然是耗费内存的,并且创建出来的 Servlet 对象如果一直没有用户访问,显然这个 Servlet 对象是一个废物,没必要先创建。
  • 怎么让服务器启动的时候创建 Servlet 对象?

    • 在 web.xml 中的 标签中添加 <load-on-startup></load-on-startup> 子标签,在该标签中填写整数,越小的整数,优先级越高

    • <servlet>
          <servlet-name>aservlet</servlet-name>
          <servlet-class>com.kuang.javaweb.servlet.AServlet</servlet-class>
          <load-on-startup>0</load-on-startup>
      </servlet>
      <servlet-mapping>
          <servlet-name>aservlet</servlet-name>
          <url-pattern>/a</url-pattern>
      </servlet-mapping>
      
  • Servlet 对象生命周期

    • 默认情况下服务器启动的时候 AServlet 对象并没有实例化
    • 得到结论
      • 用户在发送第一次请求的时候 Servlet 对象被实例化。(AServlet 的构造方法被执行了,并且执行的是无参构造方法。)
      • AServlet 对象被创建出来之后,Tomcat 服务器马上调用 AServlet 对象的 init 方法。(init 方法在执行的时候,AServlet 对象已经存在了。已经被创建出来了。)
      • 用户继续发送第一次请求的时候,init 方法执行之后,Tomcat 服务器马上调用 AServlet 对象的service 方法。
    • 用户在发送第二次,或者第三次请求的时候,Servlet 对象并没有新建,还是使用之前创建好的 Servlet 对象,直接调用该 Servlet 对象的 service 方法,这说明:、
      • 第一:Servlet 对象是单例的
      • 第二:无参构造方法、init 方法 只在第一次用户发送请求的时候执行。也就是说无参构造方法只执行一次。 init 方法也只被 Tomcat 服务器调用一次。
      • 第三:只要用户发送一次请求:service 方法必然会被 Tomcat 服务器调用一次。发送 100 次请求,service 方法会被调用 100 次。
    • 关闭服务器,得到结论
      • Servlet 的 destroy 方法只被 Tomcat 服务器调用一次
      • destroy 方法是在什么时候被 Tomcat 调用的?
        • 在服务器关闭的时候。
        • 因为服务器关闭的时候要销毁 AServlet 对象的内存。
        • 服务器在销毁 ASerclet 对象内存之前,Tomcat 服务器会自动调用 AServlet 对象 destroy 方法。
    • 请问 destroy 方法调用的时候,对象销毁了还是没销毁?
      • destroy 方法执行的时候 AServlet 对象还在,没有被销毁。destroy 方法执行结束之后,AServlet 对象的内存才会被 Tomcat 释放。
    • 关于 Servlet 类中方法的调用次数?
      • 构造方法(无参构造)只执行一次。
      • init 方法只执行一次。
      • service 方法:用户发送一次请求则执行一次,发送 N 次则执行 N 次。
      • destroy 方法只执行一次。
    • 当我们的 Servlet 类中编写一个有参数的构造方法,如果没有手动编写无参数的构造方法会出现什么问题?
      • 报错了:500 错误。
      • 如果没有无参数的构造方法,会导致 500 错误,无法实例化 Servlet 对象。
      • 所以,一定要注意:在 Servlet 开发当中,不建议程序员来定义构造方法,因为定义不当,一不小心就会导致无法实例化 Servlet 对象。
    • 思考:无参构造方法可以代替掉 init 方法吗?
      • 不能。
      • Servlet 规范中有要求,作为 javaweb 程序员,编写 Servlet 类的时候,不建议手动编写构造方法,因为编写构造方法,很容易让无参构造方法消失、这个操作可能会导致 Servlet 对象无法实例化。所以 init 方法是有存在的必要的。
    • init、service、destroy 方法中使用最多的是哪个方法?
      • 使用最多是 service 方法
      • 什么时候使用 init 方法呢?
        • init 方法很少用。
        • 通常在 init 方法当中 做初始化操作,并且这个初始化操作只需要执行一次。例如:初始化数据库连接池、初始化线程池
      • 什么时使用 destroy 方法呢?
        • destroy 方法也很少用。
        • 通常在 destroy 方法当中,进行资源关闭。
    • 我们编写一个 Servlet 类直接实现 Servlet 接口有什么缺点?
      • 我们只需要 service 方法,其他方法大部分情况下是不需要使用的,代码和丑陋。
    • 适配器设计模式 Adapter
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值