Servlet 启动时加载<load-on-startup>

在 Servlet 中启动时加载。当我们在 servlet 上启用 <load-on-startup> 时,Servlet 容器会在服务器启动期间或 Web 应用程序部署期间创建我们的 Servlet 类对象。这称为 servlet 的预实例化和预初始化。

servlet 中启动时加载的示例:-

<web-app>
  <servlet>
    <servlet-name>date</servlet-name>
    <servlet-class>com.know.program.DateServlet</servlet-class>
    <load-on-startup>1<load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>date</servlet-name>
    <url-pattern>/date</url-pattern>
  </servlet-mapping>
</web-app>

在 servlet 组件上启用 <load-on-startup> 的优势

首先,我们将讨论启动时加载未启用时会发生什么?在这种情况下,当向 servlet 组件发出第一个请求时,servlet 将参与 servlet 加载、servlet 实例化、servlet 初始化和请求处理。但是除了第一个请求,servlet 直接参与请求处理。由于这个原因,与第一个请求以外的响应时间相比,第一个请求的响应时间稍长。 

为了减少第一个请求的响应时间并与其他第一个请求相等,我们需要让 Servlet 容器在服务器启动期间或在 Web 应用程序部署期间执行 servlet 加载、实例化和初始化。为此,我们需要在 servlet 上启用 <load-on-startup>。 

  • 不必在 Web 应用程序的每个 Servlet 组件上启用 <load-on-startup>。 
  • 我们应该在部署后立即请求的此类 Servlet 组件上启用 <load-on-startup>,例如:- 提供主菜单/主页的 Servlet 组件。

servlet 容器何时创建一个 Servlet Class 对象?

servlet 容器创建 Servlet Class 对象有两种情况。

案例 1:- 如果未启用 <load-on-startup>。

  • 当向该 servlet 组件发出第一个请求时。
  • 在重新启动 Web 应用程序或重新启动 Web 服务器或重新加载 Web 应用程序或重新部署 Web 应用程序后向 servlet 发出第一个请求时。

如果 servlet 组件上未启用启动时加载,则 servlet 容器仅在收到对 servlet 的第一个请求时才创建 servlet 类对象,这称为 servlet 的延迟或延迟实例化

案例 2:- 如果启用 <load-on-startup>。

  • 然后在启动期间或在 Web 应用程序的部署期间。

当在 servlet 组件上启用启动时加载时,servlet 容器在启动期间或在 Web 应用程序部署期间创建我们的 servlet 类对象,这称为servlet 的预初始化或早期初始化

当 Servlet Containers 销毁 servlet 类对象时?

Servlet 容器在以下情况下会破坏 servlet 类对象:-

  • 当 Web 应用程序停止/重新加载/取消部署时。
  • 服务器停止/崩溃时。
  • 如果 Servlet Class 对象长时间连续空闲。

注意:-即使启用了 <load-on-startup>,Servlet 容器也不会对销毁我们的 servlet 类对象给予任何特殊优先级。

<load-on-startup> 优先级值

如果 Web 应用程序的多个 Servlet 组件通过 <load-on-startup> 启用,则它们的预实例化和预初始化顺序将根据 <load-on-startup> 优先级值确定。

<load-on-startup>1</load-on-startup>

这里 1 是启动时加载优先级值。优先加载值可以是正数、负数或零。

  • 高正优先级值表示低优先级。 
  • 低正优先级值表示高优先级。 
  • 负优先级值将被忽略为启动时加载优先级值。将优先级值设为负数等于不启用启动时加载。

为了更好地理解,将优先级值假设为排名系统,其中 1 的优先级高于 2。

小服务程序 优先价值实例化顺序
小服务程序110第四
小服务程序21第二
小服务程序3-5忽略
小服务程序40第一的
小服务程序5-10忽略
小服务程序62第三
小服务程序720第五

在多个 servlet 上启用了启动时加载的 web.xml 文件示例,

<web-app>
  <servlet>
    <servlet-name>lc</servlet-name>
    <servlet-class>com.know.program.LCTestServlet</servlet-class>
    <load-on-startup>10<load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>lc</servlet-name>
    <url-pattern>/lctest</url-pattern>
  </servlet-mapping>

  <servlet>
    <servlet-name>plain</servlet-name>
    <servlet-class>com.know.program.PlainServlet</servlet-class>
    <load-on-startup>0<load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>plain</servlet-name>
    <url-pattern>/plain</url-pattern>
  </servlet-mapping>

  <servlet>
    <servlet-name>html</servlet-name>
    <servlet-class>com.know.program.HTMLServlet</servlet-class>
    <load-on-startup>-5<load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>html</servlet-name>
    <url-pattern>/html</url-pattern>
  </servlet-mapping>
</web-app>

tomcat 服务器中,在 Tomcat 版本 8 以后,空的 load-on-startup 没有优先级值会产生错误。

在 servlet 上启用 <load-on-startup> 并以负值作为优先级值等于在 Servlet 上不启用 <load-on-startup>。

当所有 servlet 组件具有相同的优先级顺序时会发生什么?

在这种情况下,所有 servlet 组件都将被视为没有加载启动优先级值,并且这些 servlet 类的对象将在给出第一个请求时创建。这意味着 Servlet Container 将它们视为 <load-on-startup> 未启用。

当多个 servlet 组件具有相同的优先级时,Servlet 类的加载顺序是什么?

在这种情况下,先到先得。为了将它们放置在 web.xml 文件中,将按该顺序加载 servlet 类。

如果您喜欢这篇文章,请与您的朋友分享。您想分享有关上述主题的更多信息,还是您发现任何不正确的地方?让我们在评论中知道。谢谢!

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值