181

我在这里有点困惑。在我们的应用程序中,我们定义了一些 servlet。web.xml以下是其中一个 servlet的摘录:

<servlet>
    <servlet-name>AxisServlet</servlet-name>
    <display-name>Apache-Axis Servlet</display-name>
    <servlet-class>com.foo.framework.axis2.http.FrameworkServlet</servlet-class>
    <load-on-startup>0</load-on-startup>
</servlet> 

据我了解,它的值<load-on-startup>必须是一个正整数才能自动加载。我在谷歌上查找,但我遇到的回复只会让我更加困惑。

4

11 回答 11

192

Resin 3.0记录了这种行为:

load-on-startup 可以指定一个(可选的)整数值。如果该值为 0 或更大,则表示加载 servlet 的顺序,编号较大的 servlet 在编号较小的 servlet 之后加载。

JSP 3.1 规范(JSR 340) 在第 14-160 页这样说:

该元素load-on-startup指示应该在 Web 应用程序启动时加载(实例化并调用它的 init())这个 servlet。此元素的元素内容必须是一个整数,指示应加载 servlet 的顺序。如果该值为负整数,或者该元素不存在,则容器可以在选择时自由加载 servlet。如果该值为正整数或 0,则容器必须在部署应用程序时加载并初始化 servlet。容器必须保证在标有大整数的 servlet 之前加载标有小整数的 servlet。容器可以选择加载相同load-on-startup值的 servlet 的顺序。

您可能不仅要检查 JSR,还要检查 Web 容器的文档。可能存在差异

于 2009-05-01T04:25:50.490 回答
133

简短答案:值 >= 0 表示 servlet 在部署 web 应用程序或服务器启动时加载。value < 0 :当容器感觉像时加载 servlet。

长答案(来自规范):

load-on-startup 元素表明这个 servlet 应该在 Web 应用程序启动时被加载(实例化并调用它的 init())。这些元素的可选内容必须是一个整数,指示应加载 servlet 的顺序。如果该值为负整数,或者该元素不存在,则容器可以在选择时自由加载 servlet。如果该值为 128 正整数或 0,则容器必须在部署应用程序时加载并初始化 servlet。容器必须保证在标有大整数的 servlet 之前加载标有小整数的 servlet。容器可以选择加载具有相同加载启动值的 servlet 的顺序。

于 2009-08-19T10:26:18.837 回答
11

它表明 servlet 在请求尝试访问它之前不会启动。

如果 load-on-startup 大于或等于 0,那么当容器启动时,它将按照您放在那里的启动时负载值的升序启动该 servlet(即 0、1 然后 2 然后 5 然后 10 等等) .

于 2009-05-01T00:47:59.233 回答
9

Servlet 生命周期

servlet 的生命周期由部署 servlet 的容器控制。当请求映射到 servlet 时,容器会执行以下步骤。

  1. 如果 servlet 的实例不存在,则 Web 容器:

    一种。加载 servlet 类

    湾。创建 servlet 类的实例

    C。通过调用 init 方法初始化 servlet 实例(初始化在创建和初始化 Servlet中介绍)

  2. 容器调用服务方法,传递请求和响应对象。服务方法在编写服务方法中讨论。

0 值load-on-startup表示当请求到达该 servlet 时执行点 1。其他值表示第 1 点在容器启动时执行。

于 2009-05-01T07:16:18.083 回答
1

如其他答案所述,并且此加载启动文章零是可以接受的,并且在没有任何其他 servlet 的情况下,这将在部署期间优先加载和加载。load-on statup 的最佳用途是加载 servlet,这在第一个请求到来之前需要更长的时间来初始化,就像 servlet 创建连接池或进行网络调用或持有大量资源,这将显着减少前几个请求的响应时间。

于 2011-12-20T09:48:24.613 回答
1
  1. 如果两个 servlet 的值相同,则它们将按照在 web.xml 文件中声明的顺序加载。
  2. 如果是 0 或负整数,那么当 Container 感觉要加载它们时,将加载 Servlet。
  3. 保证 web 容器加载、初始化和调用 servlet 的 init() 方法。
  4. 如果没有任何 servlet 的元素,那么它们将在 Web 容器决定加载它们时被加载。
于 2013-03-14T08:56:34.633 回答
0

是的,它可以具有相同的值....在启动时为加载提供数字的原因是为服务器定义一个序列以加载所有 servlet。启动时加载值为 0 的 servlet 将首先加载,之后加载值为 1 的 servlet。

如果两个 servlet 的 load-on-startup 值相同,那么它将按照 web.xml 中从上到下的声明方式进行加载。web.xml 中最先出现的 servlet 将首先加载,然后再加载另一个。

于 2010-12-29T10:52:47.213 回答
0

--> (Absence of load-on-start-up) 标签 首先,当 servlet 部署在服务器中时,服务器负责创建 servlet 对象。例如:假设 Servlet 部署在服务器中,(Servlet 对象在服务器中不可用)客户端第一次向 servlet 发送请求,然后服务器在默认构造函数的帮助下创建 servlet 对象并立即调用 init() 。从那以后,当客户端发送请求时,只有服务方法将被执行,因为对象已经可用

如果在部署描述符中使用了 load-on-start-up 标签:在部署本身时,服务器根据标签之间提供的正值为 servlet 创建 servlet 对象。servlet 类的对象的创建将遵循从 0 到 128 0 编号的 servlet 将首先创建,然后是其他编号。

如果我们在 web.xml 中为两个 servlet 提供相同的值,那么对象的创建将基于 web.xml 中类的位置完成,也因服务器而异。

如果我们在启动标签之间的负载之间提供负值,那么服务器将不会创建 servlet 对象。

服务器为 servlet 创建对象的其他场景。

如果我们不在 web.xml 中的启动标签上使用加载,那么当客户端第一次发送请求服务器创建对象并且服务器负责调用其生命周期方法时,就会部署项目。然后,如果在服务器(tomcat)中修改了 .class 。客户端再次发送修改 servlet 的请求,但在 tomcat 的情况下,不会创建新对象并且服务器使用现有对象,除非重新启动服务器。但是在 web-logic 类中,当服务器中的 .class 文件被修改时,如果它收到请求而不重新启动服务器,则服务器调用现有 servlet 上的 destroy 方法并创建一个新的 servlet 对象并调用 init() 进行初始化.

于 2012-02-10T13:32:20.913 回答
-1

如果值 <0,则在请求到来时实例化 serlet,否则 >=0 容器将按值的递增顺序加载。如果 2 个或多个 servlet 具有相同的值,则 web.xml 中声明的 servlet 的顺序。

于 2011-08-29T21:08:13.860 回答
-2

servlet 容器在启动期间或发出第一个请求时加载 servlet。servlet 的加载取决于“web.xml”文件中的“load-on-startup”属性。如果属性有一个正整数(0 到 128),那么 servlet 会随着容器的加载而加载,否则它会在第一个服务请求到来时加载。

当 servlet 在收到请求后被加载时,它被称为“延迟加载”。

于 2011-04-01T07:32:47.447 回答
-6

这很简单,你甚至没有想到。

如果值为正,则在容器启动时加载

如果该值不是正数,则在发出请求时将加载 serverlet。

于 2012-11-22T06:11:28.777 回答