JavaWEB中Servlet的生命周期详解

 更新时间:2022年01月20日 10:52:43   作者:2022加油呀  
大家好,本篇文章主要讲的是JavaWEB中Servlet的生命周期详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下

一、什么是Servlet 生命周期?

Servlet 对象什么时候被创建?

Servlet对象什么时候被销毁?

Servlet 对象创建了几个?

Servlet 对象的声明周期表示:Servlet 对象从出生到销毁的过程是怎样的

二、Servlet 是由谁来维护的?

Servlet 是由 Tomcat 服务器全权负责的,程序员无法干预。

Tomcat 又叫 WEB 容器。

我们自己 new 的 Servlet 对象 是不受 WEB 容器 管理的。

WEB 容器 自己创建的 Servlet 对象,会放到一个集合中【Map集合】,自己创建的 Servlet 是不会放到这个集合中的。这个集合保存了 请求路径 和 Servlet 对象 的对应关系。

三、Servlet 对象 是什么时候创建的?

在 Servlet 类中 写一个无参构造方法,当Tomcat 启动时 这个无参构造方法 并没有被启动,说明 Tomcat 启动时 并不会提前创建对象。

我们可以看到,当我们在浏览器中发送请求时,这个无参构造方法才会执行,说明:只有用户发送请求时,这个Servlet 对象 才会被创建。

那么可不可以让 Tomcat 提前创建对象?

                是可以的,在配置文件中 增加一行代码即可

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>StudentList</servlet-name>
        <!--完整包名-->
        <servlet-class>yangzhaoguang.servlet.StudentServlet</servlet-class>
        <!--设置Tomcat启动时,创建对象、这里必须是正整数,越小优先级越高-->
        <load-on-startup>0</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>StudentList</servlet-name>
        <!--请求路径-->
        <url-pattern>/servlet/Student</url-pattern>
    </servlet-mapping>
</web-app>

 当设置之后,Tomcat 启动时 ,无参构造方法执行了,说明创建对象成功。但是这个方法不常用,提前创建对象会耗费内存。

四、测试 Tomcat 什么时候被销毁?

我们在 新建一个模块,在模块中新建一个 AServlet 类 并 编写三个方法

 修改配置文件,并重新部署 Servlet

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>AServlet</servlet-name>
        <servlet-class>yangzhaoguang.servlet.AServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>AServlet</servlet-name>
        <!--请求路径-->
        <url-pattern>/a</url-pattern>
    </servlet-mapping>
</web-app>

 当我们启动Tomcat 时,Servlet 并没有被创建

第一次发送请求时, init 和 service 被调用。Servlet 对象被创建

当我们不停的刷新网页,每提交一次请求 service 方法就会执行一次init 方法 只会在第一次用户请求时执行一次

 当我们关闭 Tomcat 服务器时,会销毁 AServlet 的内存,destroy 方法执行了。

在执行 destroy 方法时,对象没有被销毁,这是因为 destroy 方法是 实例方法,需要对象来调用次方法。在执行之后 对象才会被销毁

Tomcat 响应请求的过程:

 1、Tomcat 的配置文件中保存 路径请求 与 Servlet 的对应关系。Tomcat 根据浏览器中的URL,分析URL找到 AServlet 类

2、通过反射机制先调用 AServlet 中的无参构造方法创建对象,执行 init 完成初始化工作,调用 service 方法处理用户的请求。【无参构造方法是在init 方法执行之前先执行】

3、当服务器关闭时,执行 destroy 方法。执行之后销毁对象。

创建对象(无参方法执行)---->  初始化(init 方法执行)---->   提供服务(service方法执行) ---->  销毁(destroy方法执行)

当 Servlet 类中 有一个 有参数构造时,会报错吗?

        会报错:500错误。一般情况下是服务端的java小程序出现了错误。

 所以在开发中,不建议自己创建构造方法。

思考一下:既然无参构造方法和 init 方法都是在Servlet对象创建时执行并只执行一次,那么 无参构造方法可以替代 init 方法吗?

        不可以,因为在Servlet 不建议构建有参数构造方法,所以 init 可以替代有参数构造方法。

总结

到此这篇关于JavaWEB中Servlet的生命周期详解的文章就介绍到这了,更多相关JavaWEB Servlet生命周期内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解析Hibernate + MySQL中文乱码问题

    解析Hibernate + MySQL中文乱码问题

    如果持久化的类中有包括了汉字的String对象,那么对应到数据库中汉字的部分就会是乱码。这主要是由于MySQL数据表的字符集与我们当前使用的本地字符集不相同造成的
    2013-07-07
  • java 获取用户的MAC地址多种方法实例详解

    java 获取用户的MAC地址多种方法实例详解

    这篇文章主要介绍了JAVA实现获取用户的MAC地址的多种方法实例,需要的朋友可以参考下
    2017-04-04
  • MyBatis之foreach标签的用法及多种循环问题

    MyBatis之foreach标签的用法及多种循环问题

    这篇文章主要介绍了MyBatis之foreach标签的用法及多种循环问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • java中枚举的详细使用介绍

    java中枚举的详细使用介绍

    本篇文章介绍了,在java中枚举的详细使用。需要的朋友参考下
    2013-04-04
  • mybatis一直加载xml,找到错误的解决方案

    mybatis一直加载xml,找到错误的解决方案

    这篇文章主要介绍了mybatis一直加载xml,找到错误的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • SpringBoot教程_创建第一个SpringBoot项目

    SpringBoot教程_创建第一个SpringBoot项目

    这篇文章主要介绍了SpringBoot教程_创建第一个SpringBoot项目,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Java实现人机对战猜拳游戏

    Java实现人机对战猜拳游戏

    这篇文章主要为大家详细介绍了Java实现人机对战猜拳游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • 简单谈谈java自定义注解

    简单谈谈java自定义注解

    下面小编就为大家带来一篇简单谈谈java自定义注解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • java9区分opens与exports

    java9区分opens与exports

    本篇文章主要给大家讲述了java9中opens与exports的区别以及用法的不同之处,一起学习下吧。
    2018-02-02
  • java 二叉查找树实例代码

    java 二叉查找树实例代码

    这篇文章主要介绍了java 二叉查找树实例代码的相关资料,需要的朋友可以参考下
    2017-03-03

最新评论