Servlet生命周期,以及对Servlet开发的改进

Servlet

项目结构

--web(项目名称)
	--WEB-INF
		--classes(编译后的java类)
		--lib(存放运行时所需的jar包)
		--web.xml(填写servlet相关信息)
	--html
	--css
	--image

第一个servlet

  1. 在tomcat的webapp目录下创建一个文件,文件名就是项目名

  2. 创建以上目录结构,web.xml文件最好从其他地方复制,不要自己写

  3. 继承Jakarta.servlet.Servlet中的Servlet类

  4. 重写五个方法

    import Jakarta.servlet.Servlet;
    
    public class HelloServlet implemts Servlet( ){
        
    }
    
  5. 在service方法里面实现功能

IDEA 中创建javaweb项目

  • 创建一个空项目
  • 添加一个javase模块
  • 添加web框架支持
  • 项目结构----模块中添加依赖
  • 创建一个类,继承servlet,然后在service方法中实现功能
  • 添加tomcat
  • 然后运行

Servlet对象的生命周期

  • 什么是servlet对象生命周期?
    servlet对象的生命周期表示:一个servlet对象从出生到最后的死亡,整个过程是怎样的。
    • servlet对象什么时候被创建
    • servlet对象什么时候被销毁
    • servlet对象创建了几个?

servlet对象是谁来维护的?

  • servlet对象的创建、对象中方法的调用、对象的销毁,程序员是无法干预的。
  • servlet对象的生命周期是由Tomcat服务器(web Server)全权负责的
  • Tomcat服务器又称为:web容器(web container)。
  • web容器来管理servlet对象的死活

思考:我们自己new的servlet对象受web容器的管理么?

  • 不受
  • web容器创建的servlet对象,这些servlet对象都会被放到一个集合当中(hash map),只有放到这个hash map集合中的servlet才能被web容器管理,自己new的servlet对象不会被web容器管理(自己new的servlet对象不在web容器内)
  • web容器底层应该有一个hash map这样的集合,这个集合当中存储了servlet对象和请求路径之间的关系

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

  • 在servlet中提供一个无参数的构造方法,启动服务器时看构造方法是否执行

  • 得出结论,默认情况下,服务器在启动的时候servlet对象并没有被创建

  • 怎么让服务器启动的时候就启动servlet对象?

    • 在servlet标签中加一个标签,在标签中加一个整数,数字越小优先级越高。
  • servlet对象生命周期

    • 默认情况下,服务器启动的时候,servlet对象并没有被实例化

    • 用户发送第一次请求的时候,控制台输出了以下内容

      servlet无参数构造方法执行了
      servlet init 方法执行了
      servlet service 方法执行了
      
    • 由此得出结论

      • 用户在发送第一次请求的时候servlet对象被实例化(构造方法被执行了,并且执行的时无参数构造方法。
      • servlet对象被创建出来之后,Tomcat服务器马上调用了servlet对象的init方法。(init方法在执行的时候,servlet对象已经存在了,已经被创建出来了)
      • init方法执行之后,Tomcat服务器马上调用servlet对象的service方法。
    • 用户继续发送请求,控制台输出以下内容

      servlet service 方法执行了
      
    • 由此得出结论,用户继续发送请求时,servlet对象并没有创建,还是使用之前创建好的servlet对象,直接调用该servlet对象的service方法,这说明:

      • servlet对象是单例的(单实例。但是要注意:servlet对象是单实例的,但是servlet类并不符合单例模式,称为假单例)
      • 无参数构造方法,init方法只在第一次用户发送请求的时候执行。
      • 只要用户发送一次请求,service方法也必然会被toncat服务器调用一次。
    • 关闭服务器时,控制台输出了以下内容

      servlet destory 方法执行了
      
    • 通过以上内容,可以得出以下结论

      • servlet的destory方法只被tomcat调用一次
      • 什么时候被调用?
        • 在服务器关闭的时候
        • 因为服务器关闭的时候要销毁servlet对象的内存
        • 服务器在销毁servlet对象内存之前,tomcat服务器会自动调用servlet对象的destory方法
    • destory方法调用的时候,对象销毁了么?

      • destory方法执行的时候,servlet对象还在,没有被销毁。destory方法执行结束之后,servlet对象的内存才会被tomcat释放。
  • tomcat创建实例时不会传入参数,所以使用的是无参数构造方法

    • 如果编写一个有参数的构造方法,且没有手动编写无参数构造方法,那么服务器就会报错,所以不建议编写构造方法。
    • 所以init方法有了存在的必要,将需要在创建时执行的程序写在init方法里面。
  • init,service,destory三种方法

    • 使用最多的是service方法,service一定要实现,它是处理用户请求的核心
    • init方法很少用,通常是初始化,并且这个初始化操作只需要执行一次,如:初始化数据库连接池、初始化线程池。
    • destory方法也很少使用,通常是资源的关闭。对象马上被销毁了,有什么没保存的保存一下,没关闭的资源,关闭一下。

适配器设计模式

我们编写一个servlet类实现servlet接口时的缺点:我们只需要写一个service方法,其他方法大部分时间都不需要使用。

适配器设计模式Adapter

可以编写一个抽象通用标准的GenericServlet类,在其中重新其他不常用方法,然后抽象service方法,这样以后所有的servlet类都不再去实现Servlet接口了,只需要继承这个通用的GenericServlet类

GenericServlet就是一个适配器。

posted @ 2023-01-10 22:27  Winterqq  阅读(24)  评论(0编辑  收藏  举报