Servlet的生命周期

Servlet的生命周期可被定义为从创建直到毁灭的整个过程。以下是Servlet遵循的过程:

  • Servlet 初始化后调用 init ()方法。
  • Servlet 调用 service()方法来处理客户端的请求。
  • Servlet 销毁前调用 destroy()方法。
  • 最后,Servlet 由 JVM 的垃圾回收器进行垃圾回收。
  1. init()方法

    Servlet可以通过配置,选择是在启动服务器或者客户机首次访问Servlet时装载Servlet,创建Servlet实例,执行init()方法。但是无论有多少客户机访问Servlet,都不会重复执行init()

除第一次请求Servlet会创建一个Servlet实例外,之后每一个用户请求都只会产生一个新的线程。init()方法简单地创建或者加载一些数据,这些数据将被用于Servlet的整个生命周期。

  1. service()方法

    service() 方法是执行实际任务的主要方法。每当一个客户请求一个HttpServlet对象,该对象的Service()方法就要调用,而且传递给这个方法一个“请求”(ServletRequest)对象和一个“响应”(ServletResponse)对象作为参数。

    HttpServlet中存在一个继承自GenericServlet的public service(ServletRequest req, ServletResponse res)方法(下称public service),同时还有一个protected service(HttpServletRequest req, HttpServletResponse resp)方法(下称protected service)。

    public service方法被Web容器自动调用后,不对传入的参数ServletRequest对象和ServletResponse对象进行处理,只是将两者强转为HttpServletRequest和HttpServletResponse类型对象,并将两者作为参数调用protected service()方法。

  2. destroy()方法

    同init()方法一样,destroy()方法仅在服务器端停止且卸载Servlet时执行此方法。

    destroy()方法可以让Servlet关闭数据库连接、停止后台线程、把Cookie列表或点击计数器写入到磁盘,并执行其他类似的清理活动。

    在调用 destroy() 方法之后,servlet 对象被标记为垃圾回收。

具体生命周期

不存在Servlet实例 -> 容器装载Servlet -> 创建Servlet实例 -> 初始化Servlet,调用init()方法 -> 调用service()方法 -> 销毁Servlet,调用destroy()方法。

是由Servlet容器来控制的,它始于装入Web服务器的内存时,并在终止或重新装入Servlet时结束。这项操作一般是动态执行的。同时,Server通常会提供一个管理的选项,用于在Server启动时强制装载和初始化特定的Servlet。

1.加载和实例化Servlet

  1. 如果已配置自动装入选项,则在启动时自动载入。
  2. 在服务器启动时,客户机首次向Servlet发出请求。
  3. 重新装入Servlet时。

当启动Servlet容器时,容器首先查找一个配置文件web.xml,这个文件中记录了可以提供服务的Servlet。每个Servlet被指定一个Servlet名,也就是这个Servlet实际对应的Java的完整class文件名。Servlet容器会为每个自动装入选项的Servlet创建一个实例。所以,每个Servlet类必须有一个公共的无参数的构造器。

2.初始化

当Servlet被实例化后,Servlet容器将调用每个Servlet的init方法来实例化每个实例,执行完init方法之后,Servlet处于“已初始化”状态。所以说,一旦Servlet被实例化,那么必将调用init方法。通过Servlet在启动后不立即初始化,而是收到请求后进行。在web.xml文件中用<load-on-statup> ...... </load-on-statup>对Servlet进行预先初始化。

初始化失败后,执行init()方法抛出ServletException异常,Servlet对象将会被垃圾回收器回收,当客户端第一次访问服务器时加载Servlet实现类,创建对象并执行初始化方法。

3.请求处理

Servlet被初始化以后,就处于能响应请求的就绪状态。每个对Servlet 的请求由一个ServletRequest对象代表。Servlet给客户端的响应由一个ServletResponse对象代表。对于到达客户机的请求,服务器创建特定于请求的一个“请求”对象和一个“响应”对象。调用service方法,这个方法可以调用其他方法来处理请求。

Service方法会在服务器被访问时调用,Servlet对象的生命周期中service方法可能被多次调用,由于web-server启动后,服务器中公开的部分资源将处于网络中,当网络中的不同主机(客户端)并发访问服务器中的同一资源,服务器将开设多个线程处理不同的请求,多线程同时处理同一对象时,有可能出现数据并发访问的错误。

另外注意,多线程难免同时处理同一变量时(如:对同一文件进行写操作),且有读写操作时,必须考虑是否加上同步,同步添加时,不要添加范围过大,有可能使程序变为纯粹的单线程,大大削弱了系统性能;只需要做到多个线程安全的访问相同的对象就可以了。

4.卸载Servlet

当服务器不再需要Servlet实例或重新装入时,会调用destroy方法,使用这个方法,Servlet可以释放掉所有在init方法申请的资源。一个Servlet实例一旦终止,就不允许再次被调用,只能等待被卸载。

Servlet一旦终止,Servlet实例即可被垃圾回收,处于“卸载”状态,如果Servlet容器被关闭,Servlet也会被卸载,一个Servlet实例只能初始化一次,但可以创建多个相同的Servlet实例。如相同的Servlet可以在根据不同的配置参数连接不同的数据库时创建多个实例。

上一篇:Flink基础(127):FLINK-SQL语法 (21) DQL(13) OPERATIONS(10) Joins(4) Lookup Join


下一篇:Ubuntu - 20.04系统安装乐鑫ESP-IDF工具链 --- 虚拟机安装 Ubuntu - 20.04