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