详谈Servlet的生命周期

1.什么是生命周期
  • 生命周期表示一个java对象从最初的创建到最终的销毁,经历的所有过程
2.Servlet对象的生命周期是由谁来管理的
  • Servlet对象的生命周期,JavaWeb程序员是无法干涉的。包括Servlet对象的相关方法的调用,Javaweb程序员也是无法干涉的。
  • Servlet对象从最初的创建,方法的调用以及对象的销毁,整个过程是由web容器来管理的
  • web容器管理Servlet对象的生命周期
3.Servlet对象在web容器启动阶段会不会被实例化
  • “默认情况下”,Servlet对象在web容器启动阶段不会被实例化。
  • 若希望在web服务器启动阶段实例化Servlet对象,需要进行特殊的设置,就是web.xml文件中进行相关的配置,例如:
<servlet>
    <servlet-name>testLifeCycle</servlet-name>
    <servlet-class>com.javaweb.servlet.math.TestLifeCycle</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>testLifeCycle</servlet-name>
    <url-pattern>/testLifeCycle</url-pattern>
</servlet-mapping>
  • url-pattern是对应的用户在浏览器中输入的请求路径
  • servlet-class是对应的java小程序完整类名
  • servlet-name是对应的java小程序具体类名
  • load-on-startup中自然数越小优先级越高
4.Servlet生命周期
  • 4.1: 用户在浏览器地址栏上输入URL:http://localhost:8080/hcz3/testLifeCycle
    注意:这里的/hcz3是我在Tomcat服务器中布置的该项目名字
  • 4.2: web容器截取请求路径:/hcz3/testLifeCycle
  • 4.3: web容器在容器上下文中找取请求路径/hcz3/testLifeCycle对应的Servlet对象
  • 4.4: 如果没有找到对应的Servlet对象
    • (1)通过web.xml文件中的相关配置信息,得到请求路径/testLifeCycle对应的Servlet完整类名
    • (2)通过反射机制,调用Servlet类的无参数构造方法完成Servlet对象的实例化
public TestLifeCycle(){
  System.out.println("无参构造方法");
 }
  • (3)web容器调用Servlet对象的init方法完成初始化操作
@Override
 public void init(ServletConfig arg0) throws ServletException {
  System.out.println("Servlet中的init方法");
 }
  • (4)web容器调用Servlet对象的service方法提供服务
@Override
 public void service(ServletRequest request, ServletResponse response)
   throws ServletException, IOException {
  System.out.println("Servlet中的service方法");
 }
  • 4.5: 如果有找到对应的Servlet对象
    • web容器直接调用Servlet对象的service方法提供服务
  • 4.6: web容器什么时候会将Servlet对象销毁
    • web容器关闭的时候
    • webapp重新部署的时候
    • 该Servlet对象长时间没有用户访问的时候
    • web容器会调用Servlet对象的destroy方法完成销毁
@Override
 public void destroy() {
  System.out.println("Servlet中的destroy方法");
 }
5.Servlet对象是不是单例模式
  • Servlet对象是单例,但是不符合单例模式,只能称为伪单例,因为真单例的构造方法是私有的。
  • Tomcat服务器是支持多线程的,所以Servlet对象是在单实例多线程的环境下运行的。
  • 那么Servlet对象中若有实例变量,并且实例变量涉及到修改操作,那么这个Servlet对象一定会存在线程安全问题,不建议在Servlet对象中使用实例变量,尽量使用局部变量。
6.Servlet对象实例化之后,这个Servlet对象被存到哪里了?(有找到Servlet对象时)
  • 大多数的web容器都是将Servlet对象以及对应的url-pattern存储到Map集合中了
  • 在web容器中有这样一个Map集合,Map<String,Servlet>
keyValue
/loginLoginServlet对象引用
/deleteDeleteServlet对象引用
/saveSaveServlet对象引用
7.服务器在启动的时候就会解析各个webapp中的web.xml文件,然后做了什么?(没有找到Servlet对象时)
  • 将web.xml文件中的url-pattern和对应的Servlet完整类各存储到Map集合中
  • 在web容器中有这样一个Map集合
    Map<String,String>
keyvalue
/logincom.javaweb.servlet.math.LoginServlet
/deletecom.javaweb.servlet.math.DeleteServlet
/savecom.javaweb.servlet.math.SaveServlet
8.Servlet接口中的这些方法中可以编写什么代码?什么时候使用这些方法?
  1. 无参数构造方法

  2. init方法

  • 以上两个方法执行时间几乎是相同的,构造方法执行的时候对象正在创建,init方法执行的时候对象已经创建好了
    • 若系统要求在对象创建时刻执行一段特殊的程序,这段程序尽量写到init方法中
    • 为什么不建议将代码编写到构造方法中呢?
      • 因为在编写构造方法的时候,可能会导致无参构造方法不存在
      • 一个类不编写任何构造方法,默认有一个无参数构造方法,但是一旦编写一个有参数构造方法,系统则不再提供无参数构造方法
  • Servlet中的init方法是SUN公司为为JavaWeb程序员提供的一个代码初始化时刻,若希望在初始化时刻执行一段特殊的程序,这个程序可以编写到init方法,将来会被自动调用
  1. service方法
  • 这个方法是必然要重写的,因为这个方法需要完成业务逻辑的处理请求的处理,以及完成响应的处理
  1. destroy方法
  • 若希望在销毁时刻执行一段特殊的代码,需要将这段代码编写到destroy方法中,会自动被调用
9.总结
  1. Servlet类的构造方法只执行一次
  2. Servlet对象的init方法只执行一次
  3. Servlet对象的service方法,只要用户调用一次,则执行一次
  4. Servlet对象的destroy方法只执行一次
10.注意
  • init方法执行的时候,Servlet对象已经被创建好了
  • destroy方法执行的时候,Servlet对象还没有被销毁,即将被销毁
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@烟雨倾城ゝ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值