在 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。
小服务程序 | 优先价值 | 实例化顺序 |
---|---|---|
小服务程序1 | 10 | 第四 |
小服务程序2 | 1 | 第二 |
小服务程序3 | -5 | 忽略 |
小服务程序4 | 0 | 第一的 |
小服务程序5 | -10 | 忽略 |
小服务程序6 | 2 | 第三 |
小服务程序7 | 20 | 第五 |
在多个 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 类。
如果您喜欢这篇文章,请与您的朋友分享。您想分享有关上述主题的更多信息,还是您发现任何不正确的地方?让我们在评论中知道。谢谢!